refactor: customer/vendor balance summary to nestjs

This commit is contained in:
Ahmed Bouhuolia
2025-02-05 10:38:47 +02:00
parent 2017539032
commit 9539003cac
15 changed files with 75 additions and 38 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -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);
}
/**

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
import * as moment from 'moment';
export const getVendorBalanceSummaryDefaultQuery = () => {
return {