@railzai/railz-visualizations
Version:
Railz.ai Visualizations
191 lines • 8.1 kB
JavaScript
/*!
* Accounting Data as a Service™ is the solution that makes sense of your business customers' financial data.
* Built with Stencil
* Copyright (c) FIS.
*/
import { isNil, pick } from 'lodash-es';
import { format, parseISO } from 'date-fns';
import Translations from '../../config/translations/en.json';
import { formatDate, formatSeries, isStatements } from '../../helpers/utils';
import { ALL_FONTS, RAILZ_BALANCE_SHEET_COLORS, RAILZ_CASHFLOW_COLORS, RAILZ_INCOME_STATEMENT_COLORS, } from '../../types';
import { RVReportTypes, RVReportTypesUrlMapping } from '../../types/enum/report-type';
import { RequestServiceInstance } from '../../services/request';
import { errorLog } from '../../services/logger';
import { RAILZ_DATE_FORMAT } from '../../types/constants/date';
/**
* Setup Highcharts options for bar charts
*/
export const getOptionsBarChart = ({ categories, series, colors, chart, }) => ({
chart: {
height: chart === null || chart === void 0 ? void 0 : chart.height,
type: 'column',
backgroundColor: (chart === null || chart === void 0 ? void 0 : chart.backgroundColor) || '#ffffff',
style: Object.assign({ fontFamily: (chart === null || chart === void 0 ? void 0 : chart.fontFamily) || ALL_FONTS }, chart === null || chart === void 0 ? void 0 : chart.style),
reflow: true,
marginTop: 0,
spacingTop: 0,
spacingRight: 0,
marginRight: 0,
events: {
load() {
// eslint-disable-next-line @typescript-eslint/no-this-alias
const chart = this;
setTimeout(() => {
if (!isNil(chart)) {
try {
chart.reflow();
}
catch (e) { }
}
}, 0);
},
},
},
colors: colors || ['#3BCFF0', '#FFED8C', '#003032'],
title: null,
xAxis: Object.assign({ categories: categories, offset: 50, labels: {
style: Object.assign({ color: '#55565B' }, chart === null || chart === void 0 ? void 0 : chart.label),
} }, chart === null || chart === void 0 ? void 0 : chart.xAxisStyle),
yAxis: Object.assign({ gridLineDashStyle: 'longdash', endOnTick: false, title: null, labels: {
style: Object.assign({ color: '#55565B' }, chart === null || chart === void 0 ? void 0 : chart.label),
} }, chart === null || chart === void 0 ? void 0 : chart.yAxisStyle),
credits: {
enabled: false,
},
plotOptions: {
column: {
stacking: 'normal',
},
series: {
pointWidth: 12,
},
},
legend: Object.assign({ align: 'left', itemMarginTop: 8 }, chart === null || chart === void 0 ? void 0 : chart.legend),
series: series,
exporting: {
enabled: false,
},
});
/**
* Formats data into Highcharts format for cashflow statement
*/
export const formatCashflowData = ({ summary, reportFrequency, chart, date, }) => {
const categories = formatDate(summary, reportFrequency, date);
const financingActivities = formatSeries(summary, Translations.RV_FINANCING_ACTIVITIES, 'financingActivities');
const investingActivities = formatSeries(summary, Translations.RV_INVESTING_ACTIVITIES, 'investingActivities');
const operatingActivities = formatSeries(summary, Translations.RV_OPERATING_ACTIVITIES, 'operatingActivities');
const netCash = Object.assign({ type: 'spline', marker: {
enabled: false,
}, states: {
hover: {
lineWidth: 0,
},
}, enableMouseTracking: false }, formatSeries(summary, Translations.RV_NET_CASH, 'netCash'));
const series = [financingActivities, investingActivities, netCash, operatingActivities].filter((seriesData) => (seriesData === null || seriesData === void 0 ? void 0 : seriesData.data.length) > 0);
return {
categories,
series: series,
colors: (chart === null || chart === void 0 ? void 0 : chart.colors) || RAILZ_CASHFLOW_COLORS,
};
};
/**
* Formats data into Highcharts format for balance sheet
*/
export const formatBalanceSheetData = ({ summary, reportFrequency, chart, date, }) => {
const categories = formatDate(summary, reportFrequency, date);
const currentAssets = formatSeries(summary, Translations.RV_CURRENT_ASSETS, 'currentAssets');
const currentLiabilities = formatSeries(summary, Translations.RV_CURRENT_LIABILITIES, 'currentLiabilities');
const nonCurrentAssets = formatSeries(summary, Translations.RV_NON_CURRENT_ASSETS, 'nonCurrentAssets');
const nonCurrentLiabilities = formatSeries(summary, Translations.RV_NON_CURRENT_LIABILITIES, 'nonCurrentLiabilities');
const equity = Object.assign({ type: 'spline', marker: {
enabled: false,
}, states: {
hover: {
lineWidth: 0,
},
}, enableMouseTracking: false }, formatSeries(summary, Translations.RV_EQUITY, 'equity'));
const series = [
currentAssets,
currentLiabilities,
nonCurrentAssets,
nonCurrentLiabilities,
equity,
].filter((seriesData) => (seriesData === null || seriesData === void 0 ? void 0 : seriesData.data.length) > 0);
return {
categories,
series: series,
colors: (chart === null || chart === void 0 ? void 0 : chart.colors) || RAILZ_BALANCE_SHEET_COLORS,
};
};
/**
* Formats data into Highcharts format for income statement
*/
export const formatIncomeStatementData = ({ summary, reportFrequency, chart, date, }) => {
const categories = formatDate(summary, reportFrequency, date);
const costOfGoodsSold = formatSeries(summary, Translations.RV_COST_OF_GOODS_SOLD, 'costOfGoodsSold');
const operatingExpenses = formatSeries(summary, Translations.RV_OPERATING_EXPENSES, 'operatingExpenses');
const operatingIncome = formatSeries(summary, Translations.RV_OPERATING_INCOME, 'operatingIncome');
const otherExpenses = formatSeries(summary, Translations.RV_OTHER_EXPENSES, 'otherExpenses');
const otherIncome = formatSeries(summary, Translations.RV_OTHER_INCOME, 'otherIncome');
const netIncome = Object.assign({ type: 'spline', marker: {
enabled: false,
}, states: {
hover: {
lineWidth: 0,
},
}, enableMouseTracking: false }, formatSeries(summary, Translations.RV_NET_INCOME, 'netIncome'));
const series = [
costOfGoodsSold,
netIncome,
operatingExpenses,
operatingIncome,
otherExpenses,
otherIncome,
].filter((seriesData) => (seriesData === null || seriesData === void 0 ? void 0 : seriesData.data.length) > 0);
return {
categories,
series: series,
colors: (chart === null || chart === void 0 ? void 0 : chart.colors) || RAILZ_INCOME_STATEMENT_COLORS,
};
};
/**
* Formats retrieved data into Highcharts format based on different report type
*/
export const formatData = (statementParameter) => {
if (statementParameter.reportType === RVReportTypes.BALANCE_SHEET)
return formatBalanceSheetData(statementParameter);
if (statementParameter.reportType === RVReportTypes.CASHFLOW_STATEMENTS)
return formatCashflowData(statementParameter);
if (statementParameter.reportType === RVReportTypes.INCOME_STATEMENTS)
return formatIncomeStatementData(statementParameter);
};
/**
* Make API call based on expected parameters for financial statements data type
*/
export const getReportData = async ({ filter, }) => {
let reportData;
try {
const startDate = format(parseISO(filter.startDate), RAILZ_DATE_FORMAT);
const endDate = format(parseISO(filter.endDate), RAILZ_DATE_FORMAT);
const allParameters = pick(Object.assign(Object.assign({}, filter), { startDate,
endDate }), ['startDate', 'endDate', 'reportFrequency', 'connectionUuid']);
reportData = await RequestServiceInstance.getReportData({
path: RVReportTypesUrlMapping[filter.reportType],
filter: allParameters,
});
}
catch (error) {
errorLog(Translations.RV_NOT_ABLE_TO_RETRIEVE_REPORT_DATA, error);
reportData = { error };
}
return reportData;
};
/**
* Checks whether we need to add reconstruct: true to the params or not
* @param {RVStatementsFilter} filter - Current filter
* @returns {boolean}
*/
export const shouldAddReconstructParam = (filter) => {
return isStatements(filter.reportType);
};
//# sourceMappingURL=statements-chart.utils.js.map