From dacc5ea0682620c666859b9b0669b837aaed2e1e Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Thu, 18 Apr 2019 11:54:44 +0200
Subject: [PATCH] FEAT #8391 TIME 2 split externals paraph components + add
 send action xparaph

---
 .../controllers/XParaphController.php         |  3 +-
 .../maarch-paraph.component.html              | 33 +++++++++++
 .../maarch-paraph.component.scss              |  0
 .../maarch-paraph/maarch-paraph.component.ts  | 51 ++++++++++++++++
 ...ernal-signatory-book-action.component.html | 58 ++++---------------
 ...xternal-signatory-book-action.component.ts | 29 +++++++---
 .../x-paraph/x-paraph.component.ts            | 39 ++++++++++---
 src/frontend/app/app.module.ts                |  2 +
 8 files changed, 152 insertions(+), 63 deletions(-)
 create mode 100644 src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.html
 create mode 100644 src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.scss
 create mode 100644 src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.ts

diff --git a/src/app/external/externalSignatoryBook/controllers/XParaphController.php b/src/app/external/externalSignatoryBook/controllers/XParaphController.php
index a2c57ecb920..8a51c4d0d39 100755
--- a/src/app/external/externalSignatoryBook/controllers/XParaphController.php
+++ b/src/app/external/externalSignatoryBook/controllers/XParaphController.php
@@ -54,13 +54,14 @@ class XParaphController
             
             $xmlStep = '';
             foreach ($aArgs['steps'] as $key => $step) {
+                $order = $key + 1;
                 $xmlStep .= '<EtapeDepot>
                                 <user_siret xsi:type="xsd:string">'.$aArgs['info']['siret'].'</user_siret>
                                 <user_login xsi:type="xsd:string">'.$step['login'].'</user_login>
                                 <action xsi:type="xsd:string">'.$step['action'].'</action>
                                 <contexte xsi:type="xsd:string">'.$step['contexte'].'</contexte>
                                 <norejet xsi:type="xsd:string">0</norejet>
-                                <ordre xsi:type="xsd:int">'.$key.'</ordre>
+                                <ordre xsi:type="xsd:int">'.$order.'</ordre>
                             </EtapeDepot>';
             }
 
diff --git a/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.html b/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.html
new file mode 100644
index 00000000000..a9b819bf782
--- /dev/null
+++ b/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.html
@@ -0,0 +1,33 @@
+<div class="col-md-12" style="padding-top: 10px;" *ngIf="signatoryBookEnabled == 'maarchParapheur' && additionalsInfos.users.length != 0">
+    <mat-form-field>
+        <mat-label>{{lang.userMaarchParapheur}}</mat-label>
+        <mat-select name="processingUser" [(ngModel)]="externalSignatoryBookDatas.processingUser" required>
+            <mat-option *ngFor="let user of additionalsInfos.users" [value]="user.id">
+                {{user.firstname}} {{user.lastname}} ({{user.email}})
+            </mat-option>
+        </mat-select>
+    </mat-form-field>
+</div>
+<div class="col-md-12" *ngIf="additionalsInfos.users.length == 0">
+    {{lang.noUserDefinedInMaarchParapheur}}
+</div>
+<div class="col-sm-12" *ngIf="additionalsInfos.users.length != 0">
+    <mat-radio-group required name="objectSent" [(ngModel)]="externalSignatoryBookDatas.objectSent">
+        <mat-radio-button color="primary" name="objectSent" checked value="mail">{{lang.mailNote}}</mat-radio-button>
+        <mat-radio-button color="primary" name="objectSent" value="attachment">{{lang.attachmentSignature}}</mat-radio-button><br><br>
+    </mat-radio-group>
+</div>
+<div class="col-md-12" *ngIf="additionalsInfos.noMail.length != 0 && externalSignatoryBookDatas.objectSent == 'mail'">
+    <div>
+        <div class="alert-message alert-message-danger mailList" role="alert">
+            <p>
+                {{lang.canNotMakeAction}} :
+            </p>
+            <ul>
+                <li *ngFor="let mail of additionalsInfos.noMail">
+                    <b>{{mail.alt_identifier}}</b> : {{lang[mail.reason]}}
+                </li>
+            </ul>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.scss b/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.scss
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.ts b/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.ts
new file mode 100644
index 00000000000..e00af0355c5
--- /dev/null
+++ b/src/frontend/app/actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component.ts
@@ -0,0 +1,51 @@
+import { Component, OnInit, Input } from '@angular/core';
+import { LANG } from '../../../translate.component';
+import { NotificationService } from '../../../notification.service';
+import { HttpClient } from '@angular/common/http';
+
+declare function $j(selector: any): any;
+
+@Component({
+    selector: 'app-maarch-paraph',
+    templateUrl: "maarch-paraph.component.html",
+    styleUrls: ['maarch-paraph.component.scss'],
+    providers: [NotificationService],
+})
+export class MaarchParaphComponent implements OnInit {
+
+    lang: any = LANG;
+    loading: boolean = false;
+
+    currentAccount: any = null;
+    usersWorkflowList: any[] = [];
+   
+    @Input('additionalsInfos') additionalsInfos: any;
+    @Input('externalSignatoryBookDatas') externalSignatoryBookDatas: any;
+
+    constructor(public http: HttpClient, private notify: NotificationService) { }
+
+    ngOnInit(): void { }
+
+    checkValidParaph() {
+        if (!this.externalSignatoryBookDatas.processingUser || 
+            this.additionalsInfos.users.length == 0 || 
+            (this.externalSignatoryBookDatas.objectSent == 'attachment' && this.additionalsInfos.attachments.length == 0) || 
+            (this.externalSignatoryBookDatas.objectSent == 'mail' && this.additionalsInfos.mails.length == 0)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    getRessources() {
+        if (this.externalSignatoryBookDatas.objectSent == 'attachment') {
+            return this.additionalsInfos.attachments.map((e: any) => { return e.res_id; });
+        } else if (this.externalSignatoryBookDatas.objectSent == 'mail') {
+            return this.additionalsInfos.mails.map((e: any) => { return e.res_id; });
+        }
+    }
+
+    getDatas() {
+        return this.externalSignatoryBookDatas;
+    }
+}
diff --git a/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.html b/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.html
index 65bda10bb3a..a7ff09dcdd3 100644
--- a/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.html
+++ b/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.html
@@ -1,5 +1,5 @@
 <h1 mat-dialog-title>{{data.action.label_action}}</h1>
-<div mat-dialog-content >
+<div mat-dialog-content>
     <div *ngIf="loading" class="loading" style="display:flex;height:100%;">
         <mat-spinner style="margin:auto;"></mat-spinner>
     </div>
@@ -8,32 +8,19 @@
             <div class="row" style="margin: 0;">
                 <div class="col-md-12">
                     {{lang.makeActionOn}}
-                     <b *ngIf="data.selectedRes.length == 1 && data.contextChrono != ''" color="primary" class="highlight">{{data.contextChrono}}</b>
+                    <b *ngIf="data.selectedRes.length == 1 && data.contextChrono != ''" color="primary"
+                        class="highlight">{{data.contextChrono}}</b>
                     <b *ngIf="!data.contextMode" color="primary" class="highlight">{{data.selectedRes.length}}
                         {{lang.elements}}</b> ?
                 </div>
                 <div>
-                    <app-x-paraph *ngIf="signatoryBookEnabled=='xParaph'" [additionalsInfos]="additionalsInfos"></app-x-paraph>
-                    <div class="col-md-12" style="padding-top: 10px;" *ngIf="signatoryBookEnabled == 'maarchParapheur' && additionalsInfos.users.length != 0">
-                        <mat-form-field>
-                            <mat-label>{{lang.userMaarchParapheur}}</mat-label>
-                            <mat-select name="processingUser" [(ngModel)]="externalSignatoryBookDatas.processingUser" required>
-                                <mat-option *ngFor="let user of additionalsInfos.users" [value]="user.id">
-                                    {{user.firstname}} {{user.lastname}} ({{user.email}})
-                                </mat-option>
-                            </mat-select>
-                        </mat-form-field>
-                    </div>
-                    <div class="col-md-12" *ngIf="signatoryBookEnabled == 'maarchParapheur' && additionalsInfos.users.length == 0">
-                        {{lang.noUserDefinedInMaarchParapheur}}
-                    </div>
-                    <div class="col-sm-12" *ngIf="signatoryBookEnabled == 'maarchParapheur' && additionalsInfos.users.length != 0">
-                        <mat-radio-group required name="objectSent" [(ngModel)]="externalSignatoryBookDatas.objectSent">
-                            <mat-radio-button color="primary" name="objectSent" checked value="mail">{{lang.mailNote}}</mat-radio-button>
-                            <mat-radio-button color="primary" name="objectSent" value="attachment">{{lang.attachmentSignature}}</mat-radio-button><br><br>
-                        </mat-radio-group>
-                    </div>
-                    <div class="col-md-12" *ngIf="additionalsInfos.noAttachment.length != 0 && (signatoryBookEnabled != 'maarchParapheur' || (signatoryBookEnabled == 'maarchParapheur' && externalSignatoryBookDatas.objectSent == 'attachment'))">
+                    <app-maarch-paraph #maarchParaph *ngIf="signatoryBookEnabled=='maarchParapheur'"
+                        [additionalsInfos]="additionalsInfos" [externalSignatoryBookDatas]="externalSignatoryBookDatas">
+                    </app-maarch-paraph>
+                    <app-x-paraph #xParaph *ngIf="signatoryBookEnabled=='xParaph'" [additionalsInfos]="additionalsInfos"
+                        [externalSignatoryBookDatas]="externalSignatoryBookDatas"></app-x-paraph>
+                    <div class="col-md-12"
+                        *ngIf="additionalsInfos.noAttachment.length != 0 && externalSignatoryBookDatas.objectSent == 'attachment'">
                         <div>
                             <div class="alert-message alert-message-danger mailList" role="alert">
                                 <p>
@@ -47,20 +34,6 @@
                             </div>
                         </div>
                     </div>
-                    <div class="col-md-12" *ngIf="signatoryBookEnabled == 'maarchParapheur' && additionalsInfos.noMail.length != 0 && externalSignatoryBookDatas.objectSent == 'mail'">
-                        <div>
-                            <div class="alert-message alert-message-danger mailList" role="alert">
-                                <p>
-                                    {{lang.canNotMakeAction}} :
-                                </p>
-                                <ul>
-                                    <li *ngFor="let mail of additionalsInfos.noMail">
-                                        <b>{{mail.alt_identifier}}</b> : {{lang[mail.reason]}}
-                                    </li>
-                                </ul>
-                            </div>
-                        </div>
-                    </div>
                 </div>
                 <div class="col-md-12">
                     <app-note-editor #noteEditor [resIds]="data.selectedRes"></app-note-editor>
@@ -70,15 +43,6 @@
     </mat-sidenav-container>
 </div>
 <div mat-dialog-actions class="actions">
-    <button mat-raised-button mat-button color="primary" 
-        [disabled]="loading || (signatoryBookEnabled != 'maarchParapheur' && additionalsInfos.attachments.length == 0) ||
-        (signatoryBookEnabled == 'maarchParapheur' && (
-            !externalSignatoryBookDatas.processingUser || 
-            additionalsInfos.users.length == 0 || 
-            (externalSignatoryBookDatas.objectSent == 'attachment' && additionalsInfos.attachments.length == 0) || 
-            (externalSignatoryBookDatas.objectSent == 'mail' && additionalsInfos.mails.length == 0)
-            )
-        )"
-        (click)="onSubmit()">{{lang.validate}}</button>
+    <button mat-raised-button mat-button color="primary" [disabled]="loading || checkValidAction()" (click)="onSubmit()">{{lang.validate}}</button>
     <button mat-raised-button mat-button [disabled]="loading" [mat-dialog-close]="">{{lang.cancel}}</button>
 </div>
\ No newline at end of file
diff --git a/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.ts b/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.ts
index 48021099b8d..2e933dc4de2 100644
--- a/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.ts
+++ b/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.ts
@@ -4,6 +4,8 @@ import { NotificationService } from '../../notification.service';
 import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
 import { HttpClient } from '@angular/common/http';
 import { NoteEditorComponent } from '../../notes/note-editor.component';
+import { XParaphComponent } from './x-paraph/x-paraph.component';
+import { MaarchParaphComponent } from './maarch-paraph/maarch-paraph.component';
 
 @Component({
     templateUrl: "send-external-signatory-book-action.component.html",
@@ -21,14 +23,18 @@ export class SendExternalSignatoryBookActionComponent implements OnInit {
         mails: [],
         noMail: []
     };
-    signatoryBookEnabled: any;
+    signatoryBookEnabled: string = 'maarchParapheur';
+
     externalSignatoryBookDatas: any = {
-        objectSent: 'mail',
+        objectSent: 'attachment',
         processingUser: ''
     };
     errors: any;
 
     @ViewChild('noteEditor') noteEditor: NoteEditorComponent;
+    
+    @ViewChild('xParaph') xParaph: XParaphComponent;
+    @ViewChild('maarchParaph') maarchParaph: MaarchParaphComponent;
 
     constructor(public http: HttpClient, private notify: NotificationService, public dialogRef: MatDialogRef<SendExternalSignatoryBookActionComponent>, @Inject(MAT_DIALOG_DATA) public data: any) { }
 
@@ -51,13 +57,12 @@ export class SendExternalSignatoryBookActionComponent implements OnInit {
         this.loading = true;
 
         let realResSelected: string[];
-        if (this.signatoryBookEnabled != 'maarchParapheur' || (this.signatoryBookEnabled == 'maarchParapheur' && this.externalSignatoryBookDatas.objectSent == 'attachment')) {
-            realResSelected = this.additionalsInfos.attachments.map((e: any) => { return e.res_id; });
-        } else if (this.signatoryBookEnabled == 'maarchParapheur' && this.externalSignatoryBookDatas.objectSent == 'mail') {
-            realResSelected = this.additionalsInfos.mails.map((e: any) => { return e.res_id; });
-        }
+        let datas: any;
+
+        realResSelected = this[this.signatoryBookEnabled].getRessources();
+        datas = this[this.signatoryBookEnabled].getDatas();
 
-        this.http.put('../../rest/resourcesList/users/' + this.data.currentBasketInfo.ownerId + '/groups/' + this.data.currentBasketInfo.groupId + '/baskets/' + this.data.currentBasketInfo.basketId + '/actions/' + this.data.action.id, { resources: realResSelected, note: this.noteEditor.getNoteContent(), data: this.externalSignatoryBookDatas })
+        this.http.put('../../rest/resourcesList/users/' + this.data.currentBasketInfo.ownerId + '/groups/' + this.data.currentBasketInfo.groupId + '/baskets/' + this.data.currentBasketInfo.basketId + '/actions/' + this.data.action.id, { resources: realResSelected, note: this.noteEditor.getNoteContent(), data: datas })
             .subscribe((data: any) => {
                 if (!data) {
                     this.dialogRef.close('success');
@@ -71,4 +76,12 @@ export class SendExternalSignatoryBookActionComponent implements OnInit {
                 this.loading = false;
             });
     }
+
+    checkValidAction() {
+        if (this[this.signatoryBookEnabled] !== undefined) {
+            return this[this.signatoryBookEnabled].checkValidParaph();
+        } else {
+            return true;
+        }
+    }
 }
diff --git a/src/frontend/app/actions/send-external-signatory-book-action/x-paraph/x-paraph.component.ts b/src/frontend/app/actions/send-external-signatory-book-action/x-paraph/x-paraph.component.ts
index 82d2c68bf94..5246992c14b 100644
--- a/src/frontend/app/actions/send-external-signatory-book-action/x-paraph/x-paraph.component.ts
+++ b/src/frontend/app/actions/send-external-signatory-book-action/x-paraph/x-paraph.component.ts
@@ -26,27 +26,27 @@ export class XParaphComponent implements OnInit {
     contextList = [
         {
             'id': 'FON',
-            'label': 'fon'
+            'label': 'agent'
         },
         {
             'id': 'PER',
-            'label': 'per'
+            'label': 'personne physique (personnel)'
         },
         {
             'id': 'SPH',
-            'label': 'sph'
+            'label': 'supérieur hiérarchique'
         },
         {
             'id': 'DIR',
-            'label': 'dir'
+            'label': 'directeur'
         },
         {
             'id': 'DLP',
-            'label': 'dlp'
+            'label': 'délégation permanente'
         },
         {
             'id': 'EXE',
-            'label': 'exe'
+            'label': 'représentant de la collectivité'
         }
     ];
     hidePassword: boolean = true;
@@ -55,6 +55,7 @@ export class XParaphComponent implements OnInit {
     filteredUsers: Observable<any[]>;
 
     @Input('additionalsInfos') additionalsInfos: any;
+    @Input('externalSignatoryBookDatas') externalSignatoryBookDatas: any;
 
     constructor(public http: HttpClient, private notify: NotificationService) { }
 
@@ -129,10 +130,34 @@ export class XParaphComponent implements OnInit {
     }
 
     checkValidParaph() {
-        if (this.currentWorkflow.length > 0 && this.currentAccount.login != '' && this.currentAccount.password != '' && this.currentAccount.siret != '') {
+        if (this.additionalsInfos.attachments.length > 0 && this.currentWorkflow.length > 0 && this.currentAccount.login != '' && this.currentAccount.password != '' && this.currentAccount.siret != '') {
             return false;
         } else {
             return true;
         }
     }
+
+    getRessources() {
+        return this.additionalsInfos.attachments.map((e: any) => { return e.res_id; });
+    }
+
+    getDatas() {
+        this.externalSignatoryBookDatas =
+            {
+                "info": {
+                    "siret": this.currentAccount.siret,
+                    "login": this.currentAccount.login,
+                    "password": this.currentAccount.password
+                },
+                "steps": []
+            };
+        this.currentWorkflow.forEach(element => {
+            this.externalSignatoryBookDatas.steps.push({
+                "login": element.userId,
+                "action": element.currentRole == 'visa' ? '2' : '1',
+                "contexte": element.currentContext
+            })
+        });
+        return this.externalSignatoryBookDatas;
+    }
 }
diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts
index 2e445770c9e..b8cb4454184 100755
--- a/src/frontend/app/app.module.ts
+++ b/src/frontend/app/app.module.ts
@@ -34,6 +34,7 @@ import { CloseAndIndexActionComponent }             from './actions/close-and-in
 import { UpdateDepartureDateActionComponent }   from './actions/update-departure-date-action/update-departure-date-action.component';
 import { SendExternalSignatoryBookActionComponent }   from './actions/send-external-signatory-book-action/send-external-signatory-book-action.component';
 import { XParaphComponent }                         from './actions/send-external-signatory-book-action/x-paraph/x-paraph.component';
+import { MaarchParaphComponent }                         from './actions/send-external-signatory-book-action/maarch-paraph/maarch-paraph.component';
 import { ProcessActionComponent }               from './actions/process-action/process-action.component';
 import { ViewDocActionComponent }               from './actions/view-doc-action/view-doc-action.component';
 import { RedirectActionComponent }               from './actions/redirect-action/redirect-action.component';
@@ -98,6 +99,7 @@ import { AvisWorkflowComponent }             from './avis/avis-workflow.componen
         UpdateDepartureDateActionComponent,
         SendExternalSignatoryBookActionComponent,
         XParaphComponent,
+        MaarchParaphComponent,
         ProcessActionComponent,
         ViewDocActionComponent,
         RedirectActionComponent,
-- 
GitLab