mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-13 11:20:31 +00:00
248 lines
6.6 KiB
TypeScript
248 lines
6.6 KiB
TypeScript
import * as R from 'ramda';
|
|
import {
|
|
IBalanceSheetStatementData,
|
|
ITableColumnAccessor,
|
|
IBalanceSheetQuery,
|
|
ITableColumn,
|
|
ITableRow,
|
|
BALANCE_SHEET_SCHEMA_NODE_TYPE,
|
|
IBalanceSheetDataNode,
|
|
IBalanceSheetSchemaNode,
|
|
} from '@/interfaces';
|
|
import { tableRowMapper } from 'utils';
|
|
import FinancialSheet from '../FinancialSheet';
|
|
import { BalanceSheetComparsionPreviousYear } from './BalanceSheetComparsionPreviousYear';
|
|
import { IROW_TYPE, DISPLAY_COLUMNS_BY } from './constants';
|
|
import { BalanceSheetComparsionPreviousPeriod } from './BalanceSheetComparsionPreviousPeriod';
|
|
import { BalanceSheetPercentage } from './BalanceSheetPercentage';
|
|
import { FinancialSheetStructure } from '../FinancialSheetStructure';
|
|
import { BalanceSheetBase } from './BalanceSheetBase';
|
|
import { BalanceSheetTablePercentage } from './BalanceSheetTablePercentage';
|
|
import { BalanceSheetTablePreviousYear } from './BalanceSheetTablePreviousYear';
|
|
import { BalanceSheetTablePreviousPeriod } from './BalanceSheetTablePreviousPeriod';
|
|
import { FinancialTable } from '../FinancialTable';
|
|
import { BalanceSheetQuery } from './BalanceSheetQuery';
|
|
import { BalanceSheetTableDatePeriods } from './BalanceSheetTableDatePeriods';
|
|
|
|
export default class BalanceSheetTable extends R.compose(
|
|
BalanceSheetTablePreviousPeriod,
|
|
BalanceSheetTablePreviousYear,
|
|
BalanceSheetTableDatePeriods,
|
|
BalanceSheetTablePercentage,
|
|
BalanceSheetComparsionPreviousYear,
|
|
BalanceSheetComparsionPreviousPeriod,
|
|
BalanceSheetPercentage,
|
|
FinancialSheetStructure,
|
|
FinancialTable,
|
|
BalanceSheetBase
|
|
)(FinancialSheet) {
|
|
/**
|
|
* @param {}
|
|
*/
|
|
reportData: IBalanceSheetStatementData;
|
|
|
|
/**
|
|
* Balance sheet query.
|
|
* @parma {}
|
|
*/
|
|
query: BalanceSheetQuery;
|
|
|
|
/**
|
|
* Constructor method.
|
|
* @param {IBalanceSheetStatementData} reportData -
|
|
* @param {IBalanceSheetQuery} query -
|
|
*/
|
|
constructor(
|
|
reportData: IBalanceSheetStatementData,
|
|
query: IBalanceSheetQuery,
|
|
i18n: any
|
|
) {
|
|
super();
|
|
|
|
this.reportData = reportData;
|
|
this.query = new BalanceSheetQuery(query);
|
|
this.i18n = i18n;
|
|
}
|
|
|
|
/**
|
|
* Detarmines the node type of the given schema node.
|
|
* @param {IBalanceSheetStructureSection} node -
|
|
* @param {string} type -
|
|
* @return {boolean}
|
|
*/
|
|
protected isNodeType = R.curry(
|
|
(type: string, node: IBalanceSheetSchemaNode): boolean => {
|
|
return node.nodeType === type;
|
|
}
|
|
);
|
|
|
|
// -------------------------
|
|
// # Accessors.
|
|
// -------------------------
|
|
/**
|
|
* Retrieve the common columns for all report nodes.
|
|
* @param {ITableColumnAccessor[]}
|
|
*/
|
|
private commonColumnsAccessors = (): ITableColumnAccessor[] => {
|
|
return R.compose(
|
|
R.concat([{ key: 'name', accessor: 'name' }]),
|
|
R.ifElse(
|
|
R.always(this.isDisplayColumnsBy(DISPLAY_COLUMNS_BY.DATE_PERIODS)),
|
|
R.concat(this.datePeriodsColumnsAccessors()),
|
|
R.concat(this.totalColumnAccessor())
|
|
)
|
|
)([]);
|
|
};
|
|
|
|
/**
|
|
* Retrieve the total column accessor.
|
|
* @return {ITableColumnAccessor[]}
|
|
*/
|
|
private totalColumnAccessor = (): ITableColumnAccessor[] => {
|
|
return R.pipe(
|
|
R.concat(this.previousPeriodColumnAccessor()),
|
|
R.concat(this.previousYearColumnAccessor()),
|
|
R.concat(this.percentageColumnsAccessor()),
|
|
R.concat([{ key: 'total', accessor: 'total.formattedAmount' }])
|
|
)([]);
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param node
|
|
* @returns {ITableRow}
|
|
*/
|
|
private aggregateNodeTableRowsMapper = (node): ITableRow => {
|
|
const columns = this.commonColumnsAccessors();
|
|
const meta = {
|
|
rowTypes: [IROW_TYPE.AGGREGATE],
|
|
id: node.id,
|
|
};
|
|
return tableRowMapper(node, columns, meta);
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param node
|
|
* @returns {ITableRow}
|
|
*/
|
|
private accountsNodeTableRowsMapper = (node): ITableRow => {
|
|
const columns = this.commonColumnsAccessors();
|
|
const meta = {
|
|
rowTypes: [IROW_TYPE.ACCOUNTS],
|
|
id: node.id,
|
|
};
|
|
return tableRowMapper(node, columns, meta);
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {} node
|
|
* @returns {ITableRow}
|
|
*/
|
|
private accountNodeTableRowsMapper = (node): ITableRow => {
|
|
const columns = this.commonColumnsAccessors();
|
|
|
|
const meta = {
|
|
rowTypes: [IROW_TYPE.ACCOUNT],
|
|
id: node.id,
|
|
};
|
|
return tableRowMapper(node, columns, meta);
|
|
};
|
|
|
|
/**
|
|
* Mappes the given report node to table rows.
|
|
* @param {IBalanceSheetDataNode} node -
|
|
* @returns {ITableRow}
|
|
*/
|
|
private nodeToTableRowsMapper = (node: IBalanceSheetDataNode): ITableRow => {
|
|
return R.cond([
|
|
[
|
|
this.isNodeType(BALANCE_SHEET_SCHEMA_NODE_TYPE.AGGREGATE),
|
|
this.aggregateNodeTableRowsMapper,
|
|
],
|
|
[
|
|
this.isNodeType(BALANCE_SHEET_SCHEMA_NODE_TYPE.ACCOUNTS),
|
|
this.accountsNodeTableRowsMapper,
|
|
],
|
|
[
|
|
this.isNodeType(BALANCE_SHEET_SCHEMA_NODE_TYPE.ACCOUNT),
|
|
this.accountNodeTableRowsMapper,
|
|
],
|
|
])(node);
|
|
};
|
|
|
|
/**
|
|
* Mappes the given report sections to table rows.
|
|
* @param {IBalanceSheetDataNode[]} nodes -
|
|
* @return {ITableRow}
|
|
*/
|
|
private nodesToTableRowsMapper = (
|
|
nodes: IBalanceSheetDataNode[]
|
|
): ITableRow[] => {
|
|
return this.mapNodesDeep(nodes, this.nodeToTableRowsMapper);
|
|
};
|
|
|
|
/**
|
|
* Retrieves the total children columns.
|
|
* @returns {ITableColumn[]}
|
|
*/
|
|
private totalColumnChildren = (): ITableColumn[] => {
|
|
return R.compose(
|
|
R.unless(
|
|
R.isEmpty,
|
|
R.concat([{ key: 'total', Label: this.i18n.__('balance_sheet.total') }])
|
|
),
|
|
R.concat(this.percentageColumns()),
|
|
R.concat(this.getPreviousYearColumns()),
|
|
R.concat(this.previousPeriodColumns())
|
|
)([]);
|
|
};
|
|
|
|
/**
|
|
* Retrieve the total column.
|
|
* @returns {ITableColumn[]}
|
|
*/
|
|
private totalColumn = (): ITableColumn[] => {
|
|
return [
|
|
{
|
|
key: 'total',
|
|
label: this.i18n.__('balance_sheet.total'),
|
|
children: this.totalColumnChildren(),
|
|
},
|
|
];
|
|
};
|
|
|
|
/**
|
|
* Retrieve the report table rows.
|
|
* @returns {ITableRow[]}
|
|
*/
|
|
public tableRows = (): ITableRow[] => {
|
|
return R.compose(
|
|
this.addTotalRows,
|
|
this.nodesToTableRowsMapper
|
|
)(this.reportData);
|
|
};
|
|
|
|
// -------------------------
|
|
// # Columns.
|
|
// -------------------------
|
|
/**
|
|
* Retrieve the report table columns.
|
|
* @returns {ITableColumn[]}
|
|
*/
|
|
public tableColumns = (): ITableColumn[] => {
|
|
return R.compose(
|
|
this.tableColumnsCellIndexing,
|
|
R.concat([
|
|
{ key: 'name', label: this.i18n.__('balance_sheet.account_name') },
|
|
]),
|
|
R.ifElse(
|
|
this.query.isDatePeriodsColumnsType,
|
|
R.concat(this.datePeriodsColumns()),
|
|
R.concat(this.totalColumn())
|
|
)
|
|
)([]);
|
|
};
|
|
}
|