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