From: Galen Charlton Date: Mon, 29 Mar 2021 01:00:58 +0000 (-0400) Subject: funds: implement rollover dialog X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=3d4f654c726c5349823f2994f790063b3c69e710;p=working%2FEvergreen.git funds: implement rollover dialog Signed-off-by: Galen Charlton --- diff --git a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-rollover-dialog.component.html b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-rollover-dialog.component.html new file mode 100644 index 0000000000..1850ea15fc --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-rollover-dialog.component.html @@ -0,0 +1,81 @@ + + + + + + + + diff --git a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-rollover-dialog.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-rollover-dialog.component.ts new file mode 100644 index 0000000000..9d9590aed6 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/fund-rollover-dialog.component.ts @@ -0,0 +1,139 @@ +import {Component, Input, ViewChild, TemplateRef, OnInit} from '@angular/core'; +import {DialogComponent} from '@eg/share/dialog/dialog.component'; +import {NgForm} from '@angular/forms'; +import {IdlService, IdlObject} from '@eg/core/idl.service'; +import {EventService} from '@eg/core/event.service'; +import {NetService} from '@eg/core/net.service'; +import {AuthService} from '@eg/core/auth.service'; +import {PcrudService} from '@eg/core/pcrud.service'; +import {GridDataSource} from '@eg/share/grid/grid'; +import {Pager} from '@eg/share/util/pager'; +import {NgbModal} from '@ng-bootstrap/ng-bootstrap'; +import {StringComponent} from '@eg/share/string/string.component'; +import {ToastService} from '@eg/share/toast/toast.service'; +import {PermService} from '@eg/core/perm.service'; +import {OrgService} from '@eg/core/org.service'; +import {Observable} from 'rxjs'; +import {map} from 'rxjs/operators'; +import {ProgressInlineComponent} from '@eg/share/dialog/progress-inline.component'; +import {ComboboxEntry} from '@eg/share/combobox/combobox.component'; + +@Component({ + selector: 'eg-fund-rollover-dialog', + templateUrl: './fund-rollover-dialog.component.html' +}) + +export class FundRolloverDialogComponent + extends DialogComponent implements OnInit { + + doneLoading: boolean = false; + + @Input() contextOrgId: number; + + @ViewChild('successString', { static: true }) successString: StringComponent; + @ViewChild('updateFailedString', { static: false }) updateFailedString: StringComponent; + @ViewChild('rolloverProgress', { static: true }) + private rolloverProgress: ProgressInlineComponent; + + includeDescendants: boolean = false; + propagateFunds: boolean = false; + doCloseout: boolean = false; + limitToEncumbrances: boolean = false; + dryRun: boolean = true; + contextOrg: IdlObject; + isProcessing: boolean = false; + showResults: boolean = false; + years: ComboboxEntry[]; + year: number; + + count: number; + amount_rolled: number; + + constructor( + private idl: IdlService, + private evt: EventService, + private net: NetService, + private auth: AuthService, + private pcrud: PcrudService, + private perm: PermService, + private toast: ToastService, + private org: OrgService, + private modal: NgbModal + ) { + super(modal); + } + + ngOnInit() { + this.onOpen$.subscribe(() => this._initDialog()); + this.doneLoading = true; + } + + private _initDialog() { + this.contextOrg = this.org.get(this.contextOrgId); + this.includeDescendants = false; + this.propagateFunds = false; + this.doCloseout = false; + this.limitToEncumbrances = false; + this.showResults = false; + this.dryRun = true; + this.years = null; + this.year = null; + let maxYear = 0; + this.net.request( + 'open-ils.acq', + 'open-ils.acq.fund.org.years.retrieve', + this.auth.token(), + {}, + { limit_perm: 'VIEW_FUND' } + ).subscribe( + years => { + this.years = years.map(y => { + if (maxYear < y) { maxYear = y; } + return { id: y, label: y }; + }); + this.year = maxYear; + } + ) + } + + rollover() { + this.isProcessing = true; + + const rolloverResponses: any = []; + + let method = 'open-ils.acq.fiscal_rollover'; + if (this.doCloseout) { + method += '.combined'; + } else { + method += '.propagate'; + } + if (this.dryRun) { method += '.dry_run'; } + + this.count = 0; + this.amount_rolled = 0; + + this.net.request( + 'open-ils.acq', + method, + this.auth.token(), + this.year, + this.contextOrgId, + this.includeDescendants, + { encumb_only : this.limitToEncumbrances } + ).subscribe( + r => { + rolloverResponses.push(r.fund); + this.count++; + this.amount_rolled += Number(r.rollover_amount); + }, + err => {}, + () => { + this.isProcessing = false; + this.showResults = true; + // note that we're intentionally not closing the dialog + // so that user can view the results + } + ) + } + +} diff --git a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.html b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.html index 301272e08d..06af88a529 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.html +++ b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.html @@ -51,6 +51,9 @@ + + @@ -106,3 +109,4 @@ + diff --git a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.ts index 07faf6f57d..d79c5da1e5 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds-manager.component.ts @@ -15,6 +15,7 @@ import {AuthService} from '@eg/core/auth.service'; import {NetService} from '@eg/core/net.service'; import {StringComponent} from '@eg/share/string/string.component'; import {FundDetailsDialogComponent} from './fund-details-dialog.component'; +import {FundRolloverDialogComponent} from './fund-rollover-dialog.component'; @Component({ selector: 'eg-funds-manager', @@ -26,9 +27,11 @@ export class FundsManagerComponent extends AdminPageComponent implements OnInit classLabel: string; @ViewChild('fundDetailsDialog', { static: false }) fundDetailsDialog: FundDetailsDialogComponent; + @ViewChild('fundRolloverDialog', { static: false }) fundRolloverDialog: FundRolloverDialogComponent; @ViewChild('grid', { static: true }) grid: GridComponent; cellTextGenerator: GridCellTextGenerator; + canRollover: boolean = false; constructor( route: ActivatedRoute, @@ -39,6 +42,8 @@ export class FundsManagerComponent extends AdminPageComponent implements OnInit auth: AuthService, pcrud: PcrudService, perm: PermService, + private perm2: PermService, // need copy because perm is private to base + // component toast: ToastService, private net: NetService ) { @@ -50,6 +55,7 @@ export class FundsManagerComponent extends AdminPageComponent implements OnInit this.cellTextGenerator = { name: row => row.name() }; + this.checkRolloverPerms(); this.fieldOrder = 'name,code,year,org,active,currency_type,balance_stop_percentage,balance_warning_percentage,propagate,rollover'; this.defaultNewRecord = this.idl.create('acqf'); this.defaultNewRecord.active(true); @@ -115,6 +121,18 @@ export class FundsManagerComponent extends AdminPageComponent implements OnInit this.includeOrgDescendants = true; } + checkRolloverPerms() { + this.canRollover = false; + + this.perm2.hasWorkPermAt(['ADMIN_FUND'], true).then(permMap => { + Object.keys(permMap).forEach(key => { + if (permMap[key].length > 0) { + this.canRollover = true; + } + }); + }); + } + openFundDetailsDialog(rows: IdlObject[]) { if (rows.length > 0) { this.fundDetailsDialog.fundId = rows[0].id(); @@ -129,4 +147,13 @@ export class FundsManagerComponent extends AdminPageComponent implements OnInit getDefaultYear(): string { return new Date().getFullYear().toString(); } + + doRollover() { + this.fundRolloverDialog.contextOrgId = this.searchOrgs.primaryOrgId; + this.fundRolloverDialog.open({size: 'lg'}).subscribe( + ok => {}, + err => {}, + () => this.grid.reload() + ); + } } diff --git a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds.module.ts index 3c7d82beba..d7f4d043cd 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/admin/acq/funds/funds.module.ts @@ -9,6 +9,7 @@ import {FundingSourcesComponent} from './funding-sources.component'; import {FundingSourceTransactionsDialogComponent} from './funding-source-transactions-dialog.component'; import {FundTagsComponent} from './fund-tags.component'; import {FundTransferDialogComponent} from './fund-transfer-dialog.component'; +import {FundRolloverDialogComponent} from './fund-rollover-dialog.component'; @NgModule({ declarations: [ @@ -18,12 +19,13 @@ import {FundTransferDialogComponent} from './fund-transfer-dialog.component'; FundingSourcesComponent, FundingSourceTransactionsDialogComponent, FundTagsComponent, - FundTransferDialogComponent + FundTransferDialogComponent, + FundRolloverDialogComponent ], imports: [ StaffCommonModule, AdminCommonModule, - FundsRoutingModule + FundsRoutingModule, ], exports: [ ],