medusa-invoice
Version:
Generate invoice from Medusa
150 lines • 21.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateInvoiceTable = exports.amountToDisplay = void 0;
const path_1 = __importDefault(require("path"));
const currency_1 = require("../../../../utils/currency");
const amountToDisplay = (amount, currencyCode) => {
const decimalDigits = (0, currency_1.getDecimalDigits)(currencyCode);
return `₹${(amount / Math.pow(10, decimalDigits)).toFixed(decimalDigits)}`;
};
exports.amountToDisplay = amountToDisplay;
// helper to resolve effective rate
function getEffectiveTaxRate(order, fallbackRate) {
var _a, _b, _c;
const cutoff = new Date("2025-09-25T00:00:00Z");
const createdAt = new Date(order.created_at);
if (createdAt < cutoff) {
return fallbackRate;
}
// else fetch from first item tax line
const firstItemTaxLine = (_c = (_b = (_a = order.items) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.tax_lines) === null || _c === void 0 ? void 0 : _c[0];
return firstItemTaxLine ? firstItemTaxLine.rate / 2 : fallbackRate;
}
function generateTableRow(doc, y, item, hsn, quantity, unitCost, lineTotal, bg, bold) {
if (bg) {
doc
.roundedRect(50, y - 3, 500, 20, 3)
.fillColor("#111111")
.fill();
doc.fillColor("#FFFFFF");
}
else {
doc.fillColor("#111111");
}
doc
.fontSize(10)
.font("Bold")
.text(item, 58, y)
.font(bold ? "Bold" : "Regular")
.text(hsn, 240, y, { width: 60, align: "left" })
.text(quantity, 300, y, { width: 90, align: "left" })
.text(unitCost, 340, y, { width: 130, align: "right" })
.text(lineTotal, 0, y, { align: "right" });
}
function generateInvoiceTable(doc, y, order, items) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6;
doc.registerFont("Regular", path_1.default.resolve(__dirname, "../../../../../fonts/NotoSans-Regular.ttf"));
doc.registerFont("Bold", path_1.default.resolve(__dirname, "../../../../../fonts/NotoSans-Bold.ttf"));
doc.font("Regular");
const invoiceTableTop = y + 10;
// Check if order is after October 8th, 2025 and from Maharashtra
const cutoffDate = new Date("2025-10-08T00:00:00Z");
const orderDate = order.created_at ? new Date(order.created_at) : null;
const isAfterCutoff = orderDate instanceof Date &&
!isNaN(orderDate.getTime()) &&
orderDate.getTime() > cutoffDate.getTime();
const isMaharashtra = ((_b = (_a = order.shipping_address) === null || _a === void 0 ? void 0 : _a.province) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === "maharashtra";
const shouldShowIGST = isAfterCutoff && !isMaharashtra;
const getCodValue = () => {
var _a, _b, _c, _d;
if (!(orderDate instanceof Date) || isNaN(orderDate.getTime())) {
return;
}
const orderTime = orderDate.getTime();
const beforeDec8End = new Date("2025-12-08T23:59:59Z").getTime();
const dec9Start = new Date("2025-12-09T00:00:00Z").getTime();
const dec15Morning = new Date("2025-12-15T07:00:00Z").getTime();
if (orderTime <= beforeDec8End) {
return (0, exports.amountToDisplay)(300 * 100, order === null || order === void 0 ? void 0 : order.currency_code);
}
if (orderTime >= dec9Start && orderTime <= dec15Morning) {
return (0, exports.amountToDisplay)(200 * 100, order === null || order === void 0 ? void 0 : order.currency_code);
}
return (0, exports.amountToDisplay)(parseInt((_d = (_c = (_b = (_a = order === null || order === void 0 ? void 0 : order.shipping_methods) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.shipping_option) === null || _c === void 0 ? void 0 : _c.metadata) === null || _d === void 0 ? void 0 : _d.cod_charges) * 100, order === null || order === void 0 ? void 0 : order.currency_code);
};
// Header row
generateTableRow(doc, invoiceTableTop, "Item", "HSN", "Quantity", "Description", "Amount(₹)", true, false);
let position = invoiceTableTop;
let totalTax = 0;
for (let i = 0; i < items.length; i++) {
const item = items[i];
// Item row
position += 24;
generateTableRow(doc, position, (_c = item === null || item === void 0 ? void 0 : item.variant) === null || _c === void 0 ? void 0 : _c.title, (_d = item === null || item === void 0 ? void 0 : item.variant) === null || _d === void 0 ? void 0 : _d.hs_code, item.quantity, "Unit Price (Before GST)", (0, exports.amountToDisplay)(item.unit_price, order.currency_code), false, false);
if (shouldShowIGST) {
// IGST row
position += 16;
generateTableRow(doc, position, "", "", "", `IGST (${(_f = (_e = item.tax_lines) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.rate}%)`, (0, exports.amountToDisplay)(Math.round(item.original_tax_total), order.currency_code), false, false);
}
else {
// CGST row
position += 16;
generateTableRow(doc, position, "", "", "", `CGST (${((_h = (_g = item.tax_lines) === null || _g === void 0 ? void 0 : _g[0]) === null || _h === void 0 ? void 0 : _h.rate) / 2}%)`, (0, exports.amountToDisplay)(Math.round(item.original_tax_total / 2), order.currency_code), false, false);
// SGST row
position += 16;
generateTableRow(doc, position, "", "", "", `SGST (${((_k = (_j = item.tax_lines) === null || _j === void 0 ? void 0 : _j[0]) === null || _k === void 0 ? void 0 : _k.rate) / 2}%)`, (0, exports.amountToDisplay)(Math.round(item.original_tax_total / 2), order.currency_code), false, false);
}
totalTax += item.original_tax_total;
}
// Subtotal row
position += 30;
generateTableRow(doc, position, "", "", "", `Subtotal (${items.reduce((acc, item) => acc + item.quantity, 0)} ${items.reduce((acc, item) => acc + item.quantity, 0) > 1 ? "units" : "unit"})`, (0, exports.amountToDisplay)(order.subtotal, order.currency_code), false, false);
// Total (incl. GST)
position += 22;
generateTableRow(doc, position, "", "", "", "Total (incl. GST)", (0, exports.amountToDisplay)(order.subtotal + totalTax, order.currency_code), false, true);
// Discount (if any)
if (order.discounts.length > 0) {
position += 22;
const discount = order.discounts[0];
let discountLabel = "Discount";
let discountValue = 0;
if (((_l = discount.rule) === null || _l === void 0 ? void 0 : _l.type) === "percentage") {
discountLabel += ` (${(_m = discount.rule) === null || _m === void 0 ? void 0 : _m.value}%)`;
discountValue =
(order.subtotal + totalTax) * (((_o = discount.rule) === null || _o === void 0 ? void 0 : _o.value) / 100);
}
else if (((_p = discount.rule) === null || _p === void 0 ? void 0 : _p.type) === "fixed") {
discountLabel += ` (${((_q = discount.rule) === null || _q === void 0 ? void 0 : _q.value) / 100})`;
discountValue = (_r = discount.rule) === null || _r === void 0 ? void 0 : _r.value;
}
else if (((_s = discount.rule) === null || _s === void 0 ? void 0 : _s.type) === "free_shipping") {
discountLabel += ` (Free Shipping)`;
discountValue =
((_u = (_t = order === null || order === void 0 ? void 0 : order.shipping_methods) === null || _t === void 0 ? void 0 : _t[0]) === null || _u === void 0 ? void 0 : _u.price) +
((_y = (_x = (_w = (_v = order === null || order === void 0 ? void 0 : order.shipping_methods) === null || _v === void 0 ? void 0 : _v[0]) === null || _w === void 0 ? void 0 : _w.tax_lines) === null || _x === void 0 ? void 0 : _x[0]) === null || _y === void 0 ? void 0 : _y.rate) || 0;
}
generateTableRow(doc, position, "", "", "", discountLabel, "-" + (0, exports.amountToDisplay)(discountValue, order.currency_code), false, false);
}
// Shipping Fee
position += 22;
generateTableRow(doc, position, "", "", "", "Shipping Fee (Flat)", (0, exports.amountToDisplay)(((_z = order === null || order === void 0 ? void 0 : order.discounts[0]) === null || _z === void 0 ? void 0 : _z.code) === "SISTERHOOD" ||
((_0 = order === null || order === void 0 ? void 0 : order.discounts[0]) === null || _0 === void 0 ? void 0 : _0.code) === "SISTER-HOOD"
? 0
: Math.round((((_1 = order === null || order === void 0 ? void 0 : order.shipping_methods[0]) === null || _1 === void 0 ? void 0 : _1.price) + (order === null || order === void 0 ? void 0 : order.shipping_tax_total)) /
100) >
((_4 = (_3 = (_2 = order === null || order === void 0 ? void 0 : order.shipping_methods[0]) === null || _2 === void 0 ? void 0 : _2.shipping_option) === null || _3 === void 0 ? void 0 : _3.metadata) === null || _4 === void 0 ? void 0 : _4.cod_charges)
? (((_5 = order === null || order === void 0 ? void 0 : order.shipping_methods[0]) === null || _5 === void 0 ? void 0 : _5.price) + (order === null || order === void 0 ? void 0 : order.shipping_tax_total)) / 3
: Math.round(((_6 = order === null || order === void 0 ? void 0 : order.shipping_methods[0]) === null || _6 === void 0 ? void 0 : _6.price) + (order === null || order === void 0 ? void 0 : order.shipping_tax_total)), order.currency_code), false, false);
// COD Charges
position += 22;
generateTableRow(doc, position, "", "", "", order.payment_status === "captured" ? "" : "COD Charges", order.payment_status === "captured" ? "" : getCodValue(), false, false);
// Final Total Payable
position += 22;
generateTableRow(doc, position, "", "", "", "Total Payable", (0, exports.amountToDisplay)(Math.round(order.total), order.currency_code), false, true);
return position + 30;
}
exports.generateInvoiceTable = generateInvoiceTable;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvdGVtcGxhdGVzL2ludm9pY2VzL2Jhc2ljL3BhcnRzL3RhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLGdEQUF3QjtBQUN4Qix5REFBOEQ7QUFFdkQsTUFBTSxlQUFlLEdBQUcsQ0FDN0IsTUFBYyxFQUNkLFlBQW9CLEVBQ1osRUFBRTtJQUNWLE1BQU0sYUFBYSxHQUFHLElBQUEsMkJBQWdCLEVBQUMsWUFBWSxDQUFDLENBQUM7SUFDckQsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7QUFDN0UsQ0FBQyxDQUFDO0FBTlcsUUFBQSxlQUFlLG1CQU0xQjtBQUVGLG1DQUFtQztBQUNuQyxTQUFTLG1CQUFtQixDQUFDLEtBQVksRUFBRSxZQUFvQjs7SUFDN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFN0MsSUFBSSxTQUFTLEdBQUcsTUFBTSxFQUFFO1FBQ3RCLE9BQU8sWUFBWSxDQUFDO0tBQ3JCO0lBRUQsc0NBQXNDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBQSxNQUFBLE1BQUEsS0FBSyxDQUFDLEtBQUssMENBQUcsQ0FBQyxDQUFDLDBDQUFFLFNBQVMsMENBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0FBQ3JFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUN2QixHQUFH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