diff --git a/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.html b/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.html
index 0ebf6ce9296f81022c8d1dde60f70f85425b80bd..ae0295e7c6d58570b2f9d9e4bff535a07d03a049 100755
--- a/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.html
+++ b/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.html
@@ -19,6 +19,14 @@
                         (click)="toggleIntegration(inteKey.key)" [checked]="data.resource.integrations[inteKey.key]">
                         {{'lang.' + inteKey.key + '_doc' | translate}}</mat-checkbox>
                 </div>
+                <div *ngIf="!visaNumberCorrect || !signNumberCorrect" class="alert-message alert-message-danger" role="alert">
+                    <p *ngIf="!visaNumberCorrect">
+                        {{'lang.notEnoughVisaUser' | translate}}
+                    </p>
+                    <p *ngIf="!signNumberCorrect">
+                        {{'lang.tooManySignUser' | translate}}
+                    </p>
+                </div>
                 <div *ngIf="resourcesError.length > 0" class="alert-message alert-message-danger mailList" role="alert">
                     <p>
                         {{'lang.canNotMakeAction' | translate}} :
@@ -39,7 +47,7 @@
                     </ul>
                 </div>
                 <app-visa-workflow *ngIf="data.resIds.length <= 1 || (!noResourceToProcess && data.resIds.length > 1)"
-                    [adminMode]="true" #appVisaWorkflow>
+                    [adminMode]="true" (workflowUpdated)="checkMinMaxVisaSign($event)" #appVisaWorkflow>
                 </app-visa-workflow>
                 <div style="padding-top: 10px;">
                     <app-note-editor #noteEditor [resIds]="data.resIds"></app-note-editor>
@@ -58,4 +66,4 @@
             (click)="onSubmit()">{{'lang.validate' | translate}}</button>
         <button mat-raised-button mat-button [disabled]="loading" [mat-dialog-close]="">{{'lang.cancel' | translate}}</button>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.ts b/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.ts
index fe26c0c229c5fb6be689fed865f9ad5380472ace..c0d652897b8b0c9719fcffe0ab25ed029f622543 100644
--- a/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.ts
+++ b/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit, Inject, ViewChild, AfterViewInit } from '@angular/core';
+import { Component, Inject, ViewChild, AfterViewInit } from '@angular/core';
 import { TranslateService } from '@ngx-translate/core';
 import { NotificationService } from '@service/notification/notification.service';
 import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
@@ -10,12 +10,11 @@ import { FunctionsService } from '@service/functions.service';
 import { VisaWorkflowComponent } from '../../visa/visa-workflow.component';
 
 @Component({
-    templateUrl: "send-signature-book-action.component.html",
+    templateUrl: 'send-signature-book-action.component.html',
     styleUrls: ['send-signature-book-action.component.scss'],
 })
 export class SendSignatureBookActionComponent implements AfterViewInit {
 
-    
     loading: boolean = true;
 
     resourcesMailing: any[] = [];
@@ -29,6 +28,11 @@ export class SendSignatureBookActionComponent implements AfterViewInit {
         }
     };
 
+    minimumVisaRole: any = 0;
+    maximumSignRole: any = 0;
+    visaNumberCorrect: any = true;
+    signNumberCorrect: any = true;
+
     @ViewChild('noteEditor', { static: true }) noteEditor: NoteEditorComponent;
     @ViewChild('appVisaWorkflow', { static: false }) appVisaWorkflow: VisaWorkflowComponent;
 
@@ -56,6 +60,8 @@ export class SendSignatureBookActionComponent implements AfterViewInit {
                 this.appVisaWorkflow.loadDefaultWorkflow(this.data.resIds[0]);
             }
         }
+
+        this.checkMinMaxVisaSign(this.appVisaWorkflow.visaWorkflow.items);
     }
 
     async onSubmit() {
@@ -84,7 +90,7 @@ export class SendSignatureBookActionComponent implements AfterViewInit {
     checkSignatureBook() {
         this.resourcesError = [];
 
-        return new Promise((resolve, reject) => {
+        return new Promise((resolve) => {
             this.http.post('../rest/resourcesList/users/' + this.data.userId + '/groups/' + this.data.groupId + '/baskets/' + this.data.basketId + '/actions/' + this.data.action.id + '/checkSignatureBook', { resources: this.data.resIds })
                 .subscribe((data: any) => {
                     if (!this.functions.empty(data.resourcesInformations.error)) {
@@ -94,6 +100,8 @@ export class SendSignatureBookActionComponent implements AfterViewInit {
                     if (data.resourcesInformations.success) {
                         this.resourcesMailing = data.resourcesInformations.success.filter((element: any) => element.mailing);
                     }
+                    this.minimumVisaRole = data.minimumVisaRole;
+                    this.maximumSignRole = data.maximumSignRole;
                     resolve(true);
                 }, (err: any) => {
                     this.notify.handleSoftErrors(err);
@@ -120,7 +128,7 @@ export class SendSignatureBookActionComponent implements AfterViewInit {
             inSignatureBook : true
         };
 
-        return new Promise((resolve, reject) => {
+        return new Promise((resolve) => {
             this.http.post('../rest/resources', this.data.resource).pipe(
                 tap((data: any) => {
                     this.data.resIds = [data.resId];
@@ -173,6 +181,23 @@ export class SendSignatureBookActionComponent implements AfterViewInit {
     }
 
     isValidAction() {
-        return !this.noResourceToProcess && this.appVisaWorkflow !== undefined && !this.appVisaWorkflow.emptyWorkflow() && !this.appVisaWorkflow.workflowEnd();
+        return !this.noResourceToProcess && this.appVisaWorkflow !== undefined && !this.appVisaWorkflow.emptyWorkflow() && !this.appVisaWorkflow.workflowEnd() && this.signNumberCorrect && this.visaNumberCorrect;
+    }
+
+    checkMinMaxVisaSign(items: any[]) {
+        if (this.maximumSignRole !== 0 || this.minimumVisaRole !== 0) {
+            let nbVisaRole = 0;
+            let nbSignRole = 0;
+            items.forEach(item => {
+                if (item.requested_signature) {
+                    nbSignRole++;
+                } else {
+                    nbVisaRole++;
+                }
+            });
+
+            this.visaNumberCorrect = this.minimumVisaRole === 0 || nbVisaRole >= this.minimumVisaRole;
+            this.signNumberCorrect = this.maximumSignRole === 0 || nbSignRole <= this.maximumSignRole;
+        }
     }
 }
diff --git a/src/frontend/app/visa/visa-workflow.component.ts b/src/frontend/app/visa/visa-workflow.component.ts
index 380837d70bd978230b1384ab4d80ea5e156b2983..ba77a65964c3e5d33499c720a122d638a91051e1 100644
--- a/src/frontend/app/visa/visa-workflow.component.ts
+++ b/src/frontend/app/visa/visa-workflow.component.ts
@@ -1,4 +1,4 @@
-import { Component, Input, OnInit, ElementRef, ViewChild } from '@angular/core';
+import {Component, Input, OnInit, ElementRef, ViewChild, Output, EventEmitter} from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { TranslateService } from '@ngx-translate/core';
 import { NotificationService } from '@service/notification/notification.service';
@@ -50,6 +50,8 @@ export class VisaWorkflowComponent implements OnInit {
 
     @Input('linkedToMaarchParapheur') linkedToMaarchParapheur: boolean = false;
 
+    @Output() workflowUpdated = new EventEmitter<any>();
+
     @ViewChild('searchVisaSignUserInput', { static: false }) searchVisaSignUserInput: ElementRef;
 
     searchVisaSignUser = new FormControl();
@@ -97,6 +99,7 @@ export class VisaWorkflowComponent implements OnInit {
         if (event.previousContainer === event.container) {
             if (this.canManageUser(this.visaWorkflow.items[event.currentIndex], event.currentIndex)) {
                 moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
+                this.workflowUpdated.emit(event.container);
             } else {
                 this.notify.error(this.translate.instant('lang.moveVisaUserErr', {value1: this.visaWorkflow.items[event.previousIndex].labelToDisplay}));
             }
@@ -370,6 +373,7 @@ export class VisaWorkflowComponent implements OnInit {
 
     changeRole(i: number) {
         this.visaWorkflow.items[i].requested_signature = !this.visaWorkflow.items[i].requested_signature;
+        this.workflowUpdated.emit(this.visaWorkflow.items);
     }
 
     getWorkflow() {