2
0
mirror of https://github.com/frappe/books.git synced 2024-12-25 12:10:06 +00:00
books/utils/format.js

118 lines
2.8 KiB
JavaScript
Raw Normal View History

2018-07-17 18:43:51 +00:00
const luxon = require('luxon');
const frappe = require('frappejs');
2021-12-31 08:10:17 +00:00
const { DEFAULT_DISPLAY_PRECISION, DEFAULT_LOCALE } = require('./consts');
2018-02-14 12:50:56 +00:00
module.exports = {
2019-12-02 12:06:25 +00:00
format(value, df, doc) {
if (!df) {
return value;
2019-07-17 10:02:49 +00:00
}
2019-12-02 12:06:25 +00:00
if (typeof df === 'string') {
df = { fieldtype: df };
}
if (df.fieldtype === 'Currency') {
2021-12-31 08:10:17 +00:00
const currency = getCurrency(df, doc);
value = formatCurrency(value, currency);
2019-12-02 12:06:25 +00:00
} else if (df.fieldtype === 'Date') {
2019-07-17 10:02:49 +00:00
let dateFormat;
if (!frappe.SystemSettings) {
dateFormat = 'yyyy-MM-dd';
} else {
dateFormat = frappe.SystemSettings.dateFormat;
}
2020-01-28 10:56:44 +00:00
if (typeof value === 'string') {
// ISO String
value = luxon.DateTime.fromISO(value);
} else if (Object.prototype.toString.call(value) === '[object Date]') {
// JS Date
value = luxon.DateTime.fromJSDate(value);
}
value = value.toFormat(dateFormat);
2019-07-17 10:02:49 +00:00
if (value === 'Invalid DateTime') {
value = '';
}
2019-12-02 12:06:25 +00:00
} else if (df.fieldtype === 'Check') {
typeof parseInt(value) === 'number'
? (value = parseInt(value))
: (value = Boolean(value));
2019-07-17 10:02:49 +00:00
} else {
if (value === null || value === undefined) {
value = '';
} else {
value = value + '';
}
2018-02-14 12:50:56 +00:00
}
2019-07-17 10:02:49 +00:00
return value;
},
2021-12-31 08:10:17 +00:00
formatCurrency,
formatNumber,
2019-07-17 10:02:49 +00:00
};
2019-12-02 12:06:25 +00:00
2021-12-31 08:10:17 +00:00
function formatCurrency(value, currency) {
2021-12-29 11:52:07 +00:00
let valueString;
try {
2021-12-31 08:10:17 +00:00
valueString = formatNumber(value);
2021-12-29 11:52:07 +00:00
} catch (err) {
err.message += ` value: '${value}', type: ${typeof value}`;
throw err;
}
2021-12-31 08:10:17 +00:00
const currencySymbol = frappe.currencySymbols[currency];
if (currencySymbol) {
return currencySymbol + ' ' + valueString;
}
2021-12-31 08:10:17 +00:00
return valueString;
2019-12-02 12:06:25 +00:00
}
2021-12-31 08:10:17 +00:00
function formatNumber(value) {
2022-01-18 08:13:06 +00:00
const numberFormatter = getNumberFormatter();
2021-12-31 08:10:17 +00:00
if (typeof value === 'number') {
2022-01-18 08:13:06 +00:00
return numberFormatter.format(value);
2021-12-31 08:10:17 +00:00
}
if (value.round) {
2022-01-18 08:13:06 +00:00
return numberFormatter.format(value.round());
2021-12-31 08:10:17 +00:00
}
2022-01-18 08:13:06 +00:00
const formattedNumber = numberFormatter.format(value);
if (formattedNumber === 'NaN') {
2021-12-31 08:10:17 +00:00
throw Error(
2022-01-18 08:13:06 +00:00
`invalid value passed to formatNumber: '${value}' of type ${typeof value}`
2021-12-31 08:10:17 +00:00
);
}
2022-01-18 08:13:06 +00:00
return formattedNumber;
2021-12-31 08:10:17 +00:00
}
function getNumberFormatter() {
if (frappe.currencyFormatter) {
return frappe.currencyFormatter;
}
const locale = frappe.SystemSettings.locale ?? DEFAULT_LOCALE;
const display =
frappe.SystemSettings.displayPrecision ?? DEFAULT_DISPLAY_PRECISION;
return (frappe.currencyFormatter = Intl.NumberFormat(locale, {
style: 'decimal',
minimumFractionDigits: display,
}));
}
function getCurrency(df, doc) {
if (!(doc && df.getCurrency)) {
return df.currency || frappe.AccountingSettings.currency || '';
}
if (doc.meta && doc.meta.isChild) {
return df.getCurrency(doc, doc.parentdoc);
}
return df.getCurrency(doc);
}