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