mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-16 04:40:32 +00:00
feat(server): general ledger exporting to csv/xlsx
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import { Inject } from 'typedi';
|
||||
import {
|
||||
IGeneralLedgerSheetQuery,
|
||||
IGeneralLedgerTableData,
|
||||
} from '@/interfaces';
|
||||
import { GeneralLedgerTableInjectable } from './GeneralLedgerTableInjectable';
|
||||
import { GeneralLedgerExportInjectable } from './GeneralLedgerExport';
|
||||
import { GeneralLedgerService } from './GeneralLedgerService';
|
||||
|
||||
export class GeneralLedgerApplication {
|
||||
@Inject()
|
||||
private GLTable: GeneralLedgerTableInjectable;
|
||||
|
||||
@Inject()
|
||||
private GLExport: GeneralLedgerExportInjectable;
|
||||
|
||||
@Inject()
|
||||
private GLSheet: GeneralLedgerService;
|
||||
|
||||
/**
|
||||
* Retrieves the G/L sheet in json format.
|
||||
* @param {number} tenantId
|
||||
* @param {IGeneralLedgerSheetQuery} query
|
||||
*/
|
||||
public sheet(tenantId: number, query: IGeneralLedgerSheetQuery) {
|
||||
return this.GLSheet.generalLedger(tenantId, query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the G/L sheet in table format.
|
||||
* @param {number} tenantId
|
||||
* @param {IGeneralLedgerSheetQuery} query
|
||||
* @returns {Promise<IGeneralLedgerTableData>}
|
||||
*/
|
||||
public table(
|
||||
tenantId: number,
|
||||
query: IGeneralLedgerSheetQuery
|
||||
): Promise<IGeneralLedgerTableData> {
|
||||
return this.GLTable.table(tenantId, query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the G/L sheet in xlsx format.
|
||||
* @param {number} tenantId
|
||||
* @param {IGeneralLedgerSheetQuery} query
|
||||
* @returns {}
|
||||
*/
|
||||
public xlsx(
|
||||
tenantId: number,
|
||||
query: IGeneralLedgerSheetQuery
|
||||
): Promise<Buffer> {
|
||||
return this.GLExport.xlsx(tenantId, query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the G/L sheet in csv format.
|
||||
* @param {number} tenantId -
|
||||
* @param {IGeneralLedgerSheetQuery} query -
|
||||
*/
|
||||
public csv(
|
||||
tenantId: number,
|
||||
query: IGeneralLedgerSheetQuery
|
||||
): Promise<string> {
|
||||
return this.GLExport.csv(tenantId, query);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import { IGeneralLedgerSheetQuery } from '@/interfaces';
|
||||
import { TableSheet } from '@/lib/Xlsx/TableSheet';
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { GeneralLedgerTableInjectable } from './GeneralLedgerTableInjectable';
|
||||
|
||||
@Service()
|
||||
export class GeneralLedgerExportInjectable {
|
||||
@Inject()
|
||||
private generalLedgerTable: GeneralLedgerTableInjectable;
|
||||
|
||||
/**
|
||||
* Retrieves the general ledger sheet in XLSX format.
|
||||
* @param {number} tenantId
|
||||
* @param {IGeneralLedgerSheetQuery} query
|
||||
* @returns {Promise<Buffer>}
|
||||
*/
|
||||
public async xlsx(tenantId: number, query: IGeneralLedgerSheetQuery) {
|
||||
const table = await this.generalLedgerTable.table(tenantId, query);
|
||||
|
||||
const tableSheet = new TableSheet(table.table);
|
||||
const tableCsv = tableSheet.convertToXLSX();
|
||||
|
||||
return tableSheet.convertToBuffer(tableCsv, 'xlsx');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the general ledger sheet in CSV format.
|
||||
* @param {number} tenantId
|
||||
* @param {IGeneralLedgerSheetQuery} query
|
||||
* @returns {Promise<Buffer>}
|
||||
*/
|
||||
public async csv(
|
||||
tenantId: number,
|
||||
query: IGeneralLedgerSheetQuery
|
||||
): Promise<string> {
|
||||
const table = await this.generalLedgerTable.table(tenantId, query);
|
||||
|
||||
const tableSheet = new TableSheet(table.table);
|
||||
const tableCsv = tableSheet.convertToCSV();
|
||||
|
||||
return tableCsv;
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ const ERRORS = {
|
||||
};
|
||||
|
||||
@Service()
|
||||
export default class GeneralLedgerService {
|
||||
export class GeneralLedgerService {
|
||||
@Inject()
|
||||
tenancy: TenancyService;
|
||||
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
import * as R from 'ramda';
|
||||
import {
|
||||
IGeneralLedgerSheetAccount,
|
||||
IGeneralLedgerSheetData,
|
||||
IGeneralLedgerSheetQuery,
|
||||
ITableColumn,
|
||||
ITableColumnAccessor,
|
||||
ITableRow,
|
||||
} from '@/interfaces';
|
||||
import FinancialSheet from '../FinancialSheet';
|
||||
import { FinancialSheetStructure } from '../FinancialSheetStructure';
|
||||
import { FinancialTable } from '../FinancialTable';
|
||||
import { tableRowMapper } from '@/utils';
|
||||
|
||||
export class GeneralLedgerTable extends R.compose(
|
||||
FinancialTable,
|
||||
FinancialSheetStructure
|
||||
)(FinancialSheet) {
|
||||
private data: IGeneralLedgerSheetData;
|
||||
private query: IGeneralLedgerSheetQuery;
|
||||
|
||||
/**
|
||||
* Creates an instance of `GeneralLedgerTable`.
|
||||
* @param {IGeneralLedgerSheetData} data
|
||||
* @param {IGeneralLedgerSheetQuery} query
|
||||
*/
|
||||
constructor(data: IGeneralLedgerSheetData, query: IGeneralLedgerSheetQuery) {
|
||||
super();
|
||||
|
||||
this.data = data;
|
||||
this.query = query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the common table accessors.
|
||||
* @returns {ITableColumnAccessor[]}
|
||||
*/
|
||||
private commonColumnsAccessors(): ITableColumnAccessor[] {
|
||||
return [
|
||||
{ key: 'date', accessor: 'date' },
|
||||
{ key: 'reference_type', accessor: 'referenceTypeFormatted' },
|
||||
{ key: 'reference_number', accessor: 'reference_number' },
|
||||
{ key: 'currency_code', accessor: 'currencyCode' },
|
||||
{ key: 'credit', accessor: 'formattedCredit' },
|
||||
{ key: 'debit', accessor: 'formattedDebit' },
|
||||
{ key: 'running_balance', accessor: 'formattedRunningBalance' },
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the common table columns.
|
||||
* @returns {ITableColumn[]}
|
||||
*/
|
||||
private commonColumns(): ITableColumn[] {
|
||||
return [
|
||||
{ key: 'date', label: 'Date' },
|
||||
{ key: 'reference_type', label: 'Reference Type' },
|
||||
{ key: 'reference_number', label: 'Reference Number' },
|
||||
{ key: 'currency_code', label: 'Currency Code' },
|
||||
{ key: 'credit', label: 'Credit' },
|
||||
{ key: 'debit', label: 'Debit' },
|
||||
{ key: 'running_balance', label: 'Running Balance' },
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps the given account node to the table rows.
|
||||
* @param {IGeneralLedgerSheetAccount} account
|
||||
* @returns {ITableRow}
|
||||
*/
|
||||
private accountMapper = (account: IGeneralLedgerSheetAccount): ITableRow => {
|
||||
const columns = this.commonColumnsAccessors();
|
||||
|
||||
return tableRowMapper(account, columns, {});
|
||||
};
|
||||
|
||||
/**
|
||||
* Maps the given account node to table rows.
|
||||
* @param {IGeneralLedgerSheetAccount[]} accounts
|
||||
* @returns {ITableRow[]}
|
||||
*/
|
||||
private accountsMapper = (
|
||||
accounts: IGeneralLedgerSheetAccount[]
|
||||
): ITableRow[] => {
|
||||
return R.compose(R.map(this.accountMapper))(accounts);
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves the table rows.
|
||||
* @returns {ITableRow[]}
|
||||
*/
|
||||
public tableRows(): ITableRow[] {
|
||||
return R.compose(this.accountsMapper)(this.data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the table columns.
|
||||
* @returns {ITableColumn[]}
|
||||
*/
|
||||
public tableColumns(): ITableColumn[] {
|
||||
const columns = this.commonColumns();
|
||||
|
||||
return R.compose(this.tableColumnsCellIndexing)(columns);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
import {
|
||||
IGeneralLedgerSheetQuery,
|
||||
IGeneralLedgerTableData,
|
||||
} from '@/interfaces';
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { GeneralLedgerService } from './GeneralLedgerService';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { GeneralLedgerTable } from './GeneralLedgerTable';
|
||||
|
||||
@Service()
|
||||
export class GeneralLedgerTableInjectable {
|
||||
@Inject()
|
||||
private tenancy: HasTenancyService;
|
||||
|
||||
@Inject()
|
||||
private GLSheet: GeneralLedgerService;
|
||||
|
||||
/**
|
||||
* Retrieves the G/L table.
|
||||
* @param {number} tenantId
|
||||
* @param {IGeneralLedgerSheetQuery} query
|
||||
* @returns {Promise<IGeneralLedgerTableData>}
|
||||
*/
|
||||
public async table(
|
||||
tenantId: number,
|
||||
query: IGeneralLedgerSheetQuery
|
||||
): Promise<IGeneralLedgerTableData> {
|
||||
const {
|
||||
data: sheetData,
|
||||
query: sheetQuery,
|
||||
meta: sheetMeta,
|
||||
} = await this.GLSheet.generalLedger(tenantId, query);
|
||||
|
||||
const table = new GeneralLedgerTable(sheetData, sheetQuery);
|
||||
|
||||
return {
|
||||
table: {
|
||||
columns: table.tableColumns(),
|
||||
rows: table.tableRows(),
|
||||
},
|
||||
query: sheetQuery,
|
||||
meta: sheetMeta,
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user