diff --git a/lang/fr.json b/lang/fr.json
index 33074abffea368fac4df7e2c88db637fc657a00c..c15b60b5e50d5002f0bf4244b70d5d0919fce891 100755
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -401,6 +401,7 @@
 		"loadingMoreData": "Charger plus de données ...",
 		"validateDocumentWarning": "Vous êtes sur le point de valider ce document !",
 		"certifiedDocument": "Document certifié",
-		"certifiedDocumentMsg": "Le document a été signé par certificat numérique, vous ne pouvez pas apposer de griffe."
+		"certifiedDocumentMsg": "Le document a été signé par certificat numérique, vous ne pouvez pas apposer de griffe.",
+		"errorUserSignType": "Les signataires sans certificat doivent être présent avant les signataires avec certificat."
 	}
 }
diff --git a/src/frontend/app/document/visa-workflow/visa-workflow.component.ts b/src/frontend/app/document/visa-workflow/visa-workflow.component.ts
index c58697910744152ab23eeb61001b3e2bd2f1fb9f..75eba060542120ca22544c8ffe8a60a553418a27 100644
--- a/src/frontend/app/document/visa-workflow/visa-workflow.component.ts
+++ b/src/frontend/app/document/visa-workflow/visa-workflow.component.ts
@@ -7,7 +7,6 @@ import { of } from 'rxjs';
 import { NotificationService } from '../../service/notification.service';
 import { IonReorderGroup, PopoverController } from '@ionic/angular';
 import { VisaWorkflowModelsComponent } from './models/visa-workflow-models.component';
-import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
 import { ItemReorderEventDetail } from '@ionic/core';
 
 @Component({
@@ -46,11 +45,42 @@ export class VisaWorkflowComponent implements OnInit {
     }
 
     doReorder(ev: CustomEvent<ItemReorderEventDetail>) {
-        this.visaWorkflow = ev.detail.complete(this.visaWorkflow);
+        if (this.canMoveUser(ev)) {
+            this.visaWorkflow = ev.detail.complete(this.visaWorkflow);
+        } else {
+            this.notificationService.error('lang.errorUserSignType');
+            ev.detail.complete(false);
+        }
+    }
+
+    canMoveUser(ev: CustomEvent<ItemReorderEventDetail>) {
+        const newWorkflow = this.array_move(this.visaWorkflow.slice(), ev.detail.from, ev.detail.to);
+        const res = this.isValidWorkflow(newWorkflow);
+        return res;
+    }
+
+    isValidWorkflow(workflow: any = this.visaWorkflow) {
+        let res: boolean = true;
+        workflow.forEach((item: any, indexUserRgs: number) => {
+            if (['visa', 'stamp'].indexOf(item.role) === -1) {
+                if (workflow.filter((itemUserStamp: any, indexUserStamp: number) => indexUserStamp > indexUserRgs && itemUserStamp.role === 'stamp').length > 0) {
+                    console.log('false!');
+                    res = false;
+                }
+            }
+        });
+        return res;
     }
 
-    drop(event: CdkDragDrop<string[]>) {
-        moveItemInArray(this.visaWorkflow, event.previousIndex, event.currentIndex);
+    array_move(arr: any, old_index: number, new_index: number) {
+        if (new_index >= arr.length) {
+            let k = new_index - arr.length + 1;
+            while (k--) {
+                arr.push(undefined);
+            }
+        }
+        arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
+        return arr; // for testing
     }
 
     getVisaUsers(ev: any) {
@@ -84,6 +114,9 @@ export class VisaWorkflowComponent implements OnInit {
             'modes': user.signatureModes
         };
         this.visaWorkflow.push(userObj);
+        if (!this.isValidWorkflow()) {
+            this.visaWorkflow[this.visaWorkflow.length - 1].role = 'visa';
+        }
         this.getAvatarUser(this.visaWorkflow.length - 1);
         this.visaUsersSearchVal = '';
         searchInput.setFocus();