Files
bigcapital/packages/server/src/services/FinancialStatements/CustomerBalanceSummary/CustomerBalanceSummaryTableRows.ts
2024-02-25 17:40:33 +02:00

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)
)([]);
};
}