HIMA-703 move back functionality

This commit is contained in:
Adrian Toczydlowski
2020-01-28 13:41:58 +01:00
parent 36e6669aad
commit d935d932c1
14 changed files with 302 additions and 41 deletions

View File

@@ -13,6 +13,7 @@ export class HttpErrorHandlerInterceptor implements HttpInterceptor {
constructor(private errorService: ErrorService, private logger: LoggingService) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log('intercept');
return next.handle(req).pipe(catchError((error: HttpErrorResponse, caught: any) => this.handleError(error)));
}
@@ -34,8 +35,10 @@ export class HttpErrorHandlerInterceptor implements HttpInterceptor {
}
private handleError(error: HttpErrorResponse) {
console.log('handleError', error);
if (!isWhiteList(error.url)) {
if (isWhiteList(error.url, error.status)) {
console.log('111');
return throwError(error);
}
let errorMessage = '';
@@ -57,8 +60,10 @@ export class HttpErrorHandlerInterceptor implements HttpInterceptor {
const logout = error.status === 401;
this.errorService.addErrors(error.status, message, invalidProperties, logout);
}
console.log('errorMessage');
return throwError(errorMessage);
} else {
console.log('throwError');
return throwError(error);
}
}

View File

@@ -17,6 +17,7 @@ export const SET_REMISSION_SOURCE = '[REMISSION] Set source';
export const SET_REMISSION_TARGET = '[REMISSION] Set target';
export const SET_REMISSION_PRODUCTS = '[REMISSION] Set products';
export const SET_SHIPPING_DOCUMENT = '[REMISSION] Set shipping document';
export const COMPLETE_SHIPPING_DOCUMENT = '[REMISSION] Complete shipping document';
export const RESET_SHIPPING_DOCUMENT = '[REMISSION] Reset shipping document';
export const SET_REMISSION_SEARCHED_PRODUCT = '[REMISSION] Set remission searched product';
export const ACTIVATE_REMISSION_REMINDER = '[REMISSION] Activate reminder';
@@ -100,6 +101,12 @@ export class SetRemissionShippingDocument {
constructor(public shippingDocument: ShippingDocument) {}
}
export class CompleteRemissionShippingDocument {
static readonly type = COMPLETE_SHIPPING_DOCUMENT;
constructor(public shippingDocument: ShippingDocument) {}
}
export class ResetRemissionShippingDocument {
static readonly type = RESET_SHIPPING_DOCUMENT;
}

View File

@@ -226,6 +226,43 @@ export class RemissionState {
this.syncApiState(remission);
}
@Action(actions.CompleteRemissionShippingDocument)
completeRemissionShippingDocument(ctx: StateContext<RemissionStateModel>, { shippingDocument }: actions.SetRemissionShippingDocument) {
const state = ctx.getState();
const currentRemission = state.remission;
const currentRemissionProcess = currentRemission.remissionProcess;
let updatedRemissionProcess: RemissionProcess = {
...currentRemission.remissionProcess
};
if (currentRemissionProcess.shippingDocuments) {
const shippingDocumentAlreadyExists = currentRemissionProcess.shippingDocuments.findIndex(sd => sd.id === shippingDocument.id) !== -1;
if (shippingDocumentAlreadyExists) {
updatedRemissionProcess = {
...updatedRemissionProcess,
shippingDocuments: [
...currentRemission.remissionProcess.shippingDocuments.map(ds => {
if (ds.id === shippingDocument.id) {
return {
...ds,
isCompleted: true
};
}
return ds;
})
]
};
}
}
const remission: Remission = {
...currentRemission,
remissionFinishingProcessStatus: RemissionFinishingProcessStatus.containerScanned,
remissionProcess: updatedRemissionProcess
};
ctx.patchState({ remission });
this.syncApiState(remission);
}
@Action(actions.SetRemissionShippingDocument)
setRemissionShippingDocument(ctx: StateContext<RemissionStateModel>, { shippingDocument }: actions.SetRemissionShippingDocument) {
const state = ctx.getState();

View File

@@ -0,0 +1,18 @@
<app-modal id="remission-scan-shipping-document-closed" branch="true">
<div class="modal-wrapper">
<div class="header">
<lib-icon (click)="closeDialog()" height="21px" class="close-icon" name="close-branch" alt="close"></lib-icon>
</div>
<div class="title">
<span>Ungültige Beleg</span>
</div>
<div class="sub-title">
<span class="align-center">Beleg ist bereits abgeschlossen.</span>
</div>
<div class="actions">
<div class="align-right">
<app-button [primary]="true" (action)="closeDialog()">Erneut versuchen</app-button>
</div>
</div>
</div>
</app-modal>

View File

@@ -0,0 +1,57 @@
.modal-wrapper {
font-family: 'Open Sans';
line-height: 21px;
margin: 16px 0 16px 0;
display: flex;
flex-direction: column;
height: 185px;
.header {
.close-icon {
position: absolute;
top: 25px;
right: 25px;
}
.close-icon:hover {
cursor: pointer;
}
}
.title {
display: flex;
flex-direction: column;
justify-content: center;
margin-top: 36px;
span {
font-size: 20px;
font-weight: bold;
color: #000000;
text-align: center;
}
}
.sub-title {
display: flex;
flex-direction: row;
justify-content: center;
margin-top: 26px;
span {
font-family: 'Open Sans';
font-size: 16px;
font-weight: 600;
max-width: 546px;
}
}
.actions {
display: flex;
flex-direction: row;
justify-content: center;
margin-top: 26px;
.close-button {
margin-left: 20px;
}
}
}

View File

@@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { RemissionScanProductInvalidBarcodeComponent } from './remission-scan-shipping-document-closed.component';
describe('RemissionScanProductInvalidBarcodeComponent', () => {
let component: RemissionScanProductInvalidBarcodeComponent;
let fixture: ComponentFixture<RemissionScanProductInvalidBarcodeComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ RemissionScanProductInvalidBarcodeComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(RemissionScanProductInvalidBarcodeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,22 @@
import { Component, OnInit } from '@angular/core';
import { ModalService } from '@libs/ui';
@Component({
selector: 'app-remission-scan-shipping-document-closed',
templateUrl: './remission-scan-shipping-document-closed.component.html',
styleUrls: ['./remission-scan-shipping-document-closed.component.scss']
})
export class RemissionScanShippingDocumentClosedComponent implements OnInit {
id = 'remission-scan-shipping-document-closed';
constructor(private modalService: ModalService) {}
ngOnInit() {}
public openDialog() {
this.modalService.open(this.id);
}
closeDialog() {
this.modalService.close(this.id);
}
}

View File

@@ -86,6 +86,7 @@ export class RemissionShippingDocumentComponent implements OnInit, OnDestroy {
this.activeShippingDocument.emit(false);
this.emptyList = true;
}
console.log('shippingDocumentSubscriptionHandler', shippingDocument);
this.store.dispatch(new SetRemissionShippingDocument(shippingDocument));
};
}

View File

@@ -29,6 +29,6 @@
<app-button [primary]="true" *ngIf="pageStatus === 1" (action)="continueRemission()">Remission fortsetzen</app-button>
<app-button *ngIf="pageStatus === 1" (action)="finishRemission()">Remission abschließen und beenden</app-button>
</div>
<app-remission-scan-shipping-document-closed #invalidDocumentDialog></app-remission-scan-shipping-document-closed>
<app-remission-scan-product-invalid-barcode #invalidBarcodeDialog></app-remission-scan-product-invalid-barcode>
</div>

View File

@@ -3,7 +3,7 @@ import { RemissionFinishingProcessStatus } from '../../models/remission-finishin
import { Store, Select } from '@ngxs/store';
import { RemissionSelectors } from 'apps/sales/src/app/core/store/selectors/remission.selectors';
import { RemissionSupplier, RemissionProcess, RemissionService, ShippingDocument } from '@isa/remission';
import { filter, takeUntil, take } from 'rxjs/operators';
import { filter, takeUntil, take, switchMap } from 'rxjs/operators';
import { isNullOrUndefined } from 'util';
import { Subject, Observable } from 'rxjs';
import { SUPPLIER_PLACEHOLDER } from '../../constants/remission.constants';
@@ -12,17 +12,19 @@ import { SetBranchProcessCurrentPath } from 'apps/sales/src/app/core/store/actio
import { Router } from '@angular/router';
import {
ResetRemissionState,
CompleateRemissionState,
SetRemissionFinishedProcessStatus,
SetRemissionScannedContainerId,
SetRemissionStarted,
SetRemissionProcess,
ResetRemissionShippingDocument
ResetRemissionShippingDocument,
CompleteRemissionShippingDocument
} from 'apps/sales/src/app/core/store/actions/remission.actions';
import { Breadcrumb } from 'apps/sales/src/app/core/models/breadcrumb.model';
import { AppService } from '@sales/core-services';
import { RemissionScanProductInvalidBarcodeComponent } from '../../components/remission-scan-product-invalid-barcode/remission-scan-product-invalid-barcode.component';
import { NativeContainerService } from 'shared/lib/remission-container-scanner/native-container.service';
import { RemissionScanShippingDocumentClosedComponent } from '../../components/remission-scan-shipping-document-closed/remission-scan-shipping-document-closed.component';
import { RemissionProcessStatuses } from 'apps/sales/src/app/core/models/remission-process-statuses.model';
@Component({
selector: 'app-remission-finish',
@@ -32,7 +34,13 @@ import { NativeContainerService } from 'shared/lib/remission-container-scanner/n
export class RemissionFinishComponent implements OnInit, OnDestroy {
@Select(RemissionSelectors.getRemissionProcess) remissionProcess$: Observable<RemissionProcess>;
@Select(RemissionSelectors.getRemissionShippingDocument) shippingDocument$: Observable<ShippingDocument>;
@Select(RemissionSelectors.getRemissionShippingDocumentstatus) shippingDocumentStatus$;
@Select(RemissionSelectors.getRemissionProcess)
currentRemissionProcess$: Observable<RemissionProcess>;
@Select(RemissionSelectors.getRemissionProcessStatuses)
remissionProcessStatuses$: Observable<RemissionProcessStatuses>;
@ViewChild('invalidBarcodeDialog') invalidBarcodeDialog: RemissionScanProductInvalidBarcodeComponent;
@ViewChild('invalidDocumentDialog') invalidDocumentDialog: RemissionScanShippingDocumentClosedComponent;
pageStatus: RemissionFinishingProcessStatus;
suppliers: { leftSupplier: RemissionSupplier; rightSupplier: RemissionSupplier };
remissionProcess: RemissionProcess;
@@ -87,6 +95,7 @@ export class RemissionFinishComponent implements OnInit, OnDestroy {
take(1)
)
.subscribe(status => {
console.log('status', status);
this.pageStatus = status;
this.cdrf.detectChanges();
if (this.pageStatus === RemissionFinishingProcessStatus.containerScanned) {
@@ -100,12 +109,68 @@ export class RemissionFinishComponent implements OnInit, OnDestroy {
)
.subscribe(this.remissionProcessSubscriptionHandler);
this.shippingDocumentStatus$
.pipe(
filter(data => !isNullOrUndefined(data)),
takeUntil(this.destroy$)
)
.subscribe(response => console.log('shippingDocumentStatus$', response));
this.shippingDocument$
.pipe(
filter(data => !isNullOrUndefined(data)),
takeUntil(this.destroy$)
)
.subscribe(this.shippingDocumentSubscriptionHandler);
this.loadCurrentRemissionProcessStatuses().then(remissionProcessStatuses => {
console.log('REMISSION', remissionProcessStatuses);
this.continueProcess()
.pipe(takeUntil(this.destroy$))
.subscribe(remission => {
console.log('remission', remission);
console.log('shippingDocumentSubscriptionHandler', this.remissionProcess.id);
console.log('shippingDocumentSubscriptionHandler2', this.shippingDocument.id);
this.loadSupplier(remission.filter.target);
this.remissionService
.getShippingDocuments({
remissionProcessId: this.remissionProcess.id,
shippingDocumentId: this.shippingDocument.id
})
.pipe(
filter(data => !isNullOrUndefined(data)),
takeUntil(this.destroy$)
)
.subscribe(({ isCompleted }) => {
console.log('isCompleted', isCompleted);
if (isCompleted) {
this.pageStatus = RemissionFinishingProcessStatus.containerScanned;
}
});
});
});
}
loadCurrentRemissionProcessStatuses() {
return this.remissionProcessStatuses$
.pipe(
filter(data => !isNullOrUndefined(data)),
take(1)
)
.toPromise();
}
loadCurrentRemissionProcess() {
return this.currentRemissionProcess$.pipe(filter(data => !isNullOrUndefined(data), take(1)));
}
continueProcess() {
return this.loadCurrentRemissionProcess().pipe(
take(1),
switchMap(remissionProcess => {
return this.remissionService.continueProcess(remissionProcess);
})
);
}
shippingDocumentSubscriptionHandler = (shippingDocument: ShippingDocument) => {
@@ -113,6 +178,7 @@ export class RemissionFinishComponent implements OnInit, OnDestroy {
};
remissionProcessSubscriptionHandler = (remissionProcess: RemissionProcess) => {
console.log('remissionProcessSubscriptionHandler', remissionProcess);
this.remissionProcess = remissionProcess;
this.loadSupplier(remissionProcess.filter.target);
};
@@ -120,6 +186,7 @@ export class RemissionFinishComponent implements OnInit, OnDestroy {
loadSupplier(remissionSuplier: RemissionSupplier) {
this.supplier = remissionSuplier;
const selectedSupplierName = remissionSuplier.name;
console.log('selectedSupplierName', selectedSupplierName);
if (remissionSuplier.id === 1) {
this.subTitle[RemissionFinishingProcessStatus.containerScanned] =
// tslint:disable-next-line: max-line-length
@@ -152,11 +219,10 @@ export class RemissionFinishComponent implements OnInit, OnDestroy {
})
.subscribe(remissionFinished => {
if (!isNullOrUndefined(remissionFinished)) {
this.store.dispatch(new CompleateRemissionState());
this.appService.clearIdleReminder();
this.pageStatus = RemissionFinishingProcessStatus.finished;
this.store.dispatch(new SetRemissionFinishedProcessStatus(this.pageStatus));
this.navigateToNewRemissionList();
this.store.dispatch(new ResetRemissionState());
}
});
}
@@ -220,10 +286,16 @@ export class RemissionFinishComponent implements OnInit, OnDestroy {
containerId: this.containerId
})
.subscribe(response => {
if (response && response.error) {
this.pageStatus = RemissionFinishingProcessStatus.start;
this.store.dispatch(new SetRemissionFinishedProcessStatus(this.pageStatus));
this.invalidBarcodeDialog.openDialog();
if (response.error) {
if (response.errorReasons.PackageCode) {
this.pageStatus = RemissionFinishingProcessStatus.start;
this.store.dispatch(new SetRemissionFinishedProcessStatus(this.pageStatus));
this.invalidBarcodeDialog.openDialog();
} else {
this.invalidDocumentDialog.openDialog();
}
} else {
this.store.dispatch(new CompleteRemissionShippingDocument(this.shippingDocument));
}
});
}

View File

@@ -51,6 +51,7 @@ import { RemissionScanProductInvalidBarcodeComponent } from './components/remiss
import { BarcodeScannerComponent } from '../barcode-search/components/barcode-scanner/barcode-scanner.component';
import { ZXingScannerModule } from '@zxing/ngx-scanner';
import { BarcodeSearchModule } from '../barcode-search/barcode-search.module';
import { RemissionScanShippingDocumentClosedComponent } from './components/remission-scan-shipping-document-closed/remission-scan-shipping-document-closed.component';
@NgModule({
declarations: [
@@ -74,8 +75,8 @@ import { BarcodeSearchModule } from '../barcode-search/barcode-search.module';
AddProductToRemissionDialogComponent,
RemissionToTopToBottomActionsComponent,
RemissionGenerateShippingDocumentComponent,
RemissionScanProductInvalidBarcodeComponent
//BarcodeScannerComponent
RemissionScanProductInvalidBarcodeComponent,
RemissionScanShippingDocumentClosedComponent
],
imports: [
BarcodeSearchModule,

View File

@@ -6,10 +6,16 @@ import { Router } from '@angular/router';
import { DeleteLastPreviousPath, UpdateActiveCrumb } from '../../../core/store/actions/breadcrumb.actions';
import { SharedSelectors } from '../../../core/store/selectors/shared.selectors';
import { ResetFilters } from '../../../core/store/actions/filter.actions';
import { ResetRemissionState, SetRemissionCompleted } from './../../../core/store/actions/remission.actions';
import {
ResetRemissionState,
SetRemissionCompleted,
CompleateRemissionState,
SetRemissionFinishedProcessStatus
} from './../../../core/store/actions/remission.actions';
import { ModuleSwitcher } from '../../../core/models/app-switcher.enum';
import { SetBranchProcessCurrentPath } from '../../../core/store/actions/branch-process.actions';
import { AppService } from '../../../core/services/app.service';
import { RemissionFinishingProcessStatus } from '../../../modules/remission/models/remission-finishing-process-status.enum';
@Component({
selector: 'app-back-arrow',
@@ -25,8 +31,18 @@ export class BackArrowComponent implements OnInit {
emitClick() {
const previousRoute = this.store.selectSnapshot(SharedSelectors.getPreviousRoute);
console.log('previousRoute.path ', previousRoute, this.router.url);
if (previousRoute) {
if (this.router.url === '/remission/finish') {
const processStatus = this.store.selectSnapshot(RemissionSelectors.getRemissionFinishingProcessStatus);
console.log('move back FINISH!@#!@#!@#!@#!@#', processStatus);
if (processStatus === RemissionFinishingProcessStatus.start) {
this.store.dispatch(new SetRemissionFinishedProcessStatus(RemissionFinishingProcessStatus.notSet));
}
//this.store.dispatch(new CompleateRemissionState());
}
if (previousRoute.path === '/remission/create') {
console.log('remission create');
const shipingDocumentProductCount = this.store.selectSnapshot(RemissionSelectors.getRemissionShippingDocumentProductCount);
if (shipingDocumentProductCount === 0) {
this.store.dispatch(new ResetRemissionState());

42
package-lock.json generated
View File

@@ -1039,57 +1039,57 @@
}
},
"@cmf/catalog-api": {
"version": "0.1.12",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@cmf/catalog-api/-/catalog-api-0.1.12.tgz",
"integrity": "sha1-UwJ0RraS3TzJrWSekd1XocRgncw=",
"version": "0.1.19",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@cmf/catalog-api/-/catalog-api-0.1.19.tgz",
"integrity": "sha1-meUray5zaYrqJiYnTv36qWAXGgw=",
"requires": {
"tslib": "^1.9.0"
}
},
"@cmf/core": {
"version": "0.1.12",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@cmf/core/-/core-0.1.12.tgz",
"integrity": "sha1-Z5tnE0Btomnx+mL38+RLK9RA2fM=",
"version": "0.1.19",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@cmf/core/-/core-0.1.19.tgz",
"integrity": "sha1-1Jxn7V3CcsDnmgyRCD7j4GIQkoQ=",
"requires": {
"tslib": "^1.9.0"
}
},
"@cmf/inventory-api": {
"version": "0.1.12",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@cmf/inventory-api/-/inventory-api-0.1.12.tgz",
"integrity": "sha1-/hA5Y2NFQnI3FkUMcOaV6IusY8I=",
"version": "0.1.19",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@cmf/inventory-api/-/inventory-api-0.1.19.tgz",
"integrity": "sha1-HqNa6KmqAogR5sahnc9sIwrldY8=",
"requires": {
"tslib": "^1.9.0"
}
},
"@cmf/trade-api": {
"version": "0.1.12",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@cmf/trade-api/-/trade-api-0.1.12.tgz",
"integrity": "sha1-XYg4PKQuRiJcwvaJ0PzqTel5Qco=",
"version": "0.1.19",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@cmf/trade-api/-/trade-api-0.1.19.tgz",
"integrity": "sha1-OQKQRhCjhk3j3sTnuEqd8kuiVJM=",
"requires": {
"tslib": "^1.9.0"
}
},
"@isa/catsearch-api": {
"version": "0.0.46",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@isa/catsearch-api/-/catsearch-api-0.0.46.tgz",
"integrity": "sha1-ZBTOkJSidN2g3PmMKoCxXqiwKT8=",
"version": "0.0.47",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@isa/catsearch-api/-/catsearch-api-0.0.47.tgz",
"integrity": "sha1-Uk/wka6Jd/ba9w1Kg4VUKOO3Rko=",
"requires": {
"tslib": "^1.9.0"
}
},
"@isa/print-api": {
"version": "0.0.46",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@isa/print-api/-/print-api-0.0.46.tgz",
"integrity": "sha1-wV3YoblEjeiiL2NyTYkMbMrIgKM=",
"version": "0.0.47",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@isa/print-api/-/print-api-0.0.47.tgz",
"integrity": "sha1-lQCmG4/zfN1VQzKAJjMMIQBFgmA=",
"requires": {
"tslib": "^1.9.0"
}
},
"@isa/remi-api": {
"version": "0.0.46",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@isa/remi-api/-/remi-api-0.0.46.tgz",
"integrity": "sha1-Z3K47vyA82L7+7oaCkzQ0lmf464=",
"version": "0.0.47",
"resolved": "https://pkgs.dev.azure.com/hugendubel/_packaging/hugendubel/npm/registry/@isa/remi-api/-/remi-api-0.0.47.tgz",
"integrity": "sha1-m20rJHpHDdYVbZAkKLqwaTu3j80=",
"requires": {
"tslib": "^1.9.0"
}

View File

@@ -30,13 +30,13 @@
"@angular/pwa": "^0.13.4",
"@angular/router": "~7.2.12",
"@angular/service-worker": "~7.2.12",
"@cmf/catalog-api": "^0.1.12",
"@cmf/core": "^0.1.12",
"@cmf/inventory-api": "^0.1.12",
"@cmf/trade-api": "^0.1.12",
"@isa/catsearch-api": "^0.0.46",
"@isa/print-api": "^0.0.46",
"@isa/remi-api": "^0.0.46",
"@cmf/catalog-api": "^0.1.19",
"@cmf/core": "^0.1.19",
"@cmf/inventory-api": "^0.1.19",
"@cmf/trade-api": "^0.1.19",
"@isa/catsearch-api": "^0.0.47",
"@isa/print-api": "^0.0.47",
"@isa/remi-api": "^0.0.47",
"@isa/remission": "^0.2.17",
"@ng-idle/core": "^8.0.0-beta.4",
"@ng-idle/keepalive": "^8.0.0-beta.4",