@hartl-services/medusa-base 0.4.0 → 1.1.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.
- package/.medusa/server/src/admin/index.js +1657 -111
- package/.medusa/server/src/admin/index.mjs +1647 -101
- package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +24 -0
- package/.medusa/server/src/api/admin/email/messages/[id]/route.js +12 -0
- package/.medusa/server/src/api/admin/email/messages/route.js +12 -0
- package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +16 -0
- package/.medusa/server/src/api/admin/email/terms-versions/route.js +47 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/download/route.js +21 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/regenerate/route.js +38 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/regenerate/route.js +32 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/route.js +36 -0
- package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/download/route.js +24 -0
- package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/retry/route.js +44 -0
- package/.medusa/server/src/api/admin/orders/[id]/packing-lists/route.js +82 -0
- package/.medusa/server/src/api/document-download-response.js +16 -0
- package/.medusa/server/src/api/document-response.js +23 -0
- package/.medusa/server/src/api/files/[asset]/route.js +24 -0
- package/.medusa/server/src/api/files/file-response.js +43 -0
- package/.medusa/server/src/api/files/gateway-options.js +31 -0
- package/.medusa/server/src/api/files/private/[token]/route.js +29 -0
- package/.medusa/server/src/api/files/upload/[token]/route.js +66 -0
- package/.medusa/server/src/api/middlewares.js +168 -1
- package/.medusa/server/src/api/packing-list-response.js +22 -0
- package/.medusa/server/src/api/route.js +27 -0
- package/.medusa/server/src/api/store/documents/[id]/download/route.js +21 -0
- package/.medusa/server/src/api/store/documents/[id]/route.js +15 -0
- package/.medusa/server/src/api/store/documents/route.js +11 -0
- package/.medusa/server/src/api/terms-download-response.js +12 -0
- package/.medusa/server/src/documents/config/index.js +18 -0
- package/.medusa/server/src/documents/paths/documents.js +6 -0
- package/.medusa/server/src/documents/paths/index.js +18 -0
- package/.medusa/server/src/documents/plugin-features.js +38 -0
- package/.medusa/server/src/documents/schemas/documents.js +18 -0
- package/.medusa/server/src/documents/schemas/index.js +18 -0
- package/.medusa/server/src/documents/scripts/verify-documents-file-storage.js +55 -0
- package/.medusa/server/src/documents/templates/financial-document.js +160 -0
- package/.medusa/server/src/documents/templates/format.js +73 -0
- package/.medusa/server/src/documents/templates/html-factory.js +42 -0
- package/.medusa/server/src/documents/templates/html-utils.js +23 -0
- package/.medusa/server/src/documents/templates/layout.js +142 -0
- package/.medusa/server/src/documents/templates/packing-list.js +52 -0
- package/.medusa/server/src/documents/types/admin-api.js +3 -0
- package/.medusa/server/src/documents/types/document-summary.js +3 -0
- package/.medusa/server/src/documents/types/documents.js +3 -0
- package/.medusa/server/src/documents/types/html-factory.js +6 -0
- package/.medusa/server/src/documents/types/index.js +22 -0
- package/.medusa/server/src/documents/types/store-api.js +3 -0
- package/.medusa/server/src/documents/utils/document-merchant.js +22 -0
- package/.medusa/server/src/documents/utils/document-render-settings.js +59 -0
- package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
- package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
- package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
- package/.medusa/server/src/email/application/handle-invite-event.js +318 -0
- package/.medusa/server/src/email/application/handle-password-reset-event.js +366 -0
- package/.medusa/server/src/email/config/index.js +84 -0
- package/.medusa/server/src/email/config/notification-module.js +20 -0
- package/.medusa/server/src/email/domain/business-keys.js +50 -0
- package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
- package/.medusa/server/src/email/domain/event-schemas.js +36 -0
- package/.medusa/server/src/email/domain/failure-classification.js +53 -0
- package/.medusa/server/src/email/domain/order-summary.js +103 -0
- package/.medusa/server/src/email/domain/refund-summary.js +43 -0
- package/.medusa/server/src/email/domain/return-summary.js +118 -0
- package/.medusa/server/src/email/domain/shipment-summary.js +74 -0
- package/.medusa/server/src/email/plugin-features.js +39 -0
- package/.medusa/server/src/email/rendering/default-templates.js +719 -0
- package/.medusa/server/src/email/rendering/load-email-shop-details.js +36 -0
- package/.medusa/server/src/email/rendering/render-email.js +50 -0
- package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +67 -0
- package/.medusa/server/src/email/types/email-kinds.js +18 -0
- package/.medusa/server/src/email/types/index.js +21 -0
- package/.medusa/server/src/email/types/shop-configuration.js +3 -0
- package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
- package/.medusa/server/src/email/types/template-data.js +232 -0
- package/.medusa/server/src/files/config/index.js +256 -0
- package/.medusa/server/src/files/gateway/index.js +115 -0
- package/.medusa/server/src/files/types/index.js +6 -0
- package/.medusa/server/src/files/types/public.js +6 -0
- package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
- package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
- package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
- package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
- package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
- package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
- package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
- package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
- package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
- package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
- package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
- package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
- package/.medusa/server/src/modules/documents/domain/options.js +40 -0
- package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
- package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
- package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
- package/.medusa/server/src/modules/documents/index.js +15 -0
- package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
- package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
- package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
- package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
- package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
- package/.medusa/server/src/modules/documents/models/document.js +82 -0
- package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
- package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
- package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
- package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
- package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
- package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
- package/.medusa/server/src/modules/documents/service.js +1701 -0
- package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
- package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
- package/.medusa/server/src/modules/email/index.js +13 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
- package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
- package/.medusa/server/src/modules/email/models/email-message.js +71 -0
- package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
- package/.medusa/server/src/modules/email/service.js +1285 -0
- package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +4 -3
- package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
- package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
- package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
- package/.medusa/server/src/providers/s3-cache/index.js +8 -0
- package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
- package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
- package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
- package/.medusa/server/src/providers/smtp/index.js +8 -0
- package/.medusa/server/src/providers/smtp/service.js +236 -0
- package/.medusa/server/src/providers/smtp/types.js +11 -0
- package/.medusa/server/src/public/config.js +186 -0
- package/.medusa/server/src/public/descriptor.js +3 -1
- package/.medusa/server/src/public/gateway.js +19 -0
- package/.medusa/server/src/public/instrumentation.js +56 -0
- package/.medusa/server/src/public/shop-config.js +12 -0
- package/.medusa/server/src/public/shop-master-data.js +2 -2
- package/.medusa/server/src/public/shop-types.js +24 -0
- package/.medusa/server/src/shop-config/build-food-shop-config.js +252 -0
- package/.medusa/server/src/shop-config/options.js +75 -0
- package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
- package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
- package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
- package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
- package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
- package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
- package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
- package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
- package/.medusa/server/src/subscribers/order-placed.js +27 -0
- package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
- package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
- package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
- package/.medusa/server/src/subscribers/password-reset.js +23 -0
- package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
- package/.medusa/server/src/subscribers/return-received.js +27 -0
- package/.medusa/server/src/subscribers/return-requested.js +27 -0
- package/.medusa/server/src/subscribers/user-invite.js +23 -0
- package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
- package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
- package/.medusa/server/src/workflows/documents/issue-document.js +165 -0
- package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
- package/.medusa/server/src/workflows/documents/issue-packing-list.js +390 -0
- package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
- package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
- package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
- package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
- package/.medusa/server/src/workflows/email/dispatch-email-message.js +301 -0
- package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
- package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
- package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +102 -0
- package/.medusa/server/src/workflows/email/prepare-order-received-email.js +82 -0
- package/.medusa/server/src/workflows/email/prepare-refund-email.js +71 -0
- package/.medusa/server/src/workflows/email/prepare-return-email.js +136 -0
- package/.medusa/server/src/workflows/email/prepare-shipment-email.js +115 -0
- package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
- package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
- package/README.md +1777 -8
- package/dist/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +15 -0
- package/dist/admin-components/features/plugin-features/components/ImageSettingInput.js +42 -0
- package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +4 -2
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +4 -4
- package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
- package/dist/admin-components/features/plugin-features/lib/image-upload.d.ts +6 -0
- package/dist/admin-components/features/plugin-features/lib/image-upload.js +17 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +4 -4
- package/dist/admin-components/i18n/texts.d.ts +6 -0
- package/dist/admin-components/i18n/texts.js +6 -0
- package/dist/documents/config/index.d.ts +11 -0
- package/dist/documents/config/index.js +17 -0
- package/dist/documents/templates/financial-document.d.ts +3 -0
- package/dist/documents/templates/financial-document.js +159 -0
- package/dist/documents/templates/format.d.ts +30 -0
- package/dist/documents/templates/format.js +72 -0
- package/dist/documents/templates/html-factory.d.ts +15 -0
- package/dist/documents/templates/html-factory.js +41 -0
- package/dist/documents/templates/html-utils.d.ts +8 -0
- package/dist/documents/templates/html-utils.js +22 -0
- package/dist/documents/templates/layout.d.ts +35 -0
- package/dist/documents/templates/layout.js +141 -0
- package/dist/documents/templates/packing-list.d.ts +3 -0
- package/dist/documents/templates/packing-list.js +51 -0
- package/dist/documents/types/admin-api.d.ts +1 -0
- package/dist/documents/types/admin-api.js +2 -0
- package/dist/documents/types/document-summary.d.ts +1 -0
- package/dist/documents/types/document-summary.js +2 -0
- package/dist/documents/types/documents.d.ts +191 -0
- package/dist/documents/types/documents.js +2 -0
- package/dist/documents/types/html-factory.d.ts +8 -0
- package/dist/documents/types/html-factory.js +5 -0
- package/dist/documents/types/index.d.ts +5 -0
- package/dist/documents/types/index.js +21 -0
- package/dist/documents/types/store-api.d.ts +1 -0
- package/dist/documents/types/store-api.js +2 -0
- package/dist/email/config/index.d.ts +17 -0
- package/dist/email/config/index.js +83 -0
- package/dist/email/config/notification-module.d.ts +22 -0
- package/dist/email/config/notification-module.js +19 -0
- package/dist/email/types/email-kinds.d.ts +15 -0
- package/dist/email/types/email-kinds.js +17 -0
- package/dist/email/types/index.d.ts +4 -0
- package/dist/email/types/index.js +20 -0
- package/dist/email/types/shop-configuration.d.ts +68 -0
- package/dist/email/types/shop-configuration.js +2 -0
- package/dist/email/types/smtp-configuration.d.ts +9 -0
- package/dist/email/types/smtp-configuration.js +2 -0
- package/dist/email/types/template-data.d.ts +609 -0
- package/dist/email/types/template-data.js +231 -0
- package/dist/files/config/index.d.ts +32 -0
- package/dist/files/config/index.js +255 -0
- package/dist/files/gateway/index.d.ts +30 -0
- package/dist/files/gateway/index.js +114 -0
- package/dist/files/types/index.d.ts +2 -0
- package/dist/files/types/index.js +5 -0
- package/dist/files/types/public.d.ts +90 -0
- package/dist/files/types/public.js +5 -0
- package/dist/modules/documents/domain/merchant.d.ts +22 -0
- package/dist/modules/documents/domain/merchant.js +85 -0
- package/dist/modules/documents/domain/options.d.ts +34 -0
- package/dist/modules/documents/domain/options.js +39 -0
- package/dist/public/config.d.ts +59 -0
- package/dist/public/config.js +185 -0
- package/dist/public/descriptor.js +2 -0
- package/dist/public/gateway.d.ts +2 -0
- package/dist/public/gateway.js +18 -0
- package/dist/public/instrumentation.d.ts +12 -0
- package/dist/public/instrumentation.js +55 -0
- package/dist/public/shop-config.d.ts +8 -0
- package/dist/public/shop-config.js +11 -0
- package/dist/public/shop-master-data.d.ts +1 -1
- package/dist/public/shop-master-data.js +1 -1
- package/dist/public/shop-types.d.ts +7 -0
- package/dist/public/shop-types.js +23 -0
- package/dist/public/types.d.ts +19 -2
- package/dist/shop-config/build-food-shop-config.d.ts +44 -0
- package/dist/shop-config/build-food-shop-config.js +251 -0
- package/dist/shop-config/options.d.ts +48 -0
- package/dist/shop-config/options.js +74 -0
- package/package.json +48 -5
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dismissOrphanedCartPromotionLinks = void 0;
|
|
4
|
+
exports.default = dismissOrphanedCartPromotionLinksScript;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const cart_promotion_links_1 = require("../utils/cart-promotion-links");
|
|
7
|
+
/**
|
|
8
|
+
* One-off repair, run exactly once by `medusa db:migrate`: removes every
|
|
9
|
+
* `cart_promotion` link whose promotion was deleted before the
|
|
10
|
+
* `promotionsDeleted` hook (src/workflows/hooks/dismiss-deleted-
|
|
11
|
+
* promotion-cart-links.ts) existed. Such links surface as `null` entries in
|
|
12
|
+
* `cart.promotions` and crashed both the storefront cart and the affiliate
|
|
13
|
+
* plugin's cart hooks.
|
|
14
|
+
*/
|
|
15
|
+
const dismissOrphanedCartPromotionLinks = async (container) => {
|
|
16
|
+
const orphaned = await (0, cart_promotion_links_1.findOrphanedCartPromotionLinks)(container);
|
|
17
|
+
await (0, cart_promotion_links_1.dismissCartPromotionLinks)(container, orphaned);
|
|
18
|
+
return orphaned.length;
|
|
19
|
+
};
|
|
20
|
+
exports.dismissOrphanedCartPromotionLinks = dismissOrphanedCartPromotionLinks;
|
|
21
|
+
async function dismissOrphanedCartPromotionLinksScript({ container, }) {
|
|
22
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
23
|
+
const removed = await (0, exports.dismissOrphanedCartPromotionLinks)(container);
|
|
24
|
+
logger.info(`Removed ${removed} cart_promotion link(s) pointing at deleted promotions.`);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzbWlzcy1vcnBoYW5lZC1jYXJ0LXByb21vdGlvbi1saW5rcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9taWdyYXRpb24tc2NyaXB0cy9kaXNtaXNzLW9ycGhhbmVkLWNhcnQtcHJvbW90aW9uLWxpbmtzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdCQSwwREFVQztBQWpDRCxxREFBcUU7QUFFckUsd0VBR3NDO0FBRXRDOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLGlDQUFpQyxHQUFHLEtBQUssRUFDcEQsU0FBMEIsRUFDVCxFQUFFO0lBQ25CLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxxREFBOEIsRUFBQyxTQUFTLENBQUMsQ0FBQTtJQUNoRSxNQUFNLElBQUEsZ0RBQXlCLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3BELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQTtBQUN4QixDQUFDLENBQUE7QUFOWSxRQUFBLGlDQUFpQyxxQ0FNN0M7QUFFYyxLQUFLLFVBQVUsdUNBQXVDLENBQUMsRUFDcEUsU0FBUyxHQUdWO0lBQ0MsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEseUNBQWlDLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFDbEUsTUFBTSxDQUFDLElBQUksQ0FDVCxXQUFXLE9BQU8seURBQXlELENBQzVFLENBQUE7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCancellationSnapshot = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const snapshot_normalization_1 = require("./snapshot-normalization");
|
|
6
|
+
const tax_breakdown_1 = require("./tax-breakdown");
|
|
7
|
+
const asPositiveAmount = (value, field) => {
|
|
8
|
+
const amount = utils_1.MathBN.convert(value);
|
|
9
|
+
if (!amount.isFinite() || !utils_1.MathBN.gt(amount, 0)) {
|
|
10
|
+
throw new Error(`${field} must be a positive monetary amount.`);
|
|
11
|
+
}
|
|
12
|
+
return amount;
|
|
13
|
+
};
|
|
14
|
+
const scaleAsNegativeMoney = (input) => {
|
|
15
|
+
if (input.money.currency_code !== input.currency_code) {
|
|
16
|
+
throw new Error("The original invoice snapshot contains mixed currencies.");
|
|
17
|
+
}
|
|
18
|
+
const decimalPlaces = (0, tax_breakdown_1.getCurrencyDecimalPlaces)(input.currency_code);
|
|
19
|
+
const amount = utils_1.MathBN.mult(utils_1.MathBN.div(utils_1.MathBN.convert(input.money.amount), input.source_total), input.refund_amount)
|
|
20
|
+
.negated()
|
|
21
|
+
.decimalPlaces(decimalPlaces)
|
|
22
|
+
.toFixed(decimalPlaces);
|
|
23
|
+
return {
|
|
24
|
+
amount,
|
|
25
|
+
currency_code: input.currency_code,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Builds a negative correction from the invoice snapshot that the customer
|
|
30
|
+
* actually received. A payment refund has no item allocation, therefore the
|
|
31
|
+
* stored invoice's tax and total distribution is applied proportionally.
|
|
32
|
+
*/
|
|
33
|
+
const createCancellationSnapshot = (input) => {
|
|
34
|
+
const sourceInvoice = (0, snapshot_normalization_1.normalizeDocumentSnapshot)(input.source_invoice);
|
|
35
|
+
if (sourceInvoice.document.kind !== "invoice" ||
|
|
36
|
+
!sourceInvoice.document.number) {
|
|
37
|
+
throw new Error("A numbered invoice snapshot is required for a cancellation.");
|
|
38
|
+
}
|
|
39
|
+
if (Number.isNaN(input.issued_at.getTime())) {
|
|
40
|
+
throw new Error("The cancellation issue date is invalid.");
|
|
41
|
+
}
|
|
42
|
+
const currencyCode = sourceInvoice.order.currency_code;
|
|
43
|
+
const sourceTotal = asPositiveAmount(sourceInvoice.totals.total.amount, "The original invoice total");
|
|
44
|
+
const refundAmount = asPositiveAmount(input.refund_amount, "The refund amount");
|
|
45
|
+
if (utils_1.MathBN.gt(refundAmount, sourceTotal)) {
|
|
46
|
+
throw new Error("The refund amount cannot exceed the original invoice total.");
|
|
47
|
+
}
|
|
48
|
+
const scale = (money) => scaleAsNegativeMoney({
|
|
49
|
+
money,
|
|
50
|
+
source_total: sourceTotal,
|
|
51
|
+
refund_amount: refundAmount,
|
|
52
|
+
currency_code: currencyCode,
|
|
53
|
+
});
|
|
54
|
+
const subtotal = scale(sourceInvoice.totals.subtotal);
|
|
55
|
+
const taxTotal = scale(sourceInvoice.totals.tax_total);
|
|
56
|
+
const taxBreakdown = (0, tax_breakdown_1.roundTaxBreakdown)(sourceInvoice.totals.tax_breakdown.map((entry) => ({
|
|
57
|
+
...entry,
|
|
58
|
+
tax_total: scale(entry.tax_total),
|
|
59
|
+
})), taxTotal);
|
|
60
|
+
const total = {
|
|
61
|
+
amount: refundAmount.negated().toFixed((0, tax_breakdown_1.getCurrencyDecimalPlaces)(currencyCode)),
|
|
62
|
+
currency_code: currencyCode,
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
document: {
|
|
66
|
+
id: input.document_id,
|
|
67
|
+
kind: "cancellation",
|
|
68
|
+
number: input.document_number,
|
|
69
|
+
issued_at: input.issued_at.toISOString(),
|
|
70
|
+
source_document_number: sourceInvoice.document.number,
|
|
71
|
+
},
|
|
72
|
+
order: { ...sourceInvoice.order },
|
|
73
|
+
lines: [
|
|
74
|
+
{
|
|
75
|
+
id: `refund:${input.document_id}`,
|
|
76
|
+
title: `Rückerstattung zu Rechnung ${sourceInvoice.document.number}`,
|
|
77
|
+
sku: null,
|
|
78
|
+
quantity: 1,
|
|
79
|
+
unit_price: { ...subtotal },
|
|
80
|
+
subtotal,
|
|
81
|
+
tax_total: taxTotal,
|
|
82
|
+
total,
|
|
83
|
+
batch_allocations: [],
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
totals: {
|
|
87
|
+
subtotal,
|
|
88
|
+
tax_total: taxTotal,
|
|
89
|
+
tax_breakdown: taxBreakdown,
|
|
90
|
+
shipping_total: scale(sourceInvoice.totals.shipping_total),
|
|
91
|
+
discount_total: scale(sourceInvoice.totals.discount_total),
|
|
92
|
+
total,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
exports.createCancellationSnapshot = createCancellationSnapshot;
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsbGF0aW9uLXNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZG9jdW1lbnRzL2RvbWFpbi9jYW5jZWxsYXRpb24tc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWtEO0FBTWxELHFFQUFvRTtBQUNwRSxtREFBNkU7QUFFN0UsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRTtJQUN4RCxNQUFNLE1BQU0sR0FBRyxjQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLHNDQUFzQyxDQUFDLENBQUE7SUFDakUsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBSzdCLEVBQWlCLEVBQUU7SUFDbEIsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFBO0lBQzdFLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFBLHdDQUF3QixFQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNuRSxNQUFNLE1BQU0sR0FBRyxjQUFNLENBQUMsSUFBSSxDQUN4QixjQUFNLENBQUMsR0FBRyxDQUFDLGNBQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQ2xFLEtBQUssQ0FBQyxhQUFh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
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveDocumentNumberPeriodYear = exports.formatDocumentNumber = void 0;
|
|
4
|
+
const prefixByKind = {
|
|
5
|
+
invoice: "RE",
|
|
6
|
+
cancellation: "ST",
|
|
7
|
+
credit_note: "GS",
|
|
8
|
+
};
|
|
9
|
+
const formatDocumentNumber = (input) => {
|
|
10
|
+
if (!Number.isInteger(input.periodYear) || input.periodYear <= 0) {
|
|
11
|
+
throw new Error("The document-number period year must be a positive integer.");
|
|
12
|
+
}
|
|
13
|
+
if (!Number.isInteger(input.sequenceValue) || input.sequenceValue <= 0) {
|
|
14
|
+
throw new Error("The document-number sequence value must be a positive integer.");
|
|
15
|
+
}
|
|
16
|
+
return `${prefixByKind[input.kind]}-${input.periodYear}-${input.sequenceValue}`;
|
|
17
|
+
};
|
|
18
|
+
exports.formatDocumentNumber = formatDocumentNumber;
|
|
19
|
+
const resolveDocumentNumberPeriodYear = (issuedAt, timeZone) => {
|
|
20
|
+
if (Number.isNaN(issuedAt.getTime())) {
|
|
21
|
+
throw new Error("The document issue date is invalid.");
|
|
22
|
+
}
|
|
23
|
+
const year = new Intl.DateTimeFormat("en", {
|
|
24
|
+
timeZone,
|
|
25
|
+
year: "numeric",
|
|
26
|
+
})
|
|
27
|
+
.formatToParts(issuedAt)
|
|
28
|
+
.find((part) => part.type === "year")?.value;
|
|
29
|
+
const periodYear = Number(year);
|
|
30
|
+
if (!Number.isInteger(periodYear) || periodYear <= 0) {
|
|
31
|
+
throw new Error("The document-number period year could not be resolved.");
|
|
32
|
+
}
|
|
33
|
+
return periodYear;
|
|
34
|
+
};
|
|
35
|
+
exports.resolveDocumentNumberPeriodYear = resolveDocumentNumberPeriodYear;
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbnVtYmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZG9jdW1lbnRzL2RvbWFpbi9kb2N1bWVudC1udW1iZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBTSxZQUFZLEdBQWlDO0lBQ2pELE9BQU8sRUFBRSxJQUFJO0lBQ2IsWUFBWSxFQUFFLElBQUk7SUFDbEIsV0FBVyxFQUFFLElBQUk7Q0FDbEIsQ0FBQTtBQUVNLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUlwQyxFQUFVLEVBQUU7SUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUE7SUFDaEYsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQTtJQUNuRixDQUFDO0lBRUQsT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUE7QUFDakYsQ0FBQyxDQUFBO0FBYlksUUFBQSxvQkFBb0Isd0JBYWhDO0FBRU0sTUFBTSwrQkFBK0IsR0FBRyxDQUM3QyxRQUFjLEVBQ2QsUUFBZ0IsRUFDUixFQUFFO0lBQ1YsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFO1FBQ3pDLFFBQVE7UUFDUixJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDO1NBQ0MsYUFBYSxDQUFDLFFBQVEsQ0FBQztTQUN2QixJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFBO0lBQzlDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDLENBQUE7QUFwQlksUUFBQSwrQkFBK0IsbUNBb0IzQyJ9
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.canDeleteReplacedArtifact = exports.isCancellationResolutionReady = exports.resolveRefundCommunicationOwner = exports.selectShipmentInvoiceCandidate = exports.canonicalizeRefundIds = void 0;
|
|
4
|
+
const canonicalizeRefundIds = (refundIds) => [...new Set(refundIds.map((id) => id.trim()).filter(Boolean))].sort((a, b) => a.localeCompare(b));
|
|
5
|
+
exports.canonicalizeRefundIds = canonicalizeRefundIds;
|
|
6
|
+
const selectShipmentInvoiceCandidate = (assignments) => [...assignments]
|
|
7
|
+
.sort((left, right) => left.created_at.getTime() - right.created_at.getTime() ||
|
|
8
|
+
left.fulfillment_id.localeCompare(right.fulfillment_id))[0]?.fulfillment_id ?? null;
|
|
9
|
+
exports.selectShipmentInvoiceCandidate = selectShipmentInvoiceCandidate;
|
|
10
|
+
const resolveRefundCommunicationOwner = (input) => input.order_canceled || input.cancellation_resolution_exists
|
|
11
|
+
? "cancellation"
|
|
12
|
+
: "standalone";
|
|
13
|
+
exports.resolveRefundCommunicationOwner = resolveRefundCommunicationOwner;
|
|
14
|
+
const isCancellationResolutionReady = (expectedRefundIds, resolutions) => {
|
|
15
|
+
const stateByRefund = new Map(resolutions.map((resolution) => [resolution.refund_id, resolution.state]));
|
|
16
|
+
return (0, exports.canonicalizeRefundIds)(expectedRefundIds).every((refundId) => {
|
|
17
|
+
const state = stateByRefund.get(refundId);
|
|
18
|
+
return state === "ready" || state === "not_applicable";
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
exports.isCancellationResolutionReady = isCancellationResolutionReady;
|
|
22
|
+
const canDeleteReplacedArtifact = (artifact) => artifact?.communication_locked === false;
|
|
23
|
+
exports.canDeleteReplacedArtifact = canDeleteReplacedArtifact;
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtcmVzb2x1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vZG9jdW1lbnQtcmVzb2x1dGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLTyxNQUFNLHFCQUFxQixHQUFHLENBQUMsU0FBNEIsRUFBWSxFQUFFLENBQzlFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUMzRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUNuQixDQUFBO0FBSFUsUUFBQSxxQkFBcUIseUJBRy9CO0FBRUksTUFBTSw4QkFBOEIsR0FBRyxDQUM1QyxXQUFvRSxFQUNyRCxFQUFFLENBQ2pCLENBQUMsR0FBRyxXQUFXLENBQUM7S0FDYixJQUFJLENBQ0gsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDZCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO0lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FDMUQsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLElBQUksSUFBSSxDQUFBO0FBUm5CLFFBQUEsOEJBQThCLGtDQVFYO0FBRXpCLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxLQUcvQyxFQUE0QixFQUFFLENBQzdCLEtBQUssQ0FBQyxjQUFjLElBQUksS0FBSyxDQUFDLDhCQUE4QjtJQUMxRCxDQUFDLENBQUMsY0FBYztJQUNoQixDQUFDLENBQUMsWUFBWSxDQUFBO0FBTkwsUUFBQSwrQkFBK0IsbUNBTTFCO0FBRVgsTUFBTSw2QkFBNkIsR0FBRyxDQUMzQyxpQkFBb0MsRUFDcEMsV0FHRyxFQUNNLEVBQUU7SUFDWCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FDM0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUMxRSxDQUFBO0lBRUQsT0FBTyxJQUFBLDZCQUFxQixFQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDakUsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN6QyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQUksS0FBSyxLQUFLLGdCQUFnQixDQUFBO0lBQ3hELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBZlksUUFBQSw2QkFBNkIsaUNBZXpDO0FBRU0sTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxRQUFrRCxFQUN6QyxFQUFFLENBQUMsUUFBUSxFQUFFLG9CQUFvQixLQUFLLEtBQUssQ0FBQTtBQUZ6QyxRQUFBLHlCQUF5Qiw2QkFFZ0IifQ==
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.canCustomerAccessDocument = exports.mapBatchAllocationsByLineItem = exports.isInvoiceIssuableAfterShipment = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* The single invoice is deliberately deferred until Medusa has registered the
|
|
6
|
+
* final shipment. `partially_shipped` must never produce a partial invoice.
|
|
7
|
+
*/
|
|
8
|
+
const isInvoiceIssuableAfterShipment = (order) => !order.canceled_at &&
|
|
9
|
+
(order.fulfillment_status === "shipped" ||
|
|
10
|
+
order.fulfillment_status === "delivered");
|
|
11
|
+
exports.isInvoiceIssuableAfterShipment = isInvoiceIssuableAfterShipment;
|
|
12
|
+
/**
|
|
13
|
+
* Maps immutable FEFO withdrawals to their order line. Sorting makes the
|
|
14
|
+
* template input deterministic even when a provider returns rows in a
|
|
15
|
+
* different order.
|
|
16
|
+
*/
|
|
17
|
+
const mapBatchAllocationsByLineItem = (allocations) => {
|
|
18
|
+
const byLineItem = {};
|
|
19
|
+
for (const allocation of allocations) {
|
|
20
|
+
const { line_item_id: lineItemId, ...documentAllocation } = allocation;
|
|
21
|
+
const lineAllocations = byLineItem[lineItemId] ?? [];
|
|
22
|
+
lineAllocations.push(documentAllocation);
|
|
23
|
+
byLineItem[lineItemId] = lineAllocations;
|
|
24
|
+
}
|
|
25
|
+
for (const lineAllocations of Object.values(byLineItem)) {
|
|
26
|
+
lineAllocations.sort((left, right) => left.batch_id.localeCompare(right.batch_id));
|
|
27
|
+
}
|
|
28
|
+
return byLineItem;
|
|
29
|
+
};
|
|
30
|
+
exports.mapBatchAllocationsByLineItem = mapBatchAllocationsByLineItem;
|
|
31
|
+
/**
|
|
32
|
+
* Guest documents intentionally have no storefront owner and are never
|
|
33
|
+
* retrievable over Store.
|
|
34
|
+
*/
|
|
35
|
+
const canCustomerAccessDocument = (documentCustomerId, actorCustomerId) => typeof documentCustomerId === "string" && documentCustomerId === actorCustomerId;
|
|
36
|
+
exports.canCustomerAccessDocument = canCustomerAccessDocument;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNzdWFuY2UtcnVsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kb2N1bWVudHMvZG9tYWluL2lzc3VhbmNlLXJ1bGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWVBOzs7R0FHRztBQUNJLE1BQU0sOEJBQThCLEdBQUcsQ0FDNUMsS0FBZ0MsRUFDdkIsRUFBRSxDQUNYLENBQUMsS0FBSyxDQUFDLFdBQVc7SUFDbEIsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEtBQUssU0FBUztRQUNyQyxLQUFLLENBQUMsa0JBQWtCLEtBQUssV0FBVyxDQUFDLENBQUE7QUFMaEMsUUFBQSw4QkFBOEIsa0NBS0U7QUFFN0M7Ozs7R0FJRztBQUNJLE1BQU0sNkJBQTZCLEdBQUcsQ0FDM0MsV0FBc0MsRUFDSyxFQUFFO0lBQzdDLE1BQU0sVUFBVSxHQUE4QyxFQUFFLENBQUE7SUFFaEUsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxHQUFHLGtCQUFrQixFQUFFLEdBQUcsVUFBVSxDQUFBO1FBQ3RFLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDcEQsZUFBZSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ3hDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLENBQUE7SUFDMUMsQ0FBQztJQUVELEtBQUssTUFBTSxlQUFlLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3hELGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUM1QyxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUMsQ0FBQTtBQW5CWSxRQUFBLDZCQUE2QixpQ0FtQnpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxrQkFBNkMsRUFDN0MsZUFBdUIsRUFDZCxFQUFFLENBQ1gsT0FBTyxrQkFBa0IsS0FBSyxRQUFRLElBQUksa0JBQWtCLEtBQUssZUFBZSxDQUFBO0FBSnJFLFFBQUEseUJBQXlCLDZCQUk0QyJ9
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toDocumentMerchant = exports.merchantOptionToFallback = exports.MERCHANT_VAT_PLACEHOLDER = exports.DOCUMENT_MERCHANT_REQUIRED_FIELDS = void 0;
|
|
4
|
+
/** Without these a financial document or packing list has no legal sender. */
|
|
5
|
+
exports.DOCUMENT_MERCHANT_REQUIRED_FIELDS = [
|
|
6
|
+
"legal_name",
|
|
7
|
+
"address_line1",
|
|
8
|
+
"postal_code",
|
|
9
|
+
"city",
|
|
10
|
+
"country_code",
|
|
11
|
+
];
|
|
12
|
+
/** Development placeholder UID: never printed on a document. */
|
|
13
|
+
exports.MERCHANT_VAT_PLACEHOLDER = "ATU00000000";
|
|
14
|
+
const text = (value) => {
|
|
15
|
+
if (typeof value !== "string") {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const trimmed = value.trim();
|
|
19
|
+
return trimmed ? trimmed : null;
|
|
20
|
+
};
|
|
21
|
+
const vatNumber = (value) => {
|
|
22
|
+
const normalized = text(value);
|
|
23
|
+
return normalized &&
|
|
24
|
+
normalized.replace(/\s+/g, "").toUpperCase() === exports.MERCHANT_VAT_PLACEHOLDER
|
|
25
|
+
? null
|
|
26
|
+
: normalized;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* The plugin's `merchant` option as a per-field fallback for the shop master
|
|
30
|
+
* data. Empty values are left out so they never shadow a declared default.
|
|
31
|
+
*/
|
|
32
|
+
const merchantOptionToFallback = (option) => {
|
|
33
|
+
if (!option) {
|
|
34
|
+
return {};
|
|
35
|
+
}
|
|
36
|
+
const address = option.registeredAddress;
|
|
37
|
+
const entries = [
|
|
38
|
+
["legal_name", option.legalName],
|
|
39
|
+
["address_line1", address?.address1],
|
|
40
|
+
["address_line2", address?.address2],
|
|
41
|
+
["postal_code", address?.postalCode],
|
|
42
|
+
["city", address?.city],
|
|
43
|
+
[
|
|
44
|
+
"country_code",
|
|
45
|
+
text(address?.countryCode ?? option.countryCode)?.toLowerCase(),
|
|
46
|
+
],
|
|
47
|
+
["vat_number", option.vatNumber],
|
|
48
|
+
];
|
|
49
|
+
const fallback = {};
|
|
50
|
+
for (const [key, value] of entries) {
|
|
51
|
+
const normalized = text(value);
|
|
52
|
+
if (normalized) {
|
|
53
|
+
fallback[key] = normalized;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return fallback;
|
|
57
|
+
};
|
|
58
|
+
exports.merchantOptionToFallback = merchantOptionToFallback;
|
|
59
|
+
/** Maps resolved shop master data to the render input's `merchant`. */
|
|
60
|
+
const toDocumentMerchant = (values) => {
|
|
61
|
+
const missing = exports.DOCUMENT_MERCHANT_REQUIRED_FIELDS.filter((key) => !text(values[key]));
|
|
62
|
+
if (missing.length > 0) {
|
|
63
|
+
return { merchant: null, missing };
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
merchant: {
|
|
67
|
+
legal_name: text(values.legal_name),
|
|
68
|
+
address_line1: text(values.address_line1),
|
|
69
|
+
address_line2: text(values.address_line2),
|
|
70
|
+
postal_code: text(values.postal_code),
|
|
71
|
+
city: text(values.city),
|
|
72
|
+
country_code: text(values.country_code).toLowerCase(),
|
|
73
|
+
vat_number: vatNumber(values.vat_number),
|
|
74
|
+
email: text(values.email),
|
|
75
|
+
phone: text(values.phone),
|
|
76
|
+
website: text(values.website),
|
|
77
|
+
iban: text(values.iban),
|
|
78
|
+
bic: text(values.bic),
|
|
79
|
+
company_register_number: text(values.company_register_number),
|
|
80
|
+
company_register_court: text(values.company_register_court),
|
|
81
|
+
},
|
|
82
|
+
missing: [],
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
exports.toDocumentMerchant = toDocumentMerchant;
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyY2hhbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kb2N1bWVudHMvZG9tYWluL21lcmNoYW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLDhFQUE4RTtBQUNqRSxRQUFBLGlDQUFpQyxHQUFHO0lBQy9DLFlBQVk7SUFDWixlQUFlO0lBQ2YsYUFBYTtJQUNiLE1BQU07SUFDTixjQUFjO0NBQ21DLENBQUE7QUFFbkQsZ0VBQWdFO0FBQ25ELFFBQUEsd0JBQXdCLEdBQUcsYUFBYSxDQUFBO0FBRXJELE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBYyxFQUFpQixFQUFFO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNqQyxDQUFDLENBQUE7QUFFRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQWMsRUFBaUIsRUFBRTtJQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUIsT0FBTyxVQUFVO1FBQ2YsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssZ0NBQXdCO1FBQ3pFLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLFVBQVUsQ0FBQTtBQUNoQixDQUFDLENBQUE7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLHdCQUF3QixHQUFHLENBQ3RDLE1BQTBDLEVBQ2xCLEVBQUU7SUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdB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
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveDocumentPluginOptions = exports.DEFAULT_NUMBERING_TIME_ZONE = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const html_factory_1 = require("../../../documents/templates/html-factory");
|
|
6
|
+
const merchant_1 = require("./merchant");
|
|
7
|
+
/** Used when the `documents.numbering.timeZone` option is not given. */
|
|
8
|
+
exports.DEFAULT_NUMBERING_TIME_ZONE = "Europe/Vienna";
|
|
9
|
+
const resolveDocumentPluginOptions = (options) => {
|
|
10
|
+
const configuredTimeZone = options?.numbering?.timeZone;
|
|
11
|
+
const timeZone = configuredTimeZone === undefined
|
|
12
|
+
? exports.DEFAULT_NUMBERING_TIME_ZONE
|
|
13
|
+
: configuredTimeZone.trim();
|
|
14
|
+
if (!timeZone) {
|
|
15
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The documents plugin requires a numbering time zone.");
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
new Intl.DateTimeFormat("en", { timeZone }).format();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `The documents numbering time zone '${timeZone}' is invalid.`);
|
|
22
|
+
}
|
|
23
|
+
if (options?.htmlFactory !== undefined &&
|
|
24
|
+
typeof options.htmlFactory !== "function") {
|
|
25
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The documents 'htmlFactory' option must be a function.");
|
|
26
|
+
}
|
|
27
|
+
if (options?.merchant !== undefined &&
|
|
28
|
+
(typeof options.merchant !== "object" || options.merchant === null)) {
|
|
29
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The documents 'merchant' option must be an object.");
|
|
30
|
+
}
|
|
31
|
+
const executablePath = options?.pdf?.executablePath?.trim() || "google-chrome";
|
|
32
|
+
return {
|
|
33
|
+
htmlFactory: options?.htmlFactory ?? (0, html_factory_1.createDefaultDocumentHtmlFactory)({ timeZone }),
|
|
34
|
+
merchantFallback: (0, merchant_1.merchantOptionToFallback)(options?.merchant),
|
|
35
|
+
numbering: { timeZone },
|
|
36
|
+
pdf: { executablePath },
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
exports.resolveDocumentPluginOptions = resolveDocumentPluginOptions;
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFFdkQsNEVBQTRGO0FBTTVGLHlDQUFrRjtBQUVsRix3RUFBd0U7QUFDM0QsUUFBQSwyQkFBMkIsR0FBRyxlQUFlLENBQUE7QUFnQ25ELE1BQU0sNEJBQTRCLEdBQUcsQ0FDMUMsT0FBMEMsRUFDWCxFQUFFO0lBQ2pDLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUE7SUFDdkQsTUFBTSxRQUFRLEdBQ1osa0JBQWtCLEtBQUssU0FBUztRQUM5QixDQUFDLENBQUMsbUNBQTJCO1FBQzdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMvQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixzREFBc0QsQ0FDdkQsQ0FBQTtJQUNILENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUN0RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsc0NBQXNDLFFBQVEsZUFBZSxDQUM5RCxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQ0UsT0FBTyxFQUFFLFdBQVcsS0FBSyxTQUFTO1FBQ2xDLE9BQU8sT0FBTyxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQ3pDLENBQUM7UUFDRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix3REFBd0QsQ0FDekQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUNFLE9BQU8sRUFBRSxRQUFRLEtBQUssU0FBUztRQUMvQixDQUFDLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsRUFDbkUsQ0FBQztRQUNELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG9EQUFvRCxDQUNyRCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLGVBQWUsQ0FBQTtJQUM5RSxPQUFPO1FBQ0wsV0FBVyxFQUNULE9BQU8sRUFBRSxXQUFXLElBQUksSUFBQSwrQ0FBZ0MsRUFBQyxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ3hFLGdCQUFnQixFQUFFLElBQUEsbUNBQXdCLEVBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztRQUM3RCxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUU7UUFDdkIsR0FBRyxFQUFFLEVBQUUsY0FBYyxFQUFFO0tBQ3hCLENBQUE7QUFDSCxDQUFDLENBQUE7QUFuRFksUUFBQSw0QkFBNEIsZ0NBbUR4QyJ9
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isPackingListFulfillmentEligible = exports.formatPackingListNumber = exports.createPackingListLines = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const requireString = (value, field) => {
|
|
6
|
+
if (!value.trim()) {
|
|
7
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Packing-list field '${field}' is empty.`);
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
};
|
|
11
|
+
const requireQuantity = (value, field) => {
|
|
12
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
13
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Packing-list field '${field}' must be a positive integer.`);
|
|
14
|
+
}
|
|
15
|
+
return value;
|
|
16
|
+
};
|
|
17
|
+
const requireIsoDate = (value, field) => {
|
|
18
|
+
const date = new Date(requireString(value, field));
|
|
19
|
+
if (Number.isNaN(date.getTime())) {
|
|
20
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Packing-list field '${field}' must be a valid date.`);
|
|
21
|
+
}
|
|
22
|
+
return date.toISOString();
|
|
23
|
+
};
|
|
24
|
+
const groupKey = (lineItemId, inventoryItemId) => `${lineItemId}\u0000${inventoryItemId ?? ""}`;
|
|
25
|
+
/**
|
|
26
|
+
* Fulfillment items already contain concrete inventory quantities, including
|
|
27
|
+
* variant inventory multipliers. Grouping on the same identity used by Batch
|
|
28
|
+
* Management keeps kits and partial fulfillments independent.
|
|
29
|
+
*/
|
|
30
|
+
const createPackingListLines = (input) => {
|
|
31
|
+
const linesByKey = new Map();
|
|
32
|
+
for (const item of input.fulfillment_items) {
|
|
33
|
+
const lineItemId = requireString(item.line_item_id, "line_item_id");
|
|
34
|
+
const inventoryItemId = item.inventory_item_id
|
|
35
|
+
? requireString(item.inventory_item_id, "inventory_item_id")
|
|
36
|
+
: null;
|
|
37
|
+
const key = groupKey(lineItemId, inventoryItemId);
|
|
38
|
+
const existing = linesByKey.get(key);
|
|
39
|
+
if (existing) {
|
|
40
|
+
if (existing.title !== item.title || existing.sku !== item.sku) {
|
|
41
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Fulfillment item group ${lineItemId} has inconsistent item details.`);
|
|
42
|
+
}
|
|
43
|
+
existing.quantity += requireQuantity(item.quantity, "quantity");
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
linesByKey.set(key, {
|
|
47
|
+
line_item_id: lineItemId,
|
|
48
|
+
inventory_item_id: inventoryItemId,
|
|
49
|
+
title: requireString(item.title, "title"),
|
|
50
|
+
sku: item.sku?.trim() || null,
|
|
51
|
+
quantity: requireQuantity(item.quantity, "quantity"),
|
|
52
|
+
batch_allocations: [],
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
for (const allocation of input.batch_allocations) {
|
|
56
|
+
const key = groupKey(requireString(allocation.line_item_id, "batch.line_item_id"), requireString(allocation.inventory_item_id, "batch.inventory_item_id"));
|
|
57
|
+
const line = linesByKey.get(key);
|
|
58
|
+
if (!line) {
|
|
59
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "A batch allocation does not belong to a fulfillment item.");
|
|
60
|
+
}
|
|
61
|
+
line.batch_allocations.push({
|
|
62
|
+
batch_id: requireString(allocation.batch_id, "batch.batch_id"),
|
|
63
|
+
lot_number: requireString(allocation.lot_number, "batch.lot_number"),
|
|
64
|
+
expiry_date: requireIsoDate(allocation.expiry_date, "batch.expiry_date"),
|
|
65
|
+
quantity: requireQuantity(allocation.quantity, "batch.quantity"),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const lines = [...linesByKey.values()];
|
|
69
|
+
for (const line of lines) {
|
|
70
|
+
line.batch_allocations.sort((left, right) => left.lot_number.localeCompare(right.lot_number) ||
|
|
71
|
+
left.batch_id.localeCompare(right.batch_id));
|
|
72
|
+
if (!input.batch_management_enabled || !line.inventory_item_id) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const allocated = line.batch_allocations.reduce((sum, allocation) => sum + allocation.quantity, 0);
|
|
76
|
+
if (allocated !== line.quantity) {
|
|
77
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Batch allocations for fulfillment item ${line.line_item_id}/${line.inventory_item_id} total ${allocated}, expected ${line.quantity}.`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return lines.sort((left, right) => left.title.localeCompare(right.title) ||
|
|
81
|
+
left.line_item_id.localeCompare(right.line_item_id) ||
|
|
82
|
+
(left.inventory_item_id ?? "").localeCompare(right.inventory_item_id ?? ""));
|
|
83
|
+
};
|
|
84
|
+
exports.createPackingListLines = createPackingListLines;
|
|
85
|
+
const formatPackingListNumber = (input) => `PL-${input.order_display_id ?? input.order_id}-${input.fulfillment_id}`;
|
|
86
|
+
exports.formatPackingListNumber = formatPackingListNumber;
|
|
87
|
+
const isPackingListFulfillmentEligible = (input) => input.requires_shipping !== false &&
|
|
88
|
+
(input.canceled_at === null || input.canceled_at === undefined);
|
|
89
|
+
exports.isPackingListFulfillmentEligible = isPackingListFulfillmentEligible;
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZG9jdW1lbnRzL2RvbWFpbi9wYWNraW5nLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXVEO0FBb0J2RCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQVUsRUFBRTtJQUM3RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyx1QkFBdUIsS0FBSyxhQUFhLENBQzFDLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDLENBQUE7QUFFRCxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQVUsRUFBRTtJQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyx1QkFBdUIsS0FBSywrQkFBK0IsQ0FDNUQsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUMsQ0FBQTtBQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYSxFQUFFLEtBQWEsRUFBVSxFQUFFO0lBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNsRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFL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
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeDocumentSnapshot = void 0;
|
|
4
|
+
/** Adds fields introduced after older document snapshots were persisted. */
|
|
5
|
+
const normalizeDocumentSnapshot = (snapshot) => ({
|
|
6
|
+
...snapshot,
|
|
7
|
+
order: {
|
|
8
|
+
...snapshot.order,
|
|
9
|
+
tax_compliance: snapshot.order.tax_compliance ?? null,
|
|
10
|
+
},
|
|
11
|
+
totals: {
|
|
12
|
+
...snapshot.totals,
|
|
13
|
+
tax_breakdown: snapshot.totals.tax_breakdown ?? [],
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
exports.normalizeDocumentSnapshot = normalizeDocumentSnapshot;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3Qtbm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vc25hcHNob3Qtbm9ybWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw0RUFBNEU7QUFDckUsTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxRQUEwQixFQUNSLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLEdBQUcsUUFBUTtJQUNYLEtBQUssRUFBRTtRQUNMLEdBQUcsUUFBUSxDQUFDLEtBQUs7UUFDakIsY0FBYyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUk7S0FDdEQ7SUFDRCxNQUFNLEVBQUU7UUFDTixHQUFHLFFBQVEsQ0FBQyxNQUFNO1FBQ2xCLGFBQWEsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFO0tBQ25EO0NBQ0YsQ0FBQyxDQUFBO0FBWlcsUUFBQSx5QkFBeUIsNkJBWXBDIn0=
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.roundTaxBreakdown = exports.groupTaxLines = exports.getCurrencyDecimalPlaces = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const DEFAULT_CURRENCY_DECIMAL_PLACES = 2;
|
|
6
|
+
const getCurrencyDecimalPlaces = (currencyCode) => utils_1.defaultCurrencies[currencyCode.toUpperCase()]?.decimal_digits ??
|
|
7
|
+
DEFAULT_CURRENCY_DECIMAL_PLACES;
|
|
8
|
+
exports.getCurrencyDecimalPlaces = getCurrencyDecimalPlaces;
|
|
9
|
+
/**
|
|
10
|
+
* Sums item and shipping tax lines per configured tax rate. Lines with the
|
|
11
|
+
* same name and percentage form one entry; first occurrence defines order.
|
|
12
|
+
*/
|
|
13
|
+
const groupTaxLines = (lines, currencyCode) => {
|
|
14
|
+
const groups = new Map();
|
|
15
|
+
for (const line of lines) {
|
|
16
|
+
const key = JSON.stringify([line.name, line.code, line.rate]);
|
|
17
|
+
const group = groups.get(key);
|
|
18
|
+
groups.set(key, {
|
|
19
|
+
name: line.name,
|
|
20
|
+
code: line.code,
|
|
21
|
+
rate: line.rate,
|
|
22
|
+
tax_total: {
|
|
23
|
+
amount: utils_1.MathBN.add(group?.tax_total.amount ?? 0, line.amount).toFixed(),
|
|
24
|
+
currency_code: currencyCode,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return [...groups.values()];
|
|
29
|
+
};
|
|
30
|
+
exports.groupTaxLines = groupTaxLines;
|
|
31
|
+
/**
|
|
32
|
+
* Rounds every entry to the currency's minor unit and assigns the rounding
|
|
33
|
+
* residue to the largest entry, so the printed rows add up exactly to the
|
|
34
|
+
* printed tax total. A residue larger than the accumulated rounding error
|
|
35
|
+
* means the entries do not describe the total and is rejected.
|
|
36
|
+
*/
|
|
37
|
+
const roundTaxBreakdown = (entries, taxTotal) => {
|
|
38
|
+
if (entries.length === 0) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
const currencyCode = taxTotal.currency_code;
|
|
42
|
+
const decimalPlaces = (0, exports.getCurrencyDecimalPlaces)(currencyCode);
|
|
43
|
+
const target = utils_1.MathBN.convert(taxTotal.amount).decimalPlaces(decimalPlaces);
|
|
44
|
+
const rounded = entries.map((entry) => {
|
|
45
|
+
if (entry.tax_total.currency_code !== currencyCode) {
|
|
46
|
+
throw new Error("The tax breakdown contains mixed currencies.");
|
|
47
|
+
}
|
|
48
|
+
return utils_1.MathBN.convert(entry.tax_total.amount).decimalPlaces(decimalPlaces);
|
|
49
|
+
});
|
|
50
|
+
const residue = utils_1.MathBN.sub(target, utils_1.MathBN.sum(...rounded));
|
|
51
|
+
const minorUnit = utils_1.MathBN.convert(10).pow(-decimalPlaces);
|
|
52
|
+
if (utils_1.MathBN.gt(residue.abs(), utils_1.MathBN.mult(minorUnit, entries.length))) {
|
|
53
|
+
throw new Error("The tax breakdown does not match the tax total.");
|
|
54
|
+
}
|
|
55
|
+
const largestIndex = rounded.reduce((largest, amount, index) => utils_1.MathBN.gt(amount.abs(), rounded[largest].abs()) ? index : largest, 0);
|
|
56
|
+
rounded[largestIndex] = utils_1.MathBN.add(rounded[largestIndex], residue);
|
|
57
|
+
return entries.map((entry, index) => ({
|
|
58
|
+
...entry,
|
|
59
|
+
tax_total: {
|
|
60
|
+
amount: rounded[index].toFixed(decimalPlaces),
|
|
61
|
+
currency_code: currencyCode,
|
|
62
|
+
},
|
|
63
|
+
}));
|
|
64
|
+
};
|
|
65
|
+
exports.roundTaxBreakdown = roundTaxBreakdown;
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWJyZWFrZG93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vdGF4LWJyZWFrZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBcUU7QUFPckUsTUFBTSwrQkFBK0IsR0FBRyxDQUFDLENBQUE7QUFFbEMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFlBQW9CLEVBQVUsRUFBRSxDQUN2RSx5QkFBaUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxjQUFjO0lBQzdELCtCQUErQixDQUFBO0FBRnBCLFFBQUEsd0JBQXdCLDRCQUVKO0FBU2pDOzs7R0FHRztBQUNJLE1BQU0sYUFBYSxHQUFHLENBQzNCLEtBQXNCLEVBQ3RCLFlBQW9CLEVBQ1MsRUFBRTtJQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBcUMsQ0FBQTtJQUMzRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDN0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFNBQVMsRUFBRTtnQkFDVCxNQUFNLEVBQUUsY0FBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FB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
|
|
@@ -0,0 +1,15 @@
|
|
|
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.DOCUMENTS_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const assert_private_file_storage_1 = __importDefault(require("./loaders/assert-private-file-storage"));
|
|
9
|
+
const service_1 = __importDefault(require("./service"));
|
|
10
|
+
exports.DOCUMENTS_MODULE = "documents";
|
|
11
|
+
exports.default = (0, utils_1.Module)(exports.DOCUMENTS_MODULE, {
|
|
12
|
+
service: service_1.default,
|
|
13
|
+
loaders: [assert_private_file_storage_1.default],
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kb2N1bWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBRWxELHdHQUE0RTtBQUM1RSx3REFBOEM7QUFFakMsUUFBQSxnQkFBZ0IsR0FBRyxXQUFXLENBQUE7QUFFM0Msa0JBQWUsSUFBQSxjQUFNLEVBQUMsd0JBQWdCLEVBQUU7SUFDdEMsT0FBTyxFQUFFLGlCQUFzQjtJQUMvQixPQUFPLEVBQUUsQ0FBQyxxQ0FBd0IsQ0FBQztDQUNwQyxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = warnAboutPublicFileStorage;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const private_file_storage_1 = require("../../../documents/utils/private-file-storage");
|
|
6
|
+
/**
|
|
7
|
+
* Warns at startup when issued documents would be publicly downloadable. It
|
|
8
|
+
* does not refuse to boot: the documents module ships with the base plugin,
|
|
9
|
+
* so a shop on Medusa's default file storage must still start. Issuance itself
|
|
10
|
+
* refuses to write a document in that case (`assertPrivateFileStorage`).
|
|
11
|
+
*/
|
|
12
|
+
async function warnAboutPublicFileStorage({ container, }) {
|
|
13
|
+
const problem = (0, private_file_storage_1.findPubliclyServedPrivateFileStorage)(container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE), process.cwd());
|
|
14
|
+
if (problem) {
|
|
15
|
+
container
|
|
16
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
17
|
+
.warn(`Documents cannot be issued: ${problem}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0LXByaXZhdGUtZmlsZS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZG9jdW1lbnRzL2xvYWRlcnMvYXNzZXJ0LXByaXZhdGUtZmlsZS1zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0EsNkNBWUM7QUF0QkQscURBQXFFO0FBRXJFLHdGQUFvRztBQUVwRzs7Ozs7R0FLRztBQUNZLEtBQUssVUFBVSwwQkFBMEIsQ0FBQyxFQUN2RCxTQUFTLEdBQ0s7SUFDZCxNQUFNLE9BQU8sR0FBRyxJQUFBLDJEQUFvQyxFQUNsRCxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxFQUMxRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQ2QsQ0FBQTtJQUNELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixTQUFTO2FBQ04sT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQzthQUN6QyxJQUFJLENBQUMsK0JBQStCLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDbkQsQ0FBQztBQUNILENBQUMifQ==
|