mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-15 20:30:33 +00:00
feat: wip sales tax liability summary report
This commit is contained in:
@@ -70,7 +70,7 @@ export default class SalesTaxLiabilitySummary extends BaseFinancialReportControl
|
||||
);
|
||||
|
||||
return res.status(200).send({
|
||||
data: salesTaxLiabilityTable
|
||||
table: salesTaxLiabilityTable.table,
|
||||
});
|
||||
case 'json':
|
||||
default:
|
||||
|
||||
@@ -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 }
|
||||
>;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { Knex } from 'knex';
|
||||
|
||||
export interface ITaxRate {
|
||||
id?: number;
|
||||
name: string;
|
||||
code: string;
|
||||
rate: number;
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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', [
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user