From 0337fb37867b64ce9d777d5de6df3d20fead3172 Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Thu, 24 Sep 2020 18:48:28 +0200
Subject: [PATCH] FEAT #14539 TIME 3:15 Contact form for registeredMail
 recipient + countries list in contact form + short label in registeredMail
 sender

---
 .../controllers/RegisteredMailController.php  |  5 ++
 .../controllers/RegisteredMailTrait.php       | 18 ++++++-
 .../page/form/contacts-form.component.html    | 12 ++++-
 .../page/form/contacts-form.component.ts      | 50 +++++++++++++++++--
 .../contact-autocomplete.component.ts         |  5 +-
 .../indexing-form.component.html              |  5 +-
 .../indexing-form/indexing-form.component.ts  |  8 +--
 7 files changed, 90 insertions(+), 13 deletions(-)

diff --git a/src/app/registeredMail/controllers/RegisteredMailController.php b/src/app/registeredMail/controllers/RegisteredMailController.php
index 4a81aa81c1a..b04bdc68069 100644
--- a/src/app/registeredMail/controllers/RegisteredMailController.php
+++ b/src/app/registeredMail/controllers/RegisteredMailController.php
@@ -35,6 +35,7 @@ use Slim\Http\Request;
 use Slim\Http\Response;
 use SrcCore\models\DatabaseModel;
 use SrcCore\models\ValidatorModel;
+use User\models\UserModel;
 
 class RegisteredMailController
 {
@@ -410,8 +411,12 @@ class RegisteredMailController
 
     public static function generateRegisteredMailPDf(array $args)
     {
+        $resource = ResModel::getById(['select' => ['typist'], 'resId' => $args['resId']]);
+        $primaryEntity = UserModel::getPrimaryEntityById(['select' => ['short_label'], 'id' => $resource['typist']]);
+
         $sender = ContactController::getContactAfnor([
             'company'               => $args['issuingSite']['label'],
+            'firstname'             => $primaryEntity['short_label'],
             'address_number'        => $args['issuingSite']['address_number'],
             'address_street'        => $args['issuingSite']['address_street'],
             'address_additional1'   => $args['issuingSite']['address_additional1'],
diff --git a/src/app/registeredMail/controllers/RegisteredMailTrait.php b/src/app/registeredMail/controllers/RegisteredMailTrait.php
index c942b22dba0..14b5e6a95e8 100644
--- a/src/app/registeredMail/controllers/RegisteredMailTrait.php
+++ b/src/app/registeredMail/controllers/RegisteredMailTrait.php
@@ -12,6 +12,7 @@
 
 namespace RegisteredMail\controllers;
 
+use Contact\models\ContactModel;
 use Parameter\models\ParameterModel;
 use RegisteredMail\models\IssuingSiteModel;
 use RegisteredMail\models\RegisteredMailModel;
@@ -42,7 +43,22 @@ trait RegisteredMailTrait
             return ['errors' => ['R3 warranty is not allowed for type RW']];
         } elseif (empty($args['data']['recipient']) || empty($args['data']['issuingSiteId'])) {
             return ['errors' => ['recipient or issuingSiteId is missing to print registered mail']];
-        } elseif ((empty($args['data']['recipient']['company']) && (empty($args['data']['recipient']['lastname']) || empty($args['data']['recipient']['firstname']))) || empty($args['data']['recipient']['addressStreet']) || empty($args['data']['recipient']['addressPostcode']) || empty($args['data']['recipient']['addressTown']) || empty($args['data']['recipient']['addressCountry'])) {
+        } elseif (empty($args['data']['recipient'][0]['id'])) {
+            return ['errors' => ['recipient is empty']];
+        }
+
+        $args['data']['recipient'] = ContactModel::getById(
+            [
+            'select' => ['company', 'lastname', 'firstname', 'address_town as "addressTown"', 'address_number as "addressNumber"', 'address_street as "addressStreet"', 'address_country as "addressCountry"', 'address_postcode as "addressPostcode"', 'address_additional1 as addressAdditional1', 'address_additional2 as addressAdditional2', 'department'],
+            'id' => $args['data']['recipient'][0]['id']]
+        );
+        
+        if (empty($args['data']['recipient']['lastname']) && !empty($args['data']['recipient']['department'])) {
+            $args['data']['recipient']['lastname'] = $args['data']['recipient']['department'];
+        }
+        unset($args['data']['recipient']['department']);
+
+        if ((empty($args['data']['recipient']['company']) && (empty($args['data']['recipient']['lastname']) || empty($args['data']['recipient']['firstname']))) || empty($args['data']['recipient']['addressStreet']) || empty($args['data']['recipient']['addressPostcode']) || empty($args['data']['recipient']['addressTown']) || empty($args['data']['recipient']['addressCountry'])) {
             return ['errors' => ['company and firstname/lastname, or addressStreet, addressPostcode, addressTown or addressCountry is empty in Recipient']];
         }
 
diff --git a/src/frontend/app/administration/contact/page/form/contacts-form.component.html b/src/frontend/app/administration/contact/page/form/contacts-form.component.html
index 908068b6281..921466400dd 100644
--- a/src/frontend/app/administration/contact/page/form/contacts-form.component.html
+++ b/src/frontend/app/administration/contact/page/form/contacts-form.component.html
@@ -104,7 +104,7 @@
                             *ngIf="(field.unit === unit.id && unit.id !== 'address') || (field.unit === unit.id && unit.id === 'address' && !addressBANMode)">
                             <p mat-line class="contact-content" *ngIf="field.display">
                                 <ng-container
-                                    *ngIf="field.type === 'string' && field.id !== 'communicationMeans' && field.id !== 'externalId_m2m'">
+                                    *ngIf="field.type === 'string' && field.id !== 'communicationMeans' && field.id !== 'externalId_m2m' && field.id != 'addressCountry'">
                                     <mat-form-field>
                                         <input matInput [formControl]="field.control" [placeholder]="field.label"
                                             (blur)="checkCompany(field);checkFilling();" (ngModelChange)="toUpperCase(field, $event)" [required]="field.required">
@@ -255,6 +255,16 @@
                                                   [innerHTML]="field.desc"></mat-hint>
                                     </mat-form-field>
                                 </ng-container>
+                                <ng-container *ngIf="field.id === 'addressCountry'">
+                                    <mat-form-field>
+                                        <input matInput #autoCompleteInput [formControl]="field.control" [placeholder]="field.label" [matAutocomplete]="matAutocompleteCountries">
+                                        <mat-autocomplete #matAutocompleteCountries="matAutocomplete" isOpen="true" (optionSelected)="selectCountry($event)">
+                                            <mat-option *ngFor="let country of countriesFilteredResult | async" [value]="country">
+                                                {{country}}
+                                            </mat-option>
+                                        </mat-autocomplete>
+                                    </mat-form-field>
+                                </ng-container>
                             </p>
                             <button *ngIf="field.display" [disabled]="!canDelete(field)" mat-icon-button matSuffix
                                 color="warn" (click)="removeField(field)">
diff --git a/src/frontend/app/administration/contact/page/form/contacts-form.component.ts b/src/frontend/app/administration/contact/page/form/contacts-form.component.ts
index c3d8488b642..9bf36133dfc 100644
--- a/src/frontend/app/administration/contact/page/form/contacts-form.component.ts
+++ b/src/frontend/app/administration/contact/page/form/contacts-form.component.ts
@@ -6,7 +6,7 @@ import { HeaderService } from '../../../../../service/header.service';
 import { MatSidenav } from '@angular/material/sidenav';
 import { AppService } from '../../../../../service/app.service';
 import { MatDialog } from '@angular/material/dialog';
-import { switchMap, catchError, filter, exhaustMap, tap, debounceTime, distinctUntilChanged, finalize, map } from 'rxjs/operators';
+import { switchMap, catchError, filter, exhaustMap, tap, debounceTime, distinctUntilChanged, finalize, map, startWith } from 'rxjs/operators';
 import { FormControl, Validators, ValidatorFn } from '@angular/forms';
 import { ActivatedRoute, Router } from '@angular/router';
 import { ContactService } from '../../../../../service/contact.service';
@@ -15,6 +15,7 @@ import { trigger, transition, style, animate } from '@angular/animations';
 import { Observable } from 'rxjs/internal/Observable';
 import { of } from 'rxjs/internal/observable/of';
 import { environment } from '../../../../../environments/environment';
+import { LatinisePipe } from 'ngx-pipes';
 
 @Component({
     selector: 'app-contact-form',
@@ -43,7 +44,10 @@ export class ContactsFormComponent implements OnInit {
     @ViewChild('snav2', { static: true }) public sidenavRight: MatSidenav;
 
 
-    
+    countries: any = [];
+    countriesFilteredResult: Observable<string[]>;
+    countryControl = new FormControl();
+
     loading: boolean = false;
 
     @Input() creationMode: boolean = true;
@@ -304,7 +308,8 @@ export class ContactsFormComponent implements OnInit {
         public appService: AppService,
         public dialog: MatDialog,
         private contactService: ContactService,
-        public functions: FunctionsService
+        public functions: FunctionsService,
+        private latinisePipe: LatinisePipe
     ) { }
 
     ngOnInit(): void {
@@ -333,6 +338,8 @@ export class ContactsFormComponent implements OnInit {
                     this.initAutocompleteAddressBan();
                     this.initAutocompleteCommunicationMeans();
                     this.initAutocompleteExternalIdM2M();
+                    this.getCountries();
+                    this.initAutocompleteCountries();
                 }),
                 finalize(() => this.loading = false),
                 catchError((err: any) => {
@@ -363,6 +370,8 @@ export class ContactsFormComponent implements OnInit {
                     this.initAutocompleteAddressBan();
                     this.initAutocompleteCommunicationMeans();
                     this.initAutocompleteExternalIdM2M();
+                    this.getCountries();
+                    this.initAutocompleteCountries();
                 }),
                 exhaustMap(() => this.http.get('../rest/contacts/' + this.contactId)),
                 map((data: any) => {
@@ -451,6 +460,41 @@ export class ContactsFormComponent implements OnInit {
         this.contactForm.filter(contact => contact.id === 'civility')[0].values = formatedCivilities;
     }
 
+    getCountries() {
+        this.http.get(`../rest/registeredMail/countries`).pipe(
+            tap((data: any) => {
+                this.countries = data.countries.map(
+                    (item: any) => this.latinisePipe.transform(item.toUpperCase()));
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+    initAutocompleteCountries() {
+        this.contactForm.map((field: any) => {
+            if (field.id === 'addressCountry') {
+                this.countriesFilteredResult = field.control.valueChanges
+                .pipe(
+                    startWith(''),
+                    map((value: any) => this._filter(value))
+                );
+            }
+        });
+    }
+
+    private _filter(value: string): string[] {
+        const filterValue = value.toLowerCase();
+        return this.countries.filter((option: any) => option.toLowerCase().includes(filterValue));
+    }
+
+    selectCountry(ev: any) {
+        const indexFieldAddressCountry = this.contactForm.map(field => field.id).indexOf('addressCountry');
+        this.contactForm[indexFieldAddressCountry].control.setValue(ev.option.value);
+    }
+
     initCustomElementForm(data: any) {
         let valArr: ValidatorFn[] = [];
 
diff --git a/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts b/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts
index 776e94044bd..846c548e471 100755
--- a/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts
+++ b/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts
@@ -28,8 +28,6 @@ import { FunctionsService } from '../../../service/functions.service';
 
 export class ContactAutocompleteComponent implements OnInit {
 
-    
-
     loading: boolean = false;
     loadingValues: boolean = true;
 
@@ -56,6 +54,7 @@ export class ContactAutocompleteComponent implements OnInit {
     @Input('control') controlAutocomplete: FormControl;
 
     @Input() id: string = 'contact-autocomplete';
+    @Input() exclusion: string = '';
 
     @Input() singleMode: boolean = false;
 
@@ -156,7 +155,7 @@ export class ContactAutocompleteComponent implements OnInit {
     }
 
     getDatas(data: string) {
-        return this.http.get('../rest/autocomplete/correspondents', { params: { 'search': data } });
+        return this.http.get('../rest/autocomplete/correspondents' + this.exclusion, { params: { 'search': data } });
     }
 
     selectOpt(ev: any) {
diff --git a/src/frontend/app/indexation/indexing-form/indexing-form.component.html b/src/frontend/app/indexation/indexing-form/indexing-form.component.html
index f6cf72724df..b955edd081d 100644
--- a/src/frontend/app/indexation/indexing-form/indexing-form.component.html
+++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.html
@@ -212,7 +212,10 @@
                                     </app-issuing-site-input>
                                 </ng-container>
                                 <ng-container *ngIf="field.identifier === 'registeredMail_recipient'">
-                                    <app-registered-mail-recipient-input #appRegisteredMailRecipientInput [control]="arrFormControl[field.identifier]" [registeredMailType]="arrFormControl['registeredMail_type'].value" style="width:100%;">
+                                    <app-contact-autocomplete *ngIf="mode === 'indexation'" [exclusion]="'?noUsers=true&noEntities=true&noContactsGroups=true'" [id]="field.identifier" [singleMode]="true" [control]="arrFormControl[field.identifier]" style="width:100%;" (retrieveDocumentEvent)="retrieveDocumentEvent.emit()">
+                                    </app-contact-autocomplete>
+                                    
+                                    <app-registered-mail-recipient-input *ngIf="mode !== 'indexation'" #appRegisteredMailRecipientInput [control]="arrFormControl[field.identifier]" [registeredMailType]="arrFormControl['registeredMail_type'].value" style="width:100%;">
                                     </app-registered-mail-recipient-input>
                                 </ng-container>
                             </div>
diff --git a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts
index 90487d3fbcf..8b80f07744a 100755
--- a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts
+++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts
@@ -225,9 +225,9 @@ export class IndexingFormComponent implements OnInit {
         {
             identifier: 'registeredMail_recipient',
             label: this.translate.instant('lang.registeredMailRecipient'),
-            type: 'registeredMailRecipient',
+            type: 'autocomplete',
             default_value: null,
-            values: [],
+            values: ['/rest/autocomplete/correspondents'],
             enabled: true,
         },
         {
@@ -501,8 +501,8 @@ export class IndexingFormComponent implements OnInit {
 
                 formatData['customFields'][element.identifier.split('_')[1]] = element.default_value;
 
-            } else if (element.identifier === 'registeredMail_recipient') {
-                formatData[element.identifier] = this.appRegisteredMailRecipientInput.getFormatedAdress();
+            // } else if (element.identifier === 'registeredMail_recipient') {
+            //     formatData[element.identifier] = this.appRegisteredMailRecipientInput.getFormatedAdress();
             } else {
                 formatData[element.identifier] = element.default_value;
             }
-- 
GitLab