import { CompillerFunction } from "../../dist/StubbleContext";
import Stubble from "../../dist/Stubble";
import moment from "moment";
export const initHelpers = () => {
const stubble = new Stubble({});
stubble.registerHelper(
"testHelper",
(attrs: any[], fn: CompillerFunction) => {
return attrs.join("; ");
}
);
stubble.registerHelper("show", (attrs: any[], fn: CompillerFunction) => {
return attrs.toString();
});
stubble.registerHelper(
"blockHelper",
(attrs: any[], fn: CompillerFunction) => {
return fn({ AA: "it", BB: "works" });
}
);
stubble.registerHelper(
"formatPrice",
(attrs: any[], fn: CompillerFunction) => {
return `${attrs[0].toString()} \$`;
}
);
stubble.registerHelper(
"item_price",
(attrs: any[], fn: CompillerFunction) => {
var item = attrs[0] as { [key: string]: string };
if (item) {
const price = parseFloat(item.price) * parseInt(item.quantity, 10);
return number_format(price, 2);
}
return "";
}
);
stubble.registerHelper(
"item_price",
(attrs: any[], fn: CompillerFunction) => {
const { price, quantity } = this || { price: "0", quantity: "0" };
const priceValue = parseFloat(price) * parseInt(quantity, 10);
return number_format(priceValue, 2);
}
);
stubble.registerHelper("total_sum", (attrs: any[], fn: CompillerFunction) => {
let sum = 0;
var items = attrs[0];
if (items && items.length > 0) {
for (let i = 0; i < items.length; i++) {
sum += parseFloat(items[i].price) * parseInt(items[i].quantity, 10);
if (items[i].options) {
const opts = Object.values(items[i].options) as {
[key: string]: any;
};
for (let k = 0; k < opts.length; k++) {
sum += parseFloat(opts[k].price) * parseInt(items[i].quantity, 10);
}
}
}
}
return `| TOTAL | *${number_format(
sum,
2
)} |
`;
});
stubble.registerHelper(
"order_date",
(attrs: any[], fn: CompillerFunction) => {
var modified = attrs[0];
if (modified) {
return `| Order datetime | ${moment(
modified
).format("D.M.Y / hh:mm")} |
`;
}
return "";
}
);
stubble.registerHelper("bill_date", (attrs: any[], fn: CompillerFunction) => {
var modified = attrs[0];
if (modified > 0) {
return `| Bill datetime | ${moment(
modified
).format("D.M.Y / hh:mm")} |
`;
}
return "";
});
stubble.registerHelper(
"items_list",
(attrs: any[], fn: CompillerFunction) => {
var items = attrs[0];
return items
.map((item: { [key: string]: any }) => {
return fn(item);
})
.join("");
}
);
stubble.registerHelper(
"options_list",
(attrs: any[], fn: CompillerFunction) => {
var options = attrs[0];
if (options) {
return Object.values(options)
.map((item) => {
return fn(item as { [key: string]: string });
})
.join("");
}
return "";
}
);
stubble.registerHelper("vat_list", (attrs: any[], fn: CompillerFunction) => {
let vats: { [key: number]: { name: string; value: number } } = {};
var items = attrs[0];
if (items && items.length > 0) {
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (item.vat_value > 0) {
let vat = item.vat_value / 100;
if (vats[item.vat_value]) {
vats[item.vat_value].value += item.price * item.quantity * vat;
} else {
vats[item.vat_value] = {
name: item.vat_name,
value: item.price * item.quantity * vat,
};
}
}
}
return Object.values(vats)
.map((item: { [key: string]: any }) => {
item.value = number_format(item.value, 2);
return fn(item);
})
.join("");
}
return "";
});
stubble.registerHelper(
"items_by_department",
(attrs: any[], fn: CompillerFunction) => {
var deps: {
[key: string]: {
name: string;
items: object[];
};
} = {};
var items = attrs[0];
if (items && items.length > 0) {
for (let i = 0; i < items.length; i++) {
const item = items[i];
const dep = item.department;
if (deps[dep]) {
deps[dep].items.push(item);
} else {
deps[dep] = { name: "department " + i, items: [] };
//deps[dep].name = departments[dep].name;
deps[dep].items = [];
deps[dep].items.push(item);
}
}
}
return Object.values(deps)
.map((dep: { [key: string]: any }) => {
return (
"" +
dep.name +
":
" +
dep.items
.map((item: { [key: string]: any }) => {
return fn(item);
})
.join("") +
"
"
);
})
.join("");
}
);
return stubble;
};
export const number_format = (
number: number,
decimals = 0,
dec_point = ".",
thousands_sep = " "
) => {
// Format a number with grouped thousands
let i: string, j: number, kw: string, kd: string, km: string;
if (isNaN((decimals = Math.abs(decimals)))) {
decimals = 2;
}
if (dec_point == undefined) {
dec_point = ",";
}
if (thousands_sep == undefined) {
thousands_sep = ".";
}
i = (number | 0).toString();
if ((j = i.length) > 3) {
j = j % 3;
} else {
j = 0;
}
km = j ? i.substr(0, j) + thousands_sep : "";
kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep);
kd = decimals
? dec_point + Math.abs(number).toFixed(decimals).replace(/-/, "0").slice(2)
: "";
return km + kw + kd;
};
export default initHelpers;