feat: wip sales tax liability summary report

This commit is contained in:
Ahmed Bouhuolia
2023-08-31 21:39:59 +02:00
parent 6baec8dd96
commit 5bb95eeb1a
6 changed files with 56 additions and 36 deletions

View File

@@ -70,7 +70,7 @@ export default class SalesTaxLiabilitySummary extends BaseFinancialReportControl
); );
return res.status(200).send({ return res.status(200).send({
data: salesTaxLiabilityTable table: salesTaxLiabilityTable.table,
}); });
case 'json': case 'json':
default: default:

View File

@@ -31,3 +31,13 @@ export interface SalesTaxLiabilitySummaryReportData {
taxRates: SalesTaxLiabilitySummaryRate[]; taxRates: SalesTaxLiabilitySummaryRate[];
total: SalesTaxLiabilitySummaryTotal; total: SalesTaxLiabilitySummaryTotal;
} }
export type SalesTaxLiabilitySummaryPayableById = Record<
string,
{ taxRateId: number; credit: number; debit: number }
>;
export type SalesTaxLiabilitySummarySalesById = Record<
string,
{ taxRateId: number; credit: number; debit: number }
>;

View File

@@ -1,6 +1,7 @@
import { Knex } from 'knex'; import { Knex } from 'knex';
export interface ITaxRate { export interface ITaxRate {
id?: number;
name: string; name: string;
code: string; code: string;
rate: number; rate: number;

View File

@@ -1,37 +1,33 @@
import { ITaxRate } from '@/interfaces'; import { ITaxRate } from '@/interfaces';
import { import {
SalesTaxLiabilitySummaryPayableById,
SalesTaxLiabilitySummaryQuery, SalesTaxLiabilitySummaryQuery,
SalesTaxLiabilitySummaryRate, SalesTaxLiabilitySummaryRate,
SalesTaxLiabilitySummaryReportData, SalesTaxLiabilitySummaryReportData,
SalesTaxLiabilitySummarySalesById,
SalesTaxLiabilitySummaryTotal, SalesTaxLiabilitySummaryTotal,
} from '@/interfaces/SalesTaxLiabilitySummary'; } from '@/interfaces/SalesTaxLiabilitySummary';
import { sumBy } from 'lodash'; import { sumBy } from 'lodash';
import FinancialSheet from '../FinancialSheet'; import FinancialSheet from '../FinancialSheet';
export class SalesTaxLiabilitySummary extends FinancialSheet { export class SalesTaxLiabilitySummary extends FinancialSheet {
query: SalesTaxLiabilitySummaryQuery; private query: SalesTaxLiabilitySummaryQuery;
taxRates: ITaxRate[]; private taxRates: ITaxRate[];
payableTaxesById: any; private payableTaxesById: SalesTaxLiabilitySummaryPayableById;
salesTaxesById: any; private salesTaxesById: SalesTaxLiabilitySummarySalesById;
/** /**
* Sales tax liability summary constructor. * Sales tax liability summary constructor.
* @param {SalesTaxLiabilitySummaryQuery} query * @param {SalesTaxLiabilitySummaryQuery} query
* @param {ITaxRate[]} taxRates * @param {ITaxRate[]} taxRates
* @param payableTaxesById * @param {SalesTaxLiabilitySummaryPayableById} payableTaxesById
* @param salesTaxesById * @param {SalesTaxLiabilitySummarySalesById} salesTaxesById
*/ */
constructor( constructor(
query: SalesTaxLiabilitySummaryQuery, query: SalesTaxLiabilitySummaryQuery,
taxRates: ITaxRate[], taxRates: ITaxRate[],
payableTaxesById: Record< payableTaxesById: SalesTaxLiabilitySummaryPayableById,
string, salesTaxesById: SalesTaxLiabilitySummarySalesById
{ taxRateId: number; credit: number; debit: number }
>,
salesTaxesById: Record<
string,
{ taxRateId: number; credit: number; debit: number }
>
) { ) {
super(); super();
@@ -49,11 +45,19 @@ export class SalesTaxLiabilitySummary extends FinancialSheet {
private taxRateLiability = ( private taxRateLiability = (
taxRate: ITaxRate taxRate: ITaxRate
): SalesTaxLiabilitySummaryRate => { ): 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 { return {
taxName: taxRate.name, taxName: taxRate.name,
taxCode: taxRate.code, taxCode: taxRate.code,
taxableAmount: this.getAmountMeta(0), taxableAmount: this.getAmountMeta(salesTaxAmount),
taxAmount: this.getAmountMeta(0), taxAmount: this.getAmountMeta(payableTaxAmount),
}; };
}; };
@@ -73,8 +77,8 @@ export class SalesTaxLiabilitySummary extends FinancialSheet {
private taxRatesTotal = ( private taxRatesTotal = (
nodes: SalesTaxLiabilitySummaryRate[] nodes: SalesTaxLiabilitySummaryRate[]
): SalesTaxLiabilitySummaryTotal => { ): SalesTaxLiabilitySummaryTotal => {
const taxableAmount = sumBy(nodes, 'taxableAmount.total'); const taxableAmount = sumBy(nodes, 'taxableAmount.amount');
const taxAmount = sumBy(nodes, 'taxAmount.total'); const taxAmount = sumBy(nodes, 'taxAmount.amount');
return { return {
taxableAmount: this.getTotalAmountMeta(taxableAmount), taxableAmount: this.getTotalAmountMeta(taxableAmount),

View File

@@ -1,4 +1,8 @@
import { ACCOUNT_TYPE } from '@/data/AccountTypes'; import { ACCOUNT_TYPE } from '@/data/AccountTypes';
import {
SalesTaxLiabilitySummaryPayableById,
SalesTaxLiabilitySummarySalesById,
} from '@/interfaces/SalesTaxLiabilitySummary';
import HasTenancyService from '@/services/Tenancy/TenancyService'; import HasTenancyService from '@/services/Tenancy/TenancyService';
import { keyBy } from 'lodash'; import { keyBy } from 'lodash';
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
@@ -10,8 +14,8 @@ export class SalesTaxLiabilitySummaryRepository {
/** /**
* Retrieve tax rates. * Retrieve tax rates.
* @param tenantId * @param {number} tenantId
* @returns * @returns {Promise<TaxRate[]>}
*/ */
public taxRates = (tenantId: number) => { public taxRates = (tenantId: number) => {
const { TaxRate } = this.tenancy.models(tenantId); const { TaxRate } = this.tenancy.models(tenantId);
@@ -22,21 +26,19 @@ export class SalesTaxLiabilitySummaryRepository {
/** /**
* Retrieve taxes payable sum grouped by tax rate id. * Retrieve taxes payable sum grouped by tax rate id.
* @param {number} tenantId * @param {number} tenantId
* @returns * @returns {Promise<SalesTaxLiabilitySummaryPayableById>}
*/ */
public async taxesPayableSumGroupedByRateId( public async taxesPayableSumGroupedByRateId(
tenantId: number tenantId: number
): Promise< ): Promise<SalesTaxLiabilitySummaryPayableById> {
Record<string, { taxRateId: number; credit: number; debit: number }>
> {
const { AccountTransaction } = this.tenancy.models(tenantId); const { AccountTransaction } = this.tenancy.models(tenantId);
const { accountRepository } = this.tenancy.repositories(tenantId); const { accountRepository } = this.tenancy.repositories(tenantId);
const receivableAccount = // Finds or creates tax payable account.
await accountRepository.findOrCreateAccountReceivable(); const payableTaxAccount = await accountRepository.findOrCreateTaxPayable();
const groupedTaxesById = await AccountTransaction.query() const groupedTaxesById = await AccountTransaction.query()
.where('account_id', receivableAccount.id) .where('account_id', payableTaxAccount.id)
.groupBy('tax_rate_id') .groupBy('tax_rate_id')
.select(['tax_rate_id']) .select(['tax_rate_id'])
.sum('credit as credit') .sum('credit as credit')
@@ -48,9 +50,11 @@ export class SalesTaxLiabilitySummaryRepository {
/** /**
* Retrieve taxes sales sum grouped by tax rate id. * Retrieve taxes sales sum grouped by tax rate id.
* @param {number} tenantId * @param {number} tenantId
* @returns * @returns {Promise<SalesTaxLiabilitySummarySalesById>}
*/ */
public taxesSalesSumGroupedByRateId = async (tenantId: number) => { public taxesSalesSumGroupedByRateId = async (
tenantId: number
): Promise<SalesTaxLiabilitySummarySalesById> => {
const { AccountTransaction, Account } = this.tenancy.models(tenantId); const { AccountTransaction, Account } = this.tenancy.models(tenantId);
const incomeAccounts = await Account.query().whereIn('accountType', [ const incomeAccounts = await Account.query().whereIn('accountType', [

View File

@@ -10,9 +10,9 @@ export class SalesTaxLiabilitySummaryService {
private repostiory: SalesTaxLiabilitySummaryRepository; private repostiory: SalesTaxLiabilitySummaryRepository;
/** /**
* * Retrieve sales tax liability summary.
* @param tenantId * @param {number} tenantId
* @param query * @param {SalesTaxLiabilitySummaryQuery} query
* @returns * @returns
*/ */
public async salesTaxLiability( public async salesTaxLiability(
@@ -41,9 +41,9 @@ export class SalesTaxLiabilitySummaryService {
} }
/** /**
* * Retrieve sales tax liability summary table.
* @param tenantId * @param {number} tenantId
* @param query * @param {SalesTaxLiabilitySummaryQuery} query
* @returns * @returns
*/ */
public async salesTaxLiabilitySummaryTable( public async salesTaxLiabilitySummaryTable(
@@ -52,6 +52,7 @@ export class SalesTaxLiabilitySummaryService {
) { ) {
const report = await this.salesTaxLiability(tenantId, query); const report = await this.salesTaxLiability(tenantId, query);
// Creates the sales tax liability summary table.
const table = new SalesTaxLiabilitySummaryTable(report.data, query); const table = new SalesTaxLiabilitySummaryTable(report.data, query);
return { return {