feat: tax rate transformer

This commit is contained in:
Ahmed Bouhuolia
2023-09-11 20:46:46 +02:00
parent 7657337c4f
commit 6abae43c6f
8 changed files with 101 additions and 5 deletions

View File

@@ -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) {

View File

@@ -43,3 +43,8 @@ export type SalesTaxLiabilitySummarySalesById = Record<
string,
{ taxRateId: number; credit: number; debit: number }
>;
export interface SalesTaxLiabilitySummaryMeta {
organizationName: string;
baseCurrency: string;
}

View File

@@ -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',
},
},
};
}
}

View File

@@ -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,
};
}
}

View File

@@ -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');

View File

@@ -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()
);
}
}

View File

@@ -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()
);
}
}

View File

@@ -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}%)`;
};
}