mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-18 13:50:31 +00:00
151 lines
3.7 KiB
TypeScript
151 lines
3.7 KiB
TypeScript
import * as R from 'ramda';
|
|
import {
|
|
ICustomerBalanceSummaryData,
|
|
ICustomerBalanceSummaryCustomer,
|
|
ICustomerBalanceSummaryTotal,
|
|
ITableRow,
|
|
IColumnMapperMeta,
|
|
ICustomerBalanceSummaryQuery,
|
|
ITableColumn,
|
|
} from '@/interfaces';
|
|
import { tableMapper, tableRowMapper } from 'utils';
|
|
|
|
enum TABLE_ROWS_TYPES {
|
|
CUSTOMER = 'CUSTOMER',
|
|
TOTAL = 'TOTAL',
|
|
}
|
|
|
|
export class CustomerBalanceSummaryTable {
|
|
report: ICustomerBalanceSummaryData;
|
|
query: ICustomerBalanceSummaryQuery;
|
|
i18n: any;
|
|
|
|
/**
|
|
* Constructor method.
|
|
*/
|
|
constructor(
|
|
report: ICustomerBalanceSummaryData,
|
|
query: ICustomerBalanceSummaryQuery,
|
|
i18n
|
|
) {
|
|
this.report = report;
|
|
this.i18n = i18n;
|
|
this.query = query;
|
|
}
|
|
|
|
/**
|
|
* Retrieve percentage columns accessor.
|
|
* @returns {IColumnMapperMeta[]}
|
|
*/
|
|
private getPercentageColumnsAccessor = (): IColumnMapperMeta[] => {
|
|
return [
|
|
{
|
|
key: 'percentageOfColumn',
|
|
accessor: 'percentageOfColumn.formattedAmount',
|
|
},
|
|
];
|
|
};
|
|
|
|
/**
|
|
* Retrieve customer node columns accessor.
|
|
* @returns {IColumnMapperMeta[]}
|
|
*/
|
|
private getCustomerColumnsAccessor = (): IColumnMapperMeta[] => {
|
|
const columns = [
|
|
{ key: 'name', accessor: 'customerName' },
|
|
{ key: 'total', accessor: 'total.formattedAmount' },
|
|
];
|
|
return R.compose(
|
|
R.concat(columns),
|
|
R.when(
|
|
R.always(this.query.percentageColumn),
|
|
R.concat(this.getPercentageColumnsAccessor())
|
|
)
|
|
)([]);
|
|
};
|
|
|
|
/**
|
|
* Transformes the customers to table rows.
|
|
* @param {ICustomerBalanceSummaryCustomer[]} customers
|
|
* @returns {ITableRow[]}
|
|
*/
|
|
private customersTransformer(
|
|
customers: ICustomerBalanceSummaryCustomer[]
|
|
): ITableRow[] {
|
|
const columns = this.getCustomerColumnsAccessor();
|
|
|
|
return tableMapper(customers, columns, {
|
|
rowTypes: [TABLE_ROWS_TYPES.CUSTOMER],
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Retrieve total node columns accessor.
|
|
* @returns {IColumnMapperMeta[]}
|
|
*/
|
|
private getTotalColumnsAccessor = (): IColumnMapperMeta[] => {
|
|
const columns = [
|
|
{ key: 'name', value: this.i18n.__('Total') },
|
|
{ key: 'total', accessor: 'total.formattedAmount' },
|
|
];
|
|
return R.compose(
|
|
R.concat(columns),
|
|
R.when(
|
|
R.always(this.query.percentageColumn),
|
|
R.concat(this.getPercentageColumnsAccessor())
|
|
)
|
|
)([]);
|
|
};
|
|
|
|
/**
|
|
* Transformes the total to table row.
|
|
* @param {ICustomerBalanceSummaryTotal} total
|
|
* @returns {ITableRow}
|
|
*/
|
|
private totalTransformer = (
|
|
total: ICustomerBalanceSummaryTotal
|
|
): ITableRow => {
|
|
const columns = this.getTotalColumnsAccessor();
|
|
|
|
return tableRowMapper(total, columns, {
|
|
rowTypes: [TABLE_ROWS_TYPES.TOTAL],
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Transformes the customer balance summary to table rows.
|
|
* @param {ICustomerBalanceSummaryData} customerBalanceSummary
|
|
* @returns {ITableRow[]}
|
|
*/
|
|
public tableRows(): ITableRow[] {
|
|
const customers = this.customersTransformer(this.report.customers);
|
|
const total = this.totalTransformer(this.report.total);
|
|
|
|
return customers.length > 0 ? [...customers, total] : [];
|
|
}
|
|
|
|
/**
|
|
* Retrieve the report statement columns
|
|
* @returns {ITableColumn[]}
|
|
*/
|
|
public tableColumns = (): ITableColumn[] => {
|
|
const columns = [
|
|
{
|
|
key: 'name',
|
|
label: this.i18n.__('contact_summary_balance.account_name'),
|
|
},
|
|
{ key: 'total', label: this.i18n.__('contact_summary_balance.total') },
|
|
];
|
|
return R.compose(
|
|
R.when(
|
|
R.always(this.query.percentageColumn),
|
|
R.append({
|
|
key: 'percentage_of_column',
|
|
label: this.i18n.__('contact_summary_balance.percentage_column'),
|
|
})
|
|
),
|
|
R.concat(columns)
|
|
)([]);
|
|
};
|
|
}
|