diff --git a/packages/server/src/interfaces/Bill.ts b/packages/server/src/interfaces/Bill.ts index 0ccc72723..a130a62ba 100644 --- a/packages/server/src/interfaces/Bill.ts +++ b/packages/server/src/interfaces/Bill.ts @@ -99,6 +99,7 @@ export interface IBillsFilter extends IDynamicListFilterDTO { stringifiedFilterRoles?: string; page: number; pageSize: number; + filterQuery?: (q: any) => void; } export interface IBillsService { diff --git a/packages/server/src/interfaces/CreditNote.ts b/packages/server/src/interfaces/CreditNote.ts index e3e6df1cf..22ff521d7 100644 --- a/packages/server/src/interfaces/CreditNote.ts +++ b/packages/server/src/interfaces/CreditNote.ts @@ -130,7 +130,9 @@ export interface ICreditNoteOpenedPayload { trx: Knex.Transaction; } -export interface ICreditNotesQueryDTO {} +export interface ICreditNotesQueryDTO { + filterQuery?: (query: any) => void; +} export interface ICreditNotesQueryDTO extends IDynamicListFilter { page: number; diff --git a/packages/server/src/interfaces/Model.ts b/packages/server/src/interfaces/Model.ts index bb6e7720b..59c75f8de 100644 --- a/packages/server/src/interfaces/Model.ts +++ b/packages/server/src/interfaces/Model.ts @@ -151,6 +151,7 @@ export interface IModelMetaFieldCommon2 { importHint?: string; order?: number; unique?: number; + features?: Array } export interface IModelMetaRelationField2 { diff --git a/packages/server/src/interfaces/SaleEstimate.ts b/packages/server/src/interfaces/SaleEstimate.ts index 9db21c029..bc6231fc4 100644 --- a/packages/server/src/interfaces/SaleEstimate.ts +++ b/packages/server/src/interfaces/SaleEstimate.ts @@ -44,6 +44,7 @@ export interface ISaleEstimateDTO { export interface ISalesEstimatesFilter extends IDynamicListFilterDTO { stringifiedFilterRoles?: string; + filterQuery?: (q: any) => void; } export interface ISalesEstimatesService { diff --git a/packages/server/src/interfaces/SaleInvoice.ts b/packages/server/src/interfaces/SaleInvoice.ts index 6fd5e753b..03827d229 100644 --- a/packages/server/src/interfaces/SaleInvoice.ts +++ b/packages/server/src/interfaces/SaleInvoice.ts @@ -79,6 +79,7 @@ export interface ISalesInvoicesFilter extends IDynamicListFilter { page: number; pageSize: number; searchKeyword?: string; + filterQuery?: (q: Knex.QueryBuilder) => void; } export interface ISalesInvoicesService { diff --git a/packages/server/src/interfaces/SaleReceipt.ts b/packages/server/src/interfaces/SaleReceipt.ts index 36e84e0db..14f451dda 100644 --- a/packages/server/src/interfaces/SaleReceipt.ts +++ b/packages/server/src/interfaces/SaleReceipt.ts @@ -29,7 +29,9 @@ export interface ISaleReceipt { entries?: IItemEntry[]; } -export interface ISalesReceiptsFilter {} +export interface ISalesReceiptsFilter { + filterQuery?: (query: any) => void; +} export interface ISaleReceiptDTO { customerId: number; diff --git a/packages/server/src/interfaces/VendorCredit.ts b/packages/server/src/interfaces/VendorCredit.ts index d7c8f14d3..879b6b783 100644 --- a/packages/server/src/interfaces/VendorCredit.ts +++ b/packages/server/src/interfaces/VendorCredit.ts @@ -106,6 +106,7 @@ export interface IVendorCreditsQueryDTO extends IDynamicListFilter { page: number; pageSize: number; searchKeyword?: string; + filterQuery?: (q: any) => void; } export interface IVendorCreditEditingPayload { diff --git a/packages/server/src/models/Bill.Settings.ts b/packages/server/src/models/Bill.Settings.ts index 0d9e2bda6..f8464fefa 100644 --- a/packages/server/src/models/Bill.Settings.ts +++ b/packages/server/src/models/Bill.Settings.ts @@ -1,3 +1,5 @@ +import { Features } from '@/interfaces'; + export default { defaultFilterField: 'vendor', defaultSort: { @@ -167,6 +169,18 @@ export default { }, }, }, + branch: { + name: 'Branch', + type: 'text', + accessor: 'branch.name', + features: [Features.BRANCHES], + }, + warehouse: { + name: 'Warehouse', + type: 'text', + accessor: 'warehouse.name', + features: [Features.BRANCHES], + }, }, fields2: { billNumber: { @@ -238,6 +252,22 @@ export default { }, }, }, + branchId: { + name: 'Branch', + fieldType: 'relation', + relationModel: 'Branch', + relationImportMatch: ['name', 'code'], + features: [Features.BRANCHES], + required: true, + }, + warehouseId: { + name: 'Warehouse', + fieldType: 'relation', + relationModel: 'Warehouse', + relationImportMatch: ['name', 'code'], + features: [Features.WAREHOUSES], + required: true, + }, }, }; diff --git a/packages/server/src/models/Bill.ts b/packages/server/src/models/Bill.ts index e91f0ea33..f4e313e72 100644 --- a/packages/server/src/models/Bill.ts +++ b/packages/server/src/models/Bill.ts @@ -402,6 +402,7 @@ export default class Bill extends mixin(TenantModel, [ const ItemEntry = require('models/ItemEntry'); const BillLandedCost = require('models/BillLandedCost'); const Branch = require('models/Branch'); + const Warehouse = require('models/Warehouse'); const TaxRateTransaction = require('models/TaxRateTransaction'); const Document = require('models/Document'); const { MatchedBankTransaction } = require('models/MatchedBankTransaction'); @@ -453,6 +454,18 @@ export default class Bill extends mixin(TenantModel, [ }, }, + /** + * Bill may has associated warehouse. + */ + warehouse: { + relation: Model.BelongsToOneRelation, + modelClass: Warehouse.default, + join: { + from: 'bills.warehouseId', + to: 'warehouses.id', + }, + }, + /** * Bill may has associated tax rate transactions. */ diff --git a/packages/server/src/models/BillPayment.Settings.ts b/packages/server/src/models/BillPayment.Settings.ts index 6baf2efad..fe456e981 100644 --- a/packages/server/src/models/BillPayment.Settings.ts +++ b/packages/server/src/models/BillPayment.Settings.ts @@ -1,3 +1,5 @@ +import { Features } from '@/interfaces'; + export default { defaultFilterField: 'vendor', defaultSort: { @@ -141,6 +143,12 @@ export default { }, }, }, + branch: { + name: 'Branch', + type: 'text', + accessor: 'branch.name', + features: [Features.BRANCHES], + }, }, fields2: { vendorId: { @@ -204,5 +212,13 @@ export default { }, }, }, + branchId: { + name: 'Branch', + fieldType: 'relation', + relationModel: 'Branch', + relationImportMatch: ['name', 'code'], + features: [Features.BRANCHES], + required: true, + }, }, }; diff --git a/packages/server/src/models/Branch.settings.ts b/packages/server/src/models/Branch.settings.ts new file mode 100644 index 000000000..921dc5c0a --- /dev/null +++ b/packages/server/src/models/Branch.settings.ts @@ -0,0 +1,11 @@ +export default { + fields2: { + name: { + name: 'Name', + fieldType: 'text', + required: true, + }, + }, + columns: {}, + fields: {} +}; diff --git a/packages/server/src/models/Branch.ts b/packages/server/src/models/Branch.ts index bf2c4bfa3..ee143be6f 100644 --- a/packages/server/src/models/Branch.ts +++ b/packages/server/src/models/Branch.ts @@ -1,7 +1,9 @@ -import { Model } from 'objection'; +import { Model, mixin } from 'objection'; import TenantModel from 'models/TenantModel'; +import BranchMetadata from './Branch.settings'; +import ModelSetting from './ModelSetting'; -export default class Branch extends TenantModel { +export default class Branch extends mixin(TenantModel, [ModelSetting]) { /** * Table name. */ @@ -169,4 +171,11 @@ export default class Branch extends TenantModel { }, }; } + + /** + * Model settings. + */ + static get meta() { + return BranchMetadata; + } } diff --git a/packages/server/src/models/CreditNote.Meta.ts b/packages/server/src/models/CreditNote.Meta.ts index 95e8595b9..ae2dc7750 100644 --- a/packages/server/src/models/CreditNote.Meta.ts +++ b/packages/server/src/models/CreditNote.Meta.ts @@ -1,3 +1,5 @@ +import { Features } from '@/interfaces'; + function StatusFieldFilterQuery(query, role) { query.modify('filterByStatus', role.value); } @@ -100,7 +102,7 @@ export default { }, creditNoteDate: { name: 'Credit Note Date', - accessor: 'formattedCreditNoteDate' + accessor: 'formattedCreditNoteDate', }, referenceNo: { name: 'Reference No.', @@ -147,6 +149,18 @@ export default { }, }, }, + branch: { + name: 'Branch', + type: 'text', + accessor: 'branch.name', + features: [Features.BRANCHES], + }, + warehouse: { + name: 'Warehouse', + type: 'text', + accessor: 'warehouse.name', + features: [Features.BRANCHES], + }, }, fields2: { customerId: { @@ -215,5 +229,21 @@ export default { }, }, }, + branchId: { + name: 'Branch', + fieldType: 'relation', + relationModel: 'Branch', + relationImportMatch: ['name', 'code'], + features: [Features.BRANCHES], + required: true, + }, + warehouseId: { + name: 'Warehouse', + fieldType: 'relation', + relationModel: 'Warehouse', + relationImportMatch: ['name', 'code'], + features: [Features.WAREHOUSES], + required: true, + }, }, }; diff --git a/packages/server/src/models/CreditNote.ts b/packages/server/src/models/CreditNote.ts index a682753c4..b7400b14e 100644 --- a/packages/server/src/models/CreditNote.ts +++ b/packages/server/src/models/CreditNote.ts @@ -175,6 +175,7 @@ export default class CreditNote extends mixin(TenantModel, [ const Customer = require('models/Customer'); const Branch = require('models/Branch'); const Document = require('models/Document'); + const Warehouse = require('models/Warehouse'); return { /** @@ -235,6 +236,18 @@ export default class CreditNote extends mixin(TenantModel, [ }, }, + /** + * Credit note may has associated warehouse. + */ + warehouse: { + relation: Model.BelongsToOneRelation, + modelClass: Warehouse.default, + join: { + from: 'credit_notes.warehouseId', + to: 'warehouses.id', + }, + }, + /** * Credit note may has many attached attachments. */ diff --git a/packages/server/src/models/PaymentReceive.Settings.ts b/packages/server/src/models/PaymentReceive.Settings.ts index c862a3506..aeb59b41f 100644 --- a/packages/server/src/models/PaymentReceive.Settings.ts +++ b/packages/server/src/models/PaymentReceive.Settings.ts @@ -1,3 +1,5 @@ +import { Features } from '@/interfaces'; + export default { importable: true, @@ -128,6 +130,12 @@ export default { type: 'date', printable: false, }, + branch: { + name: 'Branch', + type: 'text', + accessor: 'branch.name', + features: [Features.BRANCHES], + }, }, fields2: { customerId: { @@ -189,5 +197,13 @@ export default { }, }, }, + branchId: { + name: 'Branch', + fieldType: 'relation', + relationModel: 'Branch', + relationImportMatch: ['name', 'code'], + features: [Features.BRANCHES], + required: true, + }, }, }; diff --git a/packages/server/src/models/SaleEstimate.Settings.ts b/packages/server/src/models/SaleEstimate.Settings.ts index 88224fdd1..490afc4f2 100644 --- a/packages/server/src/models/SaleEstimate.Settings.ts +++ b/packages/server/src/models/SaleEstimate.Settings.ts @@ -1,3 +1,5 @@ +import { Features } from '@/interfaces'; + export default { defaultFilterField: 'estimate_date', defaultSort: { @@ -174,6 +176,18 @@ export default { }, }, }, + branch: { + name: 'Branch', + type: 'text', + accessor: 'branch.name', + features: [Features.BRANCHES], + }, + warehouse: { + name: 'Warehouse', + type: 'text', + accessor: 'warehouse.name', + features: [Features.BRANCHES], + }, }, fields2: { customerId: { @@ -252,6 +266,22 @@ export default { }, }, }, + branchId: { + name: 'Branch', + fieldType: 'relation', + relationModel: 'Branch', + relationImportMatch: ['name', 'code'], + features: [Features.BRANCHES], + required: true, + }, + warehouseId: { + name: 'Warehouse', + fieldType: 'relation', + relationModel: 'Warehouse', + relationImportMatch: ['name', 'code'], + features: [Features.WAREHOUSES], + required: true, + }, }, }; diff --git a/packages/server/src/models/SaleEstimate.ts b/packages/server/src/models/SaleEstimate.ts index 35fa723ec..47ecebce5 100644 --- a/packages/server/src/models/SaleEstimate.ts +++ b/packages/server/src/models/SaleEstimate.ts @@ -182,6 +182,7 @@ export default class SaleEstimate extends mixin(TenantModel, [ const ItemEntry = require('models/ItemEntry'); const Customer = require('models/Customer'); const Branch = require('models/Branch'); + const Warehouse = require('models/Warehouse'); const Document = require('models/Document'); return { @@ -221,6 +222,18 @@ export default class SaleEstimate extends mixin(TenantModel, [ }, }, + /** + * Sale estimate may has associated warehouse. + */ + warehouse: { + relation: Model.BelongsToOneRelation, + modelClass: Warehouse.default, + join: { + from: 'sales_estimates.warehouseId', + to: 'warehouses.id', + }, + }, + /** * Sale estimate transaction may has many attached attachments. */ diff --git a/packages/server/src/models/SaleInvoice.Settings.ts b/packages/server/src/models/SaleInvoice.Settings.ts index 9f7cbfe8b..2992cd278 100644 --- a/packages/server/src/models/SaleInvoice.Settings.ts +++ b/packages/server/src/models/SaleInvoice.Settings.ts @@ -1,3 +1,5 @@ +import { Features } from '@/interfaces'; + export default { defaultFilterField: 'customer', defaultSort: { @@ -185,6 +187,18 @@ export default { }, }, }, + branch: { + name: 'Branch', + type: 'text', + accessor: 'branch.name', + features: [Features.BRANCHES], + }, + warehouse: { + name: 'Warehouse', + type: 'text', + accessor: 'warehouse.name', + features: [Features.BRANCHES], + }, }, fields2: { invoiceDate: { @@ -268,6 +282,22 @@ export default { fieldType: 'boolean', printable: false, }, + branchId: { + name: 'Branch', + fieldType: 'relation', + relationModel: 'Branch', + relationImportMatch: ['name', 'code'], + features: [Features.BRANCHES], + required: true, + }, + warehouseId: { + name: 'Warehouse', + fieldType: 'relation', + relationModel: 'Warehouse', + relationImportMatch: ['name', 'code'], + features: [Features.WAREHOUSES], + required: true, + }, }, }; diff --git a/packages/server/src/models/SaleInvoice.ts b/packages/server/src/models/SaleInvoice.ts index 49ceb1302..41cc528ff 100644 --- a/packages/server/src/models/SaleInvoice.ts +++ b/packages/server/src/models/SaleInvoice.ts @@ -408,6 +408,7 @@ export default class SaleInvoice extends mixin(TenantModel, [ const InventoryCostLotTracker = require('models/InventoryCostLotTracker'); const PaymentReceiveEntry = require('models/PaymentReceiveEntry'); const Branch = require('models/Branch'); + const Warehouse = require('models/Warehouse'); const Account = require('models/Account'); const TaxRateTransaction = require('models/TaxRateTransaction'); const Document = require('models/Document'); @@ -499,6 +500,18 @@ export default class SaleInvoice extends mixin(TenantModel, [ }, }, + /** + * Invoice may has associated warehouse. + */ + warehouse: { + relation: Model.BelongsToOneRelation, + modelClass: Warehouse.default, + join: { + from: 'sales_invoices.warehouseId', + to: 'warehouses.id', + } + }, + /** * Invoice may has associated written-off expense account. */ diff --git a/packages/server/src/models/SaleReceipt.Settings.ts b/packages/server/src/models/SaleReceipt.Settings.ts index 54230128b..1759ac053 100644 --- a/packages/server/src/models/SaleReceipt.Settings.ts +++ b/packages/server/src/models/SaleReceipt.Settings.ts @@ -1,3 +1,5 @@ +import { Features } from '@/interfaces'; + export default { defaultFilterField: 'receipt_date', defaultSort: { @@ -169,6 +171,18 @@ export default { type: 'date', printable: false, }, + branch: { + name: 'Branch', + type: 'text', + accessor: 'branch.name', + features: [Features.BRANCHES], + }, + warehouse: { + name: 'Warehouse', + type: 'text', + accessor: 'warehouse.name', + features: [Features.BRANCHES], + }, }, fields2: { receiptDate: { @@ -245,6 +259,22 @@ export default { name: 'Receipt Message', fieldType: 'text', }, + branchId: { + name: 'Branch', + fieldType: 'relation', + relationModel: 'Branch', + relationImportMatch: ['name', 'code'], + features: [Features.BRANCHES], + required: true, + }, + warehouseId: { + name: 'Warehouse', + fieldType: 'relation', + relationModel: 'Warehouse', + relationImportMatch: ['name', 'code'], + features: [Features.WAREHOUSES], + required: true, + }, }, }; diff --git a/packages/server/src/models/SaleReceipt.ts b/packages/server/src/models/SaleReceipt.ts index ba39af02e..9ac76640e 100644 --- a/packages/server/src/models/SaleReceipt.ts +++ b/packages/server/src/models/SaleReceipt.ts @@ -109,6 +109,7 @@ export default class SaleReceipt extends mixin(TenantModel, [ const ItemEntry = require('models/ItemEntry'); const Branch = require('models/Branch'); const Document = require('models/Document'); + const Warehouse = require('models/Warehouse'); return { customer: { @@ -169,6 +170,18 @@ export default class SaleReceipt extends mixin(TenantModel, [ }, }, + /** + * Sale receipt may has associated warehouse. + */ + warehouse: { + relation: Model.BelongsToOneRelation, + modelClass: Warehouse.default, + join: { + from: 'sales_receipts.warehouseId', + to: 'warehouses.id', + }, + }, + /** * Sale receipt transaction may has many attached attachments. */ diff --git a/packages/server/src/models/VendorCredit.Meta.ts b/packages/server/src/models/VendorCredit.Meta.ts index 3834bc5ec..a2e197963 100644 --- a/packages/server/src/models/VendorCredit.Meta.ts +++ b/packages/server/src/models/VendorCredit.Meta.ts @@ -1,3 +1,5 @@ +import { Features } from '@/interfaces'; + function StatusFieldFilterQuery(query, role) { query.modify('filterByStatus', role.value); } @@ -160,6 +162,18 @@ export default { }, }, }, + branch: { + name: 'Branch', + type: 'text', + accessor: 'branch.name', + features: [Features.BRANCHES], + }, + warehouse: { + name: 'Warehouse', + type: 'text', + accessor: 'warehouse.name', + features: [Features.BRANCHES], + }, }, fields2: { vendorId: { @@ -225,5 +239,21 @@ export default { }, }, }, + branchId: { + name: 'Branch', + fieldType: 'relation', + relationModel: 'Branch', + relationImportMatch: ['name', 'code'], + features: [Features.BRANCHES], + required: true + }, + warehouseId: { + name: 'Warehouse', + fieldType: 'relation', + relationModel: 'Warehouse', + relationImportMatch: ['name', 'code'], + features: [Features.WAREHOUSES], + required: true + }, }, }; diff --git a/packages/server/src/models/VendorCredit.ts b/packages/server/src/models/VendorCredit.ts index 1dd949205..c7de45e54 100644 --- a/packages/server/src/models/VendorCredit.ts +++ b/packages/server/src/models/VendorCredit.ts @@ -178,6 +178,7 @@ export default class VendorCredit extends mixin(TenantModel, [ const ItemEntry = require('models/ItemEntry'); const Branch = require('models/Branch'); const Document = require('models/Document'); + const Warehouse = require('models/Warehouse'); return { vendor: { @@ -217,6 +218,18 @@ export default class VendorCredit extends mixin(TenantModel, [ }, }, + /** + * Vendor credit may has associated warehouse. + */ + warehouse: { + relation: Model.BelongsToOneRelation, + modelClass: Warehouse.default, + join: { + from: 'vendor_credits.warehouseId', + to: 'warehouses.id', + }, + }, + /** * Vendor credit may has many attached attachments. */ diff --git a/packages/server/src/models/Warehouse.settings.ts b/packages/server/src/models/Warehouse.settings.ts new file mode 100644 index 000000000..921dc5c0a --- /dev/null +++ b/packages/server/src/models/Warehouse.settings.ts @@ -0,0 +1,11 @@ +export default { + fields2: { + name: { + name: 'Name', + fieldType: 'text', + required: true, + }, + }, + columns: {}, + fields: {} +}; diff --git a/packages/server/src/services/CreditNotes/CreditNotesExportable.ts b/packages/server/src/services/CreditNotes/CreditNotesExportable.ts index 09dae2a74..f461b3b40 100644 --- a/packages/server/src/services/CreditNotes/CreditNotesExportable.ts +++ b/packages/server/src/services/CreditNotes/CreditNotesExportable.ts @@ -15,12 +15,17 @@ export class CreditNotesExportable extends Exportable { * @returns {} */ public exportable(tenantId: number, query: ICreditNotesQueryDTO) { + const filterQuery = (query) => { + query.withGraphFetched('branch'); + query.withGraphFetched('warehouse'); + }; const parsedQuery = { sortOrder: 'desc', columnSortBy: 'created_at', ...query, page: 1, pageSize: 12000, + filterQuery, } as ICreditNotesQueryDTO; return this.getCreditNotes diff --git a/packages/server/src/services/CreditNotes/ListCreditNotes.ts b/packages/server/src/services/CreditNotes/ListCreditNotes.ts index 11ec2f7fa..5eb5753e3 100644 --- a/packages/server/src/services/CreditNotes/ListCreditNotes.ts +++ b/packages/server/src/services/CreditNotes/ListCreditNotes.ts @@ -48,6 +48,7 @@ export default class ListCreditNotes extends BaseCreditNotes { builder.withGraphFetched('entries.item'); builder.withGraphFetched('customer'); dynamicFilter.buildQuery()(builder); + creditNotesQuery?.filterQuery && creditNotesQuery?.filterQuery(builder); }) .pagination(filter.page - 1, filter.pageSize); diff --git a/packages/server/src/services/Export/ExportService.ts b/packages/server/src/services/Export/ExportService.ts index 60fa0a704..f3de3ffa5 100644 --- a/packages/server/src/services/Export/ExportService.ts +++ b/packages/server/src/services/Export/ExportService.ts @@ -56,7 +56,10 @@ export class ExportResourceService { ) { const resource = sanitizeResourceName(resourceName); const resourceMeta = this.getResourceMeta(tenantId, resource); - + const resourceColumns = this.resourceService.getResourceColumns( + tenantId, + resource + ); this.validateResourceMeta(resourceMeta); const data = await this.getExportableData(tenantId, resource); @@ -64,7 +67,7 @@ export class ExportResourceService { // Returns the csv, xlsx format. if (format === ExportFormat.Csv || format === ExportFormat.Xlsx) { - const exportableColumns = this.getExportableColumns(resourceMeta); + const exportableColumns = this.getExportableColumns(resourceColumns); const workbook = this.createWorkbook(transformed, exportableColumns); return this.exportWorkbook(workbook, format); @@ -143,7 +146,7 @@ export class ExportResourceService { * @param {IModelMeta} resourceMeta - The metadata of the resource. * @returns An array of exportable columns. */ - private getExportableColumns(resourceMeta: IModelMeta) { + private getExportableColumns(resourceColumns: any) { const processColumns = ( columns: { [key: string]: IModelMetaColumn }, parent = '' @@ -166,7 +169,7 @@ export class ExportResourceService { } }); }; - return processColumns(resourceMeta.columns); + return processColumns(resourceColumns); } private getPrintableColumns(resourceMeta: IModelMeta) { diff --git a/packages/server/src/services/Import/ImportFileMapping.ts b/packages/server/src/services/Import/ImportFileMapping.ts index 62098bc6b..3ef321239 100644 --- a/packages/server/src/services/Import/ImportFileMapping.ts +++ b/packages/server/src/services/Import/ImportFileMapping.ts @@ -33,6 +33,8 @@ export class ImportFileMapping { // Invalidate the from/to map attributes. this.validateMapsAttrs(tenantId, importFile, maps); + // @todo validate the required fields. + // Validate the diplicated relations of map attrs. this.validateDuplicatedMapAttrs(maps); diff --git a/packages/server/src/services/Purchases/BillPayments/BillPaymentExportable.ts b/packages/server/src/services/Purchases/BillPayments/BillPaymentExportable.ts index 95978fdb4..0622d3733 100644 --- a/packages/server/src/services/Purchases/BillPayments/BillPaymentExportable.ts +++ b/packages/server/src/services/Purchases/BillPayments/BillPaymentExportable.ts @@ -16,6 +16,7 @@ export class BillPaymentExportable extends Exportable { public exportable(tenantId: number, query: any) { const filterQuery = (builder) => { builder.withGraphFetched('entries.bill'); + builder.withGraphFetched('branch'); }; const parsedQuery = { sortOrder: 'desc', diff --git a/packages/server/src/services/Purchases/Bills/BillsExportable.ts b/packages/server/src/services/Purchases/Bills/BillsExportable.ts index b1bc9e306..e6a49e01a 100644 --- a/packages/server/src/services/Purchases/Bills/BillsExportable.ts +++ b/packages/server/src/services/Purchases/Bills/BillsExportable.ts @@ -1,8 +1,10 @@ import { Inject, Service } from 'typedi'; +import { Knex } from 'knex'; import { IBillsFilter } from '@/interfaces'; import { Exportable } from '@/services/Export/Exportable'; import { BillsApplication } from './BillsApplication'; import { EXPORT_SIZE_LIMIT } from '@/services/Export/constants'; +import Objection from 'objection'; @Service() export class BillsExportable extends Exportable { @@ -15,12 +17,17 @@ export class BillsExportable extends Exportable { * @returns */ public exportable(tenantId: number, query: IBillsFilter) { + const filterQuery = (query) => { + query.withGraphFetched('branch'); + query.withGraphFetched('warehouse'); + }; const parsedQuery = { sortOrder: 'desc', columnSortBy: 'created_at', ...query, page: 1, pageSize: EXPORT_SIZE_LIMIT, + filterQuery, } as IBillsFilter; return this.billsApplication diff --git a/packages/server/src/services/Purchases/Bills/GetBills.ts b/packages/server/src/services/Purchases/Bills/GetBills.ts index 73abc55da..b68c0018f 100644 --- a/packages/server/src/services/Purchases/Bills/GetBills.ts +++ b/packages/server/src/services/Purchases/Bills/GetBills.ts @@ -51,6 +51,9 @@ export class GetBills { builder.withGraphFetched('vendor'); builder.withGraphFetched('entries.item'); dynamicFilter.buildQuery()(builder); + + // Filter query. + filterDTO?.filterQuery && filterDTO?.filterQuery(builder); }) .pagination(filter.page - 1, filter.pageSize); diff --git a/packages/server/src/services/Purchases/VendorCredits/ListVendorCredits.ts b/packages/server/src/services/Purchases/VendorCredits/ListVendorCredits.ts index ff1be92fc..ff0e0ee30 100644 --- a/packages/server/src/services/Purchases/VendorCredits/ListVendorCredits.ts +++ b/packages/server/src/services/Purchases/VendorCredits/ListVendorCredits.ts @@ -48,6 +48,10 @@ export default class ListVendorCredits extends BaseVendorCredit { builder.withGraphFetched('entries'); builder.withGraphFetched('vendor'); dynamicFilter.buildQuery()(builder); + + // Gives ability to inject custom query to filter results. + vendorCreditQuery?.filterQuery && + vendorCreditQuery?.filterQuery(builder); }) .pagination(filter.page - 1, filter.pageSize); diff --git a/packages/server/src/services/Purchases/VendorCredits/VendorCreditsExportable.ts b/packages/server/src/services/Purchases/VendorCredits/VendorCreditsExportable.ts index 4e0963165..e1919a9ef 100644 --- a/packages/server/src/services/Purchases/VendorCredits/VendorCreditsExportable.ts +++ b/packages/server/src/services/Purchases/VendorCredits/VendorCreditsExportable.ts @@ -2,6 +2,7 @@ import { Inject, Service } from 'typedi'; import { IVendorCreditsQueryDTO } from '@/interfaces'; import ListVendorCredits from './ListVendorCredits'; import { Exportable } from '@/services/Export/Exportable'; +import { QueryBuilder } from 'knex'; @Service() export class VendorCreditsExportable extends Exportable { @@ -15,12 +16,17 @@ export class VendorCreditsExportable extends Exportable { * @returns {} */ public exportable(tenantId: number, query: IVendorCreditsQueryDTO) { + const filterQuery = (query) => { + query.withGraphFetched('branch'); + query.withGraphFetched('warehouse'); + }; const parsedQuery = { sortOrder: 'desc', columnSortBy: 'created_at', ...query, page: 1, pageSize: 12000, + filterQuery, } as IVendorCreditsQueryDTO; return this.getVendorCredits diff --git a/packages/server/src/services/Sales/Estimates/GetSaleEstimates.ts b/packages/server/src/services/Sales/Estimates/GetSaleEstimates.ts index bba1db943..c530dc857 100644 --- a/packages/server/src/services/Sales/Estimates/GetSaleEstimates.ts +++ b/packages/server/src/services/Sales/Estimates/GetSaleEstimates.ts @@ -53,6 +53,7 @@ export class GetSaleEstimates { builder.withGraphFetched('entries'); builder.withGraphFetched('entries.item'); dynamicFilter.buildQuery()(builder); + filterDTO?.filterQuery && filterDTO?.filterQuery(builder); }) .pagination(filter.page - 1, filter.pageSize); diff --git a/packages/server/src/services/Sales/Estimates/SaleEstimatesExportable.ts b/packages/server/src/services/Sales/Estimates/SaleEstimatesExportable.ts index 759c4c166..b4ddafabf 100644 --- a/packages/server/src/services/Sales/Estimates/SaleEstimatesExportable.ts +++ b/packages/server/src/services/Sales/Estimates/SaleEstimatesExportable.ts @@ -15,12 +15,17 @@ export class SaleEstimatesExportable extends Exportable { * @returns */ public exportable(tenantId: number, query: ISalesInvoicesFilter) { + const filterQuery = (query) => { + query.withGraphFetched('branch'); + query.withGraphFetched('warehouse'); + }; const parsedQuery = { sortOrder: 'desc', columnSortBy: 'created_at', ...query, page: 1, pageSize: EXPORT_SIZE_LIMIT, + filterQuery, } as ISalesInvoicesFilter; return this.saleEstimatesApplication diff --git a/packages/server/src/services/Sales/Invoices/GetSaleInvoices.ts b/packages/server/src/services/Sales/Invoices/GetSaleInvoices.ts index 569aceccb..9fe410883 100644 --- a/packages/server/src/services/Sales/Invoices/GetSaleInvoices.ts +++ b/packages/server/src/services/Sales/Invoices/GetSaleInvoices.ts @@ -52,6 +52,7 @@ export class GetSaleInvoices { builder.withGraphFetched('entries.item'); builder.withGraphFetched('customer'); dynamicFilter.buildQuery()(builder); + filterDTO?.filterQuery && filterDTO?.filterQuery(builder); }) .pagination(filter.page - 1, filter.pageSize); diff --git a/packages/server/src/services/Sales/Invoices/SaleInvoicesExportable.ts b/packages/server/src/services/Sales/Invoices/SaleInvoicesExportable.ts index 77db020b8..a68098a19 100644 --- a/packages/server/src/services/Sales/Invoices/SaleInvoicesExportable.ts +++ b/packages/server/src/services/Sales/Invoices/SaleInvoicesExportable.ts @@ -15,12 +15,17 @@ export class SaleInvoicesExportable extends Exportable { * @returns */ public exportable(tenantId: number, query: ISalesInvoicesFilter) { + const filterQuery = (query) => { + query.withGraphFetched('branch'); + query.withGraphFetched('warehouse'); + }; const parsedQuery = { sortOrder: 'desc', columnSortBy: 'created_at', ...query, page: 1, pageSize: EXPORT_SIZE_LIMIT, + filterQuery, } as ISalesInvoicesFilter; return this.saleInvoicesApplication diff --git a/packages/server/src/services/Sales/PaymentReceived/PaymentsReceivedExportable.ts b/packages/server/src/services/Sales/PaymentReceived/PaymentsReceivedExportable.ts index 20319ccfb..43881da9a 100644 --- a/packages/server/src/services/Sales/PaymentReceived/PaymentsReceivedExportable.ts +++ b/packages/server/src/services/Sales/PaymentReceived/PaymentsReceivedExportable.ts @@ -18,6 +18,7 @@ export class PaymentsReceivedExportable extends Exportable { public exportable(tenantId: number, query: IPaymentsReceivedFilter) { const filterQuery = (builder) => { builder.withGraphFetched('entries.invoice'); + builder.withGraphFetched('branch'); }; const parsedQuery = { diff --git a/packages/server/src/services/Sales/Receipts/GetSaleReceipts.ts b/packages/server/src/services/Sales/Receipts/GetSaleReceipts.ts index 1916c5e75..d38c58c61 100644 --- a/packages/server/src/services/Sales/Receipts/GetSaleReceipts.ts +++ b/packages/server/src/services/Sales/Receipts/GetSaleReceipts.ts @@ -56,6 +56,7 @@ export class GetSaleReceipts { builder.withGraphFetched('entries.item'); dynamicFilter.buildQuery()(builder); + filterDTO?.filterQuery && filterDTO?.filterQuery(builder); }) .pagination(filter.page - 1, filter.pageSize); diff --git a/packages/server/src/services/Sales/Receipts/SaleReceiptsExportable.ts b/packages/server/src/services/Sales/Receipts/SaleReceiptsExportable.ts index 0373ba5dc..619841e8d 100644 --- a/packages/server/src/services/Sales/Receipts/SaleReceiptsExportable.ts +++ b/packages/server/src/services/Sales/Receipts/SaleReceiptsExportable.ts @@ -15,12 +15,17 @@ export class SaleReceiptsExportable extends Exportable { * @returns */ public exportable(tenantId: number, query: ISalesReceiptsFilter) { + const filterQuery = (query) => { + query.withGraphFetched('branch'); + query.withGraphFetched('warehouse'); + }; const parsedQuery = { sortOrder: 'desc', columnSortBy: 'created_at', ...query, page: 1, pageSize: EXPORT_SIZE_LIMIT, + filterQuery, } as ISalesReceiptsFilter; return this.saleReceiptsApp diff --git a/packages/webapp/src/containers/Sales/Receipts/SaleReceiptsImport.tsx b/packages/webapp/src/containers/Sales/Receipts/SaleReceiptsImport.tsx index 811dd8bd7..4ad69c8ac 100644 --- a/packages/webapp/src/containers/Sales/Receipts/SaleReceiptsImport.tsx +++ b/packages/webapp/src/containers/Sales/Receipts/SaleReceiptsImport.tsx @@ -7,10 +7,10 @@ export default function ReceiptsImport() { const history = useHistory(); const handleCancelBtnClick = () => { - history.push('/accounts'); + history.push('/receipts'); }; const handleImportSuccess = () => { - history.push('/accounts'); + history.push('/receipts'); }; return (