mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-19 14:20:31 +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({
|
return res.status(200).send({
|
||||||
data: salesTaxLiabilityTable
|
table: salesTaxLiabilityTable.table,
|
||||||
});
|
});
|
||||||
case 'json':
|
case 'json':
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
>;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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', [
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user