From 0695f97844fd38a35195ccec4f13a2422625f95d Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Wed, 12 Aug 2020 11:36:40 +0200
Subject: [PATCH] FEAT #14537 TIME 1:30 front registeredMailNumberRanges admin
 list

---
 .../administration-routing.module.ts          |   8 +-
 .../administration/administration.module.ts   |   2 +
 .../administration/administration.service.ts  |   6 +
 .../issuing-site-list.component.html          |  11 +-
 .../issuing-site-list.component.scss          |   8 +
 .../issuing-site-list.component.ts            |  15 ++
 .../issuing-site/issuing-site.component.ts    |   4 +-
 .../registered-mail-list.component.html       | 144 ++++++++++++
 .../registered-mail-list.component.scss       |  42 ++++
 .../registered-mail-list.component.ts         | 212 ++++++++++++++++++
 src/frontend/service/privileges.service.ts    |   2 +-
 src/lang/lang-fr.json                         |   9 +-
 12 files changed, 455 insertions(+), 8 deletions(-)
 create mode 100644 src/frontend/app/administration/registered-mail/registered-mail-list.component.html
 create mode 100644 src/frontend/app/administration/registered-mail/registered-mail-list.component.scss
 create mode 100644 src/frontend/app/administration/registered-mail/registered-mail-list.component.ts

diff --git a/src/frontend/app/administration/administration-routing.module.ts b/src/frontend/app/administration/administration-routing.module.ts
index ae172bcc346..151fcddbfdf 100755
--- a/src/frontend/app/administration/administration-routing.module.ts
+++ b/src/frontend/app/administration/administration-routing.module.ts
@@ -51,6 +51,7 @@ import { AlfrescoListAdministrationComponent } from './alfresco/alfresco-list-ad
 import { ContactDuplicateComponent } from './contact/contact-duplicate/contact-duplicate.component';
 import { IssuingSiteListComponent } from './registered-mail/issuing-site/issuing-site-list.component';
 import { IssuingSiteComponent } from './registered-mail/issuing-site/issuing-site.component';
+import { RegisteredMailListComponent } from './registered-mail/registered-mail-list.component';
 
 @NgModule({
     imports: [
@@ -119,9 +120,10 @@ import { IssuingSiteComponent } from './registered-mail/issuing-site/issuing-sit
             { path: 'alfresco', canActivate: [AppGuard], component: AlfrescoListAdministrationComponent },
             { path: 'alfresco/new', canActivate: [AppGuard], component: AlfrescoAdministrationComponent },
             { path: 'alfresco/:id', canActivate: [AppGuard], component: AlfrescoAdministrationComponent },
-            { path: 'issuingSite', canActivate: [AppGuard], component: IssuingSiteListComponent },
-            { path: 'issuingSite/new', canActivate: [AppGuard], component: IssuingSiteComponent },
-            { path: 'issuingSite/:id', canActivate: [AppGuard], component: IssuingSiteComponent },
+            { path: 'registeredMails', canActivate: [AppGuard], component: RegisteredMailListComponent },
+            { path: 'issuingSites', canActivate: [AppGuard], component: IssuingSiteListComponent },
+            { path: 'issuingSites/new', canActivate: [AppGuard], component: IssuingSiteComponent },
+            { path: 'issuingSites/:id', canActivate: [AppGuard], component: IssuingSiteComponent },
         ]),
     ],
     exports: [
diff --git a/src/frontend/app/administration/administration.module.ts b/src/frontend/app/administration/administration.module.ts
index d722b9221ec..4afcf9bee0c 100755
--- a/src/frontend/app/administration/administration.module.ts
+++ b/src/frontend/app/administration/administration.module.ts
@@ -74,6 +74,7 @@ import {EntitiesExportComponent} from './entity/export/entities-export.component
 import { RegisteredMailComponent } from './registered-mail/registered-mail.component';
 import { IssuingSiteListComponent } from './registered-mail/issuing-site/issuing-site-list.component';
 import { IssuingSiteComponent } from './registered-mail/issuing-site/issuing-site.component';
+import { RegisteredMailListComponent } from './registered-mail/registered-mail-list.component';
 
 
 @NgModule({
@@ -156,6 +157,7 @@ import { IssuingSiteComponent } from './registered-mail/issuing-site/issuing-sit
         RegisteredMailComponent,
         IssuingSiteListComponent,
         IssuingSiteComponent,
+        RegisteredMailListComponent,
     ],
     entryComponents: [
         AccountLinkComponent,
diff --git a/src/frontend/app/administration/administration.service.ts b/src/frontend/app/administration/administration.service.ts
index 5b3d3427246..7e04dfe4ba2 100644
--- a/src/frontend/app/administration/administration.service.ts
+++ b/src/frontend/app/administration/administration.service.ts
@@ -113,6 +113,12 @@ export class AdministrationService {
             page: 0,
             field: ''
         },
+        admin_regitered_mail: {
+            sort: 'customerAccountNumber',
+            sortDirection: 'asc',
+            page: 0,
+            field: ''
+        },
     };
     dataSource: MatTableDataSource<any>;
     filterColumns: string[];
diff --git a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.html b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.html
index aff293aadf1..de77223ff55 100644
--- a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.html
+++ b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.html
@@ -9,6 +9,15 @@
                 </p>
             </a>
         </mat-nav-list>
+        <mat-divider></mat-divider>
+        <mat-nav-list>
+            <a mat-list-item *ngFor="let menu of subMenus" [class.active]="menu.current" [routerLink]="menu.route">
+                <mat-icon color="primary" mat-list-icon [class]="menu.icon"></mat-icon>
+                <p mat-line>
+                    {{menu.label}}
+                </p>
+            </a>
+        </mat-nav-list>
     </ng-template>
     <mat-sidenav-content>
         <div class="bg-head">
@@ -78,7 +87,7 @@
                     </mat-table>
                     <div class="mat-paginator"
                         style="min-height:48px;min-height: 48px;display: flex;justify-content: end;align-items: center;padding-right: 20px;">
-                        {{parameters.length}} {{'lang.issuingSites' | translate}}</div>
+                        {{data.length}} {{'lang.issuingSites' | translate}}</div>
                 </mat-card>
             </div>
         </div>
diff --git a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.scss b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.scss
index e69de29bb2d..6d6ff186c65 100644
--- a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.scss
+++ b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.scss
@@ -0,0 +1,8 @@
+
+@import '../../../../css/vars.scss';
+
+.active, .active:hover , .active:active, .active:focus {
+    color: $primary;
+    border-left: solid 5px $primary;
+    background: rgba($primary, 0.14);
+}
\ No newline at end of file
diff --git a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.ts b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.ts
index abe3345744b..9a1524caea6 100644
--- a/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.ts
+++ b/src/frontend/app/administration/registered-mail/issuing-site/issuing-site-list.component.ts
@@ -22,6 +22,21 @@ import { MatDialog } from '@angular/material/dialog';
 })
 export class IssuingSiteListComponent implements OnInit {
 
+    subMenus: any[] = [
+        {
+            icon: 'fas fa-dolly-flatbed',
+            route: '/administration/registeredMails',
+            label: this.translate.instant('lang.registeredMailNumberRanges'),
+            current: false
+        },
+        {
+            icon: 'fas fa-warehouse',
+            route: '/administration/issuingSites',
+            label: this.translate.instant('lang.issuingSites'),
+            current: true
+        },
+    ];
+
     @ViewChild('adminMenuTemplate', { static: true }) adminMenuTemplate: TemplateRef<any>;
 
     parameters: any = {};
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 b83e0981fb6..a566f5bb880 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
@@ -217,7 +217,7 @@ export class IssuingSiteComponent implements OnInit {
             this.http.post('../rest/registeredMail/sites', objToSubmit)
                 .subscribe(() => {
                     this.notify.success(this.translate.instant('lang.issuingSiteAdded'));
-                    this.router.navigate(['/administration/issuingSite']);
+                    this.router.navigate(['/administration/issuingSites']);
                 }, (err) => {
                     this.notify.error(err.error.errors);
                 });
@@ -225,7 +225,7 @@ export class IssuingSiteComponent implements OnInit {
             this.http.put('../rest/registeredMail/sites/' + this.id, objToSubmit)
                 .subscribe(() => {
                     this.notify.success(this.translate.instant('lang.issuingSiteUpdated'));
-                    this.router.navigate(['/administration/issuingSite']);
+                    this.router.navigate(['/administration/issuingSites']);
                 }, (err) => {
                     this.notify.error(err.error.errors);
                 });
diff --git a/src/frontend/app/administration/registered-mail/registered-mail-list.component.html b/src/frontend/app/administration/registered-mail/registered-mail-list.component.html
new file mode 100644
index 00000000000..688a68d97cf
--- /dev/null
+++ b/src/frontend/app/administration/registered-mail/registered-mail-list.component.html
@@ -0,0 +1,144 @@
+<mat-sidenav-container autosize class="maarch-container">
+    <ng-template #adminMenuTemplate>
+        <mat-nav-list>
+            <h3 mat-subheader>{{'lang.actions' | translate}}</h3>
+            <a mat-list-item routerLink="/administration/registeredMail/new">
+                <mat-icon color="primary" mat-list-icon class="fa fa-plus"></mat-icon>
+                <p mat-line>
+                    {{'lang.add' | translate}}
+                </p>
+            </a>
+        </mat-nav-list>
+        <mat-divider></mat-divider>
+        <mat-nav-list>
+            <a mat-list-item *ngFor="let menu of subMenus" [class.active]="menu.current" [routerLink]="menu.route">
+                <mat-icon color="primary" mat-list-icon [class]="menu.icon"></mat-icon>
+                <p mat-line>
+                    {{menu.label}}
+                </p>
+            </a>
+        </mat-nav-list>
+    </ng-template>
+    <mat-sidenav-content>
+        <div class="bg-head">
+            <div class="bg-head-title" [class.customContainerRight]="appService.getViewMode()">
+                <div class="bg-head-title-label">
+                    <header-left></header-left>
+                </div>
+                <div class="bg-head-title-tool">
+                    <header-right></header-right>
+                </div>
+            </div>
+            <div class="bg-head-content" [class.fullContainer]="appService.getViewMode()">
+            </div>
+        </div>
+        <div class="container" [class.fullContainer]="appService.getViewMode()">
+            <div class="container-content">
+                <div *ngIf="loading" style="display:flex;height:100%;">
+                    <mat-spinner style="margin:auto;"></mat-spinner>
+                </div>
+                <mat-card *ngIf="!loading" class="card-app-content">
+                    <div class="row">
+                        <div class="col-md-6 col-xs-6">
+                            <mat-form-field>
+                                <input matInput [formControl]="adminService.getFilterField()"
+                                    placeholder="{{'lang.filterBy' | translate}}">
+                            </mat-form-field>
+                        </div>
+                        <div class="col-md-6 col-xs-6">
+                            <mat-paginator #paginator [length]="100" [hidePageSize]="true" [pageSize]="10">
+                            </mat-paginator>
+                        </div>
+                    </div>
+                    <mat-table #table [dataSource]="adminService.getDataSource()" matSort matSortDisableClear>
+                        <ng-container matColumnDef="customerAccountNumber">
+                            <mat-header-cell *matHeaderCellDef mat-sort-header style="flex:2">
+                                {{'lang.customerAccountNumber' | translate}}
+                            </mat-header-cell>
+                            <mat-cell *matCellDef="let element" style="flex:2">
+                                {{element.customerAccountNumber}} </mat-cell>
+                        </ng-container>
+                        <ng-container matColumnDef="trackerNumber">
+                            <mat-header-cell *matHeaderCellDef mat-sort-header style="flex:2">
+                                {{'lang.trackerNumber' | translate}}
+                            </mat-header-cell>
+                            <mat-cell *matCellDef="let element" style="flex:2">
+                                {{element.trackerNumber}} </mat-cell>
+                        </ng-container>
+                        <ng-container matColumnDef="registredMailType">
+                            <mat-header-cell *matHeaderCellDef mat-sort-header>
+                                {{'lang.type' | translate}}
+                            </mat-header-cell>
+                            <mat-cell *matCellDef="let element">
+                                {{element.registredMailType}} </mat-cell>
+                        </ng-container>
+                        <ng-container matColumnDef="rangeNumber">
+                            <mat-header-cell *matHeaderCellDef mat-sort-header>
+                                {{'lang.rangeNumber' | translate}}
+                            </mat-header-cell>
+                            <mat-cell *matCellDef="let element">
+                                {{element.rangeNumber}} </mat-cell>
+                        </ng-container>
+                        <ng-container matColumnDef="currentNumber">
+                            <mat-header-cell *matHeaderCellDef mat-sort-header>
+                                {{'lang.currentNumber' | translate}}
+                            </mat-header-cell>
+                            <mat-cell *matCellDef="let element">
+                                {{element.currentNumber}} </mat-cell>
+                        </ng-container>
+                        <ng-container matColumnDef="status">
+                            <mat-header-cell *matHeaderCellDef mat-sort-header>
+                                {{'lang.status' | translate}}
+                            </mat-header-cell>
+                            <mat-cell *matCellDef="let element">
+                                <span
+                                    [ngClass]="{'statusLabelWarn': ['SPD','END'].indexOf(element.status) > -1, 'statusLabelPrimary': ['SPD','END'].indexOf(element.status) == -1}"
+                                    class="label">{{element.statusLabel}}</span>
+                            </mat-cell>
+                        </ng-container>
+                        <ng-container matColumnDef="fullness">
+                            <mat-header-cell *matHeaderCellDef mat-sort-header>
+                                {{'lang.fullness' | translate}}
+                            </mat-header-cell>
+                            <mat-cell *matCellDef="let element">
+                                <div class="fullness full" [class.fullness-ok]="element.fullness < 50"
+                                    [class.fullness-warning]="element.fullness >= 50 && element.fullness < 80"
+                                    [class.fullness-danger]="element.fullness >= 80">
+                                    <mat-progress-spinner color="primay" mode="determinate" diameter="54"
+                                        [value]="element.fullness">
+                                    </mat-progress-spinner>
+                                    <div class="percent">{{element.fullness}}%</div>
+                                </div>
+                            </mat-cell>
+                        </ng-container>
+                        <ng-container matColumnDef="actions">
+                            <mat-header-cell *matHeaderCellDef></mat-header-cell>
+                            <mat-cell *matCellDef="let element" style="justify-content: flex-end;">
+                                <button mat-icon-button color="accent" matTooltip="{{'Activer la plage' | translate}}"
+                                    (click)="$event.stopPropagation();activate(element)" *ngIf="element.status !== 'OK'" [disabled]="element.fullness === 100">
+                                    <mat-icon class="fa fas fa-play fa-2x" aria-hidden="true"></mat-icon>
+                                </button>
+                                <button mat-icon-button color="warn" matTooltip="{{'Clôturer la plage' | translate}}"
+                                    (click)="$event.stopPropagation();stop(element)" *ngIf="element.status === 'OK'">
+                                    <mat-icon class="fa fas fa-stop-circle fa-2x" aria-hidden="true"></mat-icon>
+                                </button>
+                                <button mat-icon-button color="warn" matTooltip="{{'lang.delete' | translate}}"
+                                    (click)="$event.stopPropagation();delete(element)"
+                                    [disabled]="element.status === 'OK'">
+                                    <mat-icon class="fa fa-trash-alt fa-2x" aria-hidden="true"></mat-icon>
+                                </button>
+                            </mat-cell>
+                        </ng-container>
+                        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
+                        <mat-row *matRowDef="let row; columns: displayedColumns;"
+                            routerLink="/administration/registeredMail/{{row.id}}" style="cursor:pointer;"
+                            matTooltip="{{'lang.view' | translate}}"></mat-row>
+                    </mat-table>
+                    <div class="mat-paginator"
+                        style="min-height:48px;min-height: 48px;display: flex;justify-content: end;align-items: center;padding-right: 20px;">
+                        {{data.length}} {{'lang.registeredMailNumberRanges' | translate}}</div>
+                </mat-card>
+            </div>
+        </div>
+    </mat-sidenav-content>
+</mat-sidenav-container>
\ No newline at end of file
diff --git a/src/frontend/app/administration/registered-mail/registered-mail-list.component.scss b/src/frontend/app/administration/registered-mail/registered-mail-list.component.scss
new file mode 100644
index 00000000000..47908866c33
--- /dev/null
+++ b/src/frontend/app/administration/registered-mail/registered-mail-list.component.scss
@@ -0,0 +1,42 @@
+@import '../../../css/vars.scss';
+
+.active, .active:hover , .active:active, .active:focus {
+    color: $primary;
+    border-left: solid 5px $primary;
+    background: rgba($primary, 0.14);
+}
+
+.fullness {
+    position: relative;
+    
+}
+.percent {
+    position: absolute;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    left: 50%;
+    font-size: 10px;
+    font-weight: bold;
+    color: #888;
+}
+
+
+.fullness-ok ::ng-deep .mat-progress-spinner circle, .mat-spinner circle {
+    stroke: green;
+}
+
+.fullness-warning ::ng-deep .mat-progress-spinner circle, .mat-spinner circle {
+    stroke: orange;
+}
+
+.fullness-danger ::ng-deep .mat-progress-spinner circle, .mat-spinner circle {
+    stroke: red;
+}
+
+.statusLabelWarn {
+    color : $warn;
+}
+
+.statusLabelPrimary {
+    color : $primary;
+}
\ No newline at end of file
diff --git a/src/frontend/app/administration/registered-mail/registered-mail-list.component.ts b/src/frontend/app/administration/registered-mail/registered-mail-list.component.ts
new file mode 100644
index 00000000000..66650cfa376
--- /dev/null
+++ b/src/frontend/app/administration/registered-mail/registered-mail-list.component.ts
@@ -0,0 +1,212 @@
+import { Component, OnInit, ViewChild, TemplateRef, ViewContainerRef } from '@angular/core';
+import { MatPaginator } from '@angular/material/paginator';
+import { MatSort } from '@angular/material/sort';
+import { TranslateService } from '@ngx-translate/core';
+import { HttpClient } from '@angular/common/http';
+import { NotificationService } from '../../../service/notification/notification.service';
+import { HeaderService } from '../../../service/header.service';
+import { AppService } from '../../../service/app.service';
+import { FunctionsService } from '../../../service/functions.service';
+import { AdministrationService } from '../administration.service';
+import { MatDialog } from '@angular/material/dialog';
+import { tap, catchError, filter, exhaustMap } from 'rxjs/operators';
+import { ConfirmComponent } from '../../../plugins/modal/confirm.component';
+import { of } from 'rxjs/internal/observable/of';
+
+@Component({
+    selector: 'app-registered-mail-list',
+    templateUrl: './registered-mail-list.component.html',
+    styleUrls: ['./registered-mail-list.component.scss']
+})
+export class RegisteredMailListComponent implements OnInit {
+
+    subMenus: any[] = [
+        {
+            icon: 'fas fa-dolly-flatbed',
+            route: '/administration/registeredMails',
+            label: this.translate.instant('lang.registeredMailNumberRanges'),
+            current: true
+        },
+        {
+            icon: 'fas fa-warehouse',
+            route: '/administration/issuingSites',
+            label: this.translate.instant('lang.issuingSites'),
+            current: false
+        },
+    ];
+
+    @ViewChild('adminMenuTemplate', { static: true }) adminMenuTemplate: TemplateRef<any>;
+
+    parameters: any = {};
+
+    loading: boolean = true;
+
+    data: any[] = [];
+
+    displayedColumns = ['customerAccountNumber', 'trackerNumber', 'registredMailType', 'rangeNumber', 'currentNumber', 'status', 'fullness', 'actions'];
+    filterColumns = ['customerAccountNumber', 'trackerNumber', 'registredMailType', 'rangeNumber', 'currentNumber', 'fullness', 'statusLabel'];
+
+    @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator;
+    @ViewChild(MatSort, { static: false }) sort: MatSort;
+
+    constructor(
+        private translate: TranslateService,
+        public http: HttpClient,
+        private notify: NotificationService,
+        private headerService: HeaderService,
+        public appService: AppService,
+        public functions: FunctionsService,
+        public adminService: AdministrationService,
+        private viewContainerRef: ViewContainerRef,
+        public dialog: MatDialog
+    ) { }
+
+    ngOnInit(): void {
+        this.headerService.setHeader(this.translate.instant('lang.administration') + ' ' + this.translate.instant('lang.registeredMailNumberRanges'));
+
+        this.headerService.injectInSideBarLeft(this.adminMenuTemplate, this.viewContainerRef, 'adminMenu');
+        this.loading = false;
+        this.getData();
+    }
+
+    getData() {
+        this.data = [];
+
+        // FOR TEST
+        this.data = [
+            {
+                id: 1,
+                customerAccountNumber : '1098498410',
+                trackerNumber: 'AZPOKF30KDZP',
+                registredMailType: 'B01',
+                rangeStart: 1000,
+                rangeEnd: 1500,
+                currentNumber: null,
+                fullness: 100,
+                status: 'END',
+            },
+            {
+                id: 2,
+                customerAccountNumber : '1098498410',
+                trackerNumber: 'AZPOKF30KDZP',
+                registredMailType: 'B01',
+                rangeStart: 1501,
+                rangeEnd: 2000,
+                currentNumber: 1621,
+                fullness: 26,
+                status: 'OK',
+            },
+            {
+                id: 3,
+                customerAccountNumber : '1098498410',
+                trackerNumber: 'AZPOKF30KDZP',
+                registredMailType: 'B02',
+                rangeStart: 1501,
+                rangeEnd: 2000,
+                currentNumber: null,
+                fullness: 0,
+                status: 'OK',
+            },
+            {
+                id: 2,
+                customerAccountNumber : '1098498410',
+                trackerNumber: 'AZPOKF30KDZP',
+                registredMailType: 'B01',
+                rangeStart: 2001,
+                rangeEnd: 2500,
+                currentNumber: null,
+                fullness: 0,
+                status: 'SPD',
+            },
+        ];
+        this.data = this.data.map((item: any) => {
+            return {
+                ...item,
+                statusLabel : item.status !== 'OK' ? this.translate.instant('lang.inactive') : this.translate.instant('lang.active'),
+                rangeNumber : `${item.rangeStart} - ${item.rangeEnd}`,
+            };
+        });
+        this.loading = false;
+        setTimeout(() => {
+            this.adminService.setDataSource('admin_regitered_mail', this.data, this.sort, this.paginator, this.filterColumns);
+        }, 0);
+
+
+        /*this.http.get('../rest/registeredMail').pipe(
+            tap((data: any) => {
+                this.data = data['sites'];
+                this.loading = false;
+                setTimeout(() => {
+                    this.adminService.setDataSource('admin_regitered_mail_issuing_site', this.data, this.sort, this.paginator, this.filterColumns);
+                }, 0);
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
+            })
+        ).subscribe();*/
+    }
+
+    activate(row: any) {
+        const dialogRef = this.dialog.open(ConfirmComponent, { panelClass: 'maarch-modal', autoFocus: false, disableClose: true, data: { title: this.translate.instant('lang.activate'), msg: 'En activant cette plage, cela clôtura la plage actuelle utilisée pour ce type de recommandé.' } });
+
+        dialogRef.afterClosed().pipe(
+            filter((data: string) => data === 'ok'),
+            // exhaustMap(() => this.http.delete(`../rest/registeredMail/${row.id}`)),
+            tap(() => {
+                row.status = 'OK';
+                row.statusLabel = this.translate.instant('lang.active');
+                setTimeout(() => {
+                    this.adminService.setDataSource('admin_regitered_mail_issuing_site', this.data, this.sort, this.paginator, this.filterColumns);
+                }, 0);
+                this.notify.success(this.translate.instant('Plage activée'));
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+    stop(row: any) {
+        const dialogRef = this.dialog.open(ConfirmComponent, { panelClass: 'maarch-modal', autoFocus: false, disableClose: true, data: { title: this.translate.instant('lang.suspend'), msg: 'En clôturant la plage, vous ne pourrez plus utiliser de recommandé de ce type tant que vous n\'en n\'aurez pas activé une autre.' } });
+
+        dialogRef.afterClosed().pipe(
+            filter((data: string) => data === 'ok'),
+            // exhaustMap(() => this.http.delete(`../rest/registeredMail/${row.id}`)),
+            tap(() => {
+                row.status = 'END';
+                row.statusLabel = this.translate.instant('lang.inactive');
+                setTimeout(() => {
+                    this.adminService.setDataSource('admin_regitered_mail_issuing_site', this.data, this.sort, this.paginator, this.filterColumns);
+                }, 0);
+                this.notify.success(this.translate.instant('Plage cloturée'));
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+    delete(row: any) {
+        const dialogRef = this.dialog.open(ConfirmComponent, { panelClass: 'maarch-modal', autoFocus: false, disableClose: true, data: { title: this.translate.instant('lang.delete'), msg: this.translate.instant('lang.confirmAction') } });
+
+        dialogRef.afterClosed().pipe(
+            filter((data: string) => data === 'ok'),
+            // exhaustMap(() => this.http.delete(`../rest/registeredMail/${row.id}`)),
+            tap(() => {
+                this.data = this.data.filter((item: any) => item.id !== row.id);
+                setTimeout(() => {
+                    this.adminService.setDataSource('admin_regitered_mail_issuing_site', this.data, this.sort, this.paginator, this.filterColumns);
+                }, 0);
+                this.notify.success(this.translate.instant('lang.issuingSiteDeleted'));
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+}
diff --git a/src/frontend/service/privileges.service.ts b/src/frontend/service/privileges.service.ts
index 95e961913cd..73f8ef7d23b 100755
--- a/src/frontend/service/privileges.service.ts
+++ b/src/frontend/service/privileges.service.ts
@@ -292,7 +292,7 @@ export class PrivilegeService {
             'id': 'admin_registered_mail',
             'label': this.translate.instant('lang.registeredMail'),
             'comment': this.translate.instant('lang.adminRegisteredMailDesc'),
-            'route': '/administration/issuingSite',
+            'route': '/administration/registeredMails',
             'unit': 'supervision',
             'style': 'fas fa-dolly-flatbed',
             'angular': true,
diff --git a/src/lang/lang-fr.json b/src/lang/lang-fr.json
index 9102b859ef3..e7e5168324b 100644
--- a/src/lang/lang-fr.json
+++ b/src/lang/lang-fr.json
@@ -1902,5 +1902,12 @@
     "siteName": "Nom du site",
     "issuingSiteCreation": "Création d'un site émetteur",
     "issuingSiteAdded": "Site émetteur ajouté",
-    "issuingSiteUpdated": "Site émetteur modifié"
+    "issuingSiteUpdated": "Site émetteur modifié",
+    "registeredMailNumberRanges": "Plages de numéros de recommandés",
+    "customerAccountNumber": "Numéro de client",
+    "trackerNumber": "Numéro de suivi",
+    "registredMailType": "Type de recommandé",
+    "rangeNumber": "Plage",
+    "currentNumber": "Numéro actuel",
+    "fullness": "Remplissage"
 }
-- 
GitLab