@webbers/invoices-medusa 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/.medusa/server/src/admin/index.js +86 -0
  2. package/.medusa/server/src/admin/index.mjs +85 -0
  3. package/.medusa/server/src/api/admin/orders/[id]/invoice/[invoice_id]/route.js +28 -0
  4. package/.medusa/server/src/api/middlewares.js +13 -0
  5. package/.medusa/server/src/api/store/orders/[id]/invoice/route.js +37 -0
  6. package/.medusa/server/src/core/classes/pdf-generator/index.js +36 -0
  7. package/.medusa/server/src/core/classes/pdf-generator/templates/base.js +32 -0
  8. package/.medusa/server/src/core/classes/pdf-generator/templates/credit-invoice-content.js +308 -0
  9. package/.medusa/server/src/core/classes/pdf-generator/templates/invoice-content.js +496 -0
  10. package/.medusa/server/src/core/classes/pdf-generator/templates/packing-slip-content.js +164 -0
  11. package/.medusa/server/src/i18n/index.js +41 -0
  12. package/.medusa/server/src/i18n/messages/de.js +80 -0
  13. package/.medusa/server/src/i18n/messages/en.js +80 -0
  14. package/.medusa/server/src/i18n/messages/fr.js +80 -0
  15. package/.medusa/server/src/i18n/messages/it.js +80 -0
  16. package/.medusa/server/src/i18n/messages/nl.js +80 -0
  17. package/.medusa/server/src/links/invoice-order.js +17 -0
  18. package/.medusa/server/src/modules/invoice/index.js +15 -0
  19. package/.medusa/server/src/modules/invoice/loaders/validate.js +12 -0
  20. package/.medusa/server/src/modules/invoice/migrations/Migration20260312154721.js +18 -0
  21. package/.medusa/server/src/modules/invoice/migrations/Migration20260403000001.js +16 -0
  22. package/.medusa/server/src/modules/invoice/models/invoice.js +14 -0
  23. package/.medusa/server/src/modules/invoice/service.js +45 -0
  24. package/.medusa/server/src/subscribers/fulfillment-created-invoice.js +39 -0
  25. package/.medusa/server/src/subscribers/payment-refunded-invoice.js +65 -0
  26. package/.medusa/server/src/types/index.js +3 -0
  27. package/.medusa/server/src/utils/format-locale-amount.js +12 -0
  28. package/.medusa/server/src/workflows/create-credit-invoice.js +37 -0
  29. package/.medusa/server/src/workflows/create-invoice.js +38 -0
  30. package/.medusa/server/src/workflows/generate-invoice-pdf.js +10 -0
  31. package/.medusa/server/src/workflows/steps/create-invoice-step.js +25 -0
  32. package/.medusa/server/src/workflows/steps/generate-invoice-pdf-step.js +61 -0
  33. package/.medusa/server/src/workflows/steps/upload-invoice-pdf-step.js +29 -0
  34. package/README.md +219 -0
  35. package/package.json +86 -0
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ const jsxRuntime = require("react/jsx-runtime");
3
+ const ui = require("@medusajs/ui");
4
+ const adminSdk = require("@medusajs/admin-sdk");
5
+ const Medusa = require("@medusajs/js-sdk");
6
+ const reactQuery = require("@tanstack/react-query");
7
+ const icons = require("@medusajs/icons");
8
+ require("@medusajs/admin-shared");
9
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
10
+ const Medusa__default = /* @__PURE__ */ _interopDefault(Medusa);
11
+ const sdk = new Medusa__default.default({
12
+ baseUrl: "/",
13
+ debug: false,
14
+ auth: {
15
+ type: "session"
16
+ }
17
+ });
18
+ const OrderInvoiceWidget = ({ data: order }) => {
19
+ var _a;
20
+ const {
21
+ data: expandedOrder,
22
+ isLoading,
23
+ isError
24
+ } = reactQuery.useQuery({
25
+ queryFn: () => sdk.admin.order.retrieve(order.id, {
26
+ fields: "+invoices.*"
27
+ }),
28
+ queryKey: [order.id, "order_invoices"]
29
+ });
30
+ const orderWithInvoices = expandedOrder == null ? void 0 : expandedOrder.order;
31
+ const orderHasInvoices = ((_a = orderWithInvoices == null ? void 0 : orderWithInvoices.invoices) == null ? void 0 : _a.length) > 0;
32
+ const invoices = orderWithInvoices == null ? void 0 : orderWithInvoices.invoices;
33
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
34
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Invoices" }) }) }),
35
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-ui-fg-subtle px-6 py-4", children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-muted", children: "Loading..." }) : isError ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-error", children: "Failed to load invoices" }) : orderHasInvoices ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-3", children: invoices == null ? void 0 : invoices.map((invoice) => /* @__PURE__ */ jsxRuntime.jsx(
36
+ "div",
37
+ {
38
+ className: "flex items-center justify-between",
39
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
40
+ "a",
41
+ {
42
+ target: "_blank",
43
+ rel: "noopener noreferrer",
44
+ href: `/admin/orders/${order.id}/invoice/${invoice.id}`,
45
+ className: "font-normal font-sans txt-compact-small text-ui-fg-subtle flex items-center gap-2",
46
+ children: [
47
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownTray, {}),
48
+ invoice.display_id,
49
+ ".pdf"
50
+ ]
51
+ }
52
+ )
53
+ },
54
+ invoice.id
55
+ )) }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-muted", children: "No invoices found" }) })
56
+ ] }) });
57
+ };
58
+ adminSdk.defineWidgetConfig({
59
+ zone: "order.details.side.before"
60
+ });
61
+ const widgetModule = { widgets: [
62
+ {
63
+ Component: OrderInvoiceWidget,
64
+ zone: ["order.details.side.before"]
65
+ }
66
+ ] };
67
+ const routeModule = {
68
+ routes: []
69
+ };
70
+ const menuItemModule = {
71
+ menuItems: []
72
+ };
73
+ const formModule = { customFields: {} };
74
+ const displayModule = {
75
+ displays: {}
76
+ };
77
+ const i18nModule = { resources: {} };
78
+ const plugin = {
79
+ widgetModule,
80
+ routeModule,
81
+ menuItemModule,
82
+ formModule,
83
+ displayModule,
84
+ i18nModule
85
+ };
86
+ module.exports = plugin;
@@ -0,0 +1,85 @@
1
+ import { jsx, Fragment, jsxs } from "react/jsx-runtime";
2
+ import { Container, Heading, Text } from "@medusajs/ui";
3
+ import { defineWidgetConfig } from "@medusajs/admin-sdk";
4
+ import Medusa from "@medusajs/js-sdk";
5
+ import { useQuery } from "@tanstack/react-query";
6
+ import { ArrowDownTray } from "@medusajs/icons";
7
+ import "@medusajs/admin-shared";
8
+ const sdk = new Medusa({
9
+ baseUrl: "/",
10
+ debug: false,
11
+ auth: {
12
+ type: "session"
13
+ }
14
+ });
15
+ const OrderInvoiceWidget = ({ data: order }) => {
16
+ var _a;
17
+ const {
18
+ data: expandedOrder,
19
+ isLoading,
20
+ isError
21
+ } = useQuery({
22
+ queryFn: () => sdk.admin.order.retrieve(order.id, {
23
+ fields: "+invoices.*"
24
+ }),
25
+ queryKey: [order.id, "order_invoices"]
26
+ });
27
+ const orderWithInvoices = expandedOrder == null ? void 0 : expandedOrder.order;
28
+ const orderHasInvoices = ((_a = orderWithInvoices == null ? void 0 : orderWithInvoices.invoices) == null ? void 0 : _a.length) > 0;
29
+ const invoices = orderWithInvoices == null ? void 0 : orderWithInvoices.invoices;
30
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
31
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Heading, { level: "h1", children: "Invoices" }) }) }),
32
+ /* @__PURE__ */ jsx("div", { className: "text-ui-fg-subtle px-6 py-4", children: isLoading ? /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "Loading..." }) : isError ? /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-error", children: "Failed to load invoices" }) : orderHasInvoices ? /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-3", children: invoices == null ? void 0 : invoices.map((invoice) => /* @__PURE__ */ jsx(
33
+ "div",
34
+ {
35
+ className: "flex items-center justify-between",
36
+ children: /* @__PURE__ */ jsxs(
37
+ "a",
38
+ {
39
+ target: "_blank",
40
+ rel: "noopener noreferrer",
41
+ href: `/admin/orders/${order.id}/invoice/${invoice.id}`,
42
+ className: "font-normal font-sans txt-compact-small text-ui-fg-subtle flex items-center gap-2",
43
+ children: [
44
+ /* @__PURE__ */ jsx(ArrowDownTray, {}),
45
+ invoice.display_id,
46
+ ".pdf"
47
+ ]
48
+ }
49
+ )
50
+ },
51
+ invoice.id
52
+ )) }) : /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "No invoices found" }) })
53
+ ] }) });
54
+ };
55
+ defineWidgetConfig({
56
+ zone: "order.details.side.before"
57
+ });
58
+ const widgetModule = { widgets: [
59
+ {
60
+ Component: OrderInvoiceWidget,
61
+ zone: ["order.details.side.before"]
62
+ }
63
+ ] };
64
+ const routeModule = {
65
+ routes: []
66
+ };
67
+ const menuItemModule = {
68
+ menuItems: []
69
+ };
70
+ const formModule = { customFields: {} };
71
+ const displayModule = {
72
+ displays: {}
73
+ };
74
+ const i18nModule = { resources: {} };
75
+ const plugin = {
76
+ widgetModule,
77
+ routeModule,
78
+ menuItemModule,
79
+ formModule,
80
+ displayModule,
81
+ i18nModule
82
+ };
83
+ export {
84
+ plugin as default
85
+ };
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const generate_invoice_pdf_1 = require("../../../../../../workflows/generate-invoice-pdf");
6
+ const invoice_1 = require("../../../../../../modules/invoice");
7
+ const GET = async (req, res) => {
8
+ const { id: orderId, invoice_id: invoiceId } = req.params;
9
+ const invoiceModule = req.scope.resolve(invoice_1.INVOICE_MODULE);
10
+ const invoice = await invoiceModule.retrieveInvoice(invoiceId);
11
+ if (invoice.pdf_url) {
12
+ const fileModuleService = req.scope.resolve(utils_1.Modules.FILE);
13
+ const file = await fileModuleService.retrieveFile(invoice.pdf_url);
14
+ return res.redirect(file.url);
15
+ }
16
+ // Fallback: generate on-demand for invoices created before storage upload was introduced
17
+ const { result } = await (0, generate_invoice_pdf_1.generateInvoicePdfWorkflow)(req.scope).run({
18
+ input: {
19
+ order_id: orderId,
20
+ invoice_id: invoiceId,
21
+ },
22
+ });
23
+ res.contentType("application/pdf");
24
+ res.attachment(result.fileName);
25
+ res.send(Buffer.from(result.data, "base64"));
26
+ };
27
+ exports.GET = GET;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL29yZGVycy9baWRdL2ludm9pY2UvW2ludm9pY2VfaWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUFpRDtBQUNqRCwyRkFBMkY7QUFDM0YsK0RBQWdFO0FBR3pELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO0lBRXZELE1BQU0sYUFBYSxHQUF5QixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyx3QkFBYyxDQUFDLENBQUE7SUFDN0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRTlELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3pELE1BQU0sSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNsRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFFRCx5RkFBeUY7SUFDekYsTUFBTSxFQUFDLE1BQU0sRUFBQyxHQUFHLE1BQU0sSUFBQSxpREFBMEIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQy9ELEtBQUssRUFBRTtZQUNMLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFVBQVUsRUFBRSxTQUFTO1NBQ3RCO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsR0FBRyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQ2xDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQy9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDOUMsQ0FBQyxDQUFBO0FBMUJZLFFBQUEsR0FBRyxPQTBCZiJ9
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const http_1 = require("@medusajs/framework/http");
4
+ const medusa_1 = require("@medusajs/medusa");
5
+ exports.default = (0, http_1.defineMiddlewares)({
6
+ routes: [
7
+ {
8
+ matcher: "/store/orders/:id/invoice",
9
+ middlewares: [(0, medusa_1.authenticate)("customer", ["session", "bearer"])],
10
+ },
11
+ ],
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBQTBEO0FBQzFELDZDQUE2QztBQUU3QyxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLDJCQUEyQjtZQUNwQyxXQUFXLEVBQUUsQ0FBQyxJQUFBLHFCQUFZLEVBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDL0Q7S0FDRjtDQUNGLENBQUMsQ0FBQSJ9
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const generate_invoice_pdf_1 = require("../../../../../workflows/generate-invoice-pdf");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const GET = async (req, res) => {
7
+ const { id } = req.params;
8
+ const customerId = req.auth_context.actor_id;
9
+ const orderModuleService = req.scope.resolve(utils_1.Modules.ORDER);
10
+ const order = await orderModuleService.retrieveOrder(id, { select: ["id", "customer_id"] });
11
+ if (!order.customer_id || order.customer_id !== customerId) {
12
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Unauthorized");
13
+ }
14
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
15
+ const { data: [orderData] } = await query.graph({
16
+ entity: "order",
17
+ fields: ["invoices.*"],
18
+ filters: { id },
19
+ });
20
+ const debitInvoice = orderData?.invoices?.find((inv) => inv.type === "debit");
21
+ if (debitInvoice?.pdf_url) {
22
+ const fileModuleService = req.scope.resolve(utils_1.Modules.FILE);
23
+ const file = await fileModuleService.retrieveFile(debitInvoice.pdf_url);
24
+ return res.redirect(file.url);
25
+ }
26
+ // Fallback: generate on-demand for invoices created before storage upload was introduced
27
+ const { result } = await (0, generate_invoice_pdf_1.generateInvoicePdfWorkflow)(req.scope).run({
28
+ input: {
29
+ order_id: id,
30
+ },
31
+ });
32
+ res.contentType("application/pdf");
33
+ res.attachment(result.fileName);
34
+ res.send(Buffer.from(result.data, "base64"));
35
+ };
36
+ exports.GET = GET;
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL29yZGVycy9baWRdL2ludm9pY2Uvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esd0ZBQXdGO0FBQ3hGLHFEQUF5RjtBQUVsRixNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBK0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDaEYsTUFBTSxFQUFDLEVBQUUsRUFBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7SUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUE7SUFFNUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDM0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFDLENBQUMsQ0FBQTtJQUV6RixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDaEUsTUFBTSxFQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzVDLE1BQU0sRUFBRSxPQUFPO1FBQ2YsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDO1FBQ3RCLE9BQU8sRUFBRSxFQUFDLEVBQUUsRUFBQztLQUNkLENBQUMsQ0FBQTtJQUVGLE1BQU0sWUFBWSxHQUFHLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBbUIsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLENBRS9FLENBQUE7SUFFYixJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMxQixNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN6RCxNQUFNLElBQUksR0FBRyxNQUFNLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdkUsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBRUQseUZBQXlGO0lBQ3pGLE1BQU0sRUFBQyxNQUFNLEVBQUMsR0FBRyxNQUFNLElBQUEsaURBQTBCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUMvRCxLQUFLLEVBQUU7WUFDTCxRQUFRLEVBQUUsRUFBRTtTQUNiO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsR0FBRyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQ2xDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQy9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDOUMsQ0FBQyxDQUFBO0FBdENZLFFBQUEsR0FBRyxPQXNDZiJ9
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const pdfmake_1 = __importDefault(require("pdfmake"));
7
+ const packing_slip_content_1 = __importDefault(require("./templates/packing-slip-content"));
8
+ const base_1 = __importDefault(require("./templates/base"));
9
+ const invoice_content_1 = __importDefault(require("./templates/invoice-content"));
10
+ const credit_invoice_content_1 = __importDefault(require("./templates/credit-invoice-content"));
11
+ pdfmake_1.default.addFonts({
12
+ Helvetica: {
13
+ normal: "Helvetica",
14
+ bold: "Helvetica-Bold",
15
+ italics: "Helvetica-Oblique",
16
+ bolditalics: "Helvetica-BoldOblique",
17
+ },
18
+ });
19
+ class PdfGenerator {
20
+ constructor() {
21
+ this.createPackingSlip = async (order, options) => {
22
+ const content = await (0, packing_slip_content_1.default)(order, options);
23
+ return pdfmake_1.default.createPdf((0, base_1.default)(content, options)).getBase64();
24
+ };
25
+ this.createInvoice = async (order, options) => {
26
+ const content = await (0, invoice_content_1.default)(order, options);
27
+ return pdfmake_1.default.createPdf((0, base_1.default)(content, options)).getBase64();
28
+ };
29
+ this.createCreditInvoice = async (order, invoice, options) => {
30
+ const content = await (0, credit_invoice_content_1.default)(order, invoice, options);
31
+ return pdfmake_1.default.createPdf((0, base_1.default)(content, options)).getBase64();
32
+ };
33
+ }
34
+ }
35
+ exports.default = PdfGenerator;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29yZS9jbGFzc2VzL3BkZi1nZW5lcmF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzREFBNkI7QUFDN0IsNEZBQWlFO0FBQ2pFLDREQUFtQztBQUVuQyxrRkFBd0Q7QUFHeEQsZ0dBQXFFO0FBRXJFLGlCQUFPLENBQUMsUUFBUSxDQUFDO0lBQ2YsU0FBUyxFQUFFO1FBQ1QsTUFBTSxFQUFFLFdBQVc7UUFDbkIsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixPQUFPLEVBQUUsbUJBQW1CO1FBQzVCLFdBQVcsRUFBRSx1QkFBdUI7S0FDckM7Q0FDRixDQUFDLENBQUE7QUFNRixNQUFxQixZQUFZO0lBQWpDO1FBRUUsc0JBQWlCLEdBQUcsS0FBSyxFQUN2QixLQUFlLEVBQ2YsT0FBc0IsRUFDTCxFQUFFO1lBQ25CLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSw4QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDeEQsT0FBTyxpQkFBTyxDQUFDLFNBQVMsQ0FBQyxJQUFBLGNBQUksRUFBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUM5RCxDQUFDLENBQUE7UUFFRCxrQkFBYSxHQUFHLEtBQUssRUFDbkIsS0FBd0IsRUFDeEIsT0FBc0IsRUFDTCxFQUFFO1lBQ25CLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSx5QkFBYyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNwRCxPQUFPLGlCQUFPLENBQUMsU0FBUyxDQUFDLElBQUEsY0FBSSxFQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQzlELENBQUMsQ0FBQTtRQUVELHdCQUFtQixHQUFHLEtBQUssRUFDekIsS0FBd0IsRUFDeEIsT0FBbUIsRUFDbkIsT0FBc0IsRUFDTCxFQUFFO1lBQ25CLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSxnQ0FBb0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ25FLE9BQU8saUJBQU8sQ0FBQyxTQUFTLENBQUMsSUFBQSxjQUFJLEVBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDOUQsQ0FBQyxDQUFBO0lBQ0gsQ0FBQztDQUFBO0FBMUJELCtCQTBCQyJ9
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const base = (content, options) => ({
4
+ pageMargins: [40, 60, 40, 54],
5
+ content,
6
+ header: options.header,
7
+ footer: options.footer,
8
+ styles: {
9
+ tableHeader: {
10
+ margin: [0, 7, 0, 5],
11
+ color: options.colors?.text ?? "#fff",
12
+ fillColor: options.colors?.background ?? "#000",
13
+ },
14
+ lineItemStyle: {
15
+ margin: [0, 7, 0, 5],
16
+ },
17
+ priceStyle: {},
18
+ fromPriceStyle: {
19
+ decoration: "lineThrough",
20
+ margin: [0, 0, 0, 0],
21
+ },
22
+ },
23
+ defaultStyle: {
24
+ font: "Helvetica",
25
+ lineHeight: 1.25,
26
+ columnGap: 20,
27
+ fontSize: 10,
28
+ color: "#000",
29
+ },
30
+ });
31
+ exports.default = base;
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb3JlL2NsYXNzZXMvcGRmLWdlbmVyYXRvci90ZW1wbGF0ZXMvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLE1BQU0sSUFBSSxHQUFHLENBQ1gsT0FBNEIsRUFDNUIsT0FBc0IsRUFDQSxFQUFFLENBQUMsQ0FBQztJQUMxQixXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDN0IsT0FBTztJQUNQLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtJQUN0QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDdEIsTUFBTSxFQUFFO1FBQ04sV0FBVyxFQUFFO1lBQ1gsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxNQUFNO1lBQ3JDLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLFVBQVUsSUFBSSxNQUFNO1NBQ2hEO1FBQ0QsYUFBYSxFQUFFO1lBQ2IsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsVUFBVSxFQUFFLEVBQUU7UUFDZCxjQUFjLEVBQUU7WUFDZCxVQUFVLEVBQUUsYUFBYTtZQUN6QixNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDckI7S0FDRjtJQUNELFlBQVksRUFBRTtRQUNaLElBQUksRUFBRSxXQUFXO1FBQ2pCLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFNBQVMsRUFBRSxFQUFFO1FBQ2IsUUFBUSxFQUFFLEVBQUU7UUFDWixLQUFLLEVBQUUsTUFBTTtLQUNkO0NBQ0YsQ0FBQyxDQUFBO0FBRUYsa0JBQWUsSUFBSSxDQUFBIn0=
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const i18n_1 = require("../../../../i18n");
7
+ const format_locale_amount_1 = __importDefault(require("../../../../utils/format-locale-amount"));
8
+ const date_fns_1 = require("date-fns");
9
+ const invoiceContent = async (order, invoice, options) => {
10
+ const locale = (0, i18n_1.resolveLocale)(order.metadata?.locale, options.defaultLocale);
11
+ const t = (0, i18n_1.getI18nMessages)(locale);
12
+ const fmt = (amount) => (0, format_locale_amount_1.default)(amount, order.currency_code, locale);
13
+ if (!order.billing_address || !order.shipping_address) {
14
+ throw new Error("Billing and or shipping address is missing");
15
+ }
16
+ const formatExclVat = order?.items?.some((i) => i.is_tax_inclusive === false);
17
+ const refund = order.payment_collections
18
+ ?.flatMap((pc) => pc.payments ?? [])
19
+ .flatMap((payment) => payment.refunds ?? [])
20
+ .find((r) => r.id === invoice.resource_id);
21
+ if (!refund) {
22
+ throw new Error("Refund is missing");
23
+ }
24
+ if (!invoice.parent_invoice) {
25
+ throw new Error("Parent invoice is missing");
26
+ }
27
+ const taxRate = order.items?.[0]?.tax_lines?.[0]?.rate ?? 0;
28
+ const refundTaxAmount = (Number(refund.amount) / (100 + taxRate)) * taxRate;
29
+ return [
30
+ {
31
+ columns: [
32
+ {
33
+ stack: [
34
+ {
35
+ text: t.invoice.creditInvoice,
36
+ width: "*",
37
+ fontSize: 28,
38
+ bold: true,
39
+ margin: [0, 0, 0, 15],
40
+ },
41
+ {
42
+ text: t.invoice.invoiceNumber,
43
+ color: "#aaaaab",
44
+ width: "*",
45
+ fontSize: 11,
46
+ margin: [0, 10, 0, 2],
47
+ },
48
+ {
49
+ text: `#${invoice.display_id.toString().padStart(5, "0")}`,
50
+ fontSize: 11,
51
+ width: 110,
52
+ },
53
+ {
54
+ columns: [
55
+ {
56
+ stack: [
57
+ {
58
+ text: t.invoice.date,
59
+ color: "#aaaaab",
60
+ width: "*",
61
+ fontSize: 11,
62
+ margin: [0, 10, 0, 2],
63
+ },
64
+ {
65
+ text: (0, date_fns_1.formatDate)(invoice.created_at, "dd-MM-yyyy"),
66
+ width: 110,
67
+ },
68
+ ],
69
+ },
70
+ ],
71
+ },
72
+ ],
73
+ },
74
+ {
75
+ stack: [
76
+ {
77
+ key: t.invoice.address,
78
+ value: options.addressInfo.companyName,
79
+ valueProps: {
80
+ bold: true,
81
+ },
82
+ },
83
+ {
84
+ key: "",
85
+ value: options.addressInfo.address(t.countries),
86
+ },
87
+ {
88
+ key: t.invoice.coc,
89
+ value: options.addressInfo.cocNumber,
90
+ },
91
+ {
92
+ key: t.invoice.vatNr,
93
+ value: options.addressInfo.vatNumber,
94
+ },
95
+ ...(formatExclVat
96
+ ? [
97
+ {
98
+ key: t.invoice.iban,
99
+ value: options.addressInfo.iban,
100
+ },
101
+ ]
102
+ : []),
103
+ {
104
+ key: t.invoice.email,
105
+ value: options.addressInfo.email,
106
+ },
107
+ ].map(({ key, value, valueProps }) => ({
108
+ columns: [
109
+ {
110
+ text: key,
111
+ color: "#aaaaab",
112
+ width: "*",
113
+ fontSize: 10,
114
+ alignment: "right",
115
+ },
116
+ {
117
+ text: value,
118
+ fontSize: 10,
119
+ width: 135,
120
+ ...valueProps,
121
+ },
122
+ ],
123
+ })),
124
+ },
125
+ ],
126
+ },
127
+ {
128
+ columns: [
129
+ {
130
+ text: t.invoice.billingAddress,
131
+ color: "#aaaaab",
132
+ fontSize: 11,
133
+ margin: [0, 10, 0, 2],
134
+ },
135
+ {
136
+ text: t.invoice.deliveryAddress,
137
+ color: "#aaaaab",
138
+ fontSize: 11,
139
+ margin: [0, 10, 0, 2],
140
+ },
141
+ ],
142
+ },
143
+ {
144
+ columns: [
145
+ {
146
+ text: `${order.billing_address.company ? `${order.billing_address.company} \n` : ""}${order.billing_address.first_name} ${order.billing_address.last_name} \n ${order.billing_address.address_1} ${!order.billing_address.address_2 ? "" : order.billing_address.address_2} \n ${order.billing_address.postal_code} ${order.billing_address.city} \n ${t.countries[order.billing_address.country_code] ?? order.billing_address.country_code}
147
+ \n\n E: ${order.email} \n T: ${order.shipping_address.phone} ${order.metadata?.po_number ? `\n PO-nummer: ${order.metadata.po_number}` : ""}`,
148
+ },
149
+ {
150
+ text: `${order.shipping_address.company ? `${order.shipping_address.company} \n` : ""}${order.shipping_address.first_name} ${order.shipping_address.last_name} \n ${order.shipping_address.address_1} ${!order.shipping_address.address_2 ? "" : order.shipping_address.address_2} \n ${order.shipping_address.postal_code} ${order.shipping_address.city} \n ${t.countries[order.shipping_address.country_code] ?? order.shipping_address.country_code}`,
151
+ },
152
+ ],
153
+ },
154
+ "\n\n",
155
+ {
156
+ layout: {
157
+ defaultBorder: false,
158
+ hLineWidth: () => 1,
159
+ vLineWidth: () => 0,
160
+ hLineColor: () => "#aaa",
161
+ paddingLeft: () => 5,
162
+ paddingRight: () => 5,
163
+ paddingTop: () => 0,
164
+ paddingBottom: () => 0,
165
+ },
166
+ table: {
167
+ headerRows: 1,
168
+ widths: ["*", "auto"],
169
+ body: [
170
+ [
171
+ {
172
+ text: t.invoice.description,
173
+ style: "tableHeader",
174
+ },
175
+ {
176
+ text: t.invoice.total,
177
+ style: "tableHeader",
178
+ alignment: "right",
179
+ },
180
+ ],
181
+ [
182
+ {
183
+ text: [
184
+ {
185
+ text: `${t.invoice.creditInvoiceDescription} #${invoice.parent_invoice.display_id.toString().padStart(5, "0")}`,
186
+ },
187
+ ...(refund.note ? [{ text: `\n- ${refund.note}` }] : []),
188
+ ],
189
+ style: "lineItemStyle",
190
+ border: [false, false, false, true],
191
+ },
192
+ {
193
+ stack: [
194
+ {
195
+ text: fmt(formatExclVat
196
+ ? -(Number(refund.amount) - refundTaxAmount)
197
+ : -Number(refund.amount)),
198
+ style: "priceStyle",
199
+ alignment: "right",
200
+ },
201
+ ],
202
+ style: "lineItemStyle",
203
+ border: [false, false, false, true],
204
+ },
205
+ ],
206
+ ],
207
+ },
208
+ },
209
+ {
210
+ layout: {
211
+ defaultBorder: false,
212
+ hLineWidth: () => 1,
213
+ vLineWidth: () => 0,
214
+ hLineColor: () => "#aaa",
215
+ paddingLeft: () => 5,
216
+ paddingRight: () => 5,
217
+ paddingTop: () => 0,
218
+ paddingBottom: () => 0,
219
+ },
220
+ table: {
221
+ headerRows: 1,
222
+ widths: ["*", "auto"],
223
+ body: [
224
+ ...(formatExclVat
225
+ ? [
226
+ [
227
+ {
228
+ text: t.invoice.totalExclVat,
229
+ border: [false, true, false, false],
230
+ margin: [0, 7, 0, 2],
231
+ },
232
+ {
233
+ text: fmt(-(Number(refund.amount) - refundTaxAmount)),
234
+ alignment: "right",
235
+ border: [false, true, false, false],
236
+ margin: [0, 7, 0, 2],
237
+ },
238
+ ],
239
+ [
240
+ {
241
+ text: `${t.invoice.vat} ${taxRate}%`,
242
+ border: false,
243
+ margin: [0, 2, 0, 5],
244
+ },
245
+ {
246
+ text: fmt(-refundTaxAmount),
247
+ alignment: "right",
248
+ border: false,
249
+ margin: [0, 2, 0, 5],
250
+ },
251
+ ],
252
+ [
253
+ {
254
+ text: t.invoice.totalInclVat,
255
+ bold: true,
256
+ fontSize: 12,
257
+ border: false,
258
+ margin: [0, 2, 0, 5],
259
+ },
260
+ {
261
+ text: fmt(-Number(refund.amount)),
262
+ bold: true,
263
+ fontSize: 12,
264
+ alignment: "right",
265
+ border: false,
266
+ margin: [0, 2, 0, 5],
267
+ },
268
+ ],
269
+ ]
270
+ : [
271
+ [
272
+ {
273
+ text: t.invoice.totalInclVat,
274
+ bold: true,
275
+ fontSize: 12,
276
+ border: [false, true, false, false],
277
+ margin: [0, 7, 0, 2],
278
+ },
279
+ {
280
+ text: fmt(-Number(refund.amount)),
281
+ bold: true,
282
+ fontSize: 12,
283
+ alignment: "right",
284
+ border: [false, true, false, false],
285
+ margin: [0, 7, 0, 2],
286
+ },
287
+ ],
288
+ [
289
+ {
290
+ text: `${t.invoice.vat} ${taxRate}%`,
291
+ border: false,
292
+ margin: [0, 2, 0, 5],
293
+ },
294
+ {
295
+ text: fmt(-refundTaxAmount),
296
+ alignment: "right",
297
+ border: false,
298
+ margin: [0, 2, 0, 5],
299
+ },
300
+ ],
301
+ ]),
302
+ ],
303
+ },
304
+ },
305
+ ];
306
+ };
307
+ exports.default = invoiceContent;
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGl0LWludm9pY2UtY29udGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb3JlL2NsYXNzZXMvcGRmLWdlbmVyYXRvci90ZW1wbGF0ZXMvY3JlZGl0LWludm9pY2UtY29udGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDJDQUErRDtBQUMvRCxrR0FBdUU7QUFFdkUsdUNBQW1DO0FBSW5DLE1BQU0sY0FBYyxHQUFHLEtBQUssRUFDMUIsS0FBd0IsRUFDeEIsT0FBbUIsRUFDbkIsT0FBc0IsRUFDSixFQUFFO0lBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUEsb0JBQWEsRUFBQyxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDM0UsTUFBTSxDQUFDLEdBQUcsSUFBQSxzQkFBZSxFQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FDN0IsSUFBQSw4QkFBa0IsRUFBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUV6RCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUksS0FBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQy9DLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEtBQUssS0FBSyxDQUNwQyxDQUFBO0lBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLG1CQUFtQjtRQUN0QyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFF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