diff --git a/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php b/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php index 94678c5e6b79476ef5ea206a6fe5f0e820d09277..f12d213255ec138393ce10943c91e641462f7908 100644 --- a/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php +++ b/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php @@ -53,28 +53,38 @@ class AcknowledgementReceiptController $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause', 'basket_res_order', 'basket_name']]); $user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]); + $acknowledgements = AcknowledgementReceiptModel::getByIds([ + 'select' => ['res_id', 'docserver_id', 'path', 'filename', 'fingerprint', 'send_date'], + 'ids' => $bodyData['resources'], + 'orderBy' => ['res_id'] + ]); + + $resourcesInBasket = []; + foreach ($acknowledgements as $acknowledgement) { + $resourcesInBasket[$acknowledgement['res_id']] = $acknowledgement['res_id']; + } + $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]); $rawResourcesInBasket = ResModel::getOnView([ 'select' => ['res_id'], 'where' => [$whereClause, 'res_view_letterbox.res_id in (?)'], - 'data' => [$bodyData['resources']] + 'data' => [$resourcesInBasket] ]); $allResourcesInBasket = []; - foreach ($rawResourcesInBasket as $resource) { - $allResourcesInBasket[] = $resource['res_id']; + foreach ($rawResourcesInBasket as $rawResourceInBasket) { + $allResourcesInBasket[$rawResourceInBasket['res_id']] = $rawResourceInBasket['res_id']; + } + + $aDiff = array_diff($resourcesInBasket, $allResourcesInBasket); + if (!empty($aDiff)) { + return $response->withStatus(403)->withJson(['errors' => 'Documents out of perimeter']); } $pdf = new Fpdi('P', 'pt'); $pdf->setPrintHeader(false); - $acknowledgement = AcknowledgementReceiptModel::getByResIds([ - 'select' => ['res_id', 'docserver_id', 'path', 'filename', 'fingerprint', 'send_date'], - 'resIds' => $allResourcesInBasket, - 'orderBy' => ['res_id'] - ]); - - foreach ($acknowledgement as $value) { + foreach ($acknowledgements as $value) { if (empty($value['send_date'])) { $docserver = DocserverModel::getByDocserverId(['docserverId' => $value['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]); if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) { @@ -90,7 +100,13 @@ class AcknowledgementReceiptController return $response->withStatus(400)->withJson(['errors' => 'Fingerprints do not match']); } - $pdf->setSourceFile($pathToDocument); + $nbPages = $pdf->setSourceFile($pathToDocument); + for ($i = 1; $i <= $nbPages; $i++) { + $page = $pdf->importPage($i); + $size = $pdf->getTemplateSize($page); + $pdf->AddPage($size['orientation'], $size); + $pdf->useImportedPage($page); + } } } @@ -125,7 +141,7 @@ class AcknowledgementReceiptController $data['resources'] = array_slice($data['resources'], 0, 500); - foreach($data['resources'] as $resId) { + foreach ($data['resources'] as $resId) { $ext = ResModel::getExtById(['select' => ['res_id', 'category_id', 'address_id', 'is_multicontacts', 'alt_identifier'], 'resId' => $resId]); //Verify resource category @@ -208,7 +224,7 @@ class AcknowledgementReceiptController $noSendAR['number'] += 1; $noSendAR['list'][] = ['resId' => $resId, 'alt_identifier' => $ext['alt_identifier'], 'info' => 'No user informations' ]; continue; - } + } if (!empty($contact['email'])) { if (empty($template[0]['template_content'])) { @@ -218,8 +234,7 @@ class AcknowledgementReceiptController } else { $email += 1; } - - } else if (!empty($contact['address_street']) && !empty($contact['address_town']) && !empty($contact['address_postal_code'] )) { + } elseif (!empty($contact['address_street']) && !empty($contact['address_town']) && !empty($contact['address_postal_code'])) { if (!file_exists($pathToDocument)) { $noSendAR['number'] += 1; $noSendAR['list'][] = ['resId' => $resId, 'alt_identifier' => $ext['alt_identifier'], 'info' => 'No paper template' ]; @@ -231,7 +246,7 @@ class AcknowledgementReceiptController } $sendEmail += $email; - $sendPaper += $paper; + $sendPaper += $paper; } return $response->withJson(['sendEmail' => $sendEmail, 'sendPaper' => $sendPaper, 'noSendAR' => $noSendAR, 'alreadySend' => $alreadySend]); diff --git a/src/app/acknowledgementReceipt/models/AcknowledgementReceiptModel.php b/src/app/acknowledgementReceipt/models/AcknowledgementReceiptModel.php index ef66a12f5dad2277aa72364b3be263fc4b336c62..ba097e9016df39220b72e8625da78101d2e0365e 100644 --- a/src/app/acknowledgementReceipt/models/AcknowledgementReceiptModel.php +++ b/src/app/acknowledgementReceipt/models/AcknowledgementReceiptModel.php @@ -36,23 +36,19 @@ class AcknowledgementReceiptModel return $aTemplates; } - public static function getById(array $aArgs) + public static function getByIds(array $aArgs) { - ValidatorModel::notEmpty($aArgs, ['id']); - ValidatorModel::intVal($aArgs, ['id']); + ValidatorModel::notEmpty($aArgs, ['ids']); + ValidatorModel::arrayType($aArgs, ['ids']); $aReturn = DatabaseModel::select([ 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], 'table' => ['acknowledgement_receipts'], - 'where' => ['id = ?'], - 'data' => [$aArgs['id']] + 'where' => ['id in (?)'], + 'data' => [$aArgs['ids']] ]); - if (empty($aReturn[0])) { - return []; - } - - return $aReturn[0]; + return $aReturn; } public static function getByResIds(array $aArgs = []) diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php index 81d2ba86defeaf80cba9b638184d4964319c2463..deb8c226d708129a91d9f00e72ba31b7e33ba105 100755 --- a/src/app/resource/controllers/ResController.php +++ b/src/app/resource/controllers/ResController.php @@ -403,24 +403,24 @@ class ResController return $response->withStatus(400)->withJson(['errors' => 'Document does not exist']); } - $document = AcknowledgementReceiptModel::getById([ + $document = AcknowledgementReceiptModel::getByIds([ 'select' => ['docserver_id', 'path', 'filename', 'fingerprint'], - 'id' => $aArgs['id'] + 'ids' => [$aArgs['id']] ]); - $docserver = DocserverModel::getByDocserverId(['docserverId' => $document['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]); + $docserver = DocserverModel::getByDocserverId(['docserverId' => $document[0]['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]); if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) { return $response->withStatus(400)->withJson(['errors' => 'Docserver does not exist']); } - $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $document['path']) . $document['filename']; + $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $document[0]['path']) . $document[0]['filename']; if (!file_exists($pathToDocument)) { return $response->withStatus(404)->withJson(['errors' => 'Document not found on docserver']); } $fingerprint = StoreController::getFingerPrint(['filePath' => $pathToDocument]); - if (!empty($document['fingerprint']) && $document['fingerprint'] != $fingerprint) { + if (!empty($document[0]['fingerprint']) && $document[0]['fingerprint'] != $fingerprint) { return $response->withStatus(400)->withJson(['errors' => 'Fingerprints do not match']); } diff --git a/src/frontend/app/actions/actions-list.component.ts b/src/frontend/app/actions/actions-list.component.ts index 9fac171484093dd3cb3ca788cfb7df47f082f3d7..93acb06b90ee33aa54c7e7311dfa40544a3b71b2 100644 --- a/src/frontend/app/actions/actions-list.component.ts +++ b/src/frontend/app/actions/actions-list.component.ts @@ -186,7 +186,7 @@ export class ActionsListComponent implements OnInit { }); } - createAcknowledgementReceiptAction() { + createAcknowledgementReceiptsAction() { const dialogRef = this.dialog.open(CreateAcknowledgementReceiptActionComponent, { width: '500px', data: { diff --git a/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.html b/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.html index b271561a6804955507c2992f5a137559c83e0256..7effec33a9299a9d21f5ab78142343098c3a8c90 100644 --- a/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.html +++ b/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.html @@ -1,20 +1,38 @@ <h1 mat-dialog-title>Confirmer "{{data.action.label_action}}"</h1> -<div mat-dialog-content> +<div mat-dialog-content *ngIf="!loadingInit"> <div *ngIf="loading" class="loading" style="display:flex;height:100%;"> <mat-spinner style="margin:auto;"></mat-spinner> </div> <div class="row"> <div class="col-md-12"> - {{lang.makeActionOn}} + <div *ngIf="acknowledgement.sendEmail || acknowledgement.sendPaper">{{lang.makeActionOn}} <b *ngIf="data.contextMode" color="primary" class="highlight">{{data.contextChrono}}</b> - <b *ngIf="!data.contextMode" color="primary" class="highlight">{{data.selectedRes.length}} {{lang.elements}}</b> ? + <b *ngIf="!data.contextMode" color="primary" class="highlight">{{data.selectedRes.length}} {{lang.elements}}<br></b> ?<br><br></div> + <div *ngIf="acknowledgement.alreadySend.number"> + <div class="alert-message alert-message-info" role="alert" style="margin-top: 30px;">{{acknowledgement.alreadySend.number}} accusé(s) de réception déjà envoyé(s) :</div> + <mat-list> + <mat-list-item *ngFor="let info of acknowledgement.alreadySend.list"> + <span mat-line>{{info.alt_identifier}}</span> + </mat-list-item> + </mat-list> + </div> + <div *ngIf="acknowledgement.noSendAR.number"> + <div class="alert-message alert-message-danger" role="alert" style="margin-top: 30px;">{{acknowledgement.noSendAR.number}} accusé(s) de réception impossible à envoyer :</div> + <mat-list> + <mat-list-item *ngFor="let info of acknowledgement.noSendAR.list"> + <span mat-line>{{info.alt_identifier}} : {{info.info}} </span> + </mat-list-item> + </mat-list> + </div> + <b *ngIf="acknowledgement.sendEmail" color="primary" class="highlight">{{acknowledgement.sendEmail}} accusé(s) de réception électronique à envoyer<br></b><br> + <b *ngIf="acknowledgement.sendPaper" color="primary" class="highlight">{{acknowledgement.sendPaper}} accusé(s) de réception papier à générer<br></b><br> </div> - <div class="col-md-12"> + <div class="col-md-12" *ngIf="acknowledgement.sendEmail || acknowledgement.sendPaper"> <app-note-editor #noteEditor></app-note-editor> </div> </div> </div> <div mat-dialog-actions class="actions"> - <button mat-raised-button mat-button color="primary" [disabled]="loading" (click)="onSubmit()">{{lang.validate}}</button> + <button mat-raised-button mat-button color="primary" [disabled]="loading || (!acknowledgement.sendEmail && !acknowledgement.sendPaper)" (click)="onSubmit()" >{{lang.validate}}</button> <button mat-raised-button mat-button [disabled]="loading" [mat-dialog-close]="">{{lang.cancel}}</button> </div> diff --git a/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.scss b/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.scss index 6de958ac477b05058fa3e5eeab40d680f58533a5..44d9e9f43b6146566ac55c07a82835bf5c1afb1b 100644 --- a/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.scss +++ b/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.scss @@ -22,3 +22,79 @@ z-index: 1; overflow: hidden; } + +.alert-message +{ + margin: 20px 0; + padding: 20px; + border-left: 3px solid #eee; +} +.alert-message h4 +{ + margin-top: 0; + margin-bottom: 5px; +} +.alert-message p:last-child +{ + margin-bottom: 0; +} +.alert-message code +{ + background-color: #fff; + border-radius: 3px; +} +.alert-message-success +{ + background-color: #F4FDF0; + border-color: #3C763D; +} +.alert-message-success h4 +{ + color: #3C763D; +} +.alert-message-danger +{ + background-color: #8e3e521a; + border-color: #8e3e52; + color: #8e3e52; +} +.alert-message-danger h4 +{ + color: #8e3e52; +} +.alert-message-warning +{ + background-color: #fcf8f2; + border-color: #f0ad4e; +} +.alert-message-warning h4 +{ + color: #f0ad4e; +} +.alert-message-info +{ + background-color: #f4f8fa; + border-color: #5bc0de; +} +.alert-message-info h4 +{ + color: #5bc0de; +} +.alert-message-default +{ + background-color: #EEE; + border-color: #B4B4B4; +} +.alert-message-default h4 +{ + color: #000; +} +.alert-message-notice +{ + background-color: #FCFCDD; + border-color: #BDBD89; +} +.alert-message-notice h4 +{ + color: #444; +} \ No newline at end of file diff --git a/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.ts b/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.ts index 402bc523eb407176202ca11b3995e7474b42a364..91169f3019ab5af210ab6ac602c51df709634f32 100644 --- a/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.ts +++ b/src/frontend/app/actions/create-acknowledgement-receipt-action/create-acknowledgement-receipt-action.component.ts @@ -14,6 +14,8 @@ export class CreateAcknowledgementReceiptActionComponent implements OnInit { lang: any = LANG; loading: boolean = false; + loadingInit: boolean = false; + acknowledgement: any; @ViewChild('noteEditor') noteEditor: NoteEditorComponent; loadingExport: boolean; @@ -21,11 +23,14 @@ export class CreateAcknowledgementReceiptActionComponent implements OnInit { constructor(public http: HttpClient, private notify: NotificationService, public dialogRef: MatDialogRef<CreateAcknowledgementReceiptActionComponent>, @Inject(MAT_DIALOG_DATA) public data: any) { } ngOnInit(): void { - this.http.post("../../rest/resourcesList/users/' + this.data.ownerId + '/groups/' + this.data.groupId + '/baskets/' + this.data.basketId + '/checkAcknowledgement", {resources : this.data.selectedRes}) - .subscribe(() => { - + this.loadingInit = true; + this.http.post('../../rest/resourcesList/users/' + this.data.currentBasketInfo.ownerId + '/groups/' + this.data.currentBasketInfo.groupId + '/baskets/' + this.data.currentBasketInfo.basketId + '/checkAcknowledgementReceipt', {resources : this.data.selectedRes}) + .subscribe((data : any) => { + this.acknowledgement = data; + this.loadingInit = false; }, (err) => { this.notify.error(err.error.errors); + this.loadingInit = false; }); } @@ -46,7 +51,7 @@ export class CreateAcknowledgementReceiptActionComponent implements OnInit { downloadAcknowledgementReceipt(data : any) { this.loadingExport = true; - this.http.put('../../rest/resourcesList/users/' + this.data.ownerId + '/groups/' + this.data.groupId + '/baskets/' + this.data.basketId + '/acknowledgementReceipt', { 'resources' : data }) + this.http.post('../../rest/resourcesList/users/' + this.data.currentBasketInfo.ownerId + '/groups/' + this.data.currentBasketInfo.groupId + '/baskets/' + this.data.currentBasketInfo.basketId + '/acknowledgementReceipt', { 'resources' : data }, { responseType: "blob" }) .subscribe((data) => { let downloadLink = document.createElement('a'); downloadLink.href = window.URL.createObjectURL(data);