@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,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = validationLoader;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const service_1 = require("../service");
6
+ async function validationLoader({ container, options, }) {
7
+ const result = service_1.moduleOptionsSchema.safeParse(options);
8
+ if (!result.success) {
9
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invoice Module. Invalid options: ${JSON.stringify(result.error.flatten().fieldErrors)}`);
10
+ }
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnZvaWNlL2xvYWRlcnMvdmFsaWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxtQ0FZQztBQWZELHFEQUFxRDtBQUNyRCx3Q0FBNkQ7QUFFOUMsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEVBQzdDLFNBQVMsRUFDVCxPQUFPLEdBQ3NCO0lBQzdCLE1BQU0sTUFBTSxHQUFHLDZCQUFtQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVyRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG9DQUFvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FDekYsQ0FBQTtJQUNILENBQUM7QUFDSCxDQUFDIn0=
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260312154721 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260312154721 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "invoice" ("id" text not null, "display_id" serial, "resource_id" text not null, "type" text check ("type" in ('debit', 'credit', 'void')) not null, "pdf_url" text null, "parent_invoice_id" text null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "invoice_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_invoice_parent_invoice_id" ON "invoice" ("parent_invoice_id") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_invoice_deleted_at" ON "invoice" ("deleted_at") WHERE deleted_at IS NULL;`);
10
+ this.addSql(`alter table if exists "invoice" add constraint "invoice_parent_invoice_id_foreign" foreign key ("parent_invoice_id") references "invoice" ("id") on update cascade on delete set null;`);
11
+ }
12
+ async down() {
13
+ this.addSql(`alter table if exists "invoice" drop constraint if exists "invoice_parent_invoice_id_foreign";`);
14
+ this.addSql(`drop table if exists "invoice" cascade;`);
15
+ }
16
+ }
17
+ exports.Migration20260312154721 = Migration20260312154721;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjAzMTIxNTQ3MjEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnZvaWNlL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjAzMTIxNTQ3MjEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLDRhQUE0YSxDQUFDLENBQUM7UUFDMWIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO1FBQ3ZJLElBQUksQ0FBQyxNQUFNLENBQUMsMkdBQTJHLENBQUMsQ0FBQztRQUV6SCxJQUFJLENBQUMsTUFBTSxDQUFDLHdMQUF3TCxDQUFDLENBQUM7SUFDeE0sQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsZ0dBQWdHLENBQUMsQ0FBQztRQUU5RyxJQUFJLENBQUMsTUFBTSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUVGO0FBaEJELDBEQWdCQyJ9
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260403000001 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260403000001 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_invoice_resource_id" ON "invoice" ("resource_id") WHERE deleted_at IS NULL;`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_invoice_type" ON "invoice" ("type") WHERE deleted_at IS NULL;`);
9
+ }
10
+ async down() {
11
+ this.addSql(`DROP INDEX IF EXISTS "IDX_invoice_resource_id";`);
12
+ this.addSql(`DROP INDEX IF EXISTS "IDX_invoice_type";`);
13
+ }
14
+ }
15
+ exports.Migration20260403000001 = Migration20260403000001;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA0MDMwMDAwMDEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnZvaWNlL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjA0MDMwMDAwMDEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUNULDZHQUE2RyxDQUM5RyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FDVCwrRkFBK0YsQ0FDaEcsQ0FBQztJQUNKLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FDRjtBQWRELDBEQWNDIn0=
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const Invoice = utils_1.model.define("invoice", {
5
+ id: utils_1.model.id({ prefix: "inv" }).primaryKey(),
6
+ display_id: utils_1.model.autoincrement().searchable(),
7
+ resource_id: utils_1.model.text(),
8
+ type: utils_1.model.enum(["debit", "credit", "void"]),
9
+ pdf_url: utils_1.model.text().nullable(),
10
+ parent_invoice: utils_1.model.belongsTo(() => Invoice).nullable(),
11
+ metadata: utils_1.model.json().nullable(),
12
+ });
13
+ exports.default = Invoice;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2ljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2ludm9pY2UvbW9kZWxzL2ludm9pY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBK0M7QUFFL0MsTUFBTSxPQUFPLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7SUFDdEMsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUU7SUFDMUMsVUFBVSxFQUFFLGFBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDOUMsV0FBVyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDekIsSUFBSSxFQUFFLGFBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLE9BQU8sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2hDLGNBQWMsRUFBRSxhQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUN6RCxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNsQyxDQUFDLENBQUE7QUFFRixrQkFBZSxPQUFPLENBQUEifQ==
@@ -0,0 +1,45 @@
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
+ exports.moduleOptionsSchema = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const invoice_1 = __importDefault(require("./models/invoice"));
9
+ const zod_1 = require("@medusajs/framework/zod");
10
+ const i18n_1 = require("../../i18n");
11
+ exports.moduleOptionsSchema = zod_1.z.object({
12
+ defaultLocale: zod_1.z.enum(i18n_1.SUPPORTED_LOCALES).optional(),
13
+ addressInfo: zod_1.z.object({
14
+ companyLogo: zod_1.z.string().optional(),
15
+ companyLogoWidth: zod_1.z.number().optional(),
16
+ companyName: zod_1.z.string(),
17
+ address: zod_1.z
18
+ .function()
19
+ .args(zod_1.z.record(zod_1.z.string(), zod_1.z.string()))
20
+ .returns(zod_1.z.string()),
21
+ cocNumber: zod_1.z.string(),
22
+ vatNumber: zod_1.z.string(),
23
+ iban: zod_1.z.string(),
24
+ email: zod_1.z.string(),
25
+ }),
26
+ colors: zod_1.z
27
+ .object({
28
+ background: zod_1.z.string().optional(),
29
+ text: zod_1.z.string().optional(),
30
+ })
31
+ .optional(),
32
+ header: zod_1.z.custom().optional(),
33
+ footer: zod_1.z.custom().optional(),
34
+ });
35
+ class Service extends (0, utils_1.MedusaService)({ Invoice: invoice_1.default }) {
36
+ constructor(container, options) {
37
+ super(container, options);
38
+ this.options_ = options;
39
+ }
40
+ getOptions() {
41
+ return this.options_;
42
+ }
43
+ }
44
+ exports.default = Service;
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2ludm9pY2Uvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBdUQ7QUFDdkQsK0RBQXNDO0FBQ3RDLGlEQUF5QztBQUV6QyxxQ0FBNEM7QUFFL0IsUUFBQSxtQkFBbUIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFDLGFBQWEsRUFBRSxPQUFDLENBQUMsSUFBSSxDQUFDLHdCQUFpQixDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ25ELFdBQVcsRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3BCLFdBQVcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO1FBQ2xDLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDdkMsV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDdkIsT0FBTyxFQUFFLE9BQUM7YUFDUCxRQUFRLEVBQUU7YUFDVixJQUFJLENBQUMsT0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDdEMsT0FBTyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0QixTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNyQixTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNyQixJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNoQixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtLQUNsQixDQUFDO0lBQ0YsTUFBTSxFQUFFLE9BQUM7U0FDTixNQUFNLENBQUM7UUFDTixVQUFVLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUNqQyxJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtLQUM1QixDQUFDO1NBQ0QsUUFBUSxFQUFFO0lBQ2IsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQVcsQ0FBQyxRQUFRLEVBQUU7SUFDdEMsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQVcsQ0FBQyxRQUFRLEVBQUU7Q0FDdkMsQ0FBQyxDQUFBO0FBSUYsTUFBTSxPQUFRLFNBQVEsSUFBQSxxQkFBYSxFQUFDLEVBQUMsT0FBTyxFQUFQLGlCQUFPLEVBQUMsQ0FBQztJQUc1QyxZQUFZLFNBQVMsRUFBRSxPQUFzQjtRQUMzQyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFBO0lBQ3pCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFBO0lBQ3RCLENBQUM7Q0FDRjtBQUVELGtCQUFlLE9BQU8sQ0FBQSJ9
@@ -0,0 +1,39 @@
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
+ exports.config = void 0;
7
+ exports.default = fulfillmentCreatedInvoiceHandler;
8
+ const utils_1 = require("@medusajs/framework/utils");
9
+ const invoice_order_1 = __importDefault(require("../links/invoice-order"));
10
+ const create_invoice_1 = require("../workflows/create-invoice");
11
+ async function fulfillmentCreatedInvoiceHandler({ event: { data }, container, }) {
12
+ const logger = container.resolve("logger");
13
+ const { order_id } = data;
14
+ try {
15
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
16
+ // Guard: only create one invoice per order — subsequent fulfillments (e.g.
17
+ // partial shipments) must not generate a second invoice number.
18
+ const { data: existing } = await query.graph({
19
+ entity: invoice_order_1.default.entryPoint,
20
+ fields: ["invoice_id"],
21
+ filters: { order_id },
22
+ });
23
+ if (existing.length > 0) {
24
+ logger.info(`[invoice] Invoice already exists for order ${order_id}, skipping`);
25
+ return;
26
+ }
27
+ await (0, create_invoice_1.createInvoiceWorkflow)(container).run({
28
+ input: { order_id },
29
+ });
30
+ logger.info(`[invoice] Created invoice for order ${order_id}`);
31
+ }
32
+ catch (error) {
33
+ logger.error(`[invoice] Failed to create invoice for order ${order_id}: ${error.message}`);
34
+ }
35
+ }
36
+ exports.config = {
37
+ event: "order.fulfillment_created",
38
+ };
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsZmlsbG1lbnQtY3JlYXRlZC1pbnZvaWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2Z1bGZpbGxtZW50LWNyZWF0ZWQtaW52b2ljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFXQSxtREFtQ0M7QUE3Q0QscURBQW1FO0FBQ25FLDJFQUFxRDtBQUNyRCxnRUFBaUU7QUFRbEQsS0FBSyxVQUFVLGdDQUFnQyxDQUFDLEVBQzdELEtBQUssRUFBRSxFQUFDLElBQUksRUFBQyxFQUNiLFNBQVMsR0FDOEI7SUFDdkMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMxQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFBO0lBRXZCLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFaEUsMkVBQTJFO1FBQzNFLGdFQUFnRTtRQUNoRSxNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6QyxNQUFNLEVBQUUsdUJBQWdCLENBQUMsVUFBVTtZQUNuQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDdEIsT0FBTyxFQUFFLEVBQUMsUUFBUSxFQUFDO1NBQ3BCLENBQUMsQ0FBQTtRQUVGLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLENBQUMsSUFBSSxDQUNULDhDQUE4QyxRQUFRLFlBQVksQ0FDbkUsQ0FBQTtZQUNELE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxJQUFBLHNDQUFxQixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN6QyxLQUFLLEVBQUUsRUFBQyxRQUFRLEVBQUM7U0FDbEIsQ0FBQyxDQUFBO1FBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQ1YsZ0RBQWdELFFBQVEsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQzdFLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsMkJBQTJCO0NBQ25DLENBQUEifQ==
@@ -0,0 +1,65 @@
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
+ exports.config = void 0;
7
+ exports.default = paymentRefundedInvoiceHandler;
8
+ const utils_1 = require("@medusajs/framework/utils");
9
+ const invoice_order_1 = __importDefault(require("../links/invoice-order"));
10
+ const create_credit_invoice_1 = require("../workflows/create-credit-invoice");
11
+ async function paymentRefundedInvoiceHandler({ event: { data }, container, }) {
12
+ const logger = container.resolve("logger");
13
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
14
+ try {
15
+ // Traverse payment → payment_collection → order
16
+ const { data: [payment], } = await query.graph({
17
+ entity: "payment",
18
+ fields: ["payment_collection.order.id", "refunds.*"],
19
+ filters: { id: data.id },
20
+ });
21
+ const orderId = payment?.payment_collection?.order?.id;
22
+ if (!orderId) {
23
+ logger.info(`[invoice] No order found for payment ${data.id}, skipping`);
24
+ return;
25
+ }
26
+ // Only refund credit lines warrant a credit invoice.
27
+ const refunds = payment?.refunds ?? [];
28
+ const { data: links } = await query.graph({
29
+ entity: invoice_order_1.default.entryPoint,
30
+ fields: [
31
+ "invoice_id",
32
+ "created_at",
33
+ "invoice.resource_id",
34
+ "invoice.type",
35
+ ],
36
+ filters: { order_id: orderId },
37
+ });
38
+ const parentInvoice = links.find((l) => l.invoice?.type === "debit");
39
+ // A credit invoice is only created after the debit invoice has been created.
40
+ if (!parentInvoice) {
41
+ return;
42
+ }
43
+ for (const refund of refunds) {
44
+ const alreadyExists = links.some((l) => l.invoice?.resource_id === refund.id);
45
+ // Create a credit invoice for each credit line that hasn't been invoiced yet.
46
+ if (!alreadyExists) {
47
+ await (0, create_credit_invoice_1.createCreditInvoiceWorkflow)(container).run({
48
+ input: {
49
+ order_id: orderId,
50
+ parent_invoice_id: parentInvoice.invoice_id,
51
+ resource_id: refund.id,
52
+ },
53
+ });
54
+ logger.info(`[invoice] Created credit invoice(s) for order ${orderId} - ${refund.id}`);
55
+ }
56
+ }
57
+ }
58
+ catch (error) {
59
+ logger.error(`[invoice] Failed to create credit invoice for payment ${data.id}: ${error.message}`);
60
+ }
61
+ }
62
+ exports.config = {
63
+ event: utils_1.PaymentEvents.REFUNDED,
64
+ };
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1yZWZ1bmRlZC1pbnZvaWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL3BheW1lbnQtcmVmdW5kZWQtaW52b2ljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFlQSxnREF3RUM7QUF0RkQscURBR2tDO0FBQ2xDLDJFQUFxRDtBQUNyRCw4RUFBOEU7QUFTL0QsS0FBSyxVQUFVLDZCQUE2QixDQUFDLEVBQzFELEtBQUssRUFBRSxFQUFDLElBQUksRUFBQyxFQUNiLFNBQVMsR0FDb0I7SUFDN0IsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMxQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWhFLElBQUksQ0FBQztRQUNILGdEQUFnRDtRQUNoRCxNQUFNLEVBQ0osSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQ2hCLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxDQUFDLDZCQUE2QixFQUFFLFdBQVcsQ0FBQztZQUNwRCxPQUFPLEVBQUUsRUFBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQztTQUN2QixDQUFDLENBQUE7UUFFRixNQUFNLE9BQU8sR0FBdUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUE7UUFFMUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsSUFBSSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUE7WUFDeEUsT0FBTTtRQUNSLENBQUM7UUFFRCxxREFBcUQ7UUFDckQsTUFBTSxPQUFPLEdBQWdCLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO1FBRW5ELE1BQU0sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3RDLE1BQU0sRUFBRSx1QkFBZ0IsQ0FBQyxVQUFVO1lBQ25DLE1BQU0sRUFBRTtnQkFDTixZQUFZO2dCQUNaLFlBQVk7Z0JBQ1oscUJBQXFCO2dCQUNyQixjQUFjO2FBQ2Y7WUFDRCxPQUFPLEVBQUUsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDO1NBQzdCLENBQUMsQ0FBQTtRQUVGLE1BQU0sYUFBYSxHQUE0QixLQUFLLENBQUMsSUFBSSxDQUN2RCxDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssT0FBTyxDQUNoRCxDQUFBO1FBRUQsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixPQUFNO1FBQ1IsQ0FBQztRQUVELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDOUIsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQ3pELENBQUE7WUFFRCw4RUFBOEU7WUFDOUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNuQixNQUFNLElBQUEsbURBQTJCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUMvQyxLQUFLLEVBQUU7d0JBQ0wsUUFBUSxFQUFFLE9BQU87d0JBQ2pCLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxVQUFVO3dCQUMzQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEVBQUU7cUJBQ3ZCO2lCQUNGLENBQUMsQ0FBQTtnQkFFRixNQUFNLENBQUMsSUFBSSxDQUNULGlEQUFpRCxPQUFPLE1BQU0sTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUMxRSxDQUFBO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQ1YseURBQXlELElBQUksQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUNyRixDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLHFCQUFhLENBQUMsUUFBUTtDQUM5QixDQUFBIn0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const formatLocaleAmount = (amount, currencyCode, locale = "nl-NL") => {
4
+ const formatter = new Intl.NumberFormat(locale, {
5
+ style: "currency",
6
+ currencyDisplay: "narrowSymbol",
7
+ currency: currencyCode,
8
+ });
9
+ return formatter.format(amount);
10
+ };
11
+ exports.default = formatLocaleAmount;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LWxvY2FsZS1hbW91bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvZm9ybWF0LWxvY2FsZS1hbW91bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLGtCQUFrQixHQUFHLENBQUMsTUFBYyxFQUFFLFlBQW9CLEVBQUUsU0FBaUIsT0FBTyxFQUFFLEVBQUU7SUFDNUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtRQUM5QyxLQUFLLEVBQUUsVUFBVTtRQUNqQixlQUFlLEVBQUUsY0FBYztRQUMvQixRQUFRLEVBQUUsWUFBWTtLQUN2QixDQUFDLENBQUE7SUFFRixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDakMsQ0FBQyxDQUFBO0FBRUQsa0JBQWUsa0JBQWtCLENBQUEifQ==
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCreditInvoiceWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const invoice_1 = require("../modules/invoice");
8
+ const create_invoice_step_1 = require("./steps/create-invoice-step");
9
+ const generate_invoice_pdf_step_1 = require("./steps/generate-invoice-pdf-step");
10
+ const upload_invoice_pdf_step_1 = require("./steps/upload-invoice-pdf-step");
11
+ exports.createCreditInvoiceWorkflow = (0, workflows_sdk_1.createWorkflow)("create-credit-invoice", function (input) {
12
+ const invoice = (0, create_invoice_step_1.createInvoiceStep)({
13
+ type: "credit",
14
+ resource_id: input.resource_id,
15
+ parent_invoice_id: input.parent_invoice_id,
16
+ });
17
+ // Link credit invoice to the return's order via Medusa's link layer.
18
+ const linkData = (0, workflows_sdk_1.transform)({ invoice, input }, ({ invoice, input }) => [
19
+ {
20
+ [invoice_1.INVOICE_MODULE]: { invoice_id: invoice.id },
21
+ [utils_1.Modules.ORDER]: { order_id: input.order_id },
22
+ },
23
+ ]);
24
+ (0, core_flows_1.createRemoteLinkStep)(linkData);
25
+ // Generate PDF after the link is established so query.graph can resolve invoices.*
26
+ const pdf = (0, generate_invoice_pdf_step_1.generateInvoicePdfStep)((0, workflows_sdk_1.transform)({ invoice, input }, ({ invoice, input }) => ({
27
+ order_id: input.order_id,
28
+ invoice_id: invoice.id,
29
+ })));
30
+ (0, upload_invoice_pdf_step_1.uploadInvoicePdfStep)((0, workflows_sdk_1.transform)({ pdf, invoice }, ({ pdf, invoice }) => ({
31
+ invoice_id: invoice.id,
32
+ file_name: pdf.fileName,
33
+ data: pdf.data,
34
+ })));
35
+ return new workflows_sdk_1.WorkflowResponse({ invoice });
36
+ });
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWNyZWRpdC1pbnZvaWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jcmVhdGUtY3JlZGl0LWludm9pY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSTBDO0FBQzFDLDREQUFnRTtBQUNoRSxxREFBaUQ7QUFDakQsZ0RBQWlEO0FBQ2pELHFFQUE2RDtBQUM3RCxpRkFBd0U7QUFDeEUsNkVBQW9FO0FBVXZELFFBQUEsMkJBQTJCLEdBQUcsSUFBQSw4QkFBYyxFQUN2RCx1QkFBdUIsRUFDdkIsVUFBVSxLQUF1QztJQUMvQyxNQUFNLE9BQU8sR0FBRyxJQUFBLHVDQUFpQixFQUFDO1FBQ2hDLElBQUksRUFBRSxRQUFRO1FBQ2QsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1FBQzlCLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUI7S0FDM0MsQ0FBQyxDQUFBO0lBRUYscUVBQXFFO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLElBQUEseUJBQVMsRUFBQyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxFQUFFLEVBQUUsQ0FBQztRQUNqRTtZQUNFLENBQUMsd0JBQWMsQ0FBQyxFQUFFLEVBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUM7WUFDMUMsQ0FBQyxlQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBQztTQUM1QztLQUNGLENBQUMsQ0FBQTtJQUVGLElBQUEsaUNBQW9CLEVBQUMsUUFBUSxDQUFDLENBQUE7SUFFOUIsbUZBQW1GO0lBQ25GLE1BQU0sR0FBRyxHQUFHLElBQUEsa0RBQXNCLEVBQ2hDLElBQUEseUJBQVMsRUFBQyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtRQUN4QixVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7S0FDdkIsQ0FBQyxDQUFDLENBQ0osQ0FBQTtJQUVELElBQUEsOENBQW9CLEVBQ2xCLElBQUEseUJBQVMsRUFBQyxFQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRTtRQUN0QixTQUFTLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDdkIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO0tBQ2YsQ0FBQyxDQUFDLENBQ0osQ0FBQTtJQUVELE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUE7QUFDeEMsQ0FBQyxDQUNGLENBQUEifQ==
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createInvoiceWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const invoice_1 = require("../modules/invoice");
8
+ const create_invoice_step_1 = require("./steps/create-invoice-step");
9
+ const generate_invoice_pdf_step_1 = require("./steps/generate-invoice-pdf-step");
10
+ const upload_invoice_pdf_step_1 = require("./steps/upload-invoice-pdf-step");
11
+ exports.createInvoiceWorkflow = (0, workflows_sdk_1.createWorkflow)("create-invoice", function (input) {
12
+ const invoice = (0, create_invoice_step_1.createInvoiceStep)({
13
+ type: "debit",
14
+ resource_id: input.order_id,
15
+ });
16
+ // Link invoice to order via Medusa's link layer — never as a FK column on the model.
17
+ // Link order matches defineLink(InvoiceModule.linkable.invoice, OrderModule.linkable.order):
18
+ // invoice side first, then order side.
19
+ const linkData = (0, workflows_sdk_1.transform)({ invoice, input }, ({ invoice, input }) => [
20
+ {
21
+ [invoice_1.INVOICE_MODULE]: { invoice_id: invoice.id },
22
+ [utils_1.Modules.ORDER]: { order_id: input.order_id },
23
+ },
24
+ ]);
25
+ (0, core_flows_1.createRemoteLinkStep)(linkData);
26
+ // Generate PDF after the link is established so query.graph can resolve invoices.*
27
+ const pdf = (0, generate_invoice_pdf_step_1.generateInvoicePdfStep)((0, workflows_sdk_1.transform)({ invoice, input }, ({ invoice, input }) => ({
28
+ order_id: input.order_id,
29
+ invoice_id: invoice.id,
30
+ })));
31
+ (0, upload_invoice_pdf_step_1.uploadInvoicePdfStep)((0, workflows_sdk_1.transform)({ pdf, invoice }, ({ pdf, invoice }) => ({
32
+ invoice_id: invoice.id,
33
+ file_name: pdf.fileName,
34
+ data: pdf.data,
35
+ })));
36
+ return new workflows_sdk_1.WorkflowResponse({ invoice });
37
+ });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWludm9pY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2NyZWF0ZS1pbnZvaWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUkwQztBQUMxQyw0REFBZ0U7QUFDaEUscURBQWlEO0FBQ2pELGdEQUFpRDtBQUNqRCxxRUFBNkQ7QUFDN0QsaUZBQXdFO0FBQ3hFLDZFQUFvRTtBQU12RCxRQUFBLHFCQUFxQixHQUFHLElBQUEsOEJBQWMsRUFDakQsZ0JBQWdCLEVBQ2hCLFVBQVUsS0FBaUM7SUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBQSx1Q0FBaUIsRUFBQztRQUNoQyxJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBUTtLQUM1QixDQUFDLENBQUE7SUFFRixxRkFBcUY7SUFDckYsNkZBQTZGO0lBQzdGLHVDQUF1QztJQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFBLHlCQUFTLEVBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFFLENBQUM7UUFDakU7WUFDRSxDQUFDLHdCQUFjLENBQUMsRUFBRSxFQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFDO1lBQzFDLENBQUMsZUFBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUM7U0FDNUM7S0FDRixDQUFDLENBQUE7SUFFRixJQUFBLGlDQUFvQixFQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTlCLG1GQUFtRjtJQUNuRixNQUFNLEdBQUcsR0FBRyxJQUFBLGtEQUFzQixFQUNoQyxJQUFBLHlCQUFTLEVBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7UUFDeEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFO0tBQ3ZCLENBQUMsQ0FBQyxDQUNKLENBQUE7SUFFRCxJQUFBLDhDQUFvQixFQUNsQixJQUFBLHlCQUFTLEVBQUMsRUFBQyxHQUFHLEVBQUUsT0FBTyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDdEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3ZCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtLQUNmLENBQUMsQ0FBQyxDQUNKLENBQUE7SUFFRCxPQUFPLElBQUksZ0NBQWdCLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFBO0FBQ3hDLENBQUMsQ0FDRixDQUFBIn0=
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateInvoicePdfWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const generate_invoice_pdf_step_1 = require("./steps/generate-invoice-pdf-step");
6
+ exports.generateInvoicePdfWorkflow = (0, workflows_sdk_1.createWorkflow)("generate-invoice-pdf-workflow", (input) => {
7
+ const pdf = (0, generate_invoice_pdf_step_1.generateInvoicePdfStep)(input);
8
+ return new workflows_sdk_1.WorkflowResponse(pdf);
9
+ });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtaW52b2ljZS1wZGYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2dlbmVyYXRlLWludm9pY2UtcGRmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUcwQztBQUMxQyxpRkFBd0U7QUFPM0QsUUFBQSwwQkFBMEIsR0FBRyxJQUFBLDhCQUFjLEVBQ3RELCtCQUErQixFQUMvQixDQUFDLEtBQXNDLEVBQUUsRUFBRTtJQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFBLGtEQUFzQixFQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3pDLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNsQyxDQUFDLENBQ0YsQ0FBQSJ9
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createInvoiceStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const invoice_1 = require("../../modules/invoice");
6
+ exports.createInvoiceStep = (0, workflows_sdk_1.createStep)("create-invoice-step", async (input, { container }) => {
7
+ const invoiceModule = container.resolve(invoice_1.INVOICE_MODULE);
8
+ const invoice = await invoiceModule.createInvoices({
9
+ type: input.type,
10
+ resource_id: input.resource_id,
11
+ ...(input.parent_invoice_id
12
+ ? { parent_invoice_id: input.parent_invoice_id }
13
+ : {}),
14
+ });
15
+ return new workflows_sdk_1.StepResponse(invoice, invoice.id);
16
+ },
17
+ // Compensation: void instead of delete to preserve the numbering sequence.
18
+ // Deleting would create a gap in display_id, which is undesirable.
19
+ async (invoiceId, { container }) => {
20
+ if (!invoiceId)
21
+ return;
22
+ const invoiceModule = container.resolve(invoice_1.INVOICE_MODULE);
23
+ await invoiceModule.updateInvoices({ id: invoiceId, type: "void" });
24
+ });
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWludm9pY2Utc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvY3JlYXRlLWludm9pY2Utc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBMEU7QUFDMUUsbURBQW9EO0FBU3ZDLFFBQUEsaUJBQWlCLEdBQUcsSUFBQSwwQkFBVSxFQUN6QyxxQkFBcUIsRUFDckIsS0FBSyxFQUFFLEtBQTZCLEVBQUUsRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFFO0lBQ25ELE1BQU0sYUFBYSxHQUNqQixTQUFTLENBQUMsT0FBTyxDQUFDLHdCQUFjLENBQUMsQ0FBQTtJQUVuQyxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxjQUFjLENBQUM7UUFDakQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztRQUM5QixHQUFHLENBQUMsS0FBSyxDQUFDLGlCQUFpQjtZQUN6QixDQUFDLENBQUMsRUFBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLEVBQUM7WUFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNSLENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSw0QkFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDOUMsQ0FBQztBQUNELDJFQUEyRTtBQUMzRSxtRUFBbUU7QUFDbkUsS0FBSyxFQUFFLFNBQTZCLEVBQUUsRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFFO0lBQ25ELElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTTtJQUN0QixNQUFNLGFBQWEsR0FDakIsU0FBUyxDQUFDLE9BQU8sQ0FBQyx3QkFBYyxDQUFDLENBQUE7SUFDbkMsTUFBTSxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtBQUNuRSxDQUFDLENBQ0YsQ0FBQSJ9
@@ -0,0 +1,61 @@
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
+ exports.generateInvoicePdfStep = void 0;
7
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
8
+ const pdf_generator_1 = __importDefault(require("../../core/classes/pdf-generator"));
9
+ const invoice_1 = require("../../modules/invoice");
10
+ const utils_1 = require("@medusajs/framework/utils");
11
+ const lodash_merge_1 = __importDefault(require("lodash.merge"));
12
+ exports.generateInvoicePdfStep = (0, workflows_sdk_1.createStep)("generate-invoice-pdf-step", async ({ order_id, invoice_id }, { container }) => {
13
+ const invoiceModuleService = container.resolve(invoice_1.INVOICE_MODULE);
14
+ const orderModuleService = container.resolve(utils_1.Modules.ORDER);
15
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
16
+ const options = invoiceModuleService.getOptions();
17
+ const pdfGenerator = new pdf_generator_1.default();
18
+ const order = await orderModuleService.retrieveOrder(order_id, {
19
+ select: ["*", "total", "items"],
20
+ });
21
+ const { data: [orderWithRelations], } = await query.graph({
22
+ entity: "order",
23
+ fields: [
24
+ "id",
25
+ "shipping_address.*",
26
+ "billing_address.*",
27
+ "customer.groups.*",
28
+ "items.*",
29
+ "items.variant.ean",
30
+ "items.variant.inventory_items.*",
31
+ "items.variant.inventory_items.inventory.*",
32
+ "items.tax_lines.*",
33
+ "shipping_methods.*",
34
+ "shipping_methods.tax_lines.*",
35
+ "invoices.*",
36
+ "invoices.parent_invoice.display_id",
37
+ "payment_collections.*",
38
+ "payment_collections.payments.*",
39
+ "payment_collections.payments.refunds.*",
40
+ ],
41
+ filters: {
42
+ id: order_id,
43
+ },
44
+ }, {
45
+ throwIfKeyNotFound: true,
46
+ });
47
+ const mergedOrder = (0, lodash_merge_1.default)(order, orderWithRelations);
48
+ // Find the invoice to generate the PDF for. If invoice_id is passed we need to find that match, otherwise we need to
49
+ // find the debit invoice.
50
+ const invoice = mergedOrder.invoices.find((i) => !invoice_id ? i.type === "debit" : i.id === invoice_id);
51
+ if (!invoice) {
52
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Invoice not found");
53
+ }
54
+ return new workflows_sdk_1.StepResponse({
55
+ fileName: `invoice-${invoice.display_id}.pdf`,
56
+ data: invoice.type === "credit"
57
+ ? await pdfGenerator.createCreditInvoice(mergedOrder, invoice, options)
58
+ : await pdfGenerator.createInvoice(mergedOrder, options),
59
+ });
60
+ });
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtaW52b2ljZS1wZGYtc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvZ2VuZXJhdGUtaW52b2ljZS1wZGYtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxRUFBMEU7QUFDMUUscUZBQWdGO0FBQ2hGLG1EQUFvRDtBQUNwRCxxREFJa0M7QUFFbEMsZ0VBQWdDO0FBT25CLFFBQUEsc0JBQXNCLEdBQUcsSUFBQSwwQkFBVSxFQUM5QywyQkFBMkIsRUFDM0IsS0FBSyxFQUFFLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBOEIsRUFBRSxFQUFDLFNBQVMsRUFBQyxFQUFFLEVBQUU7SUFDekUsTUFBTSxvQkFBb0IsR0FDeEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyx3QkFBYyxDQUFDLENBQUE7SUFDbkMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMzRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWhFLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxDQUFBO0lBRWpELE1BQU0sWUFBWSxHQUFHLElBQUksdUJBQVksRUFBRSxDQUFBO0lBRXZDLE1BQU0sS0FBSyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtRQUM3RCxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztLQUNoQyxDQUFDLENBQUE7SUFFRixNQUFNLEVBQ0osSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsR0FDM0IsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQ25CO1FBQ0UsTUFBTSxFQUFFLE9BQU87UUFDZixNQUFNLEVBQUU7WUFDTixJQUFJO1lBQ0osb0JBQW9CO1lBQ3BCLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDbkIsU0FBUztZQUNULG1CQUFtQjtZQUNuQixpQ0FBaUM7WUFDakMsMkNBQTJDO1lBQzNDLG1CQUFtQjtZQUNuQixvQkFBb0I7WUFDcEIsOEJBQThCO1lBQzlCLFlBQVk7WUFDWixvQ0FBb0M7WUFDcEMsdUJBQXVCO1lBQ3ZCLGdDQUFnQztZQUNoQyx3Q0FBd0M7U0FDekM7UUFDRCxPQUFPLEVBQUU7WUFDUCxFQUFFLEVBQUUsUUFBUTtTQUNiO0tBQ0YsRUFDRDtRQUNFLGtCQUFrQixFQUFFLElBQUk7S0FDekIsQ0FDRixDQUFBO0lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBQSxzQkFBSyxFQUN2QixLQUFLLEVBQ0wsa0JBQWtCLENBQ2EsQ0FBQTtJQUVqQyxxSEFBcUg7SUFDckgsMEJBQTBCO0lBQzFCLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDOUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FDdkQsQ0FBQTtJQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBQztRQUN0QixRQUFRLEVBQUUsV0FBVyxPQUFPLENBQUMsVUFBVSxNQUFNO1FBQzdDLElBQUksRUFDRixPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDdkIsQ0FBQyxDQUFDLE1BQU0sWUFBWSxDQUFDLG1CQUFtQixDQUNwQyxXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sQ0FDUjtZQUNILENBQUMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQztLQUM3RCxDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQSJ9
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uploadInvoicePdfStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const invoice_1 = require("../../modules/invoice");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ exports.uploadInvoicePdfStep = (0, workflows_sdk_1.createStep)("upload-invoice-pdf-step", async ({ invoice_id, file_name, data }, { container }) => {
8
+ const fileModuleService = container.resolve(utils_1.Modules.FILE);
9
+ const invoiceModule = container.resolve(invoice_1.INVOICE_MODULE);
10
+ const [file] = await fileModuleService.createFiles([
11
+ {
12
+ filename: `invoices/${Date.now()}-${file_name}`,
13
+ mimeType: "application/pdf",
14
+ content: data,
15
+ access: "private",
16
+ },
17
+ ]);
18
+ await invoiceModule.updateInvoices({ id: invoice_id, pdf_url: file.id });
19
+ return new workflows_sdk_1.StepResponse(file.id, { invoice_id, file_id: file.id });
20
+ }, async (rollbackData, { container }) => {
21
+ if (!rollbackData)
22
+ return;
23
+ const { invoice_id, file_id } = rollbackData;
24
+ const fileModuleService = container.resolve(utils_1.Modules.FILE);
25
+ const invoiceModule = container.resolve(invoice_1.INVOICE_MODULE);
26
+ await fileModuleService.deleteFiles([file_id]);
27
+ await invoiceModule.updateInvoices({ id: invoice_id, pdf_url: null });
28
+ });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWludm9pY2UtcGRmLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3VwbG9hZC1pbnZvaWNlLXBkZi1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUEwRTtBQUMxRSxtREFBb0Q7QUFFcEQscURBQWlEO0FBUXBDLFFBQUEsb0JBQW9CLEdBQUcsSUFBQSwwQkFBVSxFQUM1Qyx5QkFBeUIsRUFDekIsS0FBSyxFQUFFLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQTRCLEVBQUUsRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFFO0lBQzlFLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekQsTUFBTSxhQUFhLEdBQXlCLFNBQVMsQ0FBQyxPQUFPLENBQUMsd0JBQWMsQ0FBQyxDQUFBO0lBRTdFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztRQUNqRDtZQUNFLFFBQVEsRUFBRSxZQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxTQUFTLEVBQUU7WUFDL0MsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixPQUFPLEVBQUUsSUFBSTtZQUNiLE1BQU0sRUFBRSxTQUFTO1NBQ2xCO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUE7SUFFdEUsT0FBTyxJQUFJLDRCQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUE7QUFDbEUsQ0FBQyxFQUNELEtBQUssRUFDSCxZQUErRCxFQUMvRCxFQUFDLFNBQVMsRUFBQyxFQUNYLEVBQUU7SUFDRixJQUFJLENBQUMsWUFBWTtRQUFFLE9BQU07SUFDekIsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUMsR0FBRyxZQUFZLENBQUE7SUFFMUMsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6RCxNQUFNLGFBQWEsR0FBeUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyx3QkFBYyxDQUFDLENBQUE7SUFFN0UsTUFBTSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzlDLE1BQU0sYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7QUFDckUsQ0FBQyxDQUNGLENBQUEifQ==