mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-20 14:50:32 +00:00
233 lines
6.8 KiB
TypeScript
233 lines
6.8 KiB
TypeScript
import * as R from 'ramda';
|
|
import { first } from 'lodash';
|
|
import {
|
|
IColumnMapperMeta,
|
|
IJournalEntry,
|
|
IJournalReportEntriesGroup,
|
|
IJournalReportQuery,
|
|
IJournalTableData,
|
|
ITableColumn,
|
|
ITableColumnAccessor,
|
|
ITableRow,
|
|
} from '@/interfaces';
|
|
import { tableRowMapper } from '@/utils';
|
|
import { FinancialTable } from '../FinancialTable';
|
|
import { FinancialSheetStructure } from '../FinancialSheetStructure';
|
|
import FinancialSheet from '../FinancialSheet';
|
|
import { ROW_TYPE } from './types';
|
|
|
|
export class JournalSheetTable extends R.compose(
|
|
FinancialTable,
|
|
FinancialSheetStructure
|
|
)(FinancialSheet) {
|
|
private data: IJournalTableData;
|
|
private query: IJournalReportQuery;
|
|
private i18n: any;
|
|
|
|
/**
|
|
* Constructor method.
|
|
* @param {IJournalTableData} data
|
|
* @param {IJournalReportQuery} query
|
|
* @param i18n
|
|
*/
|
|
constructor(data: IJournalTableData, query: IJournalReportQuery, i18n: any) {
|
|
super();
|
|
|
|
this.data = data;
|
|
this.query = query;
|
|
this.i18n = i18n;
|
|
}
|
|
|
|
/**
|
|
* Retrieves the common table accessors.
|
|
* @returns {ITableColumnAccessor[]}
|
|
*/
|
|
private groupColumnsAccessors = (): ITableColumnAccessor[] => {
|
|
return [
|
|
{ key: 'date', accessor: 'dateFormatted' },
|
|
{ key: 'transaction_type', accessor: 'referenceTypeFormatted' },
|
|
{ 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' },
|
|
{ key: 'debit', accessor: 'entry.formattedDebit' },
|
|
];
|
|
};
|
|
|
|
/**
|
|
* Retrieves the group entry accessors.
|
|
* @returns {ITableColumnAccessor[]}
|
|
*/
|
|
private entryColumnsAccessors = (): ITableColumnAccessor[] => {
|
|
return [
|
|
{ key: 'date', accessor: '_empty_' },
|
|
{ key: 'transaction_type', accessor: '_empty_' },
|
|
{ key: 'transaction_number', accessor: 'transactionNumber' },
|
|
{ key: 'description', accessor: 'note' },
|
|
{ key: 'account_code', accessor: 'accountCode' },
|
|
{ key: 'account_name', accessor: 'accountName' },
|
|
{ key: 'credit', accessor: 'formattedCredit' },
|
|
{ key: 'debit', accessor: 'formattedDebit' },
|
|
];
|
|
};
|
|
|
|
/**
|
|
* Retrieves the total entry column accessors.
|
|
* @returns {ITableColumnAccessor[]}
|
|
*/
|
|
private totalEntryColumnAccessors = (): ITableColumnAccessor[] => {
|
|
return [
|
|
{ key: 'date', accessor: '_empty_' },
|
|
{ key: 'transaction_type', accessor: '_empty_' },
|
|
{ key: 'transaction_number', accessor: '_empty_' },
|
|
{ key: 'description', accessor: '_empty_' },
|
|
{ key: 'account_code', accessor: '_empty_' },
|
|
{ key: 'account_name', accessor: '_empty_' },
|
|
{ key: 'credit', accessor: 'formattedCredit' },
|
|
{ key: 'debit', accessor: 'formattedDebit' },
|
|
];
|
|
};
|
|
|
|
/**
|
|
* Retrieves the total entry column accessors.
|
|
* @returns {IColumnMapperMeta[]}
|
|
*/
|
|
private blankEnrtyColumnAccessors = (): IColumnMapperMeta[] => {
|
|
return [
|
|
{ key: 'date', value: '' },
|
|
{ key: 'transaction_type', value: '' },
|
|
{ key: 'transaction_number', value: '' },
|
|
{ key: 'description', value: '' },
|
|
{ key: 'account_code', value: '' },
|
|
{ key: 'account_name', value: '' },
|
|
{ key: 'credit', value: '' },
|
|
{ key: 'debit', value: '' },
|
|
];
|
|
};
|
|
|
|
/**
|
|
* Retrieves the common columns.
|
|
* @returns {ITableColumn[]}
|
|
*/
|
|
private commonColumns(): ITableColumn[] {
|
|
return [
|
|
{ key: 'date', label: 'Date' },
|
|
{ key: 'transaction_type', label: 'Transaction Type' },
|
|
{ key: 'transaction_number', label: 'Num.' },
|
|
{ key: 'description', label: 'Description' },
|
|
{ key: 'account_code', label: 'Acc. Code' },
|
|
{ key: 'account_name', label: 'Account' },
|
|
{ key: 'credit', label: 'Credit' },
|
|
{ key: 'debit', label: 'Debit' },
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Maps the group and first entry to table row.
|
|
* @param {IJournalReportEntriesGroup} group
|
|
* @returns {ITableRow}
|
|
*/
|
|
private firstEntryGroupMapper = (
|
|
group: IJournalReportEntriesGroup
|
|
): ITableRow => {
|
|
const meta = {
|
|
rowTypes: [ROW_TYPE.ENTRY],
|
|
};
|
|
const computedGroup = { ...group, entry: first(group.entries) };
|
|
const columns = this.groupColumnsAccessors();
|
|
|
|
return tableRowMapper(computedGroup, columns, meta);
|
|
};
|
|
|
|
/**
|
|
* Maps the given group entry to table rows.
|
|
* @param {IJournalEntry} entry
|
|
* @returns {ITableRow}
|
|
*/
|
|
private entryMapper = (entry: IJournalEntry): ITableRow => {
|
|
const columns = this.entryColumnsAccessors();
|
|
const meta = {
|
|
rowTypes: [ROW_TYPE.ENTRY],
|
|
};
|
|
return tableRowMapper(entry, columns, meta);
|
|
};
|
|
|
|
/**
|
|
* Maps the given group entries to table rows.
|
|
* @param {IJournalReportEntriesGroup} group
|
|
* @returns {ITableRow[]}
|
|
*/
|
|
private entriesMapper = (group: IJournalReportEntriesGroup): ITableRow[] => {
|
|
const entries = R.remove(0, 1, group.entries);
|
|
|
|
return R.map(this.entryMapper, entries);
|
|
};
|
|
|
|
/**
|
|
* Maps the given group entry to total table row.
|
|
* @param {IJournalReportEntriesGroup} group
|
|
* @returns {ITableRow}
|
|
*/
|
|
public totalEntryMapper = (group: IJournalReportEntriesGroup): ITableRow => {
|
|
const total = this.totalEntryColumnAccessors();
|
|
const meta = {
|
|
rowTypes: [ROW_TYPE.TOTAL],
|
|
};
|
|
return tableRowMapper(group, total, meta);
|
|
};
|
|
|
|
/**
|
|
* Retrieves the blank entry row.
|
|
* @returns {ITableRow}
|
|
*/
|
|
private blankEntryMapper = (): ITableRow => {
|
|
const columns = this.blankEnrtyColumnAccessors();
|
|
const meta = {};
|
|
return tableRowMapper({} as IJournalEntry, columns, meta);
|
|
};
|
|
|
|
/**
|
|
* Maps the entry group to table rows.
|
|
* @param {IJournalReportEntriesGroup} group -
|
|
* @returns {ITableRow}
|
|
*/
|
|
private groupMapper = (group: IJournalReportEntriesGroup): ITableRow[] => {
|
|
const firstRow = this.firstEntryGroupMapper(group);
|
|
const lastRows = this.entriesMapper(group);
|
|
const totalRow = this.totalEntryMapper(group);
|
|
const blankRow = this.blankEntryMapper();
|
|
|
|
return [firstRow, ...lastRows, totalRow, blankRow];
|
|
};
|
|
|
|
/**
|
|
* Maps the given group entries to table rows.
|
|
* @param {IJournalReportEntriesGroup[]} entries -
|
|
* @returns {ITableRow[]}
|
|
*/
|
|
private groupsMapper = (
|
|
entries: IJournalReportEntriesGroup[]
|
|
): ITableRow[] => {
|
|
return R.compose(R.flatten, R.map(this.groupMapper))(entries);
|
|
};
|
|
|
|
/**
|
|
* Retrieves the table data rows.
|
|
* @returns {ITableRow[]}
|
|
*/
|
|
public tableData(): ITableRow[] {
|
|
return R.compose(this.groupsMapper)(this.data);
|
|
}
|
|
|
|
/**
|
|
* Retrieves the table columns.
|
|
* @returns {ITableColumn[]}
|
|
*/
|
|
public tableColumns(): ITableColumn[] {
|
|
const columns = this.commonColumns();
|
|
|
|
return R.compose(this.tableColumnsCellIndexing)(columns);
|
|
}
|
|
}
|