carnet ad holder updates

This commit is contained in:
Cyril Joseph 2025-08-03 18:28:28 -03:00
parent 3d07921cec
commit 5be3f005ac
22 changed files with 291 additions and 96 deletions

View File

@ -21,7 +21,7 @@
</div> </div>
<div class="form-actions"> <div class="form-actions">
<button mat-raised-button color="primary" type="submit" <button mat-raised-button color="primary" type="submit" *ngIf="!isViewMode"
[disabled]="applicationDetailsForm.invalid || disableSaveButton "> [disabled]="applicationDetailsForm.invalid || disableSaveButton ">
Save Save
</button> </button>

View File

@ -17,6 +17,7 @@ import { ActivatedRoute } from '@angular/router';
}) })
export class ApplicationComponent { export class ApplicationComponent {
@Input() isEditMode = false; @Input() isEditMode = false;
@Input() isViewMode = false;
@Input() headerid: number = 0; @Input() headerid: number = 0;
@Input() applicationName: string = ''; @Input() applicationName: string = '';

View File

@ -38,12 +38,13 @@
<div class="table-actions"> <div class="table-actions">
<h3>Goods Items</h3> <h3>Goods Items</h3>
<div class="actions"> <div class="actions">
<button mat-raised-button color="primary" type="button" (click)="addNewItem()"> <button mat-raised-button color="primary" type="button" *ngIf="!isViewMode" (click)="addNewItem()">
<mat-icon>add</mat-icon> Add Item <mat-icon>add</mat-icon> Add Item
</button> </button>
<div class="upload-section"> <div class="upload-section">
<input type="file" accept=".xlsx,.xls,.csv" (change)="fileUpload($event)" hidden #fileInput> <input type="file" accept=".xlsx,.xls,.csv" (change)="fileUpload($event)" hidden #fileInput>
<button mat-raised-button type="button" (click)="fileInput.click()" [disabled]="isProcessing"> <button mat-raised-button type="button" *ngIf="!isViewMode" (click)="fileInput.click()"
[disabled]="isProcessing">
<mat-icon>upload</mat-icon> Upload <mat-icon>upload</mat-icon> Upload
</button> </button>
</div> </div>
@ -102,10 +103,12 @@
<ng-container matColumnDef="actions"> <ng-container matColumnDef="actions">
<th mat-header-cell *matHeaderCellDef>Actions</th> <th mat-header-cell *matHeaderCellDef>Actions</th>
<td mat-cell *matCellDef="let item; let i = index"> <td mat-cell *matCellDef="let item; let i = index">
<button mat-icon-button color="primary" (click)="editItem(item)" matTooltip="Edit"> <button mat-icon-button color="primary" *ngIf="!isViewMode" (click)="editItem(item)"
matTooltip="Edit">
<mat-icon>edit</mat-icon> <mat-icon>edit</mat-icon>
</button> </button>
<button mat-icon-button color="warn" (click)="deleteItem(item)" matTooltip="Delete"> <button mat-icon-button color="warn" *ngIf="!isViewMode" (click)="deleteItem(item)"
matTooltip="Delete">
<mat-icon>delete</mat-icon> <mat-icon>delete</mat-icon>
</button> </button>
</td> </td>
@ -219,7 +222,7 @@
</div> </div>
<div class="form-actions"> <div class="form-actions">
<button mat-raised-button color="primary" type="submit" <button mat-raised-button color="primary" type="submit" *ngIf="!isViewMode"
[disabled]="itemForm.invalid || changeInProgress"> [disabled]="itemForm.invalid || changeInProgress">
Save Save
</button> </button>
@ -229,7 +232,7 @@
</div> </div>
<div *ngIf="!showItemForm" class="form-actions"> <div *ngIf="!showItemForm" class="form-actions">
<button mat-raised-button color="primary" (click)="onSubmit()" <button mat-raised-button color="primary" (click)="onSubmit()" *ngIf="!isViewMode"
[disabled]="goodsForm.invalid || changeInProgress"> [disabled]="goodsForm.invalid || changeInProgress">
Save Save
</button> </button>

View File

@ -28,6 +28,7 @@ import { Goods, GoodsItem } from '../../core/models/carnet/goods';
}) })
export class GoodsComponent { export class GoodsComponent {
@Input() headerid: number = 0; @Input() headerid: number = 0;
@Input() isViewMode = false;
@Input() userPreferences: UserPreferences = {}; @Input() userPreferences: UserPreferences = {};
@Input() isEditMode: boolean = false; @Input() isEditMode: boolean = false;
@Output() completed = new EventEmitter<boolean>(); @Output() completed = new EventEmitter<boolean>();

View File

@ -1,2 +1,2 @@
<app-holder-search (holderSelectionCompleted)="onHolderSelectionSaved($event)" [applicationName]="applicationName" <app-holder-search (holderSelectionCompleted)="onHolderSelectionSaved($event)" [applicationName]="applicationName"
[headerid]="headerid" [selectedHolderId]="selectedHolderId"></app-holder-search> [headerid]="headerid" [selectedHolderId]="selectedHolderId" [isViewMode]="isViewMode"></app-holder-search>

View File

@ -13,6 +13,7 @@ import { ApiErrorHandlerService } from '../../core/services/common/api-error-han
styleUrl: './holder.component.scss' styleUrl: './holder.component.scss'
}) })
export class HolderComponent { export class HolderComponent {
@Input() isViewMode = false;
@Input() headerid: number = 0; @Input() headerid: number = 0;
@Input() applicationName: string = ''; @Input() applicationName: string = '';
@Input() userPreferences: UserPreferences = {}; @Input() userPreferences: UserPreferences = {};

View File

@ -49,8 +49,8 @@
<!-- <button type="button" mat-icon-button color="primary" matTooltip="Edit"> <!-- <button type="button" mat-icon-button color="primary" matTooltip="Edit">
<mat-icon>edit</mat-icon> <mat-icon>edit</mat-icon>
</button> --> </button> -->
<button type="button" mat-icon-button color="primary" (click)="selectContact()" <button type="button" mat-icon-button color="primary" *ngIf="!isViewMode"
matTooltip="Change contact"> (click)="selectContact()" matTooltip="Change contact">
<mat-icon>compare_arrows</mat-icon> <mat-icon>compare_arrows</mat-icon>
</button> </button>
</div> </div>
@ -343,15 +343,24 @@
</div> </div>
<div class="form-actions"> <div class="form-actions">
<button mat-raised-button color="primary" type="button" (click)="processApplication()"
[disabled]="!enableSubmitButton" *ngIf="showProcessButton && !isViewMode">
<span>Process Application</span>
</button>
<button mat-raised-button color="primary" type="button" (click)="submitApplication()" <button mat-raised-button color="primary" type="button" (click)="submitApplication()"
[disabled]="!enableSubmitButton"> [disabled]="!enableSubmitButton" *ngIf="showSubmitButton && !isViewMode">
<span>Submit Application</span> <span>Submit Application</span>
</button> </button>
<button mat-raised-button color="primary" type="submit" <button mat-raised-button color="primary" type="submit" *ngIf="!isViewMode"
[disabled]="shippingForm.invalid || changeInProgress"> [disabled]="shippingForm.invalid || changeInProgress">
Save Save
</button> </button>
<button mat-raised-button color="primary" type="button" (click)="returnToHome()" *ngIf="isViewMode">
Back
</button>
</div> </div>
</form> </form>
</div> </div>

View File

@ -24,6 +24,8 @@ import { Holder } from '../../core/models/carnet/holder';
import { NavigationService } from '../../core/services/common/navigation.service'; import { NavigationService } from '../../core/services/common/navigation.service';
import { StorageService } from '../../core/services/common/storage.service'; import { StorageService } from '../../core/services/common/storage.service';
import { FormOfSecurity } from '../../core/models/formofsecurity'; import { FormOfSecurity } from '../../core/models/formofsecurity';
import { CarnetService } from '../../core/services/carnet/carnet.service';
import { environment } from '../../../environments/environment';
@Component({ @Component({
selector: 'app-shipping', selector: 'app-shipping',
@ -34,6 +36,7 @@ import { FormOfSecurity } from '../../core/models/formofsecurity';
export class ShippingComponent { export class ShippingComponent {
@Input() headerid: number = 0; @Input() headerid: number = 0;
@Input() isEditMode = false; @Input() isEditMode = false;
@Input() isViewMode = false;
@Input() enableSubmitButton = false; @Input() enableSubmitButton = false;
@Input() applicationName: string = ''; @Input() applicationName: string = '';
@ -49,6 +52,7 @@ export class ShippingComponent {
private holderService = inject(HolderService); private holderService = inject(HolderService);
private navigationService = inject(NavigationService); private navigationService = inject(NavigationService);
private storageService = inject(StorageService); private storageService = inject(StorageService);
private carnetService = inject(CarnetService);
shippingForm: FormGroup; shippingForm: FormGroup;
isLoading = false; isLoading = false;
@ -58,6 +62,8 @@ export class ShippingComponent {
deliveryEstimate: string = ''; deliveryEstimate: string = '';
holderid: number = 0; holderid: number = 0;
holder: Holder | undefined | null = null; holder: Holder | undefined | null = null;
showSubmitButton: boolean = environment.appType === 'client';
showProcessButton: boolean = environment.appType === 'service-provider';
countriesHasStates = ['US', 'CA', 'MX']; countriesHasStates = ['US', 'CA', 'MX'];
countries: Country[] = []; countries: Country[] = [];
@ -68,6 +74,7 @@ export class ShippingComponent {
formOfSecurities: FormOfSecurity[] = []; formOfSecurities: FormOfSecurity[] = [];
govFormOfSecurities: FormOfSecurity[] = []; govFormOfSecurities: FormOfSecurity[] = [];
nonGovFormOfSecurities: FormOfSecurity[] = []; nonGovFormOfSecurities: FormOfSecurity[] = [];
shippingFromDB: Shipping | null = null;
private destroy$ = new Subject<void>(); private destroy$ = new Subject<void>();
@ -126,7 +133,7 @@ export class ShippingComponent {
this.loadPaymentTypes(); this.loadPaymentTypes();
this.loadFormOfSecurities(); this.loadFormOfSecurities();
if (this.headerid) { if (this.headerid && this.headerid > 0) {
this.loadShippingData(); this.loadShippingData();
} }
} }
@ -190,7 +197,7 @@ export class ShippingComponent {
public refreshShippingData(): void { public refreshShippingData(): void {
if (this.headerid > 0) { if (this.headerid > 0) {
this.loadShippingData(); this.loadAddressContactData();
} }
} }
@ -218,7 +225,7 @@ export class ShippingComponent {
this.showAddressForm = false; this.showAddressForm = false;
this.showContactForm = false; this.showContactForm = false;
this.updateShippingValidation(shipTo); this.updateAddressContactValidation(shipTo);
if (shipTo === '3RDPARTY') { if (shipTo === '3RDPARTY') {
this.shippingForm.get('contact')?.reset(); this.shippingForm.get('contact')?.reset();
@ -321,6 +328,30 @@ export class ShippingComponent {
loadShippingData(): void { loadShippingData(): void {
this.isLoading = true; this.isLoading = true;
this.shippingService.getShippingData(this.headerid).pipe(
finalize(() => {
this.isLoading = false;
})
).subscribe({
next: (results: Shipping) => {
if (!results) { // do nothing if empty
return;
}
this.shippingFromDB = results;
this.patchShippingData();
this.loadAddressContactData();
},
error: (error: any) => {
console.error('Error loading shipping data', error);
const errorMessage = this.errorHandler.handleApiError(error, 'Failed to load shipping data');
this.notificationService.showError(errorMessage);
}
});
}
loadAddressContactData(): void {
this.isLoading = true;
this.holderService.getHolder(this.headerid).pipe( this.holderService.getHolder(this.headerid).pipe(
switchMap((holder: Holder) => { switchMap((holder: Holder) => {
@ -333,10 +364,9 @@ export class ShippingComponent {
return forkJoin({ return forkJoin({
holderContacts: this.shippingService.getHolderContactsById(holder.holderid), holderContacts: this.shippingService.getHolderContactsById(holder.holderid),
holderAddress: this.shippingService.getHolderAddressById(holder.holderid), holderAddress: this.shippingService.getHolderAddress(holder),
preparerAddress: this.shippingService.getPreparerAddress(), preparerAddress: this.shippingService.getPreparerAddress(),
preparerContacts: this.shippingService.getPreparerContacts(), preparerContacts: this.shippingService.getPreparerContacts()
shippingData: this.shippingService.getShippingData(this.headerid)
}).pipe( }).pipe(
// Combine the forkJoin results with the original holder object // Combine the forkJoin results with the original holder object
map((apiResults: any) => ({ ...apiResults, holder })) map((apiResults: any) => ({ ...apiResults, holder }))
@ -346,7 +376,7 @@ export class ShippingComponent {
).subscribe({ ).subscribe({
next: (results) => { next: (results) => {
if (!results) { // do nothing if empty if (!results && !this.shippingFromDB) { // do nothing if empty
return; return;
} }
@ -357,20 +387,19 @@ export class ShippingComponent {
this.preparerAddress = results.preparerAddress; this.preparerAddress = results.preparerAddress;
// Set holder contact // Set holder contact
if (results.shippingData?.shipTo === 'HOLDER' && results.shippingData?.contact?.contactid) { if (this.shippingFromDB?.shipTo === 'HOLDER' && this.shippingFromDB?.contact?.contactid) {
this.holderContact = this.holderContacts.find(hc => hc.contactid === results.shippingData?.contact?.contactid); this.holderContact = this.holderContacts.find(hc => hc.contactid === this.shippingFromDB?.contact?.contactid);
} else { } else {
this.holderContact = this.holderContacts?.[0]; this.holderContact = this.holderContacts?.[0];
} }
// Set preparer contact // Set preparer contact
if (results.shippingData?.shipTo === 'PREPARER' && results.shippingData?.contact?.contactid) { if (this.shippingFromDB?.shipTo === 'PREPARER' && this.shippingFromDB?.contact?.contactid) {
this.preparerContact = this.preparerContacts.find(pc => pc.contactid === results.shippingData?.contact?.contactid); this.preparerContact = this.preparerContacts.find(pc => pc.contactid === this.shippingFromDB?.contact?.contactid);
} else { } else {
this.preparerContact = this.preparerContacts.find(pc => pc.defaultContact); this.preparerContact = this.preparerContacts.find(pc => pc.defaultContact);
} }
this.patchAddressContactData();
this.patchShippingData(results.shippingData);
}, },
error: (error: any) => { error: (error: any) => {
console.error('Error loading shipping data', error); console.error('Error loading shipping data', error);
@ -380,25 +409,40 @@ export class ShippingComponent {
}); });
} }
patchShippingData(shipping: Shipping): void { patchShippingData(): void {
this.shippingForm.patchValue({ if (!this.shippingFromDB) {
// needsBond: shipping.needsBond, return;
needsInsurance: shipping.needsInsurance,
needsLostDocProtection: shipping.needsLostDocProtection,
formOfSecurity: shipping.formOfSecurity,
shipTo: shipping.shipTo,
deliveryType: shipping.deliveryType,
deliveryMethod: shipping.deliveryMethod,
courierAccount: shipping.courierAccount,
paymentMethod: shipping.paymentMethod
});
if (shipping.address?.country) {
this.loadStates(shipping.address?.country);
} }
if (shipping.deliveryMethod === 'CLC') { this.shippingForm.patchValue({
this.onDeliveryMethodChange(shipping.deliveryMethod); // needsBond: shipping.needsBond,
needsInsurance: this.shippingFromDB.needsInsurance,
needsLostDocProtection: this.shippingFromDB.needsLostDocProtection,
formOfSecurity: this.shippingFromDB.formOfSecurity,
shipTo: this.shippingFromDB.shipTo,
deliveryType: this.shippingFromDB.deliveryType,
deliveryMethod: this.shippingFromDB.deliveryMethod,
courierAccount: this.shippingFromDB.courierAccount,
paymentMethod: this.shippingFromDB.paymentMethod
});
if (this.shippingFromDB.deliveryMethod === 'CLC') {
this.onDeliveryMethodChange(this.shippingFromDB.deliveryMethod);
}
this.calculateDeliveryEstimate();
this.shippingForm.markAsUntouched();
this.completed.emit(this.shippingForm.valid);
}
patchAddressContactData(): void {
if (!this.shippingFromDB) {
return
}
if (this.shippingFromDB.address?.country) {
this.loadStates(this.shippingFromDB.address?.country);
} }
let formOfSecurityControl = this.shippingForm.get('formOfSecurity'); let formOfSecurityControl = this.shippingForm.get('formOfSecurity');
@ -410,9 +454,9 @@ export class ShippingComponent {
} }
this.calculateDeliveryEstimate(); this.calculateDeliveryEstimate();
this.updateShippingValidation(shipping.shipTo); this.updateAddressContactValidation(this.shippingFromDB.shipTo);
if (shipping.shipTo === '3RDPARTY') { if (this.shippingFromDB.shipTo === '3RDPARTY') {
this.showAddressForm = true; this.showAddressForm = true;
this.showContactForm = true; this.showContactForm = true;
@ -420,35 +464,35 @@ export class ShippingComponent {
const contactGroup = this.shippingForm.get('contact') as FormGroup; const contactGroup = this.shippingForm.get('contact') as FormGroup;
addressGroup.patchValue({ addressGroup.patchValue({
addressid: shipping.address?.addressid, addressid: this.shippingFromDB.address?.addressid,
companyName: shipping.address?.companyName, companyName: this.shippingFromDB.address?.companyName,
address1: shipping.address?.address1, address1: this.shippingFromDB.address?.address1,
address2: shipping.address?.address2, address2: this.shippingFromDB.address?.address2,
city: shipping.address?.city, city: this.shippingFromDB.address?.city,
state: shipping.address?.state, state: this.shippingFromDB.address?.state,
zip: shipping.address?.zip, zip: this.shippingFromDB.address?.zip,
country: shipping.address?.country country: this.shippingFromDB.address?.country
}) })
contactGroup.patchValue({ contactGroup.patchValue({
contactid: shipping.contact?.contactid, contactid: this.shippingFromDB.contact?.contactid,
firstName: shipping.contact?.firstName, firstName: this.shippingFromDB.contact?.firstName,
lastName: shipping.contact?.lastName, lastName: this.shippingFromDB.contact?.lastName,
middleInitial: shipping.contact?.middleInitial, middleInitial: this.shippingFromDB.contact?.middleInitial,
title: shipping.contact?.title, title: this.shippingFromDB.contact?.title,
phone: shipping.contact?.phone, phone: this.shippingFromDB.contact?.phone,
mobile: shipping.contact?.mobile, mobile: this.shippingFromDB.contact?.mobile,
fax: shipping.contact?.fax, fax: this.shippingFromDB.contact?.fax,
email: shipping.contact?.email, email: this.shippingFromDB.contact?.email,
refNumber: shipping.contact?.refNumber, refNumber: this.shippingFromDB.contact?.refNumber,
notes: shipping.contact?.notes, notes: this.shippingFromDB.contact?.notes,
}) })
} }
this.shippingForm.markAsUntouched(); this.shippingForm.markAsUntouched();
this.completed.emit(this.shippingForm.valid); this.completed.emit(this.shippingForm.valid);
} }
updateShippingValidation(shipTo: string): void { updateAddressContactValidation(shipTo: string): void {
const addressGroup = this.shippingForm.get('address') as FormGroup; const addressGroup = this.shippingForm.get('address') as FormGroup;
const contactGroup = this.shippingForm.get('contact') as FormGroup; const contactGroup = this.shippingForm.get('contact') as FormGroup;
@ -641,4 +685,25 @@ export class ShippingComponent {
this.navigationService.navigate(["terms"]) this.navigationService.navigate(["terms"])
} }
returnToHome(): void {
this.navigationService.navigate(["home"])
}
processApplication(): void {
this.changeInProgress = true;
this.carnetService.processApplication(this.headerid).pipe(finalize(() => {
this.changeInProgress = false;
})).subscribe({
next: () => {
this.notificationService.showSuccess('Application processed successfully');
this.navigationService.navigate(["home"]);
},
error: (error) => {
let errorMessage = this.errorHandler.handleApiError(error, 'Failed to submit application');
this.notificationService.showError(errorMessage);
console.error('Error submitting the application', error);
}
});
}
} }

View File

@ -61,7 +61,6 @@ export class TermsConditionsComponent {
} }
onAccept(): void { onAccept(): void {
this.changeInProgress = true; this.changeInProgress = true;
this.carnetService.submitApplication(this.currentApplicationDetails?.headerid!).pipe(finalize(() => { this.carnetService.submitApplication(this.currentApplicationDetails?.headerid!).pipe(finalize(() => {
this.changeInProgress = false; this.changeInProgress = false;

View File

@ -46,11 +46,11 @@
<div class="action-buttons"> <div class="action-buttons">
<button mat-raised-button color="primary" type="button" (click)="addVisitCountry()" <button mat-raised-button color="primary" type="button" (click)="addVisitCountry()"
class="icon-end"> *ngIf="!isViewMode" class="icon-end">
<mat-icon>keyboard_double_arrow_right</mat-icon> <mat-icon>keyboard_double_arrow_right</mat-icon>
<span> Add</span> <span> Add</span>
</button> </button>
<button mat-raised-button type="button" (click)="removeVisitCountry()"> <button mat-raised-button type="button" (click)="removeVisitCountry()" *ngIf="!isViewMode">
<mat-icon>keyboard_double_arrow_left</mat-icon> <mat-icon>keyboard_double_arrow_left</mat-icon>
<span> Remove</span> <span> Remove</span>
</button> </button>
@ -101,11 +101,11 @@
<div class="action-buttons"> <div class="action-buttons">
<button mat-raised-button color="primary" type="button" (click)="addTransitCountry()" <button mat-raised-button color="primary" type="button" (click)="addTransitCountry()"
class="icon-end"> *ngIf="!isViewMode" class="icon-end">
<mat-icon>keyboard_double_arrow_right</mat-icon> <mat-icon>keyboard_double_arrow_right</mat-icon>
<span> Add</span> <span> Add</span>
</button> </button>
<button mat-raised-button type="button" (click)="removeTransitCountry()"> <button mat-raised-button type="button" (click)="removeTransitCountry()" *ngIf="!isViewMode">
<mat-icon>keyboard_double_arrow_left</mat-icon> <mat-icon>keyboard_double_arrow_left</mat-icon>
<span> Remove</span> <span> Remove</span>
</button> </button>
@ -142,7 +142,7 @@
</div> </div>
</div> </div>
<button mat-raised-button color="primary" type="submit" [disabled]="changeInProgress"> <button mat-raised-button color="primary" type="submit" *ngIf="!isViewMode" [disabled]="changeInProgress">
Save Save
</button> </button>
</div> </div>

View File

@ -19,6 +19,8 @@ import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/c
}) })
export class TravelPlanComponent { export class TravelPlanComponent {
@Input() headerid: number = 0; @Input() headerid: number = 0;
@Input() isViewMode = false;
@Output() completed = new EventEmitter<boolean>(); @Output() completed = new EventEmitter<boolean>();
private fb = inject(FormBuilder); private fb = inject(FormBuilder);

View File

@ -0,0 +1,42 @@
<div class="carnet-action-buttons">
<button mat-button (click)="accordion().openAll()">Expand All</button>
<button mat-button (click)="accordion().closeAll()">Collapse All</button>
</div>
<mat-accordion class="carnet-headers-align" multi>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title> Application Name </mat-panel-title>
</mat-expansion-panel-header>
<app-application [isViewMode]="isViewMode" [applicationName]="applicationName">
</app-application>
</mat-expansion-panel>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title> Holder Selection </mat-panel-title>
</mat-expansion-panel-header>
<app-holder [headerid]="headerid" [isViewMode]="isViewMode">
</app-holder>
</mat-expansion-panel>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title> Goods Section </mat-panel-title>
</mat-expansion-panel-header>
<app-goods [headerid]="headerid" [isViewMode]="isViewMode" [userPreferences]="userPreferences">
</app-goods>
</mat-expansion-panel>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title> Travel Plan </mat-panel-title>
</mat-expansion-panel-header>
<app-travel-plan [headerid]="headerid" [isViewMode]="isViewMode"></app-travel-plan>
</mat-expansion-panel>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title> Shipping & Payment </mat-panel-title>
</mat-expansion-panel-header>
<app-shipping [headerid]="headerid" [isViewMode]="isViewMode">
</app-shipping>
</mat-expansion-panel>
</mat-accordion>

View File

@ -0,0 +1,8 @@
.carnet-headers-align .mat-expansion-panel-header-description {
justify-content: space-between;
align-items: center;
}
.carnet-headers-align .mat-mdc-form-field+.mat-mdc-form-field {
margin-left: 8px;
}

View File

@ -0,0 +1,46 @@
import { afterNextRender, Component, inject, viewChild } from '@angular/core';
import { AngularMaterialModule } from '../../shared/module/angular-material.module';
import { MatAccordion } from '@angular/material/expansion';
import { UserPreferences } from '../../core/models/user-preference';
import { CommonModule } from '@angular/common';
import { ActivatedRoute } from '@angular/router';
import { UserPreferencesService } from '../../core/services/user-preference.service';
import { ReactiveFormsModule } from '@angular/forms';
import { ApplicationComponent } from '../application/application.component';
import { GoodsComponent } from '../goods/goods.component';
import { HolderComponent } from '../holder/holder.component';
import { ShippingComponent } from '../shipping/shipping.component';
import { TravelPlanComponent } from '../travel-plan/travel-plan.component';
@Component({
selector: 'app-view-carnet',
imports: [AngularMaterialModule, CommonModule, ReactiveFormsModule,
ApplicationComponent, HolderComponent, GoodsComponent, TravelPlanComponent, ShippingComponent],
templateUrl: './view-carnet.component.html',
styleUrl: './view-carnet.component.scss'
})
export class ViewCarnetComponent {
accordion = viewChild.required(MatAccordion);
isViewMode = true;
headerid: number = 0;
applicationName: string = '';
userPreferences: UserPreferences;
private route = inject(ActivatedRoute);
constructor(userPrefenceService: UserPreferencesService) {
this.userPreferences = userPrefenceService.getPreferences();
afterNextRender(() => {
// Open all panels
this.accordion().openAll();
});
}
ngOnInit(): void {
const idParam = this.route.snapshot.paramMap.get('headerid');
this.headerid = idParam ? parseInt(idParam, 10) : 0;
this.applicationName = this.route.snapshot.queryParamMap.get('applicationname') || '';
}
}

View File

@ -1,5 +1,6 @@
export interface Holder { export interface Holder {
holderid: number; holderid: number;
locationid?: number;
holderName: string; holderName: string;
dbaName?: string | null; dbaName?: string | null;
holderNumber: string; holderNumber: string;

View File

@ -45,4 +45,15 @@ export class CarnetService {
return this.http.post<any>(`${this.apiUrl}/${this.apiDb}/TransmitApplicationtoProcess`, appData); return this.http.post<any>(`${this.apiUrl}/${this.apiDb}/TransmitApplicationtoProcess`, appData);
} }
processApplication(headerid: number): Observable<any> {
let appData = {
// P_SPID: this.userService.getUserSpid(),
P_USERID: this.userService.getUser(),
P_HEADERID: headerid
}
return this.http.post<any>(`${this.apiUrl}/${this.apiDb}//ProcessCarnet`, appData);
}
} }

View File

@ -23,10 +23,11 @@ export class HolderService {
private mapToHolder(holder: any): Holder { private mapToHolder(holder: any): Holder {
return { return {
holderid: holder.HOLDERID, holderid: holder.HOLDERID,
locationid: holder.LOCATIONID,
holderNumber: holder.HOLDERNO, holderNumber: holder.HOLDERNO,
holderType: holder.HOLDERTYPE, holderType: holder.HOLDERTYPE,
uscibMember: holder.USCIBMEMBERFLAG === 'Y', uscibMember: holder.USCIBMEMBERFLAG === 'Y',
// govAgency: holder.GOVAGENCYFLAG === 'Y', // govAgency: holder.GOVAGENCYFLAG === 'Y',
holderName: holder.HOLDERNAME, holderName: holder.HOLDERNAME,
//NAMEQUALIFIER: holder.NAMEQUALIFIER || null, //NAMEQUALIFIER: holder.NAMEQUALIFIER || null,
dbaName: holder.ADDLNAME || null, dbaName: holder.ADDLNAME || null,

View File

@ -1,11 +1,12 @@
import { inject, Injectable } from '@angular/core'; import { inject, Injectable } from '@angular/core';
import { environment } from '../../../../environments/environment'; import { environment } from '../../../../environments/environment';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { filter, map, Observable } from 'rxjs'; import { filter, map, Observable, of } from 'rxjs';
import { UserService } from '../common/user.service'; import { UserService } from '../common/user.service';
import { Shipping } from '../../models/carnet/shipping'; import { Shipping } from '../../models/carnet/shipping';
import { ShippingContact } from '../../models/carnet/shipping-contact'; import { ShippingContact } from '../../models/carnet/shipping-contact';
import { ShippingAddress } from '../../models/carnet/shipping-address'; import { ShippingAddress } from '../../models/carnet/shipping-address';
import { Holder } from '../../models/carnet/holder';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -75,7 +76,7 @@ export class ShippingService {
P_CUSTCOURIERNO: shippingData.courierAccount, P_CUSTCOURIERNO: shippingData.courierAccount,
P_PAYMENTMETHOD: shippingData.paymentMethod, P_PAYMENTMETHOD: shippingData.paymentMethod,
// P_BONDPROTECTION: shippingData.needsBond ? 'Y' : 'N', // P_BONDPROTECTION: shippingData.needsBond ? 'Y' : 'N',
P_INSPROTECTION: shippingData.needsInsurance ? 'Y' : 'N', P_INSPROTECTION: shippingData.needsInsurance ? 'Y' : 'N',
P_LDIPROTECTION: shippingData.needsLostDocProtection ? 'Y' : 'N', P_LDIPROTECTION: shippingData.needsLostDocProtection ? 'Y' : 'N',
P_FORMOFSECURITY: shippingData.formOfSecurity, P_FORMOFSECURITY: shippingData.formOfSecurity,
@ -137,21 +138,20 @@ export class ShippingService {
map(response => this.mapToAddress(response?.[0]))); map(response => this.mapToAddress(response?.[0])));
} }
getHolderAddressById(id: number): ShippingAddress | any { getHolderAddress(holder: Holder): ShippingAddress | any {
return this.http.get<any[]>(`${this.apiUrl}/${this.apiDb}/GetHolderRecord/${this.userService.getUserSpid()}/${id}`).pipe( return of(this.mapToAddress(holder));
map(response => this.mapToAddress(response)));
} }
private mapToAddress(address: any): ShippingAddress { private mapToAddress(address: any): ShippingAddress {
return { return {
companyName: address.NAMEOF ?? address.HOLDERNAME, companyName: address.NAMEOF ?? address.holderName,
addressid: address.LOCATIONID ?? address.LOCATIONID, addressid: address.LOCATIONID ?? address.locationid,
address1: address.ADDRESS1, address1: address.ADDRESS1 ?? address.address1,
address2: address.ADDRESS2, address2: address.ADDRESS2 ?? address.address2,
city: address.CITY, city: address.CITY ?? address.city,
state: address.STATE, state: address.STATE ?? address.state,
zip: address.ZIP, zip: address.ZIP ?? address.zip,
country: address.COUNTRY country: address.COUNTRY ?? address.country
}; };
} }
} }

View File

@ -22,7 +22,7 @@
Clear Search Clear Search
</button> </button>
<button mat-raised-button color="primary" (click)="addNewHolder()"> <button mat-raised-button color="primary" *ngIf="!isViewMode" (click)="addNewHolder()">
<mat-icon>add</mat-icon> <mat-icon>add</mat-icon>
Add New Holder Add New Holder
</button> </button>
@ -78,20 +78,21 @@
<div class="actions-icons"> <div class="actions-icons">
<mat-radio-button matTooltip="Select Holder" class="selectHolder" [value]="holder.holderid" <mat-radio-button matTooltip="Select Holder" class="selectHolder" [value]="holder.holderid"
[checked]="selectedHolderId === holder.holderid" (change)="onHolderSelection(holder)" [checked]="selectedHolderId === holder.holderid" *ngIf="!isViewMode"
aria-label="Select row" [hidden]="holder.isInactive"> (change)="onHolderSelection(holder)" aria-label="Select row" [hidden]="holder.isInactive">
</mat-radio-button> </mat-radio-button>
<button mat-icon-button color="primary" (click)="onEdit(holder.holderid)" matTooltip="Edit"> <button mat-icon-button color="primary" *ngIf="!isViewMode" (click)="onEdit(holder.holderid)"
matTooltip="Edit">
<mat-icon>edit</mat-icon> <mat-icon>edit</mat-icon>
</button> </button>
<button mat-icon-button color="warn" *ngIf="!holder.isInactive" matTooltip="Inactivate" <button mat-icon-button color="warn" *ngIf="!holder.isInactive && !isViewMode"
(click)="inactivateHolder(holder.holderid)"> matTooltip="Inactivate" (click)="inactivateHolder(holder.holderid)">
<mat-icon>delete</mat-icon> <mat-icon>delete</mat-icon>
</button> </button>
<button mat-icon-button color="warn" *ngIf="holder.isInactive" matTooltip="Reactivate" <button mat-icon-button color="warn" *ngIf="holder.isInactive && !isViewMode"
(click)="reactivateHolder(holder.holderid)"> matTooltip="Reactivate" (click)="reactivateHolder(holder.holderid)">
<mat-icon>loupe</mat-icon> <mat-icon>loupe</mat-icon>
</button> </button>
</div> </div>
@ -117,7 +118,8 @@
</div> </div>
<div class="form-actions"> <div class="form-actions">
<button mat-raised-button color="primary" type="submit" [disabled]="changeInProgress" (click)="saveHolderSelection()"> <button mat-raised-button color="primary" type="submit" [disabled]="changeInProgress" *ngIf="!isViewMode"
(click)="saveHolderSelection()">
{{ 'Save' }} {{ 'Save' }}
</button> </button>
</div> </div>

View File

@ -44,6 +44,7 @@ export class SearchHolderComponent {
this.dataSource.sort = value; this.dataSource.sort = value;
} }
@Input() isViewMode = false;
@Input() headerid: number = 0; @Input() headerid: number = 0;
@Input() selectedHolderId: number = 0; @Input() selectedHolderId: number = 0;
@Input() applicationName: string = ''; @Input() applicationName: string = '';

View File

@ -1,5 +1,6 @@
export const environment = { export const environment = {
production: false, production: false,
apiUrl: 'https://dev.alphaomegainfosys.com/test-api', apiUrl: 'https://dev.alphaomegainfosys.com/test-api',
apiDb: 'oracle' apiDb: 'oracle',
appType: 'client',
}; };

View File

@ -1,5 +1,6 @@
export const environment = { export const environment = {
production: true, production: true,
apiUrl: 'https://dev.alphaomegainfosys.com/test-api', apiUrl: 'https://dev.alphaomegainfosys.com/test-api',
apiDb: 'oracle' apiDb: 'oracle',
appType: 'client',
}; };