Commit fb7f421b authored by Guillaume Heurtier's avatar Guillaume Heurtier
Browse files

FEAT #13274 TIME 9:30 added summary sheet as email attachment

parent 41724915
......@@ -33,6 +33,10 @@
<id>outgoing_mail</id>
<label>_OUTGOING_MAIL</label>
</type>
<type show="true" with_chrono="true" icon="" sign="false">
<id>summary_sheet</id>
<label>_SUMMARY_SHEET</label>
</type>
</attachment_types>
<contact_check>
<check_days_before>5</check_days_before> <!-- 0 if you want to disabled -->
......
......@@ -165,6 +165,11 @@ class SummarySheetController
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer($fileContent);
$queryParams = $request->getQueryParams();
if (!empty($queryParams['mode']) && $queryParams['mode'] == 'base64') {
return $response->withJson(['encodedDocument' => base64_encode($fileContent), 'mimeType' => $mimeType]);
}
$response->write($fileContent);
$response = $response->withAddedHeader('Content-Disposition', "inline; filename=maarch.pdf");
......
......@@ -86,7 +86,7 @@
[resId]="currentResourceInformations.resId" [expanded]="true">
</app-diffusions-list>
<app-sent-resource-list *ngIf="currentTool === 'emails' && !loading" #appSentResource
[resId]="currentResourceInformations.resId"
[resId]="currentResourceInformations.resId" [currentUserId]="currentUserId" [currentGroupId]="currentGroupId" [currentBasketId]="currentBasketId"
(reloadBadgeSentResource)="refreshBadge($event,'emails')">
</app-sent-resource-list>
<app-visa-workflow *ngIf="currentTool === 'visaCircuit' && !loading" #appVisaWorkflow
......@@ -330,4 +330,4 @@
class="panel-right" style="overflow-x:hidden;" [class.docView]="!filtersListService.filterMode"
[ngStyle]="{'width': appService.getViewMode() ? '80%' : '30%'}" autoFocus="false">
</mat-sidenav>
</mat-sidenav-container>
\ No newline at end of file
</mat-sidenav-container>
......@@ -2,7 +2,7 @@ import {Component, OnInit, ViewChild, EventEmitter, Input, Output} from '@angula
import { HttpClient } from '@angular/common/http';
import { TranslateService } from '@ngx-translate/core';
import { NotificationService } from '../../service/notification/notification.service';
import { of } from 'rxjs';
import { of } from 'rxjs/internal/observable/of';
import { MatDialog } from '@angular/material/dialog';
import { MatSort } from '@angular/material/sort';
import { MatTableDataSource } from '@angular/material/table';
......@@ -14,12 +14,11 @@ import { SentNumericPackagePageComponent } from './sent-numeric-package-page/sen
@Component({
selector: 'app-sent-resource-list',
templateUrl: "sent-resource-list.component.html",
templateUrl: 'sent-resource-list.component.html',
styleUrls: ['sent-resource-list.component.scss'],
})
export class SentResourceListComponent implements OnInit {
loading: boolean = true;
dataSource: any;
......@@ -34,6 +33,9 @@ export class SentResourceListComponent implements OnInit {
@Input('resId') resId: number = null;
@Input() currentUserId: number = null;
@Input() currentGroupId: number = null;
@Input() currentBasketId: number = null;
@Output() reloadBadgeSentResource = new EventEmitter<string>();
......@@ -267,7 +269,11 @@ export class SentResourceListComponent implements OnInit {
}
if (row.canManage || row.id === null) {
const dialogRef = this.dialog.open(SentResourcePageComponent, { panelClass: 'maarch-modal', width:'60vw', disableClose: true, data: { title: title, resId: this.resId, emailId: row.id, emailType: row.type } });
const dialogRef = this.dialog.open(SentResourcePageComponent, {
panelClass: 'maarch-modal', width: '60vw', disableClose: true, data: {
title: title, resId: this.resId, emailId: row.id, emailType: row.type, currentUserId: this.currentUserId, currentGroupId: this.currentGroupId, currentBasketId: this.currentBasketId
}
});
dialogRef.afterClosed().pipe(
filter((data: any) => data.state === 'success' || data === 'success'),
......
......@@ -102,9 +102,9 @@
<input matInput [placeholder]="this.translate.instant('lang.object')" [readonly]="!canManageMail()" [(ngModel)]="emailsubject"
maxlength="255">
<button mat-icon-button matSuffix *ngFor="let keyVal of emailAttachTool | keyvalue"
[disabled]="!canManageMail() || (emailAttachTool[keyVal.key].list.length === 0)"
[disabled]="!canManageMail() || (emailAttachTool[keyVal.key].list.length === 0 && keyVal.key !== 'summarySheet')"
[title]="emailAttachTool[keyVal.key].title"
(click)="$event.stopPropagation();currentEmailAttachTool=keyVal.key;"
(click)="$event.stopPropagation();currentEmailAttachTool=keyVal.key;openSummarySheetModal(keyVal.key)"
[matMenuTriggerFor]="emailAttachListMenu">
<mat-icon class="{{emailAttachTool[keyVal.key].icon}}"
[class.activeButton]="(keyVal.key === 'document' && emailAttach.document.isLinked) || (keyVal.key !== 'document' && emailAttach[keyVal.key].length > 0)"
......
......@@ -16,6 +16,7 @@ import { PrivilegeService } from '../../../service/privileges.service';
import { HeaderService } from '../../../service/header.service';
import { Observable } from 'rxjs/internal/Observable';
import { of } from 'rxjs/internal/observable/of';
import { SummarySheetComponent } from '../../list/summarySheet/summary-sheet.component';
declare var $: any;
declare var tinymce: any;
......@@ -28,7 +29,6 @@ declare var tinymce: any;
})
export class SentResourcePageComponent implements OnInit {
loading: boolean = true;
readonly separatorKeysCodes: number[] = [COMMA, SEMICOLON, FF_SEMICOLON, 190];
......@@ -78,9 +78,17 @@ export class SentResourcePageComponent implements OnInit {
title: this.translate.instant('lang.attachAttachment'),
list: []
},
summarySheet: {
icon: 'fa fa-link',
title: this.translate.instant('lang.attachSummarySheet'),
list: []
},
};
emailAttach: any = {};
encodedSummarySheet: any = null;
summarySheetUnits: any = [];
canManage: boolean = false;
pdfMode: boolean = false;
htmlMode: boolean = true;
......@@ -368,12 +376,14 @@ export class SentResourcePageComponent implements OnInit {
});
} else if (element === 'isLinked' && data.document.isLinked === true) {
this.emailAttach.document.isLinked = true;
this.emailAttach.document.format = data.document.original || data.document.original === undefined ? this.emailAttachTool.document.list[0].format : 'pdf',
this.emailAttach.document.original = data.document.original;
this.emailAttach.document.format = data.document.original || data.document.original === undefined ? this.emailAttachTool.document.list[0].format : 'pdf';
this.emailAttach.document.original = data.document.original;
this.emailAttach.document.size = this.emailAttach.document.original ? this.emailAttachTool.document.list[0].size : this.emailAttachTool.document.list[0].convertedDocument.size;
}
});
console.log(this.emailAttach);
resolve(true);
}),
catchError((err) => {
......@@ -594,8 +604,13 @@ export class SentResourcePageComponent implements OnInit {
this.filteredEmails = of([]);
}
onSubmit() {
async onSubmit() {
this.emailStatus = 'WAITING';
if (this.summarySheetUnits !== null) {
await this.createSummarySheet();
}
if (this.data.emailId === null) {
if (!this.isAllEmailRightFormat()) {
this.notify.error(this.translate.instant('lang.badEmailsFormat'));
......@@ -716,8 +731,8 @@ export class SentResourcePageComponent implements OnInit {
if (type === 'document') {
if (this.emailAttach.document.isLinked === false) {
this.emailAttach.document.isLinked = true;
this.emailAttach.document.format = mode !== 'pdf' ? item.format : 'pdf',
this.emailAttach.document.original = mode !== 'pdf';
this.emailAttach.document.format = mode !== 'pdf' ? item.format : 'pdf';
this.emailAttach.document.original = mode !== 'pdf';
this.emailAttach.document.size = mode === 'pdf' ? item.convertedDocument.size : item.size;
}
} else {
......@@ -872,4 +887,117 @@ export class SentResourcePageComponent implements OnInit {
});
}
}
openSummarySheetModal(keyVal: any): void {
if (keyVal !== 'summarySheet') {
return;
}
let today: any;
let dd: any;
let mm: any;
let yyyy: any;
today = new Date();
dd = today.getDate();
mm = today.getMonth() + 1;
yyyy = today.getFullYear();
if (dd < 10) {
dd = '0' + dd;
}
if (mm < 10) {
mm = '0' + mm;
}
today = dd + '-' + mm + '-' + yyyy;
const title = this.translate.instant('lang.summarySheet') + ' ' + today;
const dialogRef = this.dialog.open(SummarySheetComponent, {
panelClass: 'maarch-full-height-modal',
width: '800px',
data: {
paramMode: true
}
});
dialogRef.afterClosed().pipe(
tap((data: any) => {
this.summarySheetUnits = data;
this.emailAttach['summarySheet'].push({
label: title,
format: 'pdf',
title: title
});
}),
catchError((err: any) => {
this.notify.handleSoftErrors(err);
return of(false);
})
).subscribe();
}
async createSummarySheet() {
return new Promise(resolve => {
this.http.post('../rest/resourcesList/users/' + this.data.currentUserId + '/groups/' + this.data.currentGroupId + '/baskets/' + this.data.currentBasketId + '/summarySheets?mode=base64', {
units: this.summarySheetUnits,
resources: [this.data.resId]
})
.pipe(
tap(async (sheetData: any) => {
await this.saveSummarySheet(sheetData.encodedDocument);
this.loading = false;
resolve(true);
}),
catchError((err) => {
this.notify.handleErrors(err);
resolve(false);
return of(false);
})
).subscribe();
});
}
async saveSummarySheet(encodedDocument: any) {
return new Promise(resolve => {
let today: any;
let dd: any;
let mm: any;
let yyyy: any;
today = new Date();
dd = today.getDate();
mm = today.getMonth() + 1;
yyyy = today.getFullYear();
if (dd < 10) {
dd = '0' + dd;
}
if (mm < 10) {
mm = '0' + mm;
}
today = dd + '-' + mm + '-' + yyyy;
const title = this.translate.instant('lang.summarySheet') + ' ' + today;
this.http.post('../rest/attachments', {resIdMaster: this.data.resId, encodedFile: encodedDocument, type: 'summary_sheet', format: 'PDF', title: title})
.pipe(
tap((dataAttachment: any) => {
this.emailAttach['summarySheet'] = undefined;
this.emailAttach['attachments'].push({
id: dataAttachment.id,
label: title,
format: 'pdf',
title: title,
original: true
});
this.loading = false;
resolve(true);
}),
catchError((err) => {
this.notify.handleErrors(err);
resolve(false);
return of(false);
})
)
.subscribe();
});
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment