From 11b463f5c1f36a513421009a9516eb13fa80ba3f Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Mon, 31 Aug 2020 17:58:02 +0200
Subject: [PATCH] FEAT #14004 TIME 1:00 fix errors in english + prevent delete
 site if site is used

---
 .../controllers/IssuingSiteController.php     | 38 +++++++++++--------
 .../RegisteredNumberRangeController.php       | 12 +++---
 .../issuing-site/issuing-site.component.html  |  4 +-
 .../issuing-site/issuing-site.component.ts    |  4 +-
 .../registered-mail.component.ts              |  7 ++--
 src/lang/lang-en.json                         |  7 +++-
 src/lang/lang-fr.json                         |  7 +++-
 7 files changed, 48 insertions(+), 31 deletions(-)

diff --git a/src/app/registeredMail/controllers/IssuingSiteController.php b/src/app/registeredMail/controllers/IssuingSiteController.php
index 0ae034ea367..59a06b165d5 100644
--- a/src/app/registeredMail/controllers/IssuingSiteController.php
+++ b/src/app/registeredMail/controllers/IssuingSiteController.php
@@ -69,13 +69,13 @@ class IssuingSiteController
             'id'                 => $site['id'],
             'label'              => $site['label'],
             'postOfficeLabel'    => $site['post_office_label'] ?? null,
-            'accountNumber'      => $site['account_number'] ?? null,
-            'addressNumber'      => $site['address_number'] ?? null,
-            'addressStreet'      => $site['address_street'] ?? null,
+            'accountNumber'      => $site['account_number'],
+            'addressNumber'      => $site['address_number'],
+            'addressStreet'      => $site['address_street'],
             'addressAdditional1' => $site['address_additional1'] ?? null,
             'addressAdditional2' => $site['address_additional2'] ?? null,
-            'addressPostcode'    => $site['address_postcode'] ?? null,
-            'addressTown'        => $site['address_town'] ?? null,
+            'addressPostcode'    => $site['address_postcode'],
+            'addressTown'        => $site['address_town'],
             'addressCountry'     => $site['address_country'] ?? null
         ];
 
@@ -126,7 +126,7 @@ class IssuingSiteController
             'limit ' => 1
         ]);
         if (!empty($site)) {
-            return $response->withStatus(400)->withJson(['errors' => 'Body accountNumber is already used by another site']);
+            return $response->withStatus(400)->withJson(['errors' => 'Body accountNumber is already used by another site', 'lang' => 'accountNumberAlreadyUsed']);
         }
 
         if (!empty($body['entities']) && !Validator::arrayType()->validate($body['entities'])) {
@@ -143,12 +143,12 @@ class IssuingSiteController
             'label'              => $body['label'],
             'postOfficeLabel'    => $body['postOfficeLabel'] ?? null,
             'accountNumber'      => $body['accountNumber'],
-            'addressNumber'      => $body['addressNumber'] ?? null,
-            'addressStreet'      => $body['addressStreet'] ?? null,
+            'addressNumber'      => $body['addressNumber'],
+            'addressStreet'      => $body['addressStreet'],
             'addressAdditional1' => $body['addressAdditional1'] ?? null,
             'addressAdditional2' => $body['addressAdditional2'] ?? null,
-            'addressPostcode'    => $body['addressPostcode'] ?? null,
-            'addressTown'        => $body['addressTown'] ?? null,
+            'addressPostcode'    => $body['addressPostcode'],
+            'addressTown'        => $body['addressTown'],
             'addressCountry'     => $body['addressCountry'] ?? null
         ]);
 
@@ -209,7 +209,7 @@ class IssuingSiteController
             'limit ' => 1
         ]);
         if (!empty($site)) {
-            return $response->withStatus(400)->withJson(['errors' => 'Body accountNumber is already used by another site']);
+            return $response->withStatus(400)->withJson(['errors' => 'Body accountNumber is already used by another site', 'lang' => 'accountNumberAlreadyUsed']);
         }
 
         if (!empty($body['entities']) && !Validator::arrayType()->validate($body['entities'])) {
@@ -227,12 +227,12 @@ class IssuingSiteController
                 'label'               => $body['label'],
                 'post_office_label'   => $body['postOfficeLabel'] ?? null,
                 'account_number'      => $body['accountNumber'],
-                'address_number'      => $body['addressNumber'] ?? null,
-                'address_street'      => $body['addressStreet'] ?? null,
+                'address_number'      => $body['addressNumber'],
+                'address_street'      => $body['addressStreet'],
                 'address_additional1' => $body['addressAdditional1'] ?? null,
                 'address_additional2' => $body['addressAdditional2'] ?? null,
-                'address_postcode'    => $body['addressPostcode'] ?? null,
-                'address_town'        => $body['addressTown'] ?? null,
+                'address_postcode'    => $body['addressPostcode'],
+                'address_town'        => $body['addressTown'],
                 'address_country'     => $body['addressCountry'] ?? null
             ],
             'where' => ['id = ?'],
@@ -273,6 +273,14 @@ class IssuingSiteController
             return $response->withStatus(204);
         }
 
+        $ranges = RegisteredNumberRangeModel::get([
+            'where' => ['site_id = ?', 'status = ?'],
+            'data'  => [$args['id'], 'OK']
+        ]);
+        if (!empty($ranges)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Cannot delete site : site is used by an active range', 'lang' => 'siteIsUsedByActiveRange']);
+        }
+
         IssuingSiteEntitiesModel::delete([
             'where' => ['site_id = ?'],
             'data'  => [$args['id']]
diff --git a/src/app/registeredMail/controllers/RegisteredNumberRangeController.php b/src/app/registeredMail/controllers/RegisteredNumberRangeController.php
index b701aeea76b..369f1407b2c 100644
--- a/src/app/registeredMail/controllers/RegisteredNumberRangeController.php
+++ b/src/app/registeredMail/controllers/RegisteredNumberRangeController.php
@@ -129,7 +129,7 @@ class RegisteredNumberRangeController
             return $response->withStatus(400)->withJson(['errors' => 'Body siteId is empty or not an integer']);
         }
         if ($body['rangeStart'] >= $body['rangeEnd']) {
-            return $response->withStatus(400)->withJson(['errors' => 'Body rangeStart cannot be larger or equal than rangeEnd']);
+            return $response->withStatus(400)->withJson(['errors' => 'Body rangeStart cannot be larger or equal than rangeEnd', 'lang' => 'rangeStartLargerThanRangeEnd']);
         }
 
         $site = IssuingSiteModel::getById(['id' => $body['siteId']]);
@@ -143,7 +143,7 @@ class RegisteredNumberRangeController
             'data'   => [$body['trackerNumber']]
         ]);
         if (!empty($ranges)) {
-            return $response->withStatus(400)->withJson(['errors' => 'Body trackerNumber is already used by another range']);
+            return $response->withStatus(400)->withJson(['errors' => 'Body trackerNumber is already used by another range', 'lang' => 'trackingNumberAlreadyUsed']);
         }
 
         $ranges = RegisteredNumberRangeModel::get([
@@ -156,7 +156,7 @@ class RegisteredNumberRangeController
         foreach ($ranges as $range) {
             if ($body['rangeStart'] <= $range['range_start'] && $range['range_start'] <= $body['rangeEnd']
                 || $body['rangeStart'] <= $range['range_end'] && $range['range_end'] <= $body['rangeEnd']) {
-                return $response->withStatus(400)->withJson(['errors' => 'Range overlaps another range']);
+                return $response->withStatus(400)->withJson(['errors' => 'Range overlaps another range', 'lang' => 'rangeOverlaps']);
             }
         }
 
@@ -212,7 +212,7 @@ class RegisteredNumberRangeController
             return $response->withStatus(400)->withJson(['errors' => 'Body siteId is empty or not an integer']);
         }
         if ($body['rangeStart'] >= $body['rangeEnd']) {
-            return $response->withStatus(400)->withJson(['errors' => 'Body rangeStart cannot be larger or equal  than rangeEnd']);
+            return $response->withStatus(400)->withJson(['errors' => 'Body rangeStart cannot be larger or equal  than rangeEnd', 'lang' => 'rangeStartLargerThanRangeEnd']);
         }
 
         $site = IssuingSiteModel::getById(['id' => $body['siteId']]);
@@ -226,7 +226,7 @@ class RegisteredNumberRangeController
             'data'   => [$body['trackerNumber'], $args['id']]
         ]);
         if (!empty($ranges)) {
-            return $response->withStatus(400)->withJson(['errors' => 'Body trackerNumber is already used by another range']);
+            return $response->withStatus(400)->withJson(['errors' => 'Body trackerNumber is already used by another range', 'lang' => 'trackingNumberAlreadyUsed']);
         }
 
         $ranges = RegisteredNumberRangeModel::get([
@@ -239,7 +239,7 @@ class RegisteredNumberRangeController
         foreach ($ranges as $item) {
             if ($body['rangeStart'] <= $item['range_start'] && $item['range_start'] <= $body['rangeEnd']
                 || $body['rangeStart'] <= $item['range_end'] && $item['range_end'] <= $body['rangeEnd']) {
-                return $response->withStatus(400)->withJson(['errors' => 'Range overlaps another range']);
+                return $response->withStatus(400)->withJson(['errors' => 'Range overlaps another range', 'lang' => 'rangeOverlaps']);
             }
         }
 
diff --git a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site.component.html b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site.component.html
index 849483c1942..81f43d07fb6 100644
--- a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site.component.html
+++ b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site.component.html
@@ -26,7 +26,7 @@
                             </mat-form-field>
                             <mat-form-field>
                                 <mat-label>{{'lang.coclicoNumber' | translate}}</mat-label>
-                                <input type="text" pattern="[0-9]+" maxlength="10" matInput formControlName="accountNumber">
+                                <input type="number" pattern="[0-9]+" maxlength="10" matInput formControlName="accountNumber">
                             </mat-form-field>
                             <mat-form-field>
                                 <mat-label>{{'lang.postOffice' | translate}}</mat-label>
@@ -73,7 +73,7 @@
                                 </mat-form-field>
                                 <mat-form-field>
                                     <mat-label>{{'lang.contactsParameters_addressNumber' | translate}}</mat-label>
-                                    <input matInput formControlName="addressNumber">
+                                    <input type="number" matInput formControlName="addressNumber">
                                 </mat-form-field>
                                 <mat-form-field>
                                     <mat-label>{{'lang.contactsParameters_addressStreet' | translate}}</mat-label>
diff --git a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site.component.ts b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site.component.ts
index 2f25c776046..e3afd52652e 100644
--- a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site.component.ts
+++ b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site.component.ts
@@ -257,7 +257,7 @@ export class IssuingSiteComponent implements OnInit {
                     this.notify.success(this.translate.instant('lang.issuingSiteAdded'));
                     this.router.navigate(['/administration/issuingSites']);
                 }, (err) => {
-                    this.notify.error(err.error.errors);
+                    this.notify.handleSoftErrors(err);
                 });
         } else {
             this.http.put('../rest/registeredMail/sites/' + this.id, objToSubmit)
@@ -265,7 +265,7 @@ export class IssuingSiteComponent implements OnInit {
                     this.notify.success(this.translate.instant('lang.issuingSiteUpdated'));
                     this.router.navigate(['/administration/issuingSites']);
                 }, (err) => {
-                    this.notify.error(err.error.errors);
+                    this.notify.handleSoftErrors(err);
                 });
         }
     }
diff --git a/src/frontend/app/administration/registered-mail/registered-mail.component.ts b/src/frontend/app/administration/registered-mail/registered-mail.component.ts
index 6c5c09278c8..858ace1026a 100644
--- a/src/frontend/app/administration/registered-mail/registered-mail.component.ts
+++ b/src/frontend/app/administration/registered-mail/registered-mail.component.ts
@@ -1,4 +1,4 @@
-import {Component, OnInit, ViewChild} from '@angular/core';
+import {Component, OnInit} from '@angular/core';
 import { FormGroup, FormBuilder, Validators } from '@angular/forms';
 import { TranslateService } from '@ngx-translate/core';
 import { HttpClient } from '@angular/common/http';
@@ -8,7 +8,6 @@ import { HeaderService } from '../../../service/header.service';
 import { AppService } from '../../../service/app.service';
 import { tap, catchError } from 'rxjs/operators';
 import { of } from 'rxjs/internal/observable/of';
-import {MaarchFlatTreeComponent} from '../../../plugins/tree/maarch-flat-tree.component';
 
 @Component({
     selector: 'app-registered-mail',
@@ -195,7 +194,7 @@ export class RegisteredMailComponent implements OnInit {
                     this.notify.success(this.translate.instant('lang.registeredMailNumberRangesAdded'));
                     this.router.navigate(['/administration/registeredMails']);
                 }, (err) => {
-                    this.notify.error(err.error.errors);
+                    this.notify.handleSoftErrors(err);
                 });
         } else {
             this.http.put('../rest/registeredMail/ranges/' + this.id, objToSubmit)
@@ -203,7 +202,7 @@ export class RegisteredMailComponent implements OnInit {
                     this.notify.success(this.translate.instant('lang.registeredMailNumberRangesUpdated'));
                     this.router.navigate(['/administration/registeredMails']);
                 }, (err) => {
-                    this.notify.error(err.error.errors);
+                    this.notify.handleSoftErrors(err);
                 });
         }
     }
diff --git a/src/lang/lang-en.json b/src/lang/lang-en.json
index 3ff06723dcc..0431ab7b47b 100644
--- a/src/lang/lang-en.json
+++ b/src/lang/lang-en.json
@@ -1913,5 +1913,10 @@
     "authorizedRoutesInformations": "One route per row. Routes documentation",
     "canNotDisabledField": "This field can not be disabled because it is empty and mandatory",
     "registeredMailsIncluded": "Number of registered mails included",
-    "cannotGenerateDepositListForMails": "Imposible to generate for the following registered mails :"
+    "cannotGenerateDepositListForMails": "Imposible to generate for the following registered mails :",
+    "accountNumberAlreadyUsed": "Account number is already used by another issuing site",
+    "rangeStartLargerThanRangeEnd": "Range start cannot be larger than range end",
+    "trackingNumberAlreadyUsed": "Tracking number is already used",
+    "rangeOverlaps": "Range overlaps another range",
+    "siteIsUsedByActiveRange": "Cannot delete issuing site : site is used by an active range"
 }
diff --git a/src/lang/lang-fr.json b/src/lang/lang-fr.json
index 57d012b5687..8a1b1e4266d 100644
--- a/src/lang/lang-fr.json
+++ b/src/lang/lang-fr.json
@@ -1945,5 +1945,10 @@
     "authorizedRoutesInformations": "Une route par ligne. Documentation des routes",
     "canNotDisabledField": "Le champ ne peut pas être désactivé car il est vide et obligatoire",
     "registeredMailsIncluded": "Nombre de recommandés inclus :",
-    "cannotGenerateDepositListForMails": "Génération impossible pour les recommandés suivants :"
+    "cannotGenerateDepositListForMails": "Génération impossible pour les recommandés suivants :",
+    "accountNumberAlreadyUsed": "Le N° COCLICO est déjà utilisé par un autre site émetteur",
+    "rangeStartLargerThanRangeEnd": "Le début de la plage ne peut pas être plus grand que la fin de la plage",
+    "trackingNumberAlreadyUsed": "Le numéro de suivi est déjà utilisé",
+    "rangeOverlaps": "La plage chevauche une autre plage",
+    "siteIsUsedByActiveRange": "Impossible de supprimer le site émetteur : le site est utilisé par une plage active"
 }
-- 
GitLab