refactor(nestjs): add importable service to other modules

This commit is contained in:
Ahmed Bouhuolia
2025-04-12 19:26:15 +02:00
parent 51de3631fc
commit 1d53063e09
30 changed files with 1666 additions and 139 deletions

View File

@@ -20,12 +20,13 @@ import { VendorCreditGlEntriesSubscriber } from './subscribers/VendorCreditGLEnt
import { VendorCreditGLEntries } from './commands/VendorCreditGLEntries';
import { LedgerModule } from '../Ledger/Ledger.module';
import { AccountsModule } from '../Accounts/Accounts.module';
import VendorCreditInventoryTransactionsSubscriber from './subscribers/VendorCreditInventoryTransactionsSusbcriber';
import { VendorCreditInventoryTransactionsSubscriber } from './subscribers/VendorCreditInventoryTransactionsSusbcriber';
import { VendorCreditInventoryTransactions } from './commands/VendorCreditInventoryTransactions';
import { GetVendorCreditsService } from './queries/GetVendorCredits.service';
import { DynamicListModule } from '../DynamicListing/DynamicList.module';
import { InventoryCostModule } from '../InventoryCost/InventoryCost.module';
import { VendorCreditsExportable } from './commands/VendorCreditsExportable';
import { VendorCreditsImportable } from './commands/VendorCreditsImportable';
@Module({
imports: [
@@ -39,7 +40,7 @@ import { VendorCreditsExportable } from './commands/VendorCreditsExportable';
LedgerModule,
AccountsModule,
DynamicListModule,
InventoryCostModule
InventoryCostModule,
],
providers: [
CreateVendorCreditService,
@@ -56,7 +57,8 @@ import { VendorCreditsExportable } from './commands/VendorCreditsExportable';
VendorCreditGlEntriesSubscriber,
VendorCreditInventoryTransactions,
VendorCreditInventoryTransactionsSubscriber,
VendorCreditsExportable
VendorCreditsExportable,
VendorCreditsImportable,
],
exports: [
CreateVendorCreditService,
@@ -67,7 +69,9 @@ import { VendorCreditsExportable } from './commands/VendorCreditsExportable';
GetRefundVendorCreditService,
GetVendorCreditService,
VendorCreditsApplicationService,
OpenVendorCreditService
OpenVendorCreditService,
VendorCreditsExportable,
VendorCreditsImportable,
],
controllers: [VendorCreditsController],
})

View File

@@ -1,45 +1,49 @@
// import { Inject, Service } from 'typedi';
// import { Knex } from 'knex';
// import { Importable } from '@/services/Import/Importable';
// import CreateVendorCredit from './CreateVendorCredit.service';
// import { IVendorCreditCreateDTO } from '@/interfaces';
// import { VendorCreditsSampleData } from '../constants';
import { Knex } from 'knex';
import { VendorCreditsSampleData } from '../constants';
import { Injectable } from '@nestjs/common';
import { CreateVendorCreditService } from './CreateVendorCredit.service';
import { CreateVendorCreditDto } from '../dtos/VendorCredit.dto';
import { Importable } from '@/modules/Import/Importable';
import { ImportableService } from '@/modules/Import/decorators/Import.decorator';
import { VendorCredit } from '../models/VendorCredit';
// @Service()
// export class VendorCreditsImportable extends Importable {
// @Inject()
// private createVendorCreditService: CreateVendorCredit;
@Injectable()
@ImportableService({ name: VendorCredit.name })
export class VendorCreditsImportable extends Importable {
constructor(
private readonly createVendorCreditService: CreateVendorCreditService,
) {
super()
}
// /**
// * Importing to account service.
// * @param {number} tenantId
// * @param {IAccountCreateDTO} createAccountDTO
// * @returns
// */
// public importable(
// tenantId: number,
// createPaymentDTO: IVendorCreditCreateDTO,
// trx?: Knex.Transaction
// ) {
// return this.createVendorCreditService.newVendorCredit(
// tenantId,
// createPaymentDTO,
// trx
// );
// }
/**
* Importing to account service.
* @param {number} tenantId
* @param {IAccountCreateDTO} createAccountDTO
* @returns
*/
public importable(
createPaymentDTO: CreateVendorCreditDto,
trx?: Knex.Transaction
) {
return this.createVendorCreditService.newVendorCredit(
createPaymentDTO,
trx
);
}
// /**
// * Concurrrency controlling of the importing process.
// * @returns {number}
// */
// public get concurrency() {
// return 1;
// }
/**
* Concurrrency controlling of the importing process.
* @returns {number}
*/
public get concurrency() {
return 1;
}
// /**
// * Retrieves the sample data that used to download accounts sample sheet.
// */
// public sampleData(): any[] {
// return VendorCreditsSampleData;
// }
// }
/**
* Retrieves the sample data that used to download accounts sample sheet.
*/
public sampleData(): any[] {
return VendorCreditsSampleData;
}
}

View File

@@ -0,0 +1,259 @@
import { Features } from '@/common/types/Features';
function StatusFieldFilterQuery(query, role) {
query.modify('filterByStatus', role.value);
}
function StatusFieldSortQuery(query, role) {
query.modify('sortByStatus', role.order);
}
export const VendorCreditMeta = {
defaultFilterField: 'name',
defaultSort: {
sortOrder: 'DESC',
sortField: 'name',
},
exportable: true,
exportFlattenOn: 'entries',
importable: true,
importAggregator: 'group',
importAggregateOn: 'entries',
importAggregateBy: 'vendorCreditNumber',
print: {
pageTitle: 'Vendor Credits',
},
fields: {
vendor: {
name: 'vendor_credit.field.vendor',
column: 'vendor_id',
fieldType: 'relation',
relationType: 'enumeration',
relationKey: 'vendor',
relationEntityLabel: 'display_name',
relationEntityKey: 'id',
},
amount: {
name: 'vendor_credit.field.amount',
column: 'amount',
fieldType: 'number',
},
currency_code: {
name: 'vendor_credit.field.currency_code',
column: 'currency_code',
fieldType: 'string',
},
credit_date: {
name: 'vendor_credit.field.credit_date',
column: 'vendor_credit_date',
fieldType: 'date',
},
reference_no: {
name: 'vendor_credit.field.reference_no',
column: 'reference_no',
fieldType: 'text',
},
credit_number: {
name: 'vendor_credit.field.credit_number',
column: 'vendor_credit_number',
fieldType: 'text',
},
note: {
name: 'vendor_credit.field.note',
column: 'note',
fieldType: 'text',
},
status: {
name: 'vendor_credit.field.status',
fieldType: 'enumeration',
options: [
{ key: 'draft', label: 'vendor_credit.field.status.draft' },
{ key: 'published', label: 'vendor_credit.field.status.published' },
{ key: 'open', label: 'vendor_credit.field.status.open' },
{ key: 'closed', label: 'vendor_credit.field.status.closed' },
],
filterCustomQuery: StatusFieldFilterQuery,
sortCustomQuery: StatusFieldSortQuery,
},
created_at: {
name: 'vendor_credit.field.created_at',
column: 'created_at',
fieldType: 'date',
},
},
columns: {
vendorId: {
name: 'Vendor',
type: 'relation',
accessor: 'vendor.displayName',
},
exchangeRate: {
name: 'Echange Rate',
type: 'text',
printable: false,
},
vendorCreditNumber: {
name: 'Vendor Credit No.',
type: 'text',
},
referenceNo: {
name: 'Refernece No.',
type: 'text',
},
vendorCreditDate: {
name: 'Vendor Credit Date',
accessor: 'formattedVendorCreditDate',
},
amount: {
name: 'Amount',
accessor: 'formattedAmount',
},
creditRemaining: {
name: 'Credits Remaining',
accessor: 'formattedCreditsRemaining',
printable: false,
},
refundedAmount: {
name: 'Refunded Amount',
accessor: 'refundedAmount',
printable: false,
},
invoicedAmount: {
name: 'Invoiced Amount',
accessor: 'formattedInvoicedAmount',
},
note: {
name: 'Note',
type: 'text',
printable: false,
},
open: {
name: 'Open',
type: 'boolean',
printable: false,
},
entries: {
name: 'Entries',
type: 'collection',
collectionOf: 'object',
columns: {
itemName: {
name: 'Item Name',
accessor: 'item.name',
},
rate: {
name: 'Item Rate',
accessor: 'rateFormatted',
},
quantity: {
name: 'Item Quantity',
accessor: 'quantityFormatted',
},
description: {
name: 'Item Description',
},
amount: {
name: 'Item Amount',
accessor: 'totalFormatted',
},
},
},
branch: {
name: 'Branch',
type: 'text',
accessor: 'branch.name',
features: [Features.BRANCHES],
},
warehouse: {
name: 'Warehouse',
type: 'text',
accessor: 'warehouse.name',
features: [Features.BRANCHES],
},
},
fields2: {
vendorId: {
name: 'Vendor',
fieldType: 'relation',
relationModel: 'Contact',
relationImportMatch: 'displayName',
required: true,
},
exchangeRate: {
name: 'Echange Rate',
fieldType: 'text',
},
vendorCreditNumber: {
name: 'Vendor Credit No.',
fieldType: 'text',
},
referenceNo: {
name: 'Refernece No.',
fieldType: 'text',
},
vendorCreditDate: {
name: 'Vendor Credit Date',
fieldType: 'date',
required: true,
},
note: {
name: 'Note',
fieldType: 'text',
},
open: {
name: 'Open',
fieldType: 'boolean',
},
entries: {
name: 'Entries',
fieldType: 'collection',
collectionOf: 'object',
collectionMinLength: 1,
required: true,
fields: {
itemId: {
name: 'Item Name',
fieldType: 'relation',
relationModel: 'Item',
relationImportMatch: ['name', 'code'],
required: true,
importHint: 'Matches the item name or code.',
},
rate: {
name: 'Rate',
fieldType: 'number',
required: true,
},
quantity: {
name: 'Quantity',
fieldType: 'number',
required: true,
},
description: {
name: 'Description',
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
},
},
};

View File

@@ -6,8 +6,13 @@ import { ItemEntry } from '@/modules/TransactionItemEntry/models/ItemEntry';
import { DiscountType } from '@/common/types/Discount';
import { TenantBaseModel } from '@/modules/System/models/TenantBaseModel';
import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.decorator';
import { ImportableModel } from '@/modules/Import/decorators/Import.decorator';
import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator';
import { VendorCreditMeta } from './VendorCredit.meta';
@ExportableModel()
@ImportableModel()
@InjectModelMeta(VendorCreditMeta)
export class VendorCredit extends TenantBaseModel {
vendorId: number;
amount: number;

View File

@@ -9,7 +9,7 @@ import { Injectable } from '@nestjs/common';
import { events } from '@/common/events/events';
@Injectable()
export default class VendorCreditInventoryTransactionsSubscriber {
export class VendorCreditInventoryTransactionsSubscriber {
constructor(
private readonly inventoryTransactions: VendorCreditInventoryTransactions,
) {}