add provider invoices component
authorGalen Charlton <gmc@equinoxinitiative.org>
Wed, 25 Mar 2020 15:45:05 +0000 (11:45 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Wed, 25 Mar 2020 15:52:47 +0000 (11:52 -0400)
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/eg2/src/app/staff/acq/provider/acq-provider.component.html
Open-ILS/src/eg2/src/app/staff/acq/provider/acq-provider.module.ts
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-invoices.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-invoices.component.ts [new file with mode: 0644]

index 56dd3ff..4b54031 100644 (file)
@@ -43,7 +43,9 @@
         <ng-template ngbTabContent>PROVIDER EDI TAB</ng-template>
       </ngb-tab>
       <ngb-tab title="Invoices" i18n-title id="invoices" [disabled]="!id">
-        <ng-template ngbTabContent>PROVIDER INVOICES TAB</ng-template>
+        <ng-template ngbTabContent>
+          <eg-provider-invoices></eg-provider-invoices>
+        </ng-template>
       </ngb-tab>
       <ngb-tab title="POs" i18n-title id="purchase_orders" [disabled]="!id">
         <ng-template ngbTabContent>PROVIDER PURCHASE ORDERS TAB</ng-template>
index 51f61c4..743d3e2 100644 (file)
@@ -7,6 +7,7 @@ import {AcqProviderSummaryPaneComponent} from './summary-pane.component';
 import {ProviderResultsComponent} from './provider-results.component';
 import {ProviderAddressesComponent} from './provider-addresses.component';
 import {ProviderContactsComponent} from './provider-contacts.component';
+import {ProviderInvoicesComponent} from './provider-invoices.component';
 import {OrgFamilySelectModule} from '@eg/share/org-family-select/org-family-select.module';
 import {FmRecordEditorModule} from '@eg/share/fm-editor/fm-editor.module';
 import {ProviderRecordService} from './provider-record.service';
@@ -19,6 +20,7 @@ import {ProviderRecordService} from './provider-record.service';
     ProviderResultsComponent,
     ProviderAddressesComponent,
     ProviderContactsComponent,
+    ProviderInvoicesComponent,
     AcqProviderSummaryPaneComponent
   ],
   imports: [
diff --git a/Open-ILS/src/eg2/src/app/staff/acq/provider/provider-invoices.component.html b/Open-ILS/src/eg2/src/app/staff/acq/provider/provider-invoices.component.html
new file mode 100644 (file)
index 0000000..9ed0529
--- /dev/null
@@ -0,0 +1,45 @@
+<ng-template #inv_identTmpl let-invoice="row">
+  <a href="/eg/staff/acq/legacy/invoice/view/{{invoice.id()}}"
+     target="_blank">
+    {{invoice.inv_ident()}}
+  </a>
+</ng-template>
+<ng-template #providerTmpl let-invoice="row">
+  <a href="/eg/staff/admin/acq/conify/provider/{{invoice.provider().id()}}"
+     target="_blank">
+    {{invoice.provider().code()}}
+  </a>
+</ng-template>
+<ng-template #shipperTmpl let-invoice="row">
+  <a href="/eg/staff/admin/acq/conify/provider/{{invoice.shipper().id()}}"
+     target="_blank">
+    {{invoice.shipper().code()}}
+  </a>
+</ng-template>
+
+<eg-grid #acqProviderInvoicesGrid
+  persistKey="acq.provider.invoices"
+  [stickyHeader]="true"
+  [filterable]="true"
+  [sortable]="true"
+  [cellTextGenerator]="cellTextGenerator"
+  idlClass="acqinv" [dataSource]="gridSource">
+
+  <eg-grid-toolbar-action label="Print Selected Invoices" i18n-label
+    (onClick)="printSelectedInvoices($event)" [disableOnRows]="noSelectedRows">
+  </eg-grid-toolbar-action>
+
+  <eg-grid-column path="inv_ident" [cellTemplate]="inv_identTmpl"></eg-grid-column>
+  <eg-grid-column path="provider" [cellTemplate]="providerTmpl" [filterable]="false" [hidden]="true"></eg-grid-column>
+  <eg-grid-column path="shipper" [cellTemplate]="shipperTmpl"></eg-grid-column>
+
+  <eg-grid-column path="id" [hidden]="true"></eg-grid-column>
+  <eg-grid-column path="recv_date" [hidden]="true"></eg-grid-column>
+  <eg-grid-column [asyncSupportsEmptyTermClick]="true" path="recv_method"></eg-grid-column>
+  <eg-grid-column [asyncSupportsEmptyTermClick]="true" path="payment_method"></eg-grid-column>
+
+</eg-grid>
+
+<eg-alert-dialog #printfail i18n-dialogBody
+  dialogBody="Could not print the selected invoices.">
+</eg-alert-dialog>
diff --git a/Open-ILS/src/eg2/src/app/staff/acq/provider/provider-invoices.component.ts b/Open-ILS/src/eg2/src/app/staff/acq/provider/provider-invoices.component.ts
new file mode 100644 (file)
index 0000000..6134a1b
--- /dev/null
@@ -0,0 +1,106 @@
+import {Component, OnInit, AfterViewInit, Input, ViewChild} from '@angular/core';
+import {Observable} from 'rxjs';
+import {map} from 'rxjs/operators';
+import {Router, ActivatedRoute, ParamMap} from '@angular/router';
+import {Pager} from '@eg/share/util/pager';
+import {IdlObject} from '@eg/core/idl.service';
+import {EventService} from '@eg/core/event.service';
+import {AlertDialogComponent} from '@eg/share/dialog/alert.component';
+import {PrintService} from '@eg/share/print/print.service';
+import {NetService} from '@eg/core/net.service';
+import {AuthService} from '@eg/core/auth.service';
+import {GridComponent} from '@eg/share/grid/grid.component';
+import {GridDataSource, GridCellTextGenerator} from '@eg/share/grid/grid';
+import {AcqSearchService, AcqSearchTerm, AcqSearch} from '../search/acq-search.service';
+import {ProviderRecord, ProviderRecordService} from './provider-record.service';
+
+@Component({
+  selector: 'eg-provider-invoices',
+  templateUrl: 'provider-invoices.component.html',
+  providers: [AcqSearchService]
+})
+export class ProviderInvoicesComponent implements OnInit {
+
+    @Input() initialSearchTerms: AcqSearchTerm[] = [];
+
+    gridSource: GridDataSource;
+    @ViewChild('acqProviderInvoicesGrid', { static: true }) providerInvoicesGrid: GridComponent;
+    @ViewChild('printfail', { static: true }) private printfail: AlertDialogComponent;
+
+    noSelectedRows: (rows: IdlObject[]) => boolean;
+
+    cellTextGenerator: GridCellTextGenerator;
+
+    constructor(
+        private router: Router,
+        private route: ActivatedRoute,
+        private printer: PrintService,
+        private evt: EventService,
+        private net: NetService,
+        private auth: AuthService,
+        private providerRecord: ProviderRecordService,
+        private acqSearch: AcqSearchService) {
+    }
+
+    ngOnInit() {
+        this.gridSource = this.acqSearch.getAcqSearchDataSource('invoice');
+        this.noSelectedRows = (rows: IdlObject[]) => (rows.length === 0);
+        this.cellTextGenerator = {
+            inv_ident: row => row.inv_ident(),
+            provider: row => row.provider().code(),
+            shipper: row => row.shipper().code(),
+        };
+    }
+
+    ngAfterViewInit() {
+        this.providerRecord.refreshCurrent().then(() => {
+            const provider = this.providerRecord.current();
+            if (provider) {
+                setTimeout(() => {
+                    this.acqSearch.setSearch({
+                        terms: [{
+                            field:  'acqinv:provider',
+                            op:     '',
+                            value1: provider.id(),
+                            value2: '',
+                        }],
+                        conjunction: 'all',
+                    });
+                    this.providerInvoicesGrid.reload();
+                });
+            }
+        });
+    }
+
+    // TODO - copied from InvoiceResultsComponent, could be
+    // consolidated
+    printSelectedInvoices(rows: IdlObject[]) {
+      const that = this;
+      let html = '<style type="text/css">.acq-invoice-' +
+        'voucher {page-break-after:always;}' +
+        '</style>\n';
+      this.net.request(
+        'open-ils.acq',
+        'open-ils.acq.invoice.print.html',
+        this.auth.token(), rows.map( invoice => invoice.id() )
+      ).subscribe(
+        (res) => {
+          if (this.evt.parse(res)) {
+            console.error(res);
+            this.printfail.open();
+          } else {
+            html +=  res.template_output().data();
+          }
+        },
+        (err) => {
+          console.error(err);
+          this.printfail.open();
+        },
+        () => this.printer.print({
+          text: html,
+          printContext: 'default'
+        })
+      );
+    }
+
+}