feat: export reports csv and xlsx (#286)

This commit is contained in:
Ahmed Bouhuolia
2023-11-28 19:53:13 +02:00
committed by GitHub
parent 151aff4c8e
commit d15c5890ed
125 changed files with 4674 additions and 934 deletions

View File

@@ -0,0 +1,43 @@
import { TableSheet } from '@/lib/Xlsx/TableSheet';
import { ITrialBalanceSheetQuery } from '@/interfaces';
import { Inject, Service } from 'typedi';
import { TrialBalanceSheetTableInjectable } from './TrialBalanceSheetTableInjectable';
@Service()
export class TrialBalanceExportInjectable {
@Inject()
private trialBalanceSheetTable: TrialBalanceSheetTableInjectable;
/**
* Retrieves the trial balance sheet in XLSX format.
* @param {number} tenantId
* @param {ITrialBalanceSheetQuery} query
* @returns {Promise<Buffer>}
*/
public async xlsx(tenantId: number, query: ITrialBalanceSheetQuery) {
const table = await this.trialBalanceSheetTable.table(tenantId, query);
const tableSheet = new TableSheet(table.table);
const tableCsv = tableSheet.convertToXLSX();
return tableSheet.convertToBuffer(tableCsv, 'xlsx');
}
/**
* Retrieves the trial balance sheet in CSV format.
* @param {number} tenantId
* @param {ITrialBalanceSheetQuery} query
* @returns {Promise<Buffer>}
*/
public async csv(
tenantId: number,
query: ITrialBalanceSheetQuery
): Promise<string> {
const table = await this.trialBalanceSheetTable.table(tenantId, query);
const tableSheet = new TableSheet(table.table);
const tableCsv = tableSheet.convertToCSV();
return tableCsv;
}
}

View File

@@ -0,0 +1,60 @@
import { Inject, Service } from 'typedi';
import { TrialBalanceSheetTableInjectable } from './TrialBalanceSheetTableInjectable';
import { TrialBalanceExportInjectable } from './TrialBalanceExportInjectable';
import { ITrialBalanceSheetQuery, ITrialBalanceStatement } from '@/interfaces';
import TrialBalanceSheetService from './TrialBalanceSheetInjectable';
@Service()
export class TrialBalanceSheetApplication {
@Inject()
private sheetService: TrialBalanceSheetService;
@Inject()
private tablable: TrialBalanceSheetTableInjectable;
@Inject()
private exportable: TrialBalanceExportInjectable;
/**
* Retrieves the trial balance sheet.
* @param {number} tenantId
* @param {ITrialBalanceSheetQuery} query
* @returns {Promise<ITrialBalanceStatement>}
*/
public sheet(
tenantId: number,
query: ITrialBalanceSheetQuery
): Promise<ITrialBalanceStatement> {
return this.sheetService.trialBalanceSheet(tenantId, query);
}
/**
* Retrieves the trial balance sheet in table format.
* @param {number} tenantId
* @param {ITrialBalanceSheetQuery} query
* @returns {Promise<ITrialBalanceSheetTable>}
*/
public table(tenantId: number, query: ITrialBalanceSheetQuery) {
return this.tablable.table(tenantId, query);
}
/**
* Retrieve the trial balance sheet in CSV format.
* @param {number} tenantId
* @param {ITrialBalanceSheetQuery} query
* @returns {Promise<Buffer>}
*/
public csv(tenantId: number, query: ITrialBalanceSheetQuery) {
return this.exportable.csv(tenantId, query);
}
/**
* Retrieve the trial balance sheet in XLSX format.
* @param {number} tenantId
* @param {ITrialBalanceSheetQuery} query
* @returns {Promise<Buffer>}
*/
public async xlsx(tenantId: number, query: ITrialBalanceSheetQuery) {
return this.exportable.xlsx(tenantId, query);
}
}

View File

@@ -1,7 +1,6 @@
import { Service, Inject } from 'typedi';
import moment from 'moment';
import TenancyService from '@/services/Tenancy/TenancyService';
import Journal from '@/services/Accounting/JournalPoster';
import {
ITrialBalanceSheetMeta,
ITrialBalanceSheetQuery,
@@ -13,7 +12,6 @@ import InventoryService from '@/services/Inventory/Inventory';
import { parseBoolean } from 'utils';
import { Tenant } from '@/system/models';
import { TrialBalanceSheetRepository } from './TrialBalanceSheetRepository';
import { TrialBalanceSheetTable } from './TrialBalanceSheetTable';
@Service()
export default class TrialBalanceSheetService extends FinancialSheet {
@@ -30,7 +28,7 @@ export default class TrialBalanceSheetService extends FinancialSheet {
* Defaults trial balance sheet filter query.
* @return {IBalanceSheetQuery}
*/
get defaultQuery(): ITrialBalanceSheetQuery {
private get defaultQuery(): ITrialBalanceSheetQuery {
return {
fromDate: moment().startOf('year').format('YYYY-MM-DD'),
toDate: moment().format('YYYY-MM-DD'),
@@ -54,7 +52,7 @@ export default class TrialBalanceSheetService extends FinancialSheet {
* @param {number} tenantId - Tenant id.
* @returns {ITrialBalanceSheetMeta}
*/
reportMetadata(tenantId: number): ITrialBalanceSheetMeta {
private reportMetadata(tenantId: number): ITrialBalanceSheetMeta {
const settings = this.tenancy.settings(tenantId);
const isCostComputeRunning =
@@ -89,7 +87,6 @@ export default class TrialBalanceSheetService extends FinancialSheet {
...this.defaultQuery,
...query,
};
const tenant = await Tenant.query()
.findById(tenantId)
.withGraphFetched('metadata');
@@ -120,27 +117,4 @@ export default class TrialBalanceSheetService extends FinancialSheet {
meta: this.reportMetadata(tenantId),
};
}
/**
* Retrieves the trial balance sheet table.
* @param {number} tenantId
* @param {ITrialBalanceSheetQuery} query
* @returns {Promise<any>}
*/
public async trialBalanceSheetTable(
tenantId: number,
query: ITrialBalanceSheetQuery
) {
const trialBalance = await this.trialBalanceSheet(tenantId, query);
const table = new TrialBalanceSheetTable(trialBalance.data, query, {});
return {
table: {
columns: table.tableColumns(),
rows: table.tableRows(),
},
meta: trialBalance.meta,
query: trialBalance.query,
};
}
}

View File

@@ -0,0 +1,33 @@
import { Inject, Service } from 'typedi';
import { ITrialBalanceSheetQuery, ITrialBalanceSheetTable } from '@/interfaces';
import { TrialBalanceSheetTable } from './TrialBalanceSheetTable';
import TrialBalanceSheetService from './TrialBalanceSheetInjectable';
@Service()
export class TrialBalanceSheetTableInjectable {
@Inject()
private sheet: TrialBalanceSheetService;
/**
* Retrieves the trial balance sheet table.
* @param {number} tenantId
* @param {ITrialBalanceSheetQuery} query
* @returns {Promise<ITrialBalanceSheetTable>}
*/
public async table(
tenantId: number,
query: ITrialBalanceSheetQuery
): Promise<ITrialBalanceSheetTable> {
const trialBalance = await this.sheet.trialBalanceSheet(tenantId, query);
const table = new TrialBalanceSheetTable(trialBalance.data, query, {});
return {
table: {
columns: table.tableColumns(),
rows: table.tableRows(),
},
meta: trialBalance.meta,
query: trialBalance.query,
};
}
}