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({
data: salesTaxLiabilityTable
table: salesTaxLiabilityTable.table,
});
case 'json':
default:

View File

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

View File

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

View File

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

View File

@@ -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<TaxRate[]>}
*/
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<SalesTaxLiabilitySummaryPayableById>}
*/
public async taxesPayableSumGroupedByRateId(
tenantId: number
): Promise<
Record<string, { taxRateId: number; credit: number; debit: number }>
> {
): Promise<SalesTaxLiabilitySummaryPayableById> {
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<SalesTaxLiabilitySummarySalesById>}
*/
public taxesSalesSumGroupedByRateId = async (tenantId: number) => {
public taxesSalesSumGroupedByRateId = async (
tenantId: number
): Promise<SalesTaxLiabilitySummarySalesById> => {
const { AccountTransaction, Account } = this.tenancy.models(tenantId);
const incomeAccounts = await Account.query().whereIn('accountType', [

View File

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