mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-21 23:30:32 +00:00
refactor: customer/vendor balance summary to nestjs
This commit is contained in:
@@ -15,12 +15,14 @@ import { SalesTaxLiabilityModule } from './modules/SalesTaxLiabilitySummary/Sale
|
|||||||
import { JournalSheetModule } from './modules/JournalSheet/JournalSheet.module';
|
import { JournalSheetModule } from './modules/JournalSheet/JournalSheet.module';
|
||||||
import { ProfitLossSheetModule } from './modules/ProfitLossSheet/ProfitLossSheet.module';
|
import { ProfitLossSheetModule } from './modules/ProfitLossSheet/ProfitLossSheet.module';
|
||||||
import { CashflowStatementModule } from './modules/CashFlowStatement/CashflowStatement.module';
|
import { CashflowStatementModule } from './modules/CashFlowStatement/CashflowStatement.module';
|
||||||
|
import { VendorBalanceSummaryModule } from './modules/VendorBalanceSummary/VendorBalanceSummary.module';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
providers: [],
|
providers: [],
|
||||||
imports: [
|
imports: [
|
||||||
PurchasesByItemsModule,
|
PurchasesByItemsModule,
|
||||||
CustomerBalanceSummaryModule,
|
CustomerBalanceSummaryModule,
|
||||||
|
VendorBalanceSummaryModule,
|
||||||
SalesByItemsModule,
|
SalesByItemsModule,
|
||||||
GeneralLedgerModule,
|
GeneralLedgerModule,
|
||||||
TrialBalanceSheetModule,
|
TrialBalanceSheetModule,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as R from 'ramda';
|
import * as R from 'ramda';
|
||||||
import { defaultTo, map, set, sumBy, isEmpty, mapValues, get } from 'lodash';
|
import { defaultTo, set, sumBy, isEmpty, mapValues, get } from 'lodash';
|
||||||
import * as mathjs from 'mathjs';
|
import * as mathjs from 'mathjs';
|
||||||
import * as moment from 'moment';
|
import * as moment from 'moment';
|
||||||
import { I18nService } from 'nestjs-i18n';
|
import { I18nService } from 'nestjs-i18n';
|
||||||
|
|||||||
@@ -4,13 +4,17 @@ import { ICashFlowStatementQuery } from './Cashflow.types';
|
|||||||
import { AcceptType } from '@/constants/accept-type';
|
import { AcceptType } from '@/constants/accept-type';
|
||||||
import { CashflowSheetApplication } from './CashflowSheetApplication';
|
import { CashflowSheetApplication } from './CashflowSheetApplication';
|
||||||
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
|
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
|
||||||
|
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
@Controller('reports/cashflow-statement')
|
@Controller('reports/cashflow-statement')
|
||||||
@PublicRoute()
|
@PublicRoute()
|
||||||
|
@ApiTags('reports')
|
||||||
export class CashflowController {
|
export class CashflowController {
|
||||||
constructor(private readonly cashflowSheetApp: CashflowSheetApplication) {}
|
constructor(private readonly cashflowSheetApp: CashflowSheetApplication) {}
|
||||||
|
|
||||||
@Get()
|
@Get()
|
||||||
|
@ApiResponse({ status: 200, description: 'Cashflow statement report' })
|
||||||
|
@ApiOperation({ summary: 'Get cashflow statement report' })
|
||||||
async getCashflow(
|
async getCashflow(
|
||||||
@Query() query: ICashFlowStatementQuery,
|
@Query() query: ICashFlowStatementQuery,
|
||||||
@Res() res: Response,
|
@Res() res: Response,
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
|
import { Response } from 'express';
|
||||||
|
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
|
||||||
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
|
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
|
||||||
import { ICustomerBalanceSummaryQuery } from './CustomerBalanceSummary.types';
|
import { ICustomerBalanceSummaryQuery } from './CustomerBalanceSummary.types';
|
||||||
import { CustomerBalanceSummaryApplication } from './CustomerBalanceSummaryApplication';
|
import { CustomerBalanceSummaryApplication } from './CustomerBalanceSummaryApplication';
|
||||||
import { AcceptType } from '@/constants/accept-type';
|
import { AcceptType } from '@/constants/accept-type';
|
||||||
import { Response } from 'express';
|
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
|
||||||
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
|
|
||||||
|
|
||||||
@Controller('/reports/customer-balance-summary')
|
@Controller('/reports/customer-balance-summary')
|
||||||
@ApiTags('reports')
|
@ApiTags('reports')
|
||||||
|
@PublicRoute()
|
||||||
export class CustomerBalanceSummaryController {
|
export class CustomerBalanceSummaryController {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly customerBalanceSummaryApp: CustomerBalanceSummaryApplication,
|
private readonly customerBalanceSummaryApp: CustomerBalanceSummaryApplication,
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export class CustomerBalanceSummaryService {
|
|||||||
const commonProps = { accountNormal: 'debit', date: asDate };
|
const commonProps = { accountNormal: 'debit', date: asDate };
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
return R.map(R.merge(commonProps))(transactions);
|
return R.map(R.mergeRight(commonProps))(transactions);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
export const getCustomerBalanceSummaryDefaultQuery = () => {
|
import * as moment from 'moment';
|
||||||
return {
|
|
||||||
asDate: moment().format('YYYY-MM-DD'),
|
|
||||||
numberFormat: {
|
|
||||||
precision: 2,
|
|
||||||
divideOn1000: false,
|
|
||||||
showZero: false,
|
|
||||||
formatMoney: 'total',
|
|
||||||
negativeFormat: 'mines',
|
|
||||||
},
|
|
||||||
percentageColumn: false,
|
|
||||||
|
|
||||||
noneZero: false,
|
export const getCustomerBalanceSummaryDefaultQuery = () => ({
|
||||||
noneTransactions: true,
|
asDate: moment().format('YYYY-MM-DD'),
|
||||||
};
|
numberFormat: {
|
||||||
};
|
precision: 2,
|
||||||
|
divideOn1000: false,
|
||||||
|
showZero: false,
|
||||||
|
formatMoney: 'total',
|
||||||
|
negativeFormat: 'mines',
|
||||||
|
},
|
||||||
|
percentageColumn: false,
|
||||||
|
|
||||||
|
noneZero: false,
|
||||||
|
noneTransactions: true,
|
||||||
|
});
|
||||||
|
|||||||
@@ -3,12 +3,18 @@ import { IJournalReportQuery } from './JournalSheet.types';
|
|||||||
import { Response } from 'express';
|
import { Response } from 'express';
|
||||||
import { AcceptType } from '@/constants/accept-type';
|
import { AcceptType } from '@/constants/accept-type';
|
||||||
import { JournalSheetApplication } from './JournalSheetApplication';
|
import { JournalSheetApplication } from './JournalSheetApplication';
|
||||||
|
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
|
||||||
|
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
|
||||||
|
|
||||||
@Controller('/reports/journal')
|
@Controller('/reports/journal')
|
||||||
|
@ApiTags('reports')
|
||||||
|
@PublicRoute()
|
||||||
export class JournalSheetController {
|
export class JournalSheetController {
|
||||||
constructor(private readonly journalSheetApp: JournalSheetApplication) {}
|
constructor(private readonly journalSheetApp: JournalSheetApplication) {}
|
||||||
|
|
||||||
@Get('/')
|
@Get('/')
|
||||||
|
@ApiResponse({ status: 200, description: 'Journal report' })
|
||||||
|
@ApiOperation({ summary: 'Journal report' })
|
||||||
async journalSheet(
|
async journalSheet(
|
||||||
@Query() query: IJournalReportQuery,
|
@Query() query: IJournalReportQuery,
|
||||||
@Res() res: Response,
|
@Res() res: Response,
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ import { IProfitLossSheetQuery } from './ProfitLossSheet.types';
|
|||||||
import { ProfitLossSheetApplication } from './ProfitLossSheetApplication';
|
import { ProfitLossSheetApplication } from './ProfitLossSheetApplication';
|
||||||
import { AcceptType } from '@/constants/accept-type';
|
import { AcceptType } from '@/constants/accept-type';
|
||||||
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
|
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
|
||||||
|
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
@Controller('/reports/profit-loss-sheet')
|
@Controller('/reports/profit-loss-sheet')
|
||||||
|
@ApiTags('reports')
|
||||||
@PublicRoute()
|
@PublicRoute()
|
||||||
export class ProfitLossSheetController {
|
export class ProfitLossSheetController {
|
||||||
constructor(
|
constructor(
|
||||||
@@ -19,6 +21,8 @@ export class ProfitLossSheetController {
|
|||||||
* @param {string} acceptHeader
|
* @param {string} acceptHeader
|
||||||
*/
|
*/
|
||||||
@Get('/')
|
@Get('/')
|
||||||
|
@ApiResponse({ status: 200, description: 'Profit & loss statement' })
|
||||||
|
@ApiOperation({ summary: 'Get profit/loss statement report' })
|
||||||
async profitLossSheet(
|
async profitLossSheet(
|
||||||
@Query() query: IProfitLossSheetQuery,
|
@Query() query: IProfitLossSheetQuery,
|
||||||
@Res() res: Response,
|
@Res() res: Response,
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ import { AcceptType } from '@/constants/accept-type';
|
|||||||
import { SalesTaxLiabilitySummaryApplication } from './SalesTaxLiabilitySummaryApplication';
|
import { SalesTaxLiabilitySummaryApplication } from './SalesTaxLiabilitySummaryApplication';
|
||||||
import { Response } from 'express';
|
import { Response } from 'express';
|
||||||
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
|
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
|
||||||
|
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
@Controller('/reports/sales-tax-liability-summary')
|
@Controller('/reports/sales-tax-liability-summary')
|
||||||
|
@ApiTags('reports')
|
||||||
@PublicRoute()
|
@PublicRoute()
|
||||||
export class SalesTaxLiabilitySummaryController {
|
export class SalesTaxLiabilitySummaryController {
|
||||||
constructor(
|
constructor(
|
||||||
@@ -13,6 +15,11 @@ export class SalesTaxLiabilitySummaryController {
|
|||||||
) {}
|
) {}
|
||||||
|
|
||||||
@Get()
|
@Get()
|
||||||
|
@ApiResponse({
|
||||||
|
status: 200,
|
||||||
|
description: 'Sales tax liability summary report',
|
||||||
|
})
|
||||||
|
@ApiOperation({ summary: 'Get sales tax liability summary report' })
|
||||||
public async getSalesTaxLiabilitySummary(
|
public async getSalesTaxLiabilitySummary(
|
||||||
@Query() query: SalesTaxLiabilitySummaryQuery,
|
@Query() query: SalesTaxLiabilitySummaryQuery,
|
||||||
@Res() res: Response,
|
@Res() res: Response,
|
||||||
|
|||||||
@@ -5,14 +5,20 @@ import { VendorBalanceSummaryTableInjectable } from './VendorBalanceSummaryTable
|
|||||||
import { VendorBalanceSummaryExportInjectable } from './VendorBalanceSummaryExportInjectable';
|
import { VendorBalanceSummaryExportInjectable } from './VendorBalanceSummaryExportInjectable';
|
||||||
import { VendorBalanceSummaryPdf } from './VendorBalanceSummaryPdf';
|
import { VendorBalanceSummaryPdf } from './VendorBalanceSummaryPdf';
|
||||||
import { VendorBalanceSummaryApplication } from './VendorBalanceSummaryApplication';
|
import { VendorBalanceSummaryApplication } from './VendorBalanceSummaryApplication';
|
||||||
|
import { VendorBalanceSummaryRepository } from './VendorBalanceSummaryRepository';
|
||||||
|
import { VendorBalanceSummaryMeta } from './VendorBalanceSummaryMeta';
|
||||||
|
import { FinancialSheetCommonModule } from '../../common/FinancialSheetCommon.module';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
|
imports: [FinancialSheetCommonModule],
|
||||||
providers: [
|
providers: [
|
||||||
VendorBalanceSummaryTableInjectable,
|
VendorBalanceSummaryTableInjectable,
|
||||||
VendorBalanceSummaryExportInjectable,
|
VendorBalanceSummaryExportInjectable,
|
||||||
VendorBalanceSummaryService,
|
VendorBalanceSummaryService,
|
||||||
VendorBalanceSummaryPdf,
|
VendorBalanceSummaryPdf,
|
||||||
VendorBalanceSummaryApplication,
|
VendorBalanceSummaryApplication,
|
||||||
|
VendorBalanceSummaryRepository,
|
||||||
|
VendorBalanceSummaryMeta
|
||||||
],
|
],
|
||||||
controllers: [VendorBalanceSummaryController],
|
controllers: [VendorBalanceSummaryController],
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -10,27 +10,33 @@ import { ContactBalanceSummaryReport } from '../ContactBalanceSummary/ContactBal
|
|||||||
import { Vendor } from '@/modules/Vendors/models/Vendor';
|
import { Vendor } from '@/modules/Vendors/models/Vendor';
|
||||||
import { INumberFormatQuery } from '../../types/Report.types';
|
import { INumberFormatQuery } from '../../types/Report.types';
|
||||||
import { VendorBalanceSummaryRepository } from './VendorBalanceSummaryRepository';
|
import { VendorBalanceSummaryRepository } from './VendorBalanceSummaryRepository';
|
||||||
|
import { Ledger } from '@/modules/Ledger/Ledger';
|
||||||
|
|
||||||
export class VendorBalanceSummaryReport extends ContactBalanceSummaryReport {
|
export class VendorBalanceSummaryReport extends ContactBalanceSummaryReport {
|
||||||
readonly filter: IVendorBalanceSummaryQuery;
|
readonly filter: IVendorBalanceSummaryQuery;
|
||||||
readonly numberFormat: INumberFormatQuery;
|
readonly numberFormat: INumberFormatQuery;
|
||||||
readonly repo: VendorBalanceSummaryRepository;
|
readonly repository: VendorBalanceSummaryRepository;
|
||||||
|
readonly ledger: Ledger;
|
||||||
|
readonly baseCurrency: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor method.
|
* Constructor method.
|
||||||
* @param {IJournalPoster} receivableLedger
|
* @param {VendorBalanceSummaryRepository} repository -
|
||||||
* @param {IVendor[]} vendors
|
* @param {IVendorBalanceSummaryQuery} filter -
|
||||||
* @param {IVendorBalanceSummaryQuery} filter
|
|
||||||
* @param {string} baseCurrency
|
|
||||||
*/
|
*/
|
||||||
constructor(
|
constructor(
|
||||||
repo: VendorBalanceSummaryRepository,
|
repository: VendorBalanceSummaryRepository,
|
||||||
filter: IVendorBalanceSummaryQuery,
|
filter: IVendorBalanceSummaryQuery,
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
this.repository = repository;
|
||||||
|
this.ledger = this.repository.ledger;
|
||||||
|
this.baseCurrency = this.repository.baseCurrency;
|
||||||
|
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
this.numberFormat = this.filter.numberFormat;
|
this.numberFormat = this.filter.numberFormat;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,7 +47,7 @@ export class VendorBalanceSummaryReport extends ContactBalanceSummaryReport {
|
|||||||
private vendorMapper = (
|
private vendorMapper = (
|
||||||
vendor: ModelObject<Vendor>,
|
vendor: ModelObject<Vendor>,
|
||||||
): IVendorBalanceSummaryVendor => {
|
): IVendorBalanceSummaryVendor => {
|
||||||
const closingBalance = this.repo.ledger
|
const closingBalance = this.repository.ledger
|
||||||
.whereContactId(vendor.id)
|
.whereContactId(vendor.id)
|
||||||
.getClosingBalance();
|
.getClosingBalance();
|
||||||
|
|
||||||
@@ -86,7 +92,7 @@ export class VendorBalanceSummaryReport extends ContactBalanceSummaryReport {
|
|||||||
this.contactCamparsionPercentageOfColumn,
|
this.contactCamparsionPercentageOfColumn,
|
||||||
),
|
),
|
||||||
this.vendorsMapper,
|
this.vendorsMapper,
|
||||||
)(vendors);
|
)(vendors) as IVendorBalanceSummaryVendor[];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -94,7 +100,7 @@ export class VendorBalanceSummaryReport extends ContactBalanceSummaryReport {
|
|||||||
* @returns {IVendorBalanceSummaryData}
|
* @returns {IVendorBalanceSummaryData}
|
||||||
*/
|
*/
|
||||||
public reportData(): IVendorBalanceSummaryData {
|
public reportData(): IVendorBalanceSummaryData {
|
||||||
const vendors = this.getVendorsSection(this.repo.vendors);
|
const vendors = this.getVendorsSection(this.repository.vendors);
|
||||||
const total = this.getContactsTotalSection(vendors);
|
const total = this.getContactsTotalSection(vendors);
|
||||||
|
|
||||||
return { vendors, total };
|
return { vendors, total };
|
||||||
|
|||||||
@@ -61,9 +61,9 @@ export class VendorBalanceSummaryRepository {
|
|||||||
* Initialize the vendor balance summary repository.
|
* Initialize the vendor balance summary repository.
|
||||||
*/
|
*/
|
||||||
async asyncInit() {
|
async asyncInit() {
|
||||||
this.initVendors();
|
await this.initVendors();
|
||||||
this.initVendorsEntries();
|
await this.initVendorsEntries();
|
||||||
this.initLedger();
|
await this.initLedger();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -156,6 +156,6 @@ export class VendorBalanceSummaryRepository {
|
|||||||
const transactions = await this.getVendorsTransactions(date);
|
const transactions = await this.getVendorsTransactions(date);
|
||||||
const commonProps = { accountNormal: 'credit' };
|
const commonProps = { accountNormal: 'credit' };
|
||||||
|
|
||||||
return R.map(R.merge(commonProps))(transactions);
|
return R.map(R.mergeRight(commonProps))(transactions) as ILedgerEntry[];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export class VendorBalanceSummaryService {
|
|||||||
const filter = { ...getVendorBalanceSummaryDefaultQuery(), ...query };
|
const filter = { ...getVendorBalanceSummaryDefaultQuery(), ...query };
|
||||||
|
|
||||||
this.vendorBalanceSummaryRepository.setFilter(filter);
|
this.vendorBalanceSummaryRepository.setFilter(filter);
|
||||||
this.vendorBalanceSummaryRepository.asyncInit();
|
await this.vendorBalanceSummaryRepository.asyncInit();
|
||||||
|
|
||||||
// Report instance.
|
// Report instance.
|
||||||
const reportInstance = new VendorBalanceSummaryReport(
|
const reportInstance = new VendorBalanceSummaryReport(
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ export class VendorBalanceSummaryTable {
|
|||||||
R.always(this.query.percentageColumn),
|
R.always(this.query.percentageColumn),
|
||||||
R.concat(this.getPercentageColumnsAccessor())
|
R.concat(this.getPercentageColumnsAccessor())
|
||||||
)
|
)
|
||||||
)([]);
|
)([]) as IColumnMapperMeta[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -142,13 +142,13 @@ export class VendorBalanceSummaryTable {
|
|||||||
];
|
];
|
||||||
return R.compose(
|
return R.compose(
|
||||||
R.when(
|
R.when(
|
||||||
R.always(this.query.percentageColumn),
|
() => this.query.percentageColumn,
|
||||||
R.append({
|
R.append({
|
||||||
key: 'percentage_of_column',
|
key: 'percentage_of_column',
|
||||||
label: this.i18n.t('contact_summary_balance.percentage_column'),
|
label: this.i18n.t('contact_summary_balance.percentage_column'),
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
R.concat(columns)
|
R.concat(columns),
|
||||||
)([]);
|
)([]) as ITableColumn[];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
|
import * as moment from 'moment';
|
||||||
|
|
||||||
export const getVendorBalanceSummaryDefaultQuery = () => {
|
export const getVendorBalanceSummaryDefaultQuery = () => {
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user