LP#1942220: implement 'Load Bibs and Items'
authorGalen Charlton <gmc@equinoxOLI.org>
Wed, 8 Dec 2021 22:41:15 +0000 (17:41 -0500)
committerGalen Charlton <gmc@equinoxOLI.org>
Wed, 8 Dec 2021 22:41:15 +0000 (17:41 -0500)
Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
Open-ILS/src/eg2/src/app/staff/acq/lineitem/create-assets.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/acq/lineitem/create-assets.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem-list.component.html
Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem-list.component.ts
Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem.module.ts
Open-ILS/src/eg2/src/app/staff/acq/po/po.module.ts
Open-ILS/src/eg2/src/app/staff/acq/po/routing.module.ts

diff --git a/Open-ILS/src/eg2/src/app/staff/acq/lineitem/create-assets.component.html b/Open-ILS/src/eg2/src/app/staff/acq/lineitem/create-assets.component.html
new file mode 100644 (file)
index 0000000..ecb7238
--- /dev/null
@@ -0,0 +1,42 @@
+
+<h3 class="m-2" i18n>Load Bibs and Items</h3>
+
+<div class="w-100 m-2">
+  <eg-acq-upload mode="getImportParams" [customAction]="createAssets"></eg-acq-upload>
+</div>
+
+<eg-progress-inline *ngIf="creatingAssets"></eg-progress-inline>
+
+<div class="w-100 m-2" *ngIf="creationRequested">
+  <h4 i18n>Bib and Item Creation Status</h4>
+  <div class="row">
+    <div class="col-2" i18n>Line Items Processed</div>
+    <div class="col-1">{{creationStatus.liProcessed}}</div>
+  </div>  
+  <div class="row">
+    <div class="col-2" i18n>Vandelay Records Processed</div>
+    <div class="col-1">{{creationStatus.vqbrProcessed}}</div>
+  </div>  
+  <div class="row">
+    <div class="col-2" i18n>Bib Records Merged/Imported</div>
+    <div class="col-1">{{creationStatus.bibsProcessed}}</div>
+  </div>  
+  <div class="row">
+    <div class="col-2" i18n>Acquisitions Items Processed</div>
+    <div class="col-1">{{creationStatus.lidProcessed}}</div>
+  </div>  
+  <div class="row">
+    <div class="col-2" i18n>Debits Encumbered</div>
+    <div class="col-1">{{creationStatus.debitsProcessed}}</div>
+  </div>  
+  <div class="row">
+    <div class="col-2" i18n>Real Items Processed</div>
+    <div class="col-1">{{creationStatus.copiesProcessed}}</div>
+  </div>  
+
+  <h4 i18n class="mt-2" *ngIf="creationErrors.length">Errors encountered</h4>
+  <div class="row" *ngFor="let evt of creationErrors">
+    <div class="col-2 alert alert-warning">{{evt.textcode}}</div>
+    <div class="col-5 alert alert-warning">{{evt.desc}}</div>
+  </div>
+</div>
diff --git a/Open-ILS/src/eg2/src/app/staff/acq/lineitem/create-assets.component.ts b/Open-ILS/src/eg2/src/app/staff/acq/lineitem/create-assets.component.ts
new file mode 100644 (file)
index 0000000..27c001d
--- /dev/null
@@ -0,0 +1,95 @@
+import {Component, OnInit, Input, Output} from '@angular/core';
+import {ActivatedRoute, Router, ParamMap} from '@angular/router';
+import {IdlService, IdlObject} from '@eg/core/idl.service';
+import {NetService} from '@eg/core/net.service';
+import {EventService, EgEvent} from '@eg/core/event.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {AuthService} from '@eg/core/auth.service';
+import {LineitemService} from './lineitem.service';
+import {UploadComponent} from '../picklist/upload.component';
+
+
+interface AssetCreationResponse {
+    liProcessed: number;
+    vqbrProcessed: number;
+    bibsProcessed: number;
+    lidProcessed: number;
+    debitsProcessed: number;
+    copiesProcessed: number;
+}
+
+@Component({
+  templateUrl: 'create-assets.component.html'
+})
+export class CreateAssetsComponent implements OnInit {
+
+    targetPo: number;
+    creationRequested = false;
+    creatingAssets = false;
+
+    creationStatus: AssetCreationResponse = {
+        liProcessed: 0,
+        vqbrProcessed: 0,
+        bibsProcessed: 0,
+        lidProcessed: 0,
+        debitsProcessed: 0,
+        copiesProcessed: 0
+    };
+    creationErrors: EgEvent[] = [];
+
+    constructor(
+        private router: Router,
+        private route: ActivatedRoute,
+        private idl: IdlService,
+        private auth: AuthService,
+        private net: NetService,
+        private evt: EventService,
+        private pcrud: PcrudService,
+        private liService: LineitemService
+    ) { }
+
+    ngOnInit() {
+        this.route.parent.paramMap.subscribe((params: ParamMap) => {
+            this.targetPo = +params.get('poId');
+        });
+    }
+
+    // using arrow notion here because we want 'this' to
+    // refer to CreateAssetsComponent, not the component
+    // that createAssets is passed to
+    createAssets = (args: Object) => {
+        this.creatingAssets = true;
+        this.creationRequested = true;
+
+        const assetArgs = {
+            vandelay: args['vandelay']
+        };
+
+        this.net.request(
+            'open-ils.acq',
+            'open-ils.acq.purchase_order.assets.create',
+            this.auth.token(),
+            this.targetPo,
+            assetArgs
+        ).subscribe(
+            resp => {
+                const evt = this.evt.parse(resp);
+                if (evt) {
+                    this.creationErrors.push(evt);
+                } else {
+                    this.creationStatus['liProcessed'] = resp.li;
+                    this.creationStatus['vqbrProcessed'] = resp.vqbr;
+                    this.creationStatus['bibsProcessed'] = resp.bibs;
+                    this.creationStatus['lidProcessed'] = resp.lid;
+                    this.creationStatus['debitsProcessed'] = resp.debits_accrued;
+                    this.creationStatus['copiesProcessed'] = resp.copies;
+                }
+            },
+            err => {},
+            () => {
+                this.creatingAssets = false;
+            }
+        );
+    }
+}
+
index c240536..974389c 100644 (file)
@@ -29,6 +29,9 @@
           [disabled]="!picklistId" i18n>Create Purchase Order from All Lineitems</button>
         <div class="dropdown-divider"></div>
         <h6 class="dropdown-header" i18n>Purchase Order Actions</h6>
+        <a ngbDropdownItem routerLink="../create-assets"
+          [disabled]="!isPendingPo()"
+          queryParamsHandling="merge" i18n>Load Bibs and Items</a>
         <button ngbDropdownItem (click)="receiveSelected()" 
           [disabled]="!poId" i18n>Mark Selected Lineitems as Received</button>
         <button ngbDropdownItem (click)="unReceiveSelected()" 
index 57cbd14..0d0b6de 100644 (file)
@@ -842,6 +842,14 @@ export class LineitemListComponent implements OnInit {
         }
     }
 
+    isPendingPo(): boolean {
+        if (this.picklistId || !this.po()) {
+            return false;
+        } else {
+            return this.po().order_date() ? false : true;
+        }
+    }
+
     // For PO's, lineitems can only be deleted if they are pending order.
     canDeleteLis(): boolean {
         const li = this.pageOfLineitems[0];
index 95a4b1b..0d3b34e 100644 (file)
@@ -16,11 +16,13 @@ import {LineitemBatchCopiesComponent} from './batch-copies.component';
 import {LineitemCopyAttrsComponent} from './copy-attrs.component';
 import {LineitemHistoryComponent} from './history.component';
 import {BriefRecordComponent} from './brief-record.component';
+import {CreateAssetsComponent} from './create-assets.component';
 import {CancelDialogComponent} from './cancel-dialog.component';
 import {DeleteLineitemsDialogComponent} from './delete-lineitems-dialog.component';
 import {AddCopiesDialogComponent} from './add-copies-dialog.component';
 import {ClaimPolicyDialogComponent} from './claim-policy-dialog.component';
 import {MarcEditModule} from '@eg/staff/share/marc-edit/marc-edit.module';
+import {UploadComponent} from '../picklist/upload.component';
 
 @NgModule({
   declarations: [
@@ -38,7 +40,9 @@ import {MarcEditModule} from '@eg/staff/share/marc-edit/marc-edit.module';
     AddCopiesDialogComponent,
     ClaimPolicyDialogComponent,
     BriefRecordComponent,
-    LineitemWorksheetComponent
+    CreateAssetsComponent,
+    LineitemWorksheetComponent,
+    UploadComponent
   ],
   exports: [
     LineitemListComponent,
@@ -50,7 +54,8 @@ import {MarcEditModule} from '@eg/staff/share/marc-edit/marc-edit.module';
   imports: [
     StaffCommonModule,
     ItemLocationSelectModule,
-    MarcEditModule
+    MarcEditModule,
+    HttpClientModule
   ],
   providers: [
     LineitemService,
index 3d27b94..55b0663 100644 (file)
@@ -14,7 +14,7 @@ import {PoEdiMessagesComponent} from './edi.component';
 import {PoNotesComponent} from './notes.component';
 import {PoCreateComponent} from './create.component';
 import {PoChargesComponent} from './charges.component';
-
+import {PicklistUploadService} from '../picklist/upload.service';
 
 @NgModule({
   declarations: [
@@ -35,7 +35,8 @@ import {PoChargesComponent} from './charges.component';
     PoRoutingModule
   ],
   providers: [
-    PoService
+    PoService,
+    PicklistUploadService
   ]
 })
 
index 02a7918..d294a53 100644 (file)
@@ -7,6 +7,7 @@ import {LineitemListComponent} from '../lineitem/lineitem-list.component';
 import {LineitemDetailComponent} from '../lineitem/detail.component';
 import {LineitemCopiesComponent} from '../lineitem/copies.component';
 import {BriefRecordComponent} from '../lineitem/brief-record.component';
+import {CreateAssetsComponent} from '../lineitem/create-assets.component';
 import {LineitemHistoryComponent} from '../lineitem/history.component';
 import {LineitemWorksheetComponent} from '../lineitem/worksheet.component';
 import {PoHistoryComponent} from './history.component';
@@ -32,6 +33,9 @@ const routes: Routes = [{
     path: 'brief-record',
     component: BriefRecordComponent
   }, {
+    path: 'create-assets',
+    component: CreateAssetsComponent
+  }, {
     path: 'lineitem/:lineitemId/detail',
     component: LineitemDetailComponent
   }, {