From 5ef99f2cb347e9c9bc9efeb6f13d9481aa58fa45 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Sun, 7 Jan 2024 18:48:14 +0200 Subject: [PATCH] feat: general ledger and journal exporting --- .../FinancialStatements/GeneralLedger.ts | 2 +- .../FinancialStatements/JournalSheet.ts | 2 +- .../src/interfaces/GeneralLedgerSheet.ts | 2 ++ .../GeneralLedger/GeneralLedger.ts | 3 +- .../GeneralLedger/GeneralLedgerService.ts | 10 +++++-- .../GeneralLedger/GeneralLedgerTable.ts | 28 +++++++++++++------ .../GeneralLedgerTableInjectable.ts | 2 +- .../JournalSheet/JournalSheet.ts | 2 +- .../JournalSheet/JournalSheetTable.ts | 11 ++++---- .../GeneralLedger/dynamicColumns.ts | 2 +- 10 files changed, 41 insertions(+), 23 deletions(-) diff --git a/packages/server/src/api/controllers/FinancialStatements/GeneralLedger.ts b/packages/server/src/api/controllers/FinancialStatements/GeneralLedger.ts index 2401edf9d..c86da8eae 100644 --- a/packages/server/src/api/controllers/FinancialStatements/GeneralLedger.ts +++ b/packages/server/src/api/controllers/FinancialStatements/GeneralLedger.ts @@ -87,7 +87,7 @@ export default class GeneralLedgerReportController extends BaseFinancialReportCo return res.send(buffer); // Retrieves the xlsx format. } else if (ACCEPT_TYPE.APPLICATION_XLSX === acceptType) { - const buffer = this.generalLedgerApplication.xlsx(tenantId, filter); + const buffer = await this.generalLedgerApplication.xlsx(tenantId, filter); res.setHeader('Content-Disposition', 'attachment; filename=output.xlsx'); res.setHeader( diff --git a/packages/server/src/api/controllers/FinancialStatements/JournalSheet.ts b/packages/server/src/api/controllers/FinancialStatements/JournalSheet.ts index 674d7eb3c..871bc9af8 100644 --- a/packages/server/src/api/controllers/FinancialStatements/JournalSheet.ts +++ b/packages/server/src/api/controllers/FinancialStatements/JournalSheet.ts @@ -80,7 +80,7 @@ export default class JournalSheetController extends BaseFinancialReportControlle return res.status(200).send(table); // Retrieves the csv format. } else if (ACCEPT_TYPE.APPLICATION_CSV === acceptType) { - const buffer = this.journalSheetApp.csv(tenantId, filter); + const buffer = await this.journalSheetApp.csv(tenantId, filter); res.setHeader('Content-Disposition', 'attachment; filename=output.csv'); res.setHeader('Content-Type', 'text/csv'); diff --git a/packages/server/src/interfaces/GeneralLedgerSheet.ts b/packages/server/src/interfaces/GeneralLedgerSheet.ts index 9951bf3b2..6b863a192 100644 --- a/packages/server/src/interfaces/GeneralLedgerSheet.ts +++ b/packages/server/src/interfaces/GeneralLedgerSheet.ts @@ -82,6 +82,8 @@ export interface IGeneralLedgerMeta { isCostComputeRunning: boolean, organizationName: string, baseCurrency: string, + fromDate: string; + toDate: string; }; export interface IGeneralLedgerTableData extends IFinancialTable { diff --git a/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedger.ts b/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedger.ts index 6a96ce24c..5e12e9078 100644 --- a/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedger.ts +++ b/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedger.ts @@ -89,9 +89,10 @@ export default class GeneralLedgerSheet extends FinancialSheet { const newEntry = { date: entry.date, - dateFormatted: moment(entry.date).format('YYYY/MM/DD'), + dateFormatted: moment(entry.date).format('YYYY MMM DD'), entryId: entry.id, + transactionNumber: entry.transactionNumber, referenceType: entry.referenceType, referenceId: entry.referenceId, referenceTypeFormatted: this.i18n.__(entry.referenceTypeFormatted), diff --git a/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerService.ts b/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerService.ts index 3ce5461be..100239e39 100644 --- a/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerService.ts +++ b/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerService.ts @@ -64,7 +64,7 @@ export class GeneralLedgerService { * @param {number} tenantId - * @returns {IGeneralLedgerMeta} */ - reportMetadata(tenantId: number): IGeneralLedgerMeta { + reportMetadata(tenantId: number, filter): IGeneralLedgerMeta { const settings = this.tenancy.settings(tenantId); const isCostComputeRunning = this.inventoryService @@ -78,11 +78,15 @@ export class GeneralLedgerService { group: 'organization', key: 'base_currency', }); + const fromDate = moment(filter.fromDate).format('YYYY MMM DD'); + const toDate = moment(filter.toDate).format('YYYY MMM DD'); return { isCostComputeRunning: parseBoolean(isCostComputeRunning, false), organizationName, - baseCurrency + baseCurrency, + fromDate, + toDate }; } @@ -166,7 +170,7 @@ export class GeneralLedgerService { return { data: reportData, query: filter, - meta: this.reportMetadata(tenantId), + meta: this.reportMetadata(tenantId, filter), }; } } diff --git a/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerTable.ts b/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerTable.ts index dc6f22971..1820ab095 100644 --- a/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerTable.ts +++ b/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerTable.ts @@ -1,6 +1,7 @@ import * as R from 'ramda'; import { IColumnMapperMeta, + IGeneralLedgerMeta, IGeneralLedgerSheetAccount, IGeneralLedgerSheetAccountTransaction, IGeneralLedgerSheetData, @@ -21,17 +22,23 @@ export class GeneralLedgerTable extends R.compose( )(FinancialSheet) { private data: IGeneralLedgerSheetData; private query: IGeneralLedgerSheetQuery; + private meta: IGeneralLedgerMeta; /** * Creates an instance of `GeneralLedgerTable`. * @param {IGeneralLedgerSheetData} data * @param {IGeneralLedgerSheetQuery} query */ - constructor(data: IGeneralLedgerSheetData, query: IGeneralLedgerSheetQuery) { + constructor( + data: IGeneralLedgerSheetData, + query: IGeneralLedgerSheetQuery, + meta: IGeneralLedgerMeta + ) { super(); this.data = data; this.query = query; + this.meta = meta; } /** @@ -61,8 +68,8 @@ export class GeneralLedgerTable extends R.compose( { key: 'date', accessor: 'dateFormatted' }, { key: 'account_name', accessor: 'account.name' }, { key: 'reference_type', accessor: 'referenceTypeFormatted' }, - { key: 'reference_number', accessor: 'referenceNumber' }, - { key: 'description', accessor: 'description' }, + { key: 'reference_number', accessor: 'transactionNumber' }, + { key: 'description', accessor: 'note' }, { key: 'credit', accessor: 'formattedCredit' }, { key: 'debit', accessor: 'formattedDebit' }, { key: 'amount', accessor: 'formattedAmount' }, @@ -76,7 +83,7 @@ export class GeneralLedgerTable extends R.compose( */ private openingBalanceColumnsAccessors(): IColumnMapperMeta[] { return [ - { key: 'date', accessor: 'dateFormatted' }, + { key: 'date', value: this.meta.fromDate }, { key: 'account_name', value: 'Opening Balance' }, { key: 'reference_type', accessor: '_empty_' }, { key: 'reference_number', accessor: '_empty_' }, @@ -84,7 +91,7 @@ export class GeneralLedgerTable extends R.compose( { key: 'credit', accessor: '_empty_' }, { key: 'debit', accessor: '_empty_' }, { key: 'amount', accessor: 'openingBalance.formattedAmount' }, - { key: 'running_balance', accessor: '_empty' }, + { key: 'running_balance', accessor: 'openingBalance.formattedAmount' }, ]; } @@ -94,7 +101,7 @@ export class GeneralLedgerTable extends R.compose( */ private closingBalanceColumnAccessors(): IColumnMapperMeta[] { return [ - { key: 'date', accessor: 'dateFormatted' }, + { key: 'date', value: this.meta.toDate }, { key: 'account_name', value: 'Closing Balance' }, { key: 'reference_type', accessor: '_empty_' }, { key: 'reference_number', accessor: '_empty_' }, @@ -102,7 +109,7 @@ export class GeneralLedgerTable extends R.compose( { key: 'credit', accessor: '_empty_' }, { key: 'debit', accessor: '_empty_' }, { key: 'amount', accessor: 'closingBalance.formattedAmount' }, - { key: 'running_balance', accessor: '_empty_' }, + { key: 'running_balance', accessor: 'closingBalance.formattedAmount' }, ]; } @@ -115,7 +122,7 @@ export class GeneralLedgerTable extends R.compose( { key: 'date', label: 'Date' }, { key: 'account_name', label: 'Account Name' }, { key: 'reference_type', label: 'Transaction Type' }, - { key: 'reference_number', label: 'Transaction Number' }, + { key: 'reference_number', label: 'Transaction #' }, { key: 'description', label: 'Description' }, { key: 'credit', label: 'Credit' }, { key: 'debit', label: 'Debit' }, @@ -196,7 +203,10 @@ export class GeneralLedgerTable extends R.compose( const transactions = this.transactionsMapper(account); const closingBalance = this.closingBalanceMapper(account); - return [openingBalance, ...transactions, closingBalance]; + return R.when( + R.always(R.not(R.isEmpty(transactions))), + R.prepend(openingBalance) + )([...transactions, closingBalance]) as ITableRow[]; }; /** diff --git a/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerTableInjectable.ts b/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerTableInjectable.ts index 467e8bf4c..c830c29c2 100644 --- a/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerTableInjectable.ts +++ b/packages/server/src/services/FinancialStatements/GeneralLedger/GeneralLedgerTableInjectable.ts @@ -31,7 +31,7 @@ export class GeneralLedgerTableInjectable { meta: sheetMeta, } = await this.GLSheet.generalLedger(tenantId, query); - const table = new GeneralLedgerTable(sheetData, sheetQuery); + const table = new GeneralLedgerTable(sheetData, sheetQuery, sheetMeta); return { table: { diff --git a/packages/server/src/services/FinancialStatements/JournalSheet/JournalSheet.ts b/packages/server/src/services/FinancialStatements/JournalSheet/JournalSheet.ts index ec3d5f8ef..89725db3b 100644 --- a/packages/server/src/services/FinancialStatements/JournalSheet/JournalSheet.ts +++ b/packages/server/src/services/FinancialStatements/JournalSheet/JournalSheet.ts @@ -98,7 +98,7 @@ export default class JournalSheet extends FinancialSheet { return { date: groupEntry.date, - dateFormatted: moment(groupEntry.date).format('YYYY/MM/DD'), + dateFormatted: moment(groupEntry.date).format('YYYY MMM DD'), referenceType: groupEntry.referenceType, referenceId: groupEntry.referenceId, diff --git a/packages/server/src/services/FinancialStatements/JournalSheet/JournalSheetTable.ts b/packages/server/src/services/FinancialStatements/JournalSheet/JournalSheetTable.ts index e1f4ec8fe..724e2ec2b 100644 --- a/packages/server/src/services/FinancialStatements/JournalSheet/JournalSheetTable.ts +++ b/packages/server/src/services/FinancialStatements/JournalSheet/JournalSheetTable.ts @@ -32,6 +32,7 @@ export class JournalSheetTable extends R.compose( */ constructor(data: IJournalTableData, query: IJournalReportQuery, i18n: any) { super(); + this.data = data; this.query = query; this.i18n = i18n; @@ -43,10 +44,10 @@ export class JournalSheetTable extends R.compose( */ private groupColumnsAccessors = (): ITableColumnAccessor[] => { return [ - { key: 'date', accessor: 'date' }, + { key: 'date', accessor: 'dateFormatted' }, { key: 'transaction_type', accessor: 'referenceTypeFormatted' }, - { key: 'transaction_number', accessor: 'referenceNumber' }, - { key: 'description', accessor: 'entry.description' }, + { key: 'transaction_number', accessor: 'entry.transactionNumber' }, + { key: 'description', accessor: 'entry.note' }, { key: 'account_code', accessor: 'entry.accountCode' }, { key: 'account_name', accessor: 'entry.accountName' }, { key: 'credit', accessor: 'entry.formattedCredit' }, @@ -62,8 +63,8 @@ export class JournalSheetTable extends R.compose( return [ { key: 'date', accessor: '_empty_' }, { key: 'transaction_type', accessor: '_empty_' }, - { key: 'transaction_number', accessor: '_empty_' }, - { key: 'description', accessor: 'description' }, + { key: 'transaction_number', accessor: 'transactionNumber' }, + { key: 'description', accessor: 'note' }, { key: 'account_code', accessor: 'accountCode' }, { key: 'account_name', accessor: 'accountName' }, { key: 'credit', accessor: 'formattedCredit' }, diff --git a/packages/webapp/src/containers/FinancialStatements/GeneralLedger/dynamicColumns.ts b/packages/webapp/src/containers/FinancialStatements/GeneralLedger/dynamicColumns.ts index 70204030f..503fe3fb6 100644 --- a/packages/webapp/src/containers/FinancialStatements/GeneralLedger/dynamicColumns.ts +++ b/packages/webapp/src/containers/FinancialStatements/GeneralLedger/dynamicColumns.ts @@ -70,7 +70,7 @@ const transactionTypeColumnAccessor = (column) => { const transactionIdColumnAccessor = (column) => { return { ...column, - width: 100, + width: 80, }; };