diff --git a/canapGEST/API/app/Http/Controllers/ApplicantsController.php b/canapGEST/API/app/Http/Controllers/ApplicantsController.php
index 9cd0c3e7aa3ae0da293d1e2b4c828b4b777bca34..93ad26066e3a84697b8e632afc05241bf2607022 100644
--- a/canapGEST/API/app/Http/Controllers/ApplicantsController.php
+++ b/canapGEST/API/app/Http/Controllers/ApplicantsController.php
@@ -74,10 +74,10 @@ class ApplicantsController extends Controller
           ->get();
         }
       } else {
-        return abort(403, lang::get('http.unauthorized'));
+        return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
       }
     } else {
-      return abort(404, lang::get('http.notfound'));
+      return response()->json(['error' => 404, 'message' => lang::get('http.notfound')], 404);
     }
   }
 
@@ -90,12 +90,12 @@ class ApplicantsController extends Controller
       $data = AccessLevelHelper::hasPermittedRole($this->user_role, 'formateur') ? $this->getOne($id, true) : $this->getOne($id, false);
 
       if ($data['personal_data'] == null) {
-        return abort(403, lang::get('http.unauthorized'));
+        return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
       } else {
         return response()->json($data, 200);
       }
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -108,7 +108,7 @@ class ApplicantsController extends Controller
       DB::table('applicant')->where('applicant_id', $id)->delete();
       return ["message" => lang::get('http.success.deleted.application')];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -120,12 +120,12 @@ class ApplicantsController extends Controller
       $tmp_file_path = sys_get_temp_dir() . '\\' .$id .'-export.json';
       $json = AccessLevelHelper::hasPermittedRole($this->user_role, 'formateur') ? json_encode($this->getOne($id, true)) : json_encode($this->getOne($id, false));
       if (json_decode($json)->personal_data == null) {
-        return abort(403, lang::get('http.unauthorized'));
+        return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
       }
       File::put($tmp_file_path, $json);
       return response()->download($tmp_file_path, $id .'-export.json', ['Content-Type' => 'application/json'])->deleteFileAfterSend(true);
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
diff --git a/canapGEST/API/app/Http/Controllers/CommentsController.php b/canapGEST/API/app/Http/Controllers/CommentsController.php
index 8e93099306908ef48d0aeaee4dbfbcc212c1aadf..f47149e861b3b0bf2d10dc01d7d2335f5cec0cb7 100644
--- a/canapGEST/API/app/Http/Controllers/CommentsController.php
+++ b/canapGEST/API/app/Http/Controllers/CommentsController.php
@@ -35,7 +35,7 @@ class CommentsController extends Controller
       $private_comments = DB::table('comment')->where('fk_applicant_id', $id)->where('comment_is_private', 1)->where('comment_owner_sciper', $this->user_sciper)->get();
       return ["public" => $public_comments, "private" => $private_comments];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -70,7 +70,7 @@ class CommentsController extends Controller
       ]);
       return ["message" => lang::get('http.success.created.comment'), "id" => $inserted_id];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -81,7 +81,7 @@ class CommentsController extends Controller
       DB::table('comment')->where('comment_id', $id)->where('comment_owner_sciper', $this->user_sciper)->delete();
       return ["message" => lang::get('http.success.deleted.comment')];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -105,7 +105,7 @@ class CommentsController extends Controller
       ]);
       return ["message" => lang::get('http.success.updated.comment'), "id" => $id];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
diff --git a/canapGEST/API/app/Http/Controllers/FilesController.php b/canapGEST/API/app/Http/Controllers/FilesController.php
index 803dbbecad978b1a629466eac93a6af3fcce18f4..00004d8c1fbb57397bcb7230e6a0bf7193934c4c 100644
--- a/canapGEST/API/app/Http/Controllers/FilesController.php
+++ b/canapGEST/API/app/Http/Controllers/FilesController.php
@@ -35,7 +35,7 @@ class FilesController extends Controller
       $file = DB::table('file')->where('file_id', $id)->first();
       return response()->download($file->file_path);
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 }
diff --git a/canapGEST/API/app/Http/Controllers/MarkersController.php b/canapGEST/API/app/Http/Controllers/MarkersController.php
index 1a166d62d33de1dd9829e472702bd0faae0a08aa..82b7f9564633249474fb60e75db0267f47b7f8dd 100644
--- a/canapGEST/API/app/Http/Controllers/MarkersController.php
+++ b/canapGEST/API/app/Http/Controllers/MarkersController.php
@@ -21,23 +21,6 @@ class MarkersController extends Controller
     $this->user_permissions = $this->request->get('user_permissions');
   }
 
-  // public function getApplicantMarkers($id)
-  // {
-  //   // Not usefull anymore
-  //   $applicant_job = DB::table('applicant')
-  //     ->join('position', 'applicant.fk_position', '=', 'position.position_id')
-  //     ->join('job', 'position.fk_job', '=', 'job.job_id')
-  //     ->where('applicant_id', $id)
-  //     ->pluck('job_short_value')->first();
-
-  //   $has_access = AccessLevelHelper::hasAccessToJob($applicant_job, $this->user_permissions);
-  //   if ($has_access) {
-  //     return DB::table('marker')->where('fk_applicant_id', $id)->get();
-  //   } else {
-  //     return abort(403, lang::get('http.unauthorized'));
-  //   }
-  // }
-
   public function getUserMarkerOnApplicant($id)
   {
     $marker = DB::table('marker')->where('fk_applicant_id', $id)->where('marker_owner_sciper', $this->user_sciper)->first();
@@ -69,7 +52,7 @@ class MarkersController extends Controller
       ]);
       return ["message" => lang::get('http.success.created.marker'), "id" => $inserted_id];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -85,7 +68,7 @@ class MarkersController extends Controller
       DB::table('marker')->where('marker_id', $id)->update(['marker_value' => $new_value]);
       return ["message" => lang::get('http.success.updated.marker'), "id" => $id];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -96,7 +79,7 @@ class MarkersController extends Controller
       DB::table('marker')->where('marker_id', $id)->where('marker_owner_sciper', $this->user_sciper)->delete();
       return ["message" => lang::get('http.success.deleted.marker')];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 }
diff --git a/canapGEST/API/app/Http/Controllers/PositionsController.php b/canapGEST/API/app/Http/Controllers/PositionsController.php
index 770f7723bfb8e60b58b07ed234b75b922b3b6eb8..0ca0d8c72ed9029f80ca66e8029fdd34c3f0cb8c 100644
--- a/canapGEST/API/app/Http/Controllers/PositionsController.php
+++ b/canapGEST/API/app/Http/Controllers/PositionsController.php
@@ -64,7 +64,7 @@ class PositionsController extends Controller
       ]);
       return ["message" => lang::get('http.success.created.position'), "id" => $inserted_id];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -95,7 +95,7 @@ class PositionsController extends Controller
       ]);
       return ["message" => lang::get('http.success.updated.position'), "id" => $id];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -107,13 +107,13 @@ class PositionsController extends Controller
 
     if ($wanted_position_exists && $has_permitted_role) {
       if ($wanted_position_in_use) {
-        return abort(403, lang::get('http.error.deleted.position'));
+        return response()->json(['error' => 403, 'message' => lang::get('http.error.deleted.position')], 403);
       } else {
         DB::table('position')->where('position_id', $id)->delete();
         return ["message" => lang::get('http.success.deleted.position')];
       }
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -132,7 +132,7 @@ class PositionsController extends Controller
       ]);
       return ["message" => lang::get('http.success.created.location'), "id" => $inserted_id];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 
@@ -153,7 +153,7 @@ class PositionsController extends Controller
       ]);
       return ["message" => lang::get('http.success.created.job'), "id" => $inserted_id];
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 }
diff --git a/canapGEST/API/app/Http/Controllers/StatusController.php b/canapGEST/API/app/Http/Controllers/StatusController.php
index 81e28a2cf5cc9aac4fce7cfae58177458870b319..cda9a936f4f6fb69524ec0c0b7dc846d9ed2e03e 100644
--- a/canapGEST/API/app/Http/Controllers/StatusController.php
+++ b/canapGEST/API/app/Http/Controllers/StatusController.php
@@ -45,10 +45,10 @@ class StatusController extends Controller
         DB::table('applicant')->where('applicant_id', $id)->update(['fk_status' => $new_status]);
         return ["message" => lang::get('http.success.updated.status'), "id" => $id];
       } else {
-        return abort(404, lang::get('http.notfound'));
+        return response()->json(['error' => 404, 'message' => lang::get('http.notfound')], 404);
       }
     } else {
-      return abort(403, lang::get('http.unauthorized'));
+      return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
     }
   }
 }
\ No newline at end of file
diff --git a/canapGEST/Documentation/journal_travail.xlsx b/canapGEST/Documentation/journal_travail.xlsx
index c37596b56131b66192fb845f233594cb0bc6d536..7078266c97cd726736da63548b1bab511b932ef6 100644
Binary files a/canapGEST/Documentation/journal_travail.xlsx and b/canapGEST/Documentation/journal_travail.xlsx differ
diff --git a/canapGEST/Site/src/plugins/axios.js b/canapGEST/Site/src/plugins/axios.js
index 927f9308b54c00b20c7a3ae5ea20ebed7ba7f35b..660eb3b1fb14142c1d647f96674228dba3ec29d6 100644
--- a/canapGEST/Site/src/plugins/axios.js
+++ b/canapGEST/Site/src/plugins/axios.js
@@ -1,5 +1,6 @@
 import axios from 'axios'
 import store from '@/store/store.js'
+import router from '@/router/index.js'
 
 const instance = axios.create({
   headers: { 'Authorization': "Bearer " + localStorage.getItem('stored_token') },
@@ -16,6 +17,8 @@ instance.interceptors.response.use(function (response) {
     // Erreur de token
     store.commit('moduleSnackbar/toggle', { open: true, message: error.response.data.error, type: 'warning' }, { root: true })
     store.dispatch('moduleUser/logout', false)
+  } else if (error.response.status == 403 || error.response.status == 404) {
+    router.push({ name: 'error', params: { status: error.response.data.error, message: error.response.data.message, route: '' } })
   } else {
     // Affichage des erreurs (snackbar)
     Object.values(error.response.data).forEach(errMsg => {
diff --git a/canapGEST/Site/src/router/index.js b/canapGEST/Site/src/router/index.js
index 80a69e4c80bd3266c55f94ce6c9cfb441b37a993..a3319c55fa074cfb4f76af2aa554cc8f5edf45cf 100644
--- a/canapGEST/Site/src/router/index.js
+++ b/canapGEST/Site/src/router/index.js
@@ -19,14 +19,14 @@ router.beforeEach((to, from, next) => {
         // Routes limitées aux responsables
         let deniedRoutes = ['/openjobs']
         if (deniedRoutes.includes(to.fullPath)) {
-          return next({ name: 'error', params: { status: 403, route: to.path } })
+          return next({ name: 'error', params: { status: 403, route: to.path, message: 'Action non autorisée' } })
         }
       }
       if (routeLimitation == 'formateur' && userRole == 'responsable') {
         // Routes limitées aux formateurs
         let deniedRoutes = ['/favourites']
         if (deniedRoutes.includes(to.fullPath)) {
-          return next({ name: 'error', params: { status: 403, route: to.path } })
+          return next({ name: 'error', params: { status: 403, route: to.path, message: 'Action non autorisée' } })
         }
       }
       return next()
diff --git a/canapGEST/Site/src/views/ErrorView.vue b/canapGEST/Site/src/views/ErrorView.vue
index d0a4dc82ade9d8d7aed4d365d726b0433bd6a67e..a63942cdc1ea4d7eaba85d5b45b9f9c1ecf7f51d 100644
--- a/canapGEST/Site/src/views/ErrorView.vue
+++ b/canapGEST/Site/src/views/ErrorView.vue
@@ -1,8 +1,9 @@
 <template>
-  <div id="error-view" class="align-center">
-    <h1>ERREUR !</h1>
-    {{status}}
+  <div id="error-view" class="text-xs-center">
+    <h1>Erreur {{status}}</h1>
     {{route}}
+    <p>{{message}}</p>
+    <v-btn @click="$router.push('/')">Retour</v-btn>
   </div>
 </template>
 
@@ -11,10 +12,8 @@ export default {
   name: 'error-view',
   props: {
     status: Number,
-    route: String
+    route: String,
+    message: String
   }
 }
 </script>
-
-<style>
-</style>