From 6abae43c6f0d7ba2dd6d7e10776c65b647cd2866 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Mon, 11 Sep 2023 20:46:46 +0200 Subject: [PATCH] feat: tax rate transformer --- .../SalesTaxLiabilitySummary/index.ts | 6 ++- .../interfaces/SalesTaxLiabilitySummary.ts | 5 +++ packages/server/src/models/ItemEntry.ts | 13 +++++++ .../SalesTaxLiabilitySummaryService.ts | 37 ++++++++++++++++++- .../services/Sales/Invoices/GetSaleInvoice.ts | 1 + .../src/services/TaxRates/GetTaxRate.ts | 12 +++++- .../src/services/TaxRates/GetTaxRates.ts | 12 +++++- .../services/TaxRates/TaxRateTransformer.ts | 20 ++++++++++ 8 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 packages/server/src/services/TaxRates/TaxRateTransformer.ts diff --git a/packages/server/src/api/controllers/FinancialStatements/SalesTaxLiabilitySummary/index.ts b/packages/server/src/api/controllers/FinancialStatements/SalesTaxLiabilitySummary/index.ts index 42e2c5ecc..399fbeb90 100644 --- a/packages/server/src/api/controllers/FinancialStatements/SalesTaxLiabilitySummary/index.ts +++ b/packages/server/src/api/controllers/FinancialStatements/SalesTaxLiabilitySummary/index.ts @@ -67,6 +67,8 @@ export default class SalesTaxLiabilitySummary extends BaseFinancialReportControl return res.status(200).send({ table: salesTaxLiabilityTable.table, + query: salesTaxLiabilityTable.query, + meta: salesTaxLiabilityTable.meta, }); case 'json': default: @@ -76,7 +78,9 @@ export default class SalesTaxLiabilitySummary extends BaseFinancialReportControl filter ); return res.status(200).send({ - data: salesTaxLiability, + data: salesTaxLiability.data, + query: salesTaxLiability.query, + meta: salesTaxLiability.meta, }); } } catch (error) { diff --git a/packages/server/src/interfaces/SalesTaxLiabilitySummary.ts b/packages/server/src/interfaces/SalesTaxLiabilitySummary.ts index 1a036ce1c..533bba840 100644 --- a/packages/server/src/interfaces/SalesTaxLiabilitySummary.ts +++ b/packages/server/src/interfaces/SalesTaxLiabilitySummary.ts @@ -43,3 +43,8 @@ export type SalesTaxLiabilitySummarySalesById = Record< string, { taxRateId: number; credit: number; debit: number } >; + +export interface SalesTaxLiabilitySummaryMeta { + organizationName: string; + baseCurrency: string; +} diff --git a/packages/server/src/models/ItemEntry.ts b/packages/server/src/models/ItemEntry.ts index 7ac7910e0..43b3f9376 100644 --- a/packages/server/src/models/ItemEntry.ts +++ b/packages/server/src/models/ItemEntry.ts @@ -111,6 +111,7 @@ export default class ItemEntry extends TenantModel { const SaleEstimate = require('models/SaleEstimate'); const ProjectTask = require('models/Task'); const Expense = require('models/Expense'); + const TaxRate = require('models/TaxRate'); return { item: { @@ -204,6 +205,18 @@ export default class ItemEntry extends TenantModel { to: 'bills.id', }, }, + + /** + * Tax rate reference. + */ + tax: { + relation: Model.HasOneRelation, + modelClass: TaxRate.default, + join: { + from: 'items_entries.taxRateId', + to: 'tax_rates.id', + }, + }, }; } } diff --git a/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryService.ts b/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryService.ts index 2eae55b49..09fa9283b 100644 --- a/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryService.ts +++ b/packages/server/src/services/FinancialStatements/SalesTaxLiabilitySummary/SalesTaxLiabilitySummaryService.ts @@ -1,14 +1,21 @@ import { Inject, Service } from 'typedi'; import { SalesTaxLiabilitySummaryRepository } from './SalesTaxLiabilitySummaryRepository'; -import { SalesTaxLiabilitySummaryQuery } from '@/interfaces/SalesTaxLiabilitySummary'; +import { + SalesTaxLiabilitySummaryMeta, + SalesTaxLiabilitySummaryQuery, +} from '@/interfaces/SalesTaxLiabilitySummary'; import { SalesTaxLiabilitySummary } from './SalesTaxLiabilitySummary'; import { SalesTaxLiabilitySummaryTable } from './SalesTaxLiabilitySummaryTable'; +import HasTenancyService from '@/services/Tenancy/TenancyService'; @Service() export class SalesTaxLiabilitySummaryService { @Inject() private repostiory: SalesTaxLiabilitySummaryRepository; + @Inject() + private tenancy: HasTenancyService; + /** * Retrieve sales tax liability summary. * @param {number} tenantId @@ -36,7 +43,7 @@ export class SalesTaxLiabilitySummaryService { return { data: taxLiabilitySummary.reportData(), query, - meta: {}, + meta: this.reportMetadata(tenantId), }; } @@ -60,6 +67,32 @@ export class SalesTaxLiabilitySummaryService { rows: table.tableRows(), columns: table.tableColumns(), }, + data: report.data, + query: report.query, + meta: report.meta, + }; + } + + /** + * Retrieve the report meta. + * @param {number} tenantId - + * @returns {IBalanceSheetMeta} + */ + private reportMetadata(tenantId: number): SalesTaxLiabilitySummaryMeta { + const settings = this.tenancy.settings(tenantId); + + const organizationName = settings.get({ + group: 'organization', + key: 'name', + }); + const baseCurrency = settings.get({ + group: 'organization', + key: 'base_currency', + }); + + return { + organizationName, + baseCurrency, }; } } diff --git a/packages/server/src/services/Sales/Invoices/GetSaleInvoice.ts b/packages/server/src/services/Sales/Invoices/GetSaleInvoice.ts index b7eaa4440..f2245afef 100644 --- a/packages/server/src/services/Sales/Invoices/GetSaleInvoice.ts +++ b/packages/server/src/services/Sales/Invoices/GetSaleInvoice.ts @@ -32,6 +32,7 @@ export class GetSaleInvoice { const saleInvoice = await SaleInvoice.query() .findById(saleInvoiceId) .withGraphFetched('entries.item') + .withGraphFetched('entries.tax') .withGraphFetched('customer') .withGraphFetched('branch') .withGraphFetched('taxes.taxRate'); diff --git a/packages/server/src/services/TaxRates/GetTaxRate.ts b/packages/server/src/services/TaxRates/GetTaxRate.ts index 5dacd3d3f..5df27a87d 100644 --- a/packages/server/src/services/TaxRates/GetTaxRate.ts +++ b/packages/server/src/services/TaxRates/GetTaxRate.ts @@ -1,6 +1,8 @@ import { Inject, Service } from 'typedi'; import HasTenancyService from '../Tenancy/TenancyService'; import { CommandTaxRatesValidators } from './CommandTaxRatesValidators'; +import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable'; +import { TaxRateTransformer } from './TaxRateTransformer'; @Service() export class GetTaxRateService { @@ -10,6 +12,9 @@ export class GetTaxRateService { @Inject() private validators: CommandTaxRatesValidators; + @Inject() + private transformer: TransformerInjectable; + /** * Retrieves the given tax rate. * @param {number} tenantId @@ -24,6 +29,11 @@ export class GetTaxRateService { // Validates the tax rate existance. this.validators.validateTaxRateExistance(taxRate); - return taxRate; + // Transforms the tax rate. + return this.transformer.transform( + tenantId, + taxRate, + new TaxRateTransformer() + ); } } diff --git a/packages/server/src/services/TaxRates/GetTaxRates.ts b/packages/server/src/services/TaxRates/GetTaxRates.ts index 8086dd121..c97b41340 100644 --- a/packages/server/src/services/TaxRates/GetTaxRates.ts +++ b/packages/server/src/services/TaxRates/GetTaxRates.ts @@ -1,11 +1,16 @@ import { Inject, Service } from 'typedi'; import HasTenancyService from '../Tenancy/TenancyService'; +import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable'; +import { TaxRateTransformer } from './TaxRateTransformer'; @Service() export class GetTaxRatesService { @Inject() private tenancy: HasTenancyService; + @Inject() + private transformer: TransformerInjectable; + /** * Retrieves the tax rates list. * @param {number} tenantId @@ -16,6 +21,11 @@ export class GetTaxRatesService { const taxRates = await TaxRate.query(); - return taxRates; + // Transforms the tax rates. + return this.transformer.transform( + tenantId, + taxRates, + new TaxRateTransformer() + ); } } diff --git a/packages/server/src/services/TaxRates/TaxRateTransformer.ts b/packages/server/src/services/TaxRates/TaxRateTransformer.ts new file mode 100644 index 000000000..25aed54f3 --- /dev/null +++ b/packages/server/src/services/TaxRates/TaxRateTransformer.ts @@ -0,0 +1,20 @@ +import { Transformer } from '@/lib/Transformer/Transformer'; + +export class TaxRateTransformer extends Transformer { + /** + * Include these attributes to tax rate object. + * @returns {Array} + */ + public includeAttributes = (): string[] => { + return ['nameFormatted']; + }; + + /** + * Formats the tax rate name. + * @param taxRate + * @returns {string} + */ + protected nameFormatted = (taxRate): string => { + return `${taxRate.name} (${taxRate.rate}%)`; + }; +}