feat: financial reports meta

This commit is contained in:
Ahmed Bouhuolia
2024-02-17 23:58:26 +02:00
parent 06e78db49d
commit 465bb66d6b
12 changed files with 139 additions and 18 deletions

View File

@@ -29,10 +29,12 @@ export type ITransactionsByCustomersData = ITransactionsByCustomersCustomer[];
export interface ITransactionsByCustomersStatement { export interface ITransactionsByCustomersStatement {
data: ITransactionsByCustomersData; data: ITransactionsByCustomersData;
query: ITransactionsByCustomersFilter; query: ITransactionsByCustomersFilter;
meta: ITransactionsByCustomersMeta;
} }
export interface ITransactionsByCustomersTable extends IFinancialTable { export interface ITransactionsByCustomersTable extends IFinancialTable {
query: ITransactionsByCustomersFilter; query: ITransactionsByCustomersFilter;
meta: ITransactionsByCustomersMeta;
} }
export interface ITransactionsByCustomersService { export interface ITransactionsByCustomersService {

View File

@@ -0,0 +1,36 @@
import moment from 'moment';
import { Inject, Service } from 'typedi';
import { FinancialSheetMeta } from '../FinancialSheetMeta';
import {
ITransactionsByCustomersFilter,
ITransactionsByCustomersMeta,
} from '@/interfaces';
@Service()
export class TransactionsByCustomersMeta {
@Inject()
private financialSheetMeta: FinancialSheetMeta;
/**
* Retrieves the transactions by customers meta.
* @param {number} tenantId -
* @returns {IBalanceSheetMeta}
*/
public async meta(
tenantId: number,
query: ITransactionsByCustomersFilter
): Promise<ITransactionsByCustomersMeta> {
const commonMeta = await this.financialSheetMeta.meta(tenantId);
const formattedToDate = moment(query.toDate).format('YYYY/MM/DD');
const formattedFromDate = moment(query.fromDate).format('YYYY/MM/DD');
const formattedDateRange = `From ${formattedFromDate} | To ${formattedToDate}`;
return {
...commonMeta,
sheetName: 'Transactions By Customers',
formattedFromDate,
formattedToDate,
formattedDateRange,
};
}
}

View File

@@ -13,7 +13,7 @@ export class TransactionsByCustomersPdf {
/** /**
* Retrieves the transactions by customers in PDF format. * Retrieves the transactions by customers in PDF format.
* @param {number} tenantId - Tenant ID. * @param {number} tenantId - Tenant ID.
* @param {IBalanceSheetQuery} query - Balance sheet query. * @param {ITransactionsByCustomersFilter} query - Balance sheet query.
* @returns {Promise<Buffer>} * @returns {Promise<Buffer>}
*/ */
public async pdf( public async pdf(
@@ -24,13 +24,11 @@ export class TransactionsByCustomersPdf {
tenantId, tenantId,
query query
); );
const sheetName = 'Transactions By Customers';
return this.tableSheetPdf.convertToPdf( return this.tableSheetPdf.convertToPdf(
tenantId, tenantId,
table.table, table.table,
sheetName, table.meta.sheetName,
table.meta.baseCurrency table.meta.formattedDateRange
); );
} }
} }

View File

@@ -12,6 +12,7 @@ import TransactionsByCustomers from './TransactionsByCustomers';
import Ledger from '@/services/Accounting/Ledger'; import Ledger from '@/services/Accounting/Ledger';
import TransactionsByCustomersRepository from './TransactionsByCustomersRepository'; import TransactionsByCustomersRepository from './TransactionsByCustomersRepository';
import { Tenant } from '@/system/models'; import { Tenant } from '@/system/models';
import { TransactionsByCustomersMeta } from './TransactionsByCustomersMeta';
export class TransactionsByCustomersSheet export class TransactionsByCustomersSheet
implements ITransactionsByCustomersService implements ITransactionsByCustomersService
@@ -22,6 +23,9 @@ export class TransactionsByCustomersSheet
@Inject() @Inject()
private reportRepository: TransactionsByCustomersRepository; private reportRepository: TransactionsByCustomersRepository;
@Inject()
private transactionsByCustomersMeta: TransactionsByCustomersMeta;
/** /**
* Defaults balance sheet filter query. * Defaults balance sheet filter query.
* @return {ICustomerBalanceSummaryQuery} * @return {ICustomerBalanceSummaryQuery}
@@ -160,10 +164,12 @@ export class TransactionsByCustomersSheet
i18n i18n
); );
const meta = await this.transactionsByCustomersMeta.meta(tenantId, filter);
return { return {
data: reportInstance.reportData(), data: reportInstance.reportData(),
query: filter, query: filter,
meta: {}, meta,
}; };
} }
} }

View File

@@ -1,6 +1,10 @@
import * as R from 'ramda'; import * as R from 'ramda';
import { tableRowMapper } from 'utils'; import { tableRowMapper } from 'utils';
import { ITransactionsByCustomersCustomer, ITableRow, ITableColumn } from '@/interfaces'; import {
ITransactionsByCustomersCustomer,
ITableRow,
ITableColumn,
} from '@/interfaces';
import TransactionsByContactsTableRows from '../TransactionsByContact/TransactionsByContactTableRows'; import TransactionsByContactsTableRows from '../TransactionsByContact/TransactionsByContactTableRows';
enum ROW_TYPE { enum ROW_TYPE {
@@ -78,6 +82,14 @@ export class TransactionsByCustomersTable extends TransactionsByContactsTableRow
* @returns {ITableColumn[]} * @returns {ITableColumn[]}
*/ */
public tableColumns = (): ITableColumn[] => { public tableColumns = (): ITableColumn[] => {
return []; return [
} { key: 'customer_name', label: 'Customer name' },
{ key: 'account_name', label: 'Account Name' },
{ key: 'ref_type', label: 'Reference Type' },
{ key: 'transaction_type', label: 'Transaction Type' },
{ key: 'credit', label: 'Credit' },
{ key: 'debit', label: 'Debit' },
{ key: 'running_balance', label: 'Running Balance' },
];
};
} }

View File

@@ -69,6 +69,7 @@ export class TransactionsByVendorApplication {
* Retrieves the transactions by vendor in XLSX format. * Retrieves the transactions by vendor in XLSX format.
* @param {number} tenantId * @param {number} tenantId
* @param {ITransactionsByVendorsFilter} query * @param {ITransactionsByVendorsFilter} query
* @returns {Promise<Buffer>}
*/ */
public xlsx( public xlsx(
tenantId: number, tenantId: number,

View File

@@ -12,6 +12,7 @@ import TransactionsByVendor from './TransactionsByVendor';
import Ledger from '@/services/Accounting/Ledger'; import Ledger from '@/services/Accounting/Ledger';
import TransactionsByVendorRepository from './TransactionsByVendorRepository'; import TransactionsByVendorRepository from './TransactionsByVendorRepository';
import { Tenant } from '@/system/models'; import { Tenant } from '@/system/models';
import { TransactionsByVendorMeta } from './TransactionsByVendorMeta';
export class TransactionsByVendorsInjectable export class TransactionsByVendorsInjectable
implements ITransactionsByVendorsService implements ITransactionsByVendorsService
@@ -22,6 +23,9 @@ export class TransactionsByVendorsInjectable
@Inject() @Inject()
private reportRepository: TransactionsByVendorRepository; private reportRepository: TransactionsByVendorRepository;
@Inject()
private transactionsByVendorMeta: TransactionsByVendorMeta;
/** /**
* Defaults balance sheet filter query. * Defaults balance sheet filter query.
* @return {IVendorBalanceSummaryQuery} * @return {IVendorBalanceSummaryQuery}
@@ -165,10 +169,12 @@ export class TransactionsByVendorsInjectable
tenant.metadata.baseCurrency, tenant.metadata.baseCurrency,
i18n i18n
); );
const meta = await this.transactionsByVendorMeta.meta(tenantId, filter);
return { return {
data: reportInstance.reportData(), data: reportInstance.reportData(),
query: filter, query: filter,
meta: {}, meta,
}; };
} }
} }

View File

@@ -0,0 +1,36 @@
import moment from 'moment';
import { Inject, Service } from 'typedi';
import { FinancialSheetMeta } from '../FinancialSheetMeta';
import {
ITransactionsByVendorMeta,
ITransactionsByVendorsFilter,
} from '@/interfaces';
@Service()
export class TransactionsByVendorMeta {
@Inject()
private financialSheetMeta: FinancialSheetMeta;
/**
* Retrieves the transactions by vendor meta.
* @param {number} tenantId -
* @returns {Promise<ITransactionsByVendorMeta>}
*/
public async meta(
tenantId: number,
query: ITransactionsByVendorsFilter
): Promise<ITransactionsByVendorMeta> {
const commonMeta = await this.financialSheetMeta.meta(tenantId);
const formattedToDate = moment(query.toDate).format('YYYY/MM/DD');
const formattedFromDate = moment(query.fromDate).format('YYYY/MM/DD');
const formattedDateRange = `From ${formattedFromDate} | To ${formattedToDate}`;
return {
...commonMeta,
sheetName: 'Transactions By Vendor',
formattedFromDate,
formattedToDate,
formattedDateRange,
};
}
}

View File

@@ -22,13 +22,12 @@ export class TransactionsByVendorsPdf {
query: ITransactionsByVendorsFilter query: ITransactionsByVendorsFilter
): Promise<Buffer> { ): Promise<Buffer> {
const table = await this.transactionsByVendorTable.table(tenantId, query); const table = await this.transactionsByVendorTable.table(tenantId, query);
const sheetName = 'Transactions By Vendors';
return this.tableSheetPdf.convertToPdf( return this.tableSheetPdf.convertToPdf(
tenantId, tenantId,
table.table, table.table,
sheetName, table.meta.sheetName,
table.meta.baseCurrency table.meta.formattedDateRange
); );
} }
} }

View File

@@ -43,7 +43,6 @@ export class TransactionsByVendorsTable extends TransactionsByContactsTableRows
accessor: 'closingBalance.formattedAmount', accessor: 'closingBalance.formattedAmount',
}, },
]; ];
return { return {
...tableRowMapper(vendor, columns, { rowTypes: [ROW_TYPE.VENDOR] }), ...tableRowMapper(vendor, columns, { rowTypes: [ROW_TYPE.VENDOR] }),
children: R.pipe( children: R.pipe(
@@ -82,6 +81,14 @@ export class TransactionsByVendorsTable extends TransactionsByContactsTableRows
* @returns {ITableColumn[]} * @returns {ITableColumn[]}
*/ */
public tableColumns = (): ITableColumn[] => { public tableColumns = (): ITableColumn[] => {
return []; return [
{ key: 'vendor_name', label: 'Vendor name' },
{ key: 'account_name', label: 'Account Name' },
{ key: 'ref_type', label: 'Reference Type' },
{ key: 'transaction_type', label: 'Transaction Type' },
{ key: 'credit', label: 'Credit' },
{ key: 'debit', label: 'Debit' },
{ key: 'running_balance', label: 'Running Balance' },
];
}; };
} }

View File

@@ -17,10 +17,10 @@ import NumberFormatDropdown from '@/components/NumberFormatDropdown';
import { useARAgingSummaryContext } from './ARAgingSummaryProvider'; import { useARAgingSummaryContext } from './ARAgingSummaryProvider';
import withARAgingSummaryActions from './withARAgingSummaryActions'; import withARAgingSummaryActions from './withARAgingSummaryActions';
import withARAgingSummary from './withARAgingSummary'; import withARAgingSummary from './withARAgingSummary';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import { compose, safeInvoke } from '@/utils'; import { compose, safeInvoke } from '@/utils';
import { ARAgingSummaryExportMenu } from './components'; import { ARAgingSummaryExportMenu } from './components';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import { DialogsName } from '@/constants/dialogs'; import { DialogsName } from '@/constants/dialogs';
/** /**

View File

@@ -1,11 +1,15 @@
// @ts-nocheck // @ts-nocheck
import { useRequestQuery } from '../../useQueryRequest'; import { useRequestQuery } from '../../useQueryRequest';
import { useDownloadFile } from '../../useDownloadFile'; import { useDownloadFile } from '../../useDownloadFile';
import { useRequestPdf } from '../../useRequestPdf'; import { useRequestPdf } from '../../useRequestPdf';
import t from '../types'; import t from '../types';
/** /**
* Retrieve balance sheet. * Fetches balance sheet data.
* @param {Object} query - The query parameters for the request.
* @param {Object} props - Additional options for the request.
* @returns {Object} The response object from the useRequestQuery hook.
*/ */
export function useBalanceSheet(query, props) { export function useBalanceSheet(query, props) {
return useRequestQuery( return useRequestQuery(
@@ -25,6 +29,12 @@ export function useBalanceSheet(query, props) {
); );
} }
/**
* Initiates a download of the balance sheet in XLSX format.
* @param {Object} query - The query parameters for the request.
* @param {Object} args - Additional configurations for the download.
* @returns {Function} A function to trigger the file download.
*/
export const useBalanceSheetXlsxExport = (query, args) => { export const useBalanceSheetXlsxExport = (query, args) => {
return useDownloadFile({ return useDownloadFile({
url: '/financial_statements/balance_sheet', url: '/financial_statements/balance_sheet',
@@ -39,6 +49,12 @@ export const useBalanceSheetXlsxExport = (query, args) => {
}); });
}; };
/**
* Initiates a download of the balance sheet in CSV format.
* @param {Object} query - The query parameters for the request.
* @param {Object} args - Additional configurations for the download.
* @returns {Function} A function to trigger the file download.
*/
export const useBalanceSheetCsvExport = (query, args) => { export const useBalanceSheetCsvExport = (query, args) => {
return useDownloadFile({ return useDownloadFile({
url: '/financial_statements/balance_sheet', url: '/financial_statements/balance_sheet',
@@ -54,7 +70,9 @@ export const useBalanceSheetCsvExport = (query, args) => {
}; };
/** /**
* Retrieves the balance sheet pdf document data. * Fetches balance sheet data in PDF format.
* @param {Object} [query={}] - The query parameters for the request.
* @returns {Object} The response object from the useRequestPdf hook.
*/ */
export function useBalanceSheetPdf(query = {}) { export function useBalanceSheetPdf(query = {}) {
return useRequestPdf({ return useRequestPdf({