From 5bb95eeb1afa2a1fc289a0475687cd0ce6a242d0 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Thu, 31 Aug 2023 21:39:59 +0200 Subject: [PATCH] feat: wip sales tax liability summary report --- .../SalesTaxLiabilitySummary/index.ts | 2 +- .../interfaces/SalesTaxLiabilitySummary.ts | 10 +++++ packages/server/src/interfaces/TaxRate.ts | 1 + .../SalesTaxLiabilitySummary.ts | 40 ++++++++++--------- .../SalesTaxLiabilitySummaryRepository.ts | 26 +++++++----- .../SalesTaxLiabilitySummaryService.ts | 13 +++--- 6 files changed, 56 insertions(+), 36 deletions(-) diff --git a/packages/server/src/api/controllers/FinancialStatements/SalesTaxLiabilitySummary/index.ts b/packages/server/src/api/controllers/FinancialStatements/SalesTaxLiabilitySummary/index.ts index 9af858699..a9399c1dd 100644 --- a/packages/server/src/api/controllers/FinancialStatements/SalesTaxLiabilitySummary/index.ts +++ b/packages/server/src/api/controllers/FinancialStatements/SalesTaxLiabilitySummary/index.ts @@ -70,7 +70,7 @@ export default class SalesTaxLiabilitySummary extends BaseFinancialReportControl ); return res.status(200).send({ - data: salesTaxLiabilityTable + table: salesTaxLiabilityTable.table, }); case 'json': default: diff --git a/packages/server/src/interfaces/SalesTaxLiabilitySummary.ts b/packages/server/src/interfaces/SalesTaxLiabilitySummary.ts index cb8e0da33..301cdd76c 100644 --- a/packages/server/src/interfaces/SalesTaxLiabilitySummary.ts +++ b/packages/server/src/interfaces/SalesTaxLiabilitySummary.ts @@ -31,3 +31,13 @@ export interface SalesTaxLiabilitySummaryReportData { taxRates: SalesTaxLiabilitySummaryRate[]; total: SalesTaxLiabilitySummaryTotal; } + +export type SalesTaxLiabilitySummaryPayableById = Record< + string, + { taxRateId: number; credit: number; debit: number } +>; + +export type SalesTaxLiabilitySummarySalesById = Record< + string, + { taxRateId: number; credit: number; debit: number } +>; diff --git a/packages/server/src/interfaces/TaxRate.ts b/packages/server/src/interfaces/TaxRate.ts index 0e6481d8d..4e1275392 100644 --- a/packages/server/src/interfaces/TaxRate.ts +++ b/packages/server/src/interfaces/TaxRate.ts @@ -1,6 +1,7 @@ import { Knex } from 'knex'; export interface ITaxRate { + id?: number; name: string; code: string; rate: number; diff --git a/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummary.ts b/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummary.ts index 16e605de2..3c658dd8a 100644 --- a/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummary.ts +++ b/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummary.ts @@ -1,37 +1,33 @@ import { ITaxRate } from '@/interfaces'; import { + SalesTaxLiabilitySummaryPayableById, SalesTaxLiabilitySummaryQuery, SalesTaxLiabilitySummaryRate, SalesTaxLiabilitySummaryReportData, + SalesTaxLiabilitySummarySalesById, SalesTaxLiabilitySummaryTotal, } from '@/interfaces/SalesTaxLiabilitySummary'; import { sumBy } from 'lodash'; import FinancialSheet from '../FinancialSheet'; export class SalesTaxLiabilitySummary extends FinancialSheet { - query: SalesTaxLiabilitySummaryQuery; - taxRates: ITaxRate[]; - payableTaxesById: any; - salesTaxesById: any; + private query: SalesTaxLiabilitySummaryQuery; + private taxRates: ITaxRate[]; + private payableTaxesById: SalesTaxLiabilitySummaryPayableById; + private salesTaxesById: SalesTaxLiabilitySummarySalesById; /** * Sales tax liability summary constructor. * @param {SalesTaxLiabilitySummaryQuery} query * @param {ITaxRate[]} taxRates - * @param payableTaxesById - * @param salesTaxesById + * @param {SalesTaxLiabilitySummaryPayableById} payableTaxesById + * @param {SalesTaxLiabilitySummarySalesById} salesTaxesById */ constructor( query: SalesTaxLiabilitySummaryQuery, taxRates: ITaxRate[], - payableTaxesById: Record< - string, - { taxRateId: number; credit: number; debit: number } - >, - salesTaxesById: Record< - string, - { taxRateId: number; credit: number; debit: number } - > + payableTaxesById: SalesTaxLiabilitySummaryPayableById, + salesTaxesById: SalesTaxLiabilitySummarySalesById ) { super(); @@ -49,11 +45,19 @@ export class SalesTaxLiabilitySummary extends FinancialSheet { private taxRateLiability = ( taxRate: ITaxRate ): SalesTaxLiabilitySummaryRate => { + const payableTax = this.payableTaxesById[taxRate.id]; + const salesTax = this.salesTaxesById[taxRate.id]; + + const payableTaxAmount = payableTax + ? payableTax.credit - payableTax.debit + : 0; + const salesTaxAmount = salesTax ? salesTax.credit - salesTax.debit : 0; + return { taxName: taxRate.name, taxCode: taxRate.code, - taxableAmount: this.getAmountMeta(0), - taxAmount: this.getAmountMeta(0), + taxableAmount: this.getAmountMeta(salesTaxAmount), + taxAmount: this.getAmountMeta(payableTaxAmount), }; }; @@ -73,8 +77,8 @@ export class SalesTaxLiabilitySummary extends FinancialSheet { private taxRatesTotal = ( nodes: SalesTaxLiabilitySummaryRate[] ): SalesTaxLiabilitySummaryTotal => { - const taxableAmount = sumBy(nodes, 'taxableAmount.total'); - const taxAmount = sumBy(nodes, 'taxAmount.total'); + const taxableAmount = sumBy(nodes, 'taxableAmount.amount'); + const taxAmount = sumBy(nodes, 'taxAmount.amount'); return { taxableAmount: this.getTotalAmountMeta(taxableAmount), diff --git a/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryRepository.ts b/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryRepository.ts index bac9b548a..c5faaec9f 100644 --- a/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryRepository.ts +++ b/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryRepository.ts @@ -1,4 +1,8 @@ import { ACCOUNT_TYPE } from '@/data/AccountTypes'; +import { + SalesTaxLiabilitySummaryPayableById, + SalesTaxLiabilitySummarySalesById, +} from '@/interfaces/SalesTaxLiabilitySummary'; import HasTenancyService from '@/services/Tenancy/TenancyService'; import { keyBy } from 'lodash'; import { Inject, Service } from 'typedi'; @@ -10,8 +14,8 @@ export class SalesTaxLiabilitySummaryRepository { /** * Retrieve tax rates. - * @param tenantId - * @returns + * @param {number} tenantId + * @returns {Promise} */ public taxRates = (tenantId: number) => { const { TaxRate } = this.tenancy.models(tenantId); @@ -22,21 +26,19 @@ export class SalesTaxLiabilitySummaryRepository { /** * Retrieve taxes payable sum grouped by tax rate id. * @param {number} tenantId - * @returns + * @returns {Promise} */ public async taxesPayableSumGroupedByRateId( tenantId: number - ): Promise< - Record - > { + ): Promise { const { AccountTransaction } = this.tenancy.models(tenantId); const { accountRepository } = this.tenancy.repositories(tenantId); - const receivableAccount = - await accountRepository.findOrCreateAccountReceivable(); + // Finds or creates tax payable account. + const payableTaxAccount = await accountRepository.findOrCreateTaxPayable(); const groupedTaxesById = await AccountTransaction.query() - .where('account_id', receivableAccount.id) + .where('account_id', payableTaxAccount.id) .groupBy('tax_rate_id') .select(['tax_rate_id']) .sum('credit as credit') @@ -48,9 +50,11 @@ export class SalesTaxLiabilitySummaryRepository { /** * Retrieve taxes sales sum grouped by tax rate id. * @param {number} tenantId - * @returns + * @returns {Promise} */ - public taxesSalesSumGroupedByRateId = async (tenantId: number) => { + public taxesSalesSumGroupedByRateId = async ( + tenantId: number + ): Promise => { const { AccountTransaction, Account } = this.tenancy.models(tenantId); const incomeAccounts = await Account.query().whereIn('accountType', [ diff --git a/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryService.ts b/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryService.ts index 8bd9774e6..2eae55b49 100644 --- a/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryService.ts +++ b/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryService.ts @@ -10,9 +10,9 @@ export class SalesTaxLiabilitySummaryService { private repostiory: SalesTaxLiabilitySummaryRepository; /** - * - * @param tenantId - * @param query + * Retrieve sales tax liability summary. + * @param {number} tenantId + * @param {SalesTaxLiabilitySummaryQuery} query * @returns */ public async salesTaxLiability( @@ -41,9 +41,9 @@ export class SalesTaxLiabilitySummaryService { } /** - * - * @param tenantId - * @param query + * Retrieve sales tax liability summary table. + * @param {number} tenantId + * @param {SalesTaxLiabilitySummaryQuery} query * @returns */ public async salesTaxLiabilitySummaryTable( @@ -52,6 +52,7 @@ export class SalesTaxLiabilitySummaryService { ) { const report = await this.salesTaxLiability(tenantId, query); + // Creates the sales tax liability summary table. const table = new SalesTaxLiabilitySummaryTable(report.data, query); return {