From da809f6fcf6e83093c424a01b01030b91f13bd14 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Fri, 21 Feb 2020 16:03:30 +0100
Subject: [PATCH] FEAT #12091 TIME 1:10 lang notify + check hasPrivilege
 listTemplates

---
 .../PreProcessActionController.php            | 12 -----------
 .../controllers/ListTemplateController.php    |  6 ++++++
 ...ffusionModel-administration.component.html |  4 ++--
 ...fusionModel-administration.component.scss} | 12 ++++++++++-
 ...diffusionModel-administration.component.ts |  2 +-
 src/frontend/app/notification.service.ts      |  8 +++++--
 .../app/visa/visa-workflow.component.ts       | 21 +++++++------------
 src/frontend/lang/lang-en.ts                  |  3 ++-
 src/frontend/lang/lang-fr.ts                  |  1 +
 src/frontend/lang/lang-nl.ts                  |  1 +
 10 files changed, 37 insertions(+), 33 deletions(-)
 rename src/frontend/app/administration/diffusionModel/{diffusionModel-administration.component.css => diffusionModel-administration.component.scss} (70%)
 mode change 100755 => 100644

diff --git a/src/app/action/controllers/PreProcessActionController.php b/src/app/action/controllers/PreProcessActionController.php
index f3631fdf35c..c0de6e41767 100755
--- a/src/app/action/controllers/PreProcessActionController.php
+++ b/src/app/action/controllers/PreProcessActionController.php
@@ -956,18 +956,6 @@ class PreProcessActionController
                 $resource['alt_identifier'] = _UNDEFINED;
             }
 
-            $circuit = ListInstanceModel::get([
-                'select'    => ['requested_signature'],
-                'where'     => ['res_id = ?', 'difflist_type = ?', 'process_date is null'],
-                'data'      => [$resId, 'VISA_CIRCUIT'],
-                'orderBy'   => ['listinstance_id'],
-                'limit'     => 1
-            ]);
-            if (empty($circuit)) {
-                $resourcesInformations['error'][] = ['alt_identifier' => $resource['alt_identifier'], 'res_id' => $resId, 'reason' => 'noCircuitAvailable'];
-                continue;
-            }
-
             $attachments = AttachmentModel::get([
                 'select'    => ['status'],
                 'where'     => ['res_id_master = ?', 'attachment_type in (?)', 'in_signature_book = ?', 'status not in (?)'],
diff --git a/src/app/entity/controllers/ListTemplateController.php b/src/app/entity/controllers/ListTemplateController.php
index a9028db8bc9..6654edaaaff 100755
--- a/src/app/entity/controllers/ListTemplateController.php
+++ b/src/app/entity/controllers/ListTemplateController.php
@@ -62,6 +62,12 @@ class ListTemplateController
                 $listTemplateItems[$key]['idToDisplay'] = UserModel::getLabelledUserById(['id' => $value['item_id']]);
                 $listTemplateItems[$key]['descriptionToDisplay'] = UserModel::getPrimaryEntityById(['id' => $value['item_id'], 'select' => ['entity_label']])['entity_label'];
             }
+            $listTemplateItems[$key]['hasPrivilege'] = true;
+            if ($listTemplate['type'] == 'visaCircuit' && !PrivilegeController::hasPrivilege(['privilegeId' => 'visa_documents', 'userId' => $value['item_id']]) && !PrivilegeController::hasPrivilege(['privilegeId' => 'sign_document', 'userId' => $value['item_id']])) {
+                $listTemplateItems[$key]['hasPrivilege'] = false;
+            } elseif ($listTemplate['type'] == 'opinionCircuit' && !PrivilegeController::hasPrivilege(['privilegeId' => 'avis_documents', 'userId' => $value['item_id']])) {
+                $listTemplateItems[$key]['hasPrivilege'] = false;
+            }
         }
 
         $roles = EntityModel::getRoles();
diff --git a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html
index b93bd7dd395..c61d6d2dee3 100755
--- a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html
+++ b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html
@@ -50,9 +50,9 @@
                                         <plugin-autocomplete [labelPlaceholder]="lang.addUser" [labelList]="lang.availableUsers" [routeDatas]="diffusionModel.type == 'visaCircuit' ? ['/rest/autocomplete/users/circuit'] : ['/rest/autocomplete/users/circuit?circuit=opinion']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelVisa($event)"></plugin-autocomplete>
                                         <mat-list>
                                             <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="diffusionModel.items">
-                                                <mat-list-item disableRipple="true" *ngFor="let template of diffusionModel.items; let i = index" title="{{lang.move}}"
+                                                <mat-list-item disableRipple="true" *ngFor="let template of diffusionModel.items; let i = index" [title]="template.hasPrivilege ? lang.move : lang.insufficientPrivilege"
                                                     dnd-sortable [sortableIndex]="i" (onDropSuccess)="updateDiffListVisa(template)">
-                                                    <mat-icon color="primary" [class]="template.item_mode == 'sign' ? 'fa fa-certificate' : 'fa fa-user'" mat-list-icon></mat-icon>
+                                                    <mat-icon [class]="template.item_mode == 'sign' ? 'fa fa-certificate' : 'fa fa-user'" [class.primaryColor]="template.hasPrivilege" [class.redColor]="!template.hasPrivilege" mat-list-icon></mat-icon>
                                                     <p mat-line>{{template.idToDisplay}}
                                                         <small style="opacity:0.5;">{{template.descriptionToDisplay}}</small>
                                                     </p>
diff --git a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.css b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.scss
old mode 100755
new mode 100644
similarity index 70%
rename from src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.css
rename to src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.scss
index bd3247a5c48..903b07dc24d
--- a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.css
+++ b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.scss
@@ -1,3 +1,5 @@
+@import '../../../css/vars.scss';
+
 .mat-list-item[draggable="false"]:hover{
     background: inherit;
 }
@@ -12,4 +14,12 @@
 
 .mat-list-item[draggable="true"] mat-icon{
     cursor: move;
-}
\ No newline at end of file
+}
+
+.primaryColor {
+    color: $primary;
+}
+
+.redColor {
+    color: #e4342b;
+}
diff --git a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts
index 0d81c3b67b7..06c2eb7b5b1 100755
--- a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts
+++ b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts
@@ -11,7 +11,7 @@ declare function $j(selector: any): any;
 
 @Component({
     templateUrl: "diffusionModel-administration.component.html",
-    styleUrls: ['diffusionModel-administration.component.css'],
+    styleUrls: ['diffusionModel-administration.component.scss'],
     providers: [NotificationService, AppService]
 })
 export class DiffusionModelAdministrationComponent implements OnInit {
diff --git a/src/frontend/app/notification.service.ts b/src/frontend/app/notification.service.ts
index 0940a2ac4dc..32bfc3930fc 100755
--- a/src/frontend/app/notification.service.ts
+++ b/src/frontend/app/notification.service.ts
@@ -47,7 +47,11 @@ export class NotificationService {
         } else {
             if (err.error !== undefined) {
                 if (err.error.errors !== undefined) {
-                    this.error(err.error.errors, err.url);
+                    if (err.error.lang !== undefined) {
+                        this.error('lang.' + err.error.lang, err.url);
+                    } else {
+                        this.error(err.error.errors, err.url);
+                    }
                     if (err.status === 403 || err.status === 404) {
                         this.router.navigate(['/home']);
                     }
@@ -80,4 +84,4 @@ export class NotificationService {
             this.error(err);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/frontend/app/visa/visa-workflow.component.ts b/src/frontend/app/visa/visa-workflow.component.ts
index dcb5f7395e8..6a758e405bb 100644
--- a/src/frontend/app/visa/visa-workflow.component.ts
+++ b/src/frontend/app/visa/visa-workflow.component.ts
@@ -327,10 +327,10 @@ export class VisaWorkflowComponent implements OnInit {
                         'listinstance_id': key,
                         'id': element.userId,
                         'labelToDisplay': element.userDisplay,
-                        'requested_signature': element.mode === 'visa' ? false : true,
+                        'requested_signature': element.mode !== 'visa',
                         'process_date': this.functions.formatFrenchDateToTechnicalDate(element.processDate),
                         'picture': ''
-                    }
+                    };
                     this.visaWorkflow.items.push(user);
                     this.http.get("../../rest/maarchParapheur/user/" + element.userId + "/picture")
                         .subscribe((data: any) => {
@@ -475,7 +475,8 @@ export class VisaWorkflowComponent implements OnInit {
             this.http.get(`../../rest/listTemplates/${item.id}`).pipe(
                 tap((data: any) => {
                     this.visaWorkflow.items = this.visaWorkflow.items.concat(
-                        data.listTemplate.items.map((itemTemplate: any) => {
+
+                        data.listTemplate.items.filter((itemTemplate: any) => itemTemplate.hasPrivilege === true).map((itemTemplate: any) => {
                             return {
                                 item_id: itemTemplate.item_id,
                                 item_type: 'user',
@@ -483,7 +484,7 @@ export class VisaWorkflowComponent implements OnInit {
                                 item_entity: itemTemplate.descriptionToDisplay,
                                 difflist_type: 'VISA_CIRCUIT',
                                 signatory: false,
-                                requested_signature: itemTemplate.item_mode === 'sign' ? true : false
+                                requested_signature: itemTemplate.item_mode === 'sign'
                             }
                         })
                     );
@@ -503,11 +504,7 @@ export class VisaWorkflowComponent implements OnInit {
     }
 
     emptyWorkflow() {
-        if (this.visaWorkflow.items.length === 0) {
-            return true;
-        } else {
-            return false;
-        }
+        return this.visaWorkflow.items.length === 0;
     }
 
     workflowEnd() {
@@ -570,10 +567,6 @@ export class VisaWorkflowComponent implements OnInit {
     }
 
     isModified() {
-        if (this.loading || JSON.stringify(this.visaWorkflow.items) === JSON.stringify(this.visaWorkflowClone)) {
-            return false;
-        } else {
-            return true;
-        }
+        return !(this.loading || JSON.stringify(this.visaWorkflow.items) === JSON.stringify(this.visaWorkflowClone));
     }
 }
diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts
index a6bf0fd375e..660f9c01f7a 100755
--- a/src/frontend/lang/lang-en.ts
+++ b/src/frontend/lang/lang-en.ts
@@ -1553,5 +1553,6 @@ export const LANG_EN = {
     "willBeTransferedToNewTag" : "will be transfered to selected tag",
     "detailDoc" : "Detail page",
     "emptySubject" : "Empty subject",
-    "editAcknowledgementReceipt" : "Edit the acknowledgement receipt", 
+    "editAcknowledgementReceipt" : "Edit the acknowledgement receipt",
+    "insufficientPrivilege" : "Privilege insuffisant",
 };
diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts
index a8be924b32a..f3289c79a9e 100755
--- a/src/frontend/lang/lang-fr.ts
+++ b/src/frontend/lang/lang-fr.ts
@@ -1593,4 +1593,5 @@ export const LANG_FR = {
     "detailDoc" : "Fiche détaillée",
     "emptySubject" : "Objet vide",
     "editAcknowledgementReceipt" : "Editer l'accusé de réception",
+    "insufficientPrivilege" : "Privilège insuffisant",
 };
diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts
index d12620d68f5..751f7f536a7 100755
--- a/src/frontend/lang/lang-nl.ts
+++ b/src/frontend/lang/lang-nl.ts
@@ -1579,4 +1579,5 @@ export const LANG_NL = {
     "detailDoc" : "Detail page", //_TO_TRANSLATE
     "emptySubject" : "Empty subject", //_TO_TRANSLATE
     "editAcknowledgementReceipt" : "Edit the acknowledgement receipt", //_TO_TRANSLATE
+    "insufficientPrivilege" : "Privilege insuffisant", //TRANSLATE
 };
-- 
GitLab