From 6af4be9c6c74bf21c816cc7955b1304884ebc8bd Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Thu, 5 Feb 2026 16:03:57 +0200 Subject: [PATCH] fix(server): branches activation not marking bills and payments with primary branch When activating the multi-branches feature, existing bills, vendor credits, and bill payments were not being marked with the default primary branch. Changes: - Add missing @Inject decorators to BillActivateBranches, VendorCreditActivateBranches, and BillPaymentsActivateBranches services - Create BillBranchesActivateSubscriber to listen to onActivated event - Create VendorCreditBranchesActivateSubscriber to listen to onActivated event - Register BillPaymentsActivateBranches and PaymentMadeActivateBranchesSubscriber in BranchesModule - Add branch object to BillResponseDto for API responses - Add branch to BillTransformer includeAttributes Fixes: #935 --- .../modules/Bills/dtos/BillResponse.dto.ts | 10 +++++++ .../modules/Bills/queries/Bill.transformer.ts | 1 + .../src/modules/Branches/Branches.module.ts | 14 +++++++++- .../Purchases/BillBranchesActivate.ts | 11 +++++--- .../Purchases/PaymentMadeBranchesActivate.ts | 3 +- .../Purchases/VendorCreditBranchesActivate.ts | 3 +- .../BillBranchesActivateSubscriber.ts | 28 +++++++++++++++++++ .../VendorCreditBranchesActivateSubscriber.ts | 28 +++++++++++++++++++ 8 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 packages/server/src/modules/Branches/subscribers/Activate/BillBranchesActivateSubscriber.ts create mode 100644 packages/server/src/modules/Branches/subscribers/Activate/VendorCreditBranchesActivateSubscriber.ts diff --git a/packages/server/src/modules/Bills/dtos/BillResponse.dto.ts b/packages/server/src/modules/Bills/dtos/BillResponse.dto.ts index b082b1496..990070fc9 100644 --- a/packages/server/src/modules/Bills/dtos/BillResponse.dto.ts +++ b/packages/server/src/modules/Bills/dtos/BillResponse.dto.ts @@ -1,6 +1,8 @@ import { ApiProperty } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; import { ItemEntryDto } from '@/modules/TransactionItemEntry/dto/ItemEntry.dto'; import { AttachmentLinkDto } from '@/modules/Attachments/dtos/Attachment.dto'; +import { BranchResponseDto } from '@/modules/Branches/dtos/BranchResponse.dto'; import { DiscountType } from '@/common/types/Discount'; export class BillResponseDto { @@ -89,6 +91,14 @@ export class BillResponseDto { }) branchId?: number; + @ApiProperty({ + description: 'Branch details', + type: () => BranchResponseDto, + required: false, + }) + @Type(() => BranchResponseDto) + branch?: BranchResponseDto; + @ApiProperty({ description: 'The ID of the project', example: 301, diff --git a/packages/server/src/modules/Bills/queries/Bill.transformer.ts b/packages/server/src/modules/Bills/queries/Bill.transformer.ts index 851a284a4..b264d251a 100644 --- a/packages/server/src/modules/Bills/queries/Bill.transformer.ts +++ b/packages/server/src/modules/Bills/queries/Bill.transformer.ts @@ -30,6 +30,7 @@ export class BillTransformer extends Transformer { 'taxes', 'entries', 'attachments', + 'branch', ]; }; diff --git a/packages/server/src/modules/Branches/Branches.module.ts b/packages/server/src/modules/Branches/Branches.module.ts index d53e1d4c9..a6c661d45 100644 --- a/packages/server/src/modules/Branches/Branches.module.ts +++ b/packages/server/src/modules/Branches/Branches.module.ts @@ -31,6 +31,12 @@ import { ValidateBranchExistance } from './integrations/ValidateBranchExistance' import { ManualJournalBranchesValidator } from './integrations/ManualJournals/ManualJournalsBranchesValidator'; import { CashflowTransactionsActivateBranches } from './integrations/Cashflow/CashflowActivateBranches'; import { ExpensesActivateBranches } from './integrations/Expense/ExpensesActivateBranches'; +import { BillActivateBranches } from './integrations/Purchases/BillBranchesActivate'; +import { VendorCreditActivateBranches } from './integrations/Purchases/VendorCreditBranchesActivate'; +import { BillPaymentsActivateBranches } from './integrations/Purchases/PaymentMadeBranchesActivate'; +import { BillBranchesActivateSubscriber } from './subscribers/Activate/BillBranchesActivateSubscriber'; +import { VendorCreditBranchesActivateSubscriber } from './subscribers/Activate/VendorCreditBranchesActivateSubscriber'; +import { PaymentMadeActivateBranchesSubscriber } from './subscribers/Activate/PaymentMadeBranchesActivateSubscriber'; import { FeaturesModule } from '../Features/Features.module'; @Module({ @@ -66,7 +72,13 @@ import { FeaturesModule } from '../Features/Features.module'; ValidateBranchExistance, ManualJournalBranchesValidator, CashflowTransactionsActivateBranches, - ExpensesActivateBranches + ExpensesActivateBranches, + BillActivateBranches, + VendorCreditActivateBranches, + BillPaymentsActivateBranches, + BillBranchesActivateSubscriber, + VendorCreditBranchesActivateSubscriber, + PaymentMadeActivateBranchesSubscriber ], exports: [ BranchesSettingsService, diff --git a/packages/server/src/modules/Branches/integrations/Purchases/BillBranchesActivate.ts b/packages/server/src/modules/Branches/integrations/Purchases/BillBranchesActivate.ts index e05dd7619..e12af7615 100644 --- a/packages/server/src/modules/Branches/integrations/Purchases/BillBranchesActivate.ts +++ b/packages/server/src/modules/Branches/integrations/Purchases/BillBranchesActivate.ts @@ -1,11 +1,14 @@ import { Knex } from 'knex'; -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel'; import { Bill } from '@/modules/Bills/models/Bill'; @Injectable() export class BillActivateBranches { - constructor(private readonly billModel: TenantModelProxy) {} + constructor( + @Inject(Bill.name) + private readonly billModel: TenantModelProxy, + ) {} /** * Updates all bills transactions with the primary branch. @@ -17,7 +20,7 @@ export class BillActivateBranches { primaryBranchId: number, trx?: Knex.Transaction, ) => { - // Updates the sale invoice with primary branch. - await Bill.query(trx).update({ branchId: primaryBranchId }); + // Updates the bills with primary branch. + await this.billModel().query(trx).update({ branchId: primaryBranchId }); }; } diff --git a/packages/server/src/modules/Branches/integrations/Purchases/PaymentMadeBranchesActivate.ts b/packages/server/src/modules/Branches/integrations/Purchases/PaymentMadeBranchesActivate.ts index 32645f612..dcfc1c15d 100644 --- a/packages/server/src/modules/Branches/integrations/Purchases/PaymentMadeBranchesActivate.ts +++ b/packages/server/src/modules/Branches/integrations/Purchases/PaymentMadeBranchesActivate.ts @@ -1,11 +1,12 @@ import { Knex } from 'knex'; +import { Inject, Injectable } from '@nestjs/common'; import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel'; import { BillPayment } from '@/modules/BillPayments/models/BillPayment'; -import { Injectable } from '@nestjs/common'; @Injectable() export class BillPaymentsActivateBranches { constructor( + @Inject(BillPayment.name) private readonly billPaymentModel: TenantModelProxy, ) {} diff --git a/packages/server/src/modules/Branches/integrations/Purchases/VendorCreditBranchesActivate.ts b/packages/server/src/modules/Branches/integrations/Purchases/VendorCreditBranchesActivate.ts index 3dfb98174..0b33f2441 100644 --- a/packages/server/src/modules/Branches/integrations/Purchases/VendorCreditBranchesActivate.ts +++ b/packages/server/src/modules/Branches/integrations/Purchases/VendorCreditBranchesActivate.ts @@ -1,11 +1,12 @@ import { Knex } from 'knex'; -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel'; import { VendorCredit } from '@/modules/VendorCredit/models/VendorCredit'; @Injectable() export class VendorCreditActivateBranches { constructor( + @Inject(VendorCredit.name) private readonly vendorCreditModel: TenantModelProxy, ) {} diff --git a/packages/server/src/modules/Branches/subscribers/Activate/BillBranchesActivateSubscriber.ts b/packages/server/src/modules/Branches/subscribers/Activate/BillBranchesActivateSubscriber.ts new file mode 100644 index 000000000..c819932f4 --- /dev/null +++ b/packages/server/src/modules/Branches/subscribers/Activate/BillBranchesActivateSubscriber.ts @@ -0,0 +1,28 @@ +import { IBranchesActivatedPayload } from '../../Branches.types'; +import { events } from '@/common/events/events'; +import { Injectable } from '@nestjs/common'; +import { BillActivateBranches } from '../../integrations/Purchases/BillBranchesActivate'; +import { OnEvent } from '@nestjs/event-emitter'; + +@Injectable() +export class BillBranchesActivateSubscriber { + constructor( + private readonly billActivateBranches: BillActivateBranches, + ) { } + + /** + * Updates bills transactions with the primary branch once + * the multi-branches is activated. + * @param {IBranchesActivatedPayload} + */ + @OnEvent(events.branch.onActivated) + async updateBillsWithBranchOnActivated({ + primaryBranch, + trx, + }: IBranchesActivatedPayload) { + await this.billActivateBranches.updateBillsWithBranch( + primaryBranch.id, + trx, + ); + } +} diff --git a/packages/server/src/modules/Branches/subscribers/Activate/VendorCreditBranchesActivateSubscriber.ts b/packages/server/src/modules/Branches/subscribers/Activate/VendorCreditBranchesActivateSubscriber.ts new file mode 100644 index 000000000..3d2991092 --- /dev/null +++ b/packages/server/src/modules/Branches/subscribers/Activate/VendorCreditBranchesActivateSubscriber.ts @@ -0,0 +1,28 @@ +import { IBranchesActivatedPayload } from '../../Branches.types'; +import { events } from '@/common/events/events'; +import { Injectable } from '@nestjs/common'; +import { VendorCreditActivateBranches } from '../../integrations/Purchases/VendorCreditBranchesActivate'; +import { OnEvent } from '@nestjs/event-emitter'; + +@Injectable() +export class VendorCreditBranchesActivateSubscriber { + constructor( + private readonly vendorCreditActivateBranches: VendorCreditActivateBranches, + ) { } + + /** + * Updates vendor credits transactions with the primary branch once + * the multi-branches is activated. + * @param {IBranchesActivatedPayload} + */ + @OnEvent(events.branch.onActivated) + async updateVendorCreditsWithBranchOnActivated({ + primaryBranch, + trx, + }: IBranchesActivatedPayload) { + await this.vendorCreditActivateBranches.updateVendorCreditsWithBranch( + primaryBranch.id, + trx, + ); + } +}