Implement organization maker-checker workflows
This commit is contained in:
@@ -143,11 +143,25 @@ export class BranchProfileComponent implements OnInit {
|
||||
.subscribe((res: any) => {
|
||||
this.saving = false;
|
||||
if (!res) return;
|
||||
if (res.rollbackTransaction) {
|
||||
// Parked for checker approval - the branch profile has not actually changed yet.
|
||||
this.successMsg = 'Branch profile update has been submitted for approval.';
|
||||
this.form.markAsPristine();
|
||||
return;
|
||||
}
|
||||
this.successMsg = 'Branch profile saved.';
|
||||
this.form.markAsPristine();
|
||||
this.lastUpdated = res.updatedByUsername ? { by: res.updatedByUsername, at: res.updatedAt } : null;
|
||||
const idx = this.offices.findIndex((o) => o.officeId === this.selectedOfficeId);
|
||||
if (idx >= 0) this.offices[idx] = res;
|
||||
// The response is now a CommandProcessingResult, not the updated row (the write goes through
|
||||
// the command pipeline) - reload the saved row from the server instead of patching state from
|
||||
// this response.
|
||||
this.organizationService.getBranchProfile(this.selectedOfficeId!).subscribe((updated: any) => {
|
||||
if (!updated) return;
|
||||
this.lastUpdated = updated.updatedByUsername
|
||||
? { by: updated.updatedByUsername, at: updated.updatedAt }
|
||||
: null;
|
||||
const idx = this.offices.findIndex((o) => o.officeId === this.selectedOfficeId);
|
||||
if (idx >= 0) this.offices[idx] = updated;
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,9 +182,18 @@ export class InstitutionProfileComponent implements OnInit {
|
||||
.subscribe((res: any) => {
|
||||
this.saving = false;
|
||||
if (!res) return;
|
||||
if (res.rollbackTransaction) {
|
||||
// Parked for checker approval - the profile has not actually changed yet, so the form must
|
||||
// not be patched with the submitted (not-yet-applied) values as if it had.
|
||||
this.successMsg = 'Bank profile update has been submitted for approval.';
|
||||
this.form.markAsPristine();
|
||||
return;
|
||||
}
|
||||
this.successMsg = 'Bank profile saved.';
|
||||
this.applyResult(res);
|
||||
this.form.markAsPristine();
|
||||
// The response is now a CommandProcessingResult, not the updated row (the write goes through
|
||||
// the command pipeline) - reload the saved row from the server instead of patching the form
|
||||
// from this response.
|
||||
this.load();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+9
-1
@@ -16,6 +16,7 @@ import { OrganizationService } from '../../organization.service';
|
||||
import { CdkTextareaAutosize } from '@angular/cdk/text-field';
|
||||
import { MatCheckbox } from '@angular/material/checkbox';
|
||||
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
import { AlertService } from 'app/core/alert/alert.service';
|
||||
|
||||
/**
|
||||
* Create Payment Type Component.
|
||||
@@ -35,6 +36,7 @@ export class CreatePaymentTypeComponent implements OnInit {
|
||||
private organizationService = inject(OrganizationService);
|
||||
private router = inject(Router);
|
||||
private route = inject(ActivatedRoute);
|
||||
private alertService = inject(AlertService);
|
||||
|
||||
/** Payment Type form. */
|
||||
paymentTypeForm: UntypedFormGroup;
|
||||
@@ -73,7 +75,13 @@ export class CreatePaymentTypeComponent implements OnInit {
|
||||
*/
|
||||
submit() {
|
||||
const paymentType = this.paymentTypeForm.value;
|
||||
this.organizationService.createPaymentType(paymentType).subscribe((response) => {
|
||||
this.organizationService.createPaymentType(paymentType).subscribe((response: any) => {
|
||||
if (response?.rollbackTransaction) {
|
||||
this.alertService.alert({
|
||||
type: 'Success',
|
||||
message: 'Payment Type creation has been submitted for approval.'
|
||||
});
|
||||
}
|
||||
this.router.navigate(['../'], { relativeTo: this.route });
|
||||
});
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import { OrganizationService } from 'app/organization/organization.service';
|
||||
import { CdkTextareaAutosize } from '@angular/cdk/text-field';
|
||||
import { MatCheckbox } from '@angular/material/checkbox';
|
||||
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
import { AlertService } from 'app/core/alert/alert.service';
|
||||
|
||||
/**
|
||||
* Edit Payment Type component.
|
||||
@@ -35,6 +36,7 @@ export class EditPaymentTypeComponent implements OnInit {
|
||||
private organizationService = inject(OrganizationService);
|
||||
private router = inject(Router);
|
||||
private route = inject(ActivatedRoute);
|
||||
private alertService = inject(AlertService);
|
||||
|
||||
/** Payment Type form. */
|
||||
paymentTypeForm: UntypedFormGroup;
|
||||
@@ -88,7 +90,13 @@ export class EditPaymentTypeComponent implements OnInit {
|
||||
*/
|
||||
submit() {
|
||||
const paymentType = this.paymentTypeForm.value;
|
||||
this.organizationService.updatePaymentType(this.paymentTypeData.id, paymentType).subscribe((response) => {
|
||||
this.organizationService.updatePaymentType(this.paymentTypeData.id, paymentType).subscribe((response: any) => {
|
||||
if (response?.rollbackTransaction) {
|
||||
this.alertService.alert({
|
||||
type: 'Success',
|
||||
message: 'Payment Type update has been submitted for approval.'
|
||||
});
|
||||
}
|
||||
this.router.navigate(['../../'], { relativeTo: this.route });
|
||||
});
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import { DeleteDialogComponent } from '../../shared/delete-dialog/delete-dialog.
|
||||
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
|
||||
import { MatTooltip } from '@angular/material/tooltip';
|
||||
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
import { AlertService } from 'app/core/alert/alert.service';
|
||||
|
||||
/**
|
||||
* Payment Types component.
|
||||
@@ -65,6 +66,7 @@ export class PaymentTypesComponent implements OnInit {
|
||||
private organizationService = inject(OrganizationService);
|
||||
private route = inject(ActivatedRoute);
|
||||
private dialog = inject(MatDialog);
|
||||
private alertService = inject(AlertService);
|
||||
|
||||
/** Payment Types data. */
|
||||
paymentTypesData: any;
|
||||
@@ -132,9 +134,20 @@ export class PaymentTypesComponent implements OnInit {
|
||||
});
|
||||
deletePaymentTypeDialogRef.afterClosed().subscribe((response: any) => {
|
||||
if (response.delete) {
|
||||
this.organizationService.deletePaymentType(paymentTypeId).subscribe(() => {
|
||||
this.paymentTypesData = this.paymentTypesData.filter((paymentType: any) => paymentType.id !== paymentTypeId);
|
||||
this.setPaymentTypes();
|
||||
this.organizationService.deletePaymentType(paymentTypeId).subscribe((deleteResponse: any) => {
|
||||
if (deleteResponse?.rollbackTransaction) {
|
||||
// Parked for checker approval - the record has not actually been removed yet, so the
|
||||
// list must not drop it (that would falsely show the deletion as already applied).
|
||||
this.alertService.alert({
|
||||
type: 'Success',
|
||||
message: 'Payment Type deletion has been submitted for approval.'
|
||||
});
|
||||
} else {
|
||||
this.paymentTypesData = this.paymentTypesData.filter(
|
||||
(paymentType: any) => paymentType.id !== paymentTypeId
|
||||
);
|
||||
this.setPaymentTypes();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -23,6 +23,7 @@ import { OrganizationService } from '../organization.service';
|
||||
import { SettingsService } from 'app/settings/settings.service';
|
||||
import { PopoverService } from '../../configuration-wizard/popover/popover.service';
|
||||
import { ConfigurationWizardService } from '../../configuration-wizard/configuration-wizard.service';
|
||||
import { AlertService } from 'app/core/alert/alert.service';
|
||||
|
||||
/** Custom Dialog Components */
|
||||
import { NextStepDialogComponent } from '../../configuration-wizard/next-step-dialog/next-step-dialog.component';
|
||||
@@ -53,6 +54,7 @@ export class WorkingDaysComponent implements OnInit, AfterViewInit {
|
||||
private dialog = inject(MatDialog);
|
||||
private configurationWizardService = inject(ConfigurationWizardService);
|
||||
private popoverService = inject(PopoverService);
|
||||
private alertService = inject(AlertService);
|
||||
|
||||
/** Working days form. */
|
||||
workingDaysForm: UntypedFormGroup;
|
||||
@@ -152,7 +154,13 @@ export class WorkingDaysComponent implements OnInit, AfterViewInit {
|
||||
}
|
||||
}
|
||||
workingDays.recurrence = recurrence;
|
||||
this.organizationService.updateWorkingDays(workingDays).subscribe((response) => {
|
||||
this.organizationService.updateWorkingDays(workingDays).subscribe((response: any) => {
|
||||
if (response?.rollbackTransaction) {
|
||||
this.alertService.alert({
|
||||
type: 'Success',
|
||||
message: 'Working Days update has been submitted for approval.'
|
||||
});
|
||||
}
|
||||
if (this.configurationWizardService.showDefineWorkingDays) {
|
||||
this.configurationWizardService.showDefineWorkingDays = false;
|
||||
this.openNextStepDialog();
|
||||
|
||||
Reference in New Issue
Block a user