@hszrdm/core 1.4.0 → 1.5.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 +5582 -3769
- package/.medusa/server/src/admin/index.mjs +5582 -3769
- package/.medusa/server/src/api/admin/back-in-stock/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/back-in-stock/route.js +70 -0
- package/.medusa/server/src/api/admin/customer-activation/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/customer-activation/route.js +97 -0
- package/.medusa/server/src/api/admin/customer-import/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/customer-import/route.js +166 -0
- package/.medusa/server/src/api/admin/order-export/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/order-export/route.js +88 -0
- package/.medusa/server/src/api/admin/product-migration/inventory/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-migration/inventory/route.js +164 -0
- package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.js +204 -0
- package/.medusa/server/src/api/admin/product-migration/products/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/product-migration/products/route.js +24 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/route.js +36 -4
- package/.medusa/server/src/api/admin/product-reviews/settings/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-reviews/settings/route.js +63 -0
- package/.medusa/server/src/api/admin/system-runtime/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/system-runtime/route.js +18 -0
- package/.medusa/server/src/api/hooks/packeta/status/route.d.ts +2 -0
- package/.medusa/server/src/api/hooks/packeta/status/route.js +55 -0
- package/.medusa/server/src/api/middlewares.js +16 -1
- package/.medusa/server/src/api/store/abandoned-cart/recover/route.d.ts +2 -0
- package/.medusa/server/src/api/store/abandoned-cart/recover/route.js +37 -0
- package/.medusa/server/src/api/store/back-in-stock/route.d.ts +8 -0
- package/.medusa/server/src/api/store/back-in-stock/route.js +124 -0
- package/.medusa/server/src/api/store/customer-activation/complete/route.d.ts +2 -0
- package/.medusa/server/src/api/store/customer-activation/complete/route.js +96 -0
- package/.medusa/server/src/api/store/customer-activation/route.d.ts +2 -0
- package/.medusa/server/src/api/store/customer-activation/route.js +34 -0
- package/.medusa/server/src/api/store/products/[id]/reviews/route.d.ts +1 -0
- package/.medusa/server/src/api/store/products/[id]/reviews/route.js +76 -34
- package/.medusa/server/src/api/store/review-request/route.d.ts +2 -0
- package/.medusa/server/src/api/store/review-request/route.js +60 -0
- package/.medusa/server/src/core/abandoned-cart.d.ts +64 -0
- package/.medusa/server/src/core/abandoned-cart.js +197 -0
- package/.medusa/server/src/core/back-in-stock.d.ts +51 -0
- package/.medusa/server/src/core/back-in-stock.js +107 -0
- package/.medusa/server/src/core/checkout-contract.d.ts +1 -0
- package/.medusa/server/src/core/checkout-contract.js +2 -1
- package/.medusa/server/src/core/customer-account-contract.d.ts +3 -0
- package/.medusa/server/src/core/customer-account-contract.js +4 -1
- package/.medusa/server/src/core/customer-activation.d.ts +120 -0
- package/.medusa/server/src/core/customer-activation.js +169 -0
- package/.medusa/server/src/core/customer-email.d.ts +1 -1
- package/.medusa/server/src/core/customer-email.js +4 -1
- package/.medusa/server/src/core/native-migration-export.d.ts +6 -0
- package/.medusa/server/src/core/native-migration-export.js +105 -0
- package/.medusa/server/src/core/order-export.d.ts +11 -0
- package/.medusa/server/src/core/order-export.js +297 -0
- package/.medusa/server/src/core/review-request.d.ts +61 -0
- package/.medusa/server/src/core/review-request.js +105 -0
- package/.medusa/server/src/core/review-reward.d.ts +94 -0
- package/.medusa/server/src/core/review-reward.js +124 -0
- package/.medusa/server/src/core/runtime-health.d.ts +39 -0
- package/.medusa/server/src/core/runtime-health.js +250 -0
- package/.medusa/server/src/core/storefront-core-config.d.ts +10 -0
- package/.medusa/server/src/core/storefront-core-config.js +26 -1
- package/.medusa/server/src/core/version.d.ts +2 -2
- package/.medusa/server/src/core/version.js +2 -2
- package/.medusa/server/src/jobs/abandoned-cart-recovery.d.ts +23 -0
- package/.medusa/server/src/jobs/abandoned-cart-recovery.js +138 -0
- package/.medusa/server/src/jobs/back-in-stock-reconciliation.d.ts +15 -0
- package/.medusa/server/src/jobs/back-in-stock-reconciliation.js +90 -0
- package/.medusa/server/src/jobs/dpd-statusdata-sync.d.ts +17 -0
- package/.medusa/server/src/jobs/dpd-statusdata-sync.js +107 -0
- package/.medusa/server/src/jobs/mpl-push-tracking.d.ts +19 -0
- package/.medusa/server/src/jobs/mpl-push-tracking.js +183 -0
- package/.medusa/server/src/jobs/mpl-status-sync.d.ts +8 -2
- package/.medusa/server/src/jobs/mpl-status-sync.js +12 -7
- package/.medusa/server/src/jobs/product-review-request-dispatch.d.ts +28 -0
- package/.medusa/server/src/jobs/product-review-request-dispatch.js +84 -0
- package/.medusa/server/src/jobs/runtime-heartbeat.d.ts +12 -0
- package/.medusa/server/src/jobs/runtime-heartbeat.js +13 -0
- package/.medusa/server/src/jobs/shipping-status-sync.d.ts +8 -2
- package/.medusa/server/src/jobs/shipping-status-sync.js +11 -14
- package/.medusa/server/src/lib/modules/shipping/idempotency.js +3 -3
- package/.medusa/server/src/lib/modules/shipping/index.d.ts +1 -0
- package/.medusa/server/src/lib/modules/shipping/index.js +2 -1
- package/.medusa/server/src/lib/modules/shipping/tracking.d.ts +48 -0
- package/.medusa/server/src/lib/modules/shipping/tracking.js +368 -0
- package/.medusa/server/src/lib/modules/shipping/webhooks.d.ts +6 -9
- package/.medusa/server/src/lib/modules/shipping/webhooks.js +24 -137
- package/.medusa/server/src/modules/back-in-stock/index.d.ts +23 -0
- package/.medusa/server/src/modules/back-in-stock/index.js +16 -0
- package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.d.ts +5 -0
- package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.js +18 -0
- package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.d.ts +13 -0
- package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.js +23 -0
- package/.medusa/server/src/modules/back-in-stock/service.d.ts +22 -0
- package/.medusa/server/src/modules/back-in-stock/service.js +12 -0
- package/.medusa/server/src/modules/email-center/abandoned-cart-registration.d.ts +1 -0
- package/.medusa/server/src/modules/email-center/abandoned-cart-registration.js +27 -0
- package/.medusa/server/src/modules/email-center/back-in-stock-registration.d.ts +1 -0
- package/.medusa/server/src/modules/email-center/back-in-stock-registration.js +27 -0
- package/.medusa/server/src/modules/email-center/defaults.js +7 -1
- package/.medusa/server/src/modules/email-center/index.d.ts +2 -0
- package/.medusa/server/src/modules/email-center/index.js +3 -1
- package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.d.ts +1 -0
- package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.js +30 -0
- package/.medusa/server/src/modules/integration-settings/index.d.ts +1 -0
- package/.medusa/server/src/modules/integration-settings/index.js +2 -1
- package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -1
- package/.medusa/server/src/modules/product-review/index.d.ts +14 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.js +28 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.js +20 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.js +18 -0
- package/.medusa/server/src/modules/product-review/models/product-review-settings.d.ts +15 -0
- package/.medusa/server/src/modules/product-review/models/product-review-settings.js +19 -0
- package/.medusa/server/src/modules/product-review/models/product-review.d.ts +6 -2
- package/.medusa/server/src/modules/product-review/models/product-review.js +7 -3
- package/.medusa/server/src/modules/product-review/service.d.ts +22 -1
- package/.medusa/server/src/modules/product-review/service.js +3 -2
- package/.medusa/server/src/providers/dpd/index.d.ts +2 -0
- package/.medusa/server/src/providers/dpd/index.js +3 -1
- package/.medusa/server/src/providers/dpd/statusdata-ftp.d.ts +16 -0
- package/.medusa/server/src/providers/dpd/statusdata-ftp.js +268 -0
- package/.medusa/server/src/providers/dpd/statusdata.d.ts +14 -0
- package/.medusa/server/src/providers/dpd/statusdata.js +161 -0
- package/.medusa/server/src/providers/mpl/client.d.ts +3 -1
- package/.medusa/server/src/providers/mpl/client.js +154 -2
- package/.medusa/server/src/providers/mpl/service.js +31 -20
- package/.medusa/server/src/providers/mpl/types.d.ts +25 -0
- package/.medusa/server/src/providers/mpl/types.js +1 -1
- package/.medusa/server/src/providers/packeta/index.d.ts +1 -0
- package/.medusa/server/src/providers/packeta/index.js +2 -1
- package/.medusa/server/src/providers/packeta/push-tracking.d.ts +8 -0
- package/.medusa/server/src/providers/packeta/push-tracking.js +96 -0
- package/.medusa/server/src/providers/packeta/service.js +22 -2
- package/.medusa/server/src/scripts/core-init.d.ts +1 -1
- package/.medusa/server/src/scripts/core-init.js +3 -2
- package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.d.ts +7 -0
- package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.js +65 -0
- package/.medusa/server/src/workflows/link-migrated-customer.d.ts +8 -0
- package/.medusa/server/src/workflows/link-migrated-customer.js +17 -0
- package/package.json +2 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.exportNativeMigrationCsv = exportNativeMigrationCsv;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
7
|
+
const PRODUCT_EXPORT_FIELDS = [
|
|
8
|
+
"id",
|
|
9
|
+
"title",
|
|
10
|
+
"subtitle",
|
|
11
|
+
"status",
|
|
12
|
+
"external_id",
|
|
13
|
+
"description",
|
|
14
|
+
"handle",
|
|
15
|
+
"is_giftcard",
|
|
16
|
+
"discountable",
|
|
17
|
+
"thumbnail",
|
|
18
|
+
"collection_id",
|
|
19
|
+
"type_id",
|
|
20
|
+
"weight",
|
|
21
|
+
"length",
|
|
22
|
+
"height",
|
|
23
|
+
"width",
|
|
24
|
+
"hs_code",
|
|
25
|
+
"origin_country",
|
|
26
|
+
"mid_code",
|
|
27
|
+
"material",
|
|
28
|
+
"created_at",
|
|
29
|
+
"updated_at",
|
|
30
|
+
"deleted_at",
|
|
31
|
+
"metadata",
|
|
32
|
+
"*type",
|
|
33
|
+
"*collection",
|
|
34
|
+
"*options",
|
|
35
|
+
"*options.values",
|
|
36
|
+
"*tags",
|
|
37
|
+
"*images",
|
|
38
|
+
"*variants",
|
|
39
|
+
"*variants.prices",
|
|
40
|
+
"variants.prices.price_rules.value",
|
|
41
|
+
"variants.prices.price_rules.attribute",
|
|
42
|
+
"*variants.options",
|
|
43
|
+
"*variants.images",
|
|
44
|
+
"*sales_channels",
|
|
45
|
+
].map((field) => field.replace("variants.prices.", "variants.price_set.prices."));
|
|
46
|
+
const INVENTORY_EXPORT_FIELDS = [
|
|
47
|
+
"id",
|
|
48
|
+
"sku",
|
|
49
|
+
"title",
|
|
50
|
+
"description",
|
|
51
|
+
"thumbnail",
|
|
52
|
+
"origin_country",
|
|
53
|
+
"hs_code",
|
|
54
|
+
"requires_shipping",
|
|
55
|
+
"mid_code",
|
|
56
|
+
"material",
|
|
57
|
+
"unit_of_measure",
|
|
58
|
+
"weight",
|
|
59
|
+
"length",
|
|
60
|
+
"height",
|
|
61
|
+
"width",
|
|
62
|
+
"metadata",
|
|
63
|
+
"reserved_quantity",
|
|
64
|
+
"stocked_quantity",
|
|
65
|
+
"created_at",
|
|
66
|
+
"updated_at",
|
|
67
|
+
"*location_levels",
|
|
68
|
+
];
|
|
69
|
+
const productMigrationExportWorkflow = (0, workflows_sdk_1.createWorkflow)("hszrdm-product-migration-export", (input) => {
|
|
70
|
+
const file = (0, core_flows_1.exportProductsStep)(input);
|
|
71
|
+
return new workflows_sdk_1.WorkflowResponse(file);
|
|
72
|
+
});
|
|
73
|
+
const inventoryMigrationExportWorkflow = (0, workflows_sdk_1.createWorkflow)("hszrdm-inventory-migration-export", (input) => {
|
|
74
|
+
const file = (0, core_flows_1.exportInventoryItemsStep)(input);
|
|
75
|
+
return new workflows_sdk_1.WorkflowResponse(file);
|
|
76
|
+
});
|
|
77
|
+
async function exportNativeMigrationCsv(scope, kind) {
|
|
78
|
+
const workflow = kind === "products"
|
|
79
|
+
? productMigrationExportWorkflow
|
|
80
|
+
: inventoryMigrationExportWorkflow;
|
|
81
|
+
const select = kind === "products" ? PRODUCT_EXPORT_FIELDS : INVENTORY_EXPORT_FIELDS;
|
|
82
|
+
const { result } = await workflow(scope).run({
|
|
83
|
+
input: {
|
|
84
|
+
select,
|
|
85
|
+
batch_size: 250,
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
const fileId = String(result?.id || "").trim();
|
|
89
|
+
const filename = String(result?.filename || `${kind}.csv`).trim();
|
|
90
|
+
if (!fileId) {
|
|
91
|
+
throw new Error("A Medusa natív export nem adott vissza fájlazonosítót.");
|
|
92
|
+
}
|
|
93
|
+
const fileModule = scope.resolve(utils_1.Modules.FILE);
|
|
94
|
+
try {
|
|
95
|
+
const buffer = await fileModule.getAsBuffer(fileId);
|
|
96
|
+
return {
|
|
97
|
+
filename,
|
|
98
|
+
csv: buffer.toString("utf8"),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
await fileModule.deleteFiles(fileId).catch(() => undefined);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLW1pZ3JhdGlvbi1leHBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9uYXRpdmUtbWlncmF0aW9uLWV4cG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXlGQSw0REFzQ0M7QUEvSEQscURBQW1EO0FBQ25ELHFFQUFvRjtBQUNwRiw0REFHb0M7QUFFcEMsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixJQUFJO0lBQ0osT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsYUFBYTtJQUNiLGFBQWE7SUFDYixRQUFRO0lBQ1IsYUFBYTtJQUNiLGNBQWM7SUFDZCxXQUFXO0lBQ1gsZUFBZTtJQUNmLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsVUFBVTtJQUNWLFlBQVk7SUFDWixZQUFZO0lBQ1osWUFBWTtJQUNaLFVBQVU7SUFDVixPQUFPO0lBQ1AsYUFBYTtJQUNiLFVBQVU7SUFDVixpQkFBaUI7SUFDakIsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLG1DQUFtQztJQUNuQyx1Q0FBdUM7SUFDdkMsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixpQkFBaUI7Q0FDbEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNkLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsNEJBQTRCLENBQUMsQ0FDaEUsQ0FBQTtBQUVELE1BQU0sdUJBQXVCLEdBQUc7SUFDOUIsSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsYUFBYTtJQUNiLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsU0FBUztJQUNULG1CQUFtQjtJQUNuQixVQUFVO0lBQ1YsVUFBVTtJQUNWLGlCQUFpQjtJQUNqQixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsVUFBVTtJQUNWLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLFlBQVk7SUFDWixrQkFBa0I7Q0FDbkIsQ0FBQTtBQUVELE1BQU0sOEJBQThCLEdBQUcsSUFBQSw4QkFBYyxFQUNuRCxpQ0FBaUMsRUFDakMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtJQUNiLE1BQU0sSUFBSSxHQUFHLElBQUEsK0JBQWtCLEVBQUMsS0FBSyxDQUFDLENBQUE7SUFDdEMsT0FBTyxJQUFJLGdDQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ25DLENBQUMsQ0FDRixDQUFBO0FBRUQsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFBLDhCQUFjLEVBQ3JELG1DQUFtQyxFQUNuQyxDQUFDLEtBQVUsRUFBRSxFQUFFO0lBQ2IsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQ0FBd0IsRUFBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QyxPQUFPLElBQUksZ0NBQWdCLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDbkMsQ0FBQyxDQUNGLENBQUE7QUFFTSxLQUFLLFVBQVUsd0JBQXdCLENBQzVDLEtBQXdDLEVBQ3hDLElBQThCO0lBRTlCLE1BQU0sUUFBUSxHQUNaLElBQUksS0FBSyxVQUFVO1FBQ2pCLENBQUMsQ0FBQyw4QkFBOEI7UUFDaEMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFBO0lBQ3RDLE1BQU0sTUFBTSxHQUNWLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQTtJQUV2RSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBWSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2xELEtBQUssRUFBRTtZQUNMLE1BQU07WUFDTixVQUFVLEVBQUUsR0FBRztTQUNoQjtLQUNGLENBQUMsQ0FBQTtJQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBRSxNQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBRSxNQUFjLEVBQUUsUUFBUSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMxRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLElBQUksQ0FHNUMsQ0FBQTtJQUVELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNuRCxPQUFPO1lBQ0wsUUFBUTtZQUNSLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUM3QixDQUFBO0lBQ0gsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzdELENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const ORDER_EXPORT_HEADERS: readonly ["Order Id", "Display Id", "Order Date", "Order Status", "Currency", "Customer Id", "Customer Email", "Customer First Name", "Customer Last Name", "Billing Company", "Billing Tax Number", "Billing EU Tax Number", "Billing Tax Type", "Billing First Name", "Billing Last Name", "Billing Address 1", "Billing Address 2", "Billing City", "Billing Postal Code", "Billing Province", "Billing Country Code", "Billing Phone", "Shipping First Name", "Shipping Last Name", "Shipping Company", "Shipping Address 1", "Shipping Address 2", "Shipping City", "Shipping Postal Code", "Shipping Province", "Shipping Country Code", "Shipping Phone", "Item Id", "Variant Id", "SKU", "Product Title", "Variant Title", "Quantity", "Unit Price", "Item Subtotal", "Item Discount Total", "Item Tax Total", "Item Total", "Order Subtotal", "Shipping Total", "Order Discount Total", "Order Tax Total", "Order Total", "Payment Status", "Payment Provider", "Payment Amount", "Captured Amount", "Refunded Amount", "Shipping Method", "Fulfillment Provider", "Tracking Number", "Billingo Document Id", "Billingo Invoice Number", "Billingo Payment Status", "Billingo Notification Status", "Billingo Online Szamla Status", "Billingo Gross Total", "Billingo Currency", "Billingo Cancelled", "Billingo Sent At", "Billingo Cancellation Document Id", "Billingo Cancellation Invoice Number", "Billingo Modification Document Id", "Billingo Modification Invoice Number", "Billingo Modified At", "Billingo Proforma Document Id", "Billingo Proforma Number", "Billingo Proforma Converted Document Id", "Billingo Proforma Converted Invoice Number", "Billingo Proforma Archived", "Billingo Proforma Archived At"];
|
|
2
|
+
export declare const ORDER_EXPORT_NUMERIC_HEADERS: Set<string>;
|
|
3
|
+
type AnyRecord = Record<string, any>;
|
|
4
|
+
export type OrderExportTable = {
|
|
5
|
+
headers: string[];
|
|
6
|
+
rows: string[][];
|
|
7
|
+
order_count: number;
|
|
8
|
+
line_count: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function ordersToAccountingTable(orders: AnyRecord[]): OrderExportTable;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ORDER_EXPORT_NUMERIC_HEADERS = exports.ORDER_EXPORT_HEADERS = void 0;
|
|
4
|
+
exports.ordersToAccountingTable = ordersToAccountingTable;
|
|
5
|
+
exports.ORDER_EXPORT_HEADERS = [
|
|
6
|
+
"Order Id",
|
|
7
|
+
"Display Id",
|
|
8
|
+
"Order Date",
|
|
9
|
+
"Order Status",
|
|
10
|
+
"Currency",
|
|
11
|
+
"Customer Id",
|
|
12
|
+
"Customer Email",
|
|
13
|
+
"Customer First Name",
|
|
14
|
+
"Customer Last Name",
|
|
15
|
+
"Billing Company",
|
|
16
|
+
"Billing Tax Number",
|
|
17
|
+
"Billing EU Tax Number",
|
|
18
|
+
"Billing Tax Type",
|
|
19
|
+
"Billing First Name",
|
|
20
|
+
"Billing Last Name",
|
|
21
|
+
"Billing Address 1",
|
|
22
|
+
"Billing Address 2",
|
|
23
|
+
"Billing City",
|
|
24
|
+
"Billing Postal Code",
|
|
25
|
+
"Billing Province",
|
|
26
|
+
"Billing Country Code",
|
|
27
|
+
"Billing Phone",
|
|
28
|
+
"Shipping First Name",
|
|
29
|
+
"Shipping Last Name",
|
|
30
|
+
"Shipping Company",
|
|
31
|
+
"Shipping Address 1",
|
|
32
|
+
"Shipping Address 2",
|
|
33
|
+
"Shipping City",
|
|
34
|
+
"Shipping Postal Code",
|
|
35
|
+
"Shipping Province",
|
|
36
|
+
"Shipping Country Code",
|
|
37
|
+
"Shipping Phone",
|
|
38
|
+
"Item Id",
|
|
39
|
+
"Variant Id",
|
|
40
|
+
"SKU",
|
|
41
|
+
"Product Title",
|
|
42
|
+
"Variant Title",
|
|
43
|
+
"Quantity",
|
|
44
|
+
"Unit Price",
|
|
45
|
+
"Item Subtotal",
|
|
46
|
+
"Item Discount Total",
|
|
47
|
+
"Item Tax Total",
|
|
48
|
+
"Item Total",
|
|
49
|
+
"Order Subtotal",
|
|
50
|
+
"Shipping Total",
|
|
51
|
+
"Order Discount Total",
|
|
52
|
+
"Order Tax Total",
|
|
53
|
+
"Order Total",
|
|
54
|
+
"Payment Status",
|
|
55
|
+
"Payment Provider",
|
|
56
|
+
"Payment Amount",
|
|
57
|
+
"Captured Amount",
|
|
58
|
+
"Refunded Amount",
|
|
59
|
+
"Shipping Method",
|
|
60
|
+
"Fulfillment Provider",
|
|
61
|
+
"Tracking Number",
|
|
62
|
+
"Billingo Document Id",
|
|
63
|
+
"Billingo Invoice Number",
|
|
64
|
+
"Billingo Payment Status",
|
|
65
|
+
"Billingo Notification Status",
|
|
66
|
+
"Billingo Online Szamla Status",
|
|
67
|
+
"Billingo Gross Total",
|
|
68
|
+
"Billingo Currency",
|
|
69
|
+
"Billingo Cancelled",
|
|
70
|
+
"Billingo Sent At",
|
|
71
|
+
"Billingo Cancellation Document Id",
|
|
72
|
+
"Billingo Cancellation Invoice Number",
|
|
73
|
+
"Billingo Modification Document Id",
|
|
74
|
+
"Billingo Modification Invoice Number",
|
|
75
|
+
"Billingo Modified At",
|
|
76
|
+
"Billingo Proforma Document Id",
|
|
77
|
+
"Billingo Proforma Number",
|
|
78
|
+
"Billingo Proforma Converted Document Id",
|
|
79
|
+
"Billingo Proforma Converted Invoice Number",
|
|
80
|
+
"Billingo Proforma Archived",
|
|
81
|
+
"Billingo Proforma Archived At",
|
|
82
|
+
];
|
|
83
|
+
exports.ORDER_EXPORT_NUMERIC_HEADERS = new Set([
|
|
84
|
+
"Display Id",
|
|
85
|
+
"Quantity",
|
|
86
|
+
"Unit Price",
|
|
87
|
+
"Item Subtotal",
|
|
88
|
+
"Item Discount Total",
|
|
89
|
+
"Item Tax Total",
|
|
90
|
+
"Item Total",
|
|
91
|
+
"Order Subtotal",
|
|
92
|
+
"Shipping Total",
|
|
93
|
+
"Order Discount Total",
|
|
94
|
+
"Order Tax Total",
|
|
95
|
+
"Order Total",
|
|
96
|
+
"Payment Amount",
|
|
97
|
+
"Captured Amount",
|
|
98
|
+
"Refunded Amount",
|
|
99
|
+
"Billingo Document Id",
|
|
100
|
+
"Billingo Gross Total",
|
|
101
|
+
"Billingo Cancellation Document Id",
|
|
102
|
+
"Billingo Modification Document Id",
|
|
103
|
+
"Billingo Proforma Document Id",
|
|
104
|
+
"Billingo Proforma Converted Document Id",
|
|
105
|
+
]);
|
|
106
|
+
function ordersToAccountingTable(orders) {
|
|
107
|
+
const rows = [];
|
|
108
|
+
for (const order of orders) {
|
|
109
|
+
const items = Array.isArray(order.items) && order.items.length ? order.items : [null];
|
|
110
|
+
const customer = asRecord(order.customer);
|
|
111
|
+
const billing = asRecord(order.billing_address);
|
|
112
|
+
const shipping = asRecord(order.shipping_address);
|
|
113
|
+
const metadata = asRecord(order.metadata);
|
|
114
|
+
const billingo = asRecord(metadata.billingo);
|
|
115
|
+
const proforma = asRecord(metadata.billingo_proforma);
|
|
116
|
+
const paymentCollections = array(order.payment_collections);
|
|
117
|
+
const payments = paymentCollections.flatMap((collection) => array(collection?.payments));
|
|
118
|
+
const paymentSessions = paymentCollections.flatMap((collection) => array(collection?.payment_sessions));
|
|
119
|
+
const paymentProviders = unique([
|
|
120
|
+
...payments.map((payment) => text(payment?.provider_id)),
|
|
121
|
+
...paymentSessions.map((session) => text(session?.provider_id)),
|
|
122
|
+
]);
|
|
123
|
+
const paymentStatuses = unique(paymentCollections.map((collection) => text(collection?.status)));
|
|
124
|
+
const paymentAmount = sumDirect(paymentCollections, "amount");
|
|
125
|
+
const capturedAmount = sumDirect(paymentCollections, "captured_amount");
|
|
126
|
+
const refundedAmount = sumDirect(paymentCollections, "refunded_amount");
|
|
127
|
+
const shippingMethods = array(order.shipping_methods);
|
|
128
|
+
const fulfillments = array(order.fulfillments);
|
|
129
|
+
const shippingMethodNames = unique(shippingMethods.map((method) => text(method?.name || method?.shipping_option?.name)));
|
|
130
|
+
const fulfillmentProviders = unique(fulfillments.map((fulfillment) => text(fulfillment?.provider_id)));
|
|
131
|
+
const trackingNumbers = unique(fulfillments.flatMap(readTrackingNumbers));
|
|
132
|
+
const common = {
|
|
133
|
+
"Order Id": text(order.id),
|
|
134
|
+
"Display Id": text(order.display_id),
|
|
135
|
+
"Order Date": iso(order.created_at),
|
|
136
|
+
"Order Status": text(order.status),
|
|
137
|
+
"Currency": text(order.currency_code).toUpperCase(),
|
|
138
|
+
"Customer Id": text(customer.id || order.customer_id),
|
|
139
|
+
"Customer Email": text(customer.email || order.email),
|
|
140
|
+
"Customer First Name": text(customer.first_name || billing.first_name),
|
|
141
|
+
"Customer Last Name": text(customer.last_name || billing.last_name),
|
|
142
|
+
"Billing Company": text(billing.company),
|
|
143
|
+
"Billing Tax Number": text(metadata.billing_tax_number || metadata.tax_number),
|
|
144
|
+
"Billing EU Tax Number": text(metadata.billing_eu_tax_number || metadata.eu_tax_number),
|
|
145
|
+
"Billing Tax Type": text(metadata.billing_tax_type),
|
|
146
|
+
"Billing First Name": text(billing.first_name),
|
|
147
|
+
"Billing Last Name": text(billing.last_name),
|
|
148
|
+
"Billing Address 1": text(billing.address_1),
|
|
149
|
+
"Billing Address 2": text(billing.address_2),
|
|
150
|
+
"Billing City": text(billing.city),
|
|
151
|
+
"Billing Postal Code": text(billing.postal_code),
|
|
152
|
+
"Billing Province": text(billing.province),
|
|
153
|
+
"Billing Country Code": text(billing.country_code).toUpperCase(),
|
|
154
|
+
"Billing Phone": text(billing.phone),
|
|
155
|
+
"Shipping First Name": text(shipping.first_name),
|
|
156
|
+
"Shipping Last Name": text(shipping.last_name),
|
|
157
|
+
"Shipping Company": text(shipping.company),
|
|
158
|
+
"Shipping Address 1": text(shipping.address_1),
|
|
159
|
+
"Shipping Address 2": text(shipping.address_2),
|
|
160
|
+
"Shipping City": text(shipping.city),
|
|
161
|
+
"Shipping Postal Code": text(shipping.postal_code),
|
|
162
|
+
"Shipping Province": text(shipping.province),
|
|
163
|
+
"Shipping Country Code": text(shipping.country_code).toUpperCase(),
|
|
164
|
+
"Shipping Phone": text(shipping.phone),
|
|
165
|
+
"Order Subtotal": numberText(order.subtotal),
|
|
166
|
+
"Shipping Total": numberText(order.shipping_total),
|
|
167
|
+
"Order Discount Total": numberText(order.discount_total),
|
|
168
|
+
"Order Tax Total": numberText(order.tax_total),
|
|
169
|
+
"Order Total": numberText(order.total),
|
|
170
|
+
"Payment Status": paymentStatuses.join(" | "),
|
|
171
|
+
"Payment Provider": paymentProviders.join(" | "),
|
|
172
|
+
"Payment Amount": numberText(paymentAmount),
|
|
173
|
+
"Captured Amount": numberText(capturedAmount),
|
|
174
|
+
"Refunded Amount": numberText(refundedAmount),
|
|
175
|
+
"Shipping Method": shippingMethodNames.join(" | "),
|
|
176
|
+
"Fulfillment Provider": fulfillmentProviders.join(" | "),
|
|
177
|
+
"Tracking Number": trackingNumbers.join(" | "),
|
|
178
|
+
"Billingo Document Id": numberText(billingo.documentId),
|
|
179
|
+
"Billingo Invoice Number": text(billingo.invoiceNumber),
|
|
180
|
+
"Billingo Payment Status": text(billingo.paymentStatus),
|
|
181
|
+
"Billingo Notification Status": text(billingo.notificationStatus),
|
|
182
|
+
"Billingo Online Szamla Status": text(billingo.onlineSzamlaStatus),
|
|
183
|
+
"Billingo Gross Total": numberText(billingo.grossTotal),
|
|
184
|
+
"Billingo Currency": text(billingo.currency).toUpperCase(),
|
|
185
|
+
"Billingo Cancelled": booleanText(billingo.cancelled),
|
|
186
|
+
"Billingo Sent At": iso(billingo.sentAt),
|
|
187
|
+
"Billingo Cancellation Document Id": numberText(billingo.cancellationDocumentId),
|
|
188
|
+
"Billingo Cancellation Invoice Number": text(billingo.cancellationInvoiceNumber),
|
|
189
|
+
"Billingo Modification Document Id": numberText(billingo.modificationDocumentId),
|
|
190
|
+
"Billingo Modification Invoice Number": text(billingo.modificationInvoiceNumber),
|
|
191
|
+
"Billingo Modified At": iso(billingo.modifiedAt),
|
|
192
|
+
"Billingo Proforma Document Id": numberText(proforma.documentId),
|
|
193
|
+
"Billingo Proforma Number": text(proforma.invoiceNumber),
|
|
194
|
+
"Billingo Proforma Converted Document Id": numberText(proforma.convertedDocumentId),
|
|
195
|
+
"Billingo Proforma Converted Invoice Number": text(proforma.convertedInvoiceNumber),
|
|
196
|
+
"Billingo Proforma Archived": booleanText(proforma.archived),
|
|
197
|
+
"Billingo Proforma Archived At": iso(proforma.archivedAt),
|
|
198
|
+
};
|
|
199
|
+
for (const rawItem of items) {
|
|
200
|
+
const item = asRecord(rawItem);
|
|
201
|
+
const values = {
|
|
202
|
+
...common,
|
|
203
|
+
"Item Id": text(item.id),
|
|
204
|
+
"Variant Id": text(item.variant_id),
|
|
205
|
+
"SKU": text(item.variant_sku || item.sku),
|
|
206
|
+
"Product Title": text(item.product_title || item.title),
|
|
207
|
+
"Variant Title": text(item.variant_title),
|
|
208
|
+
"Quantity": numberText(item.quantity),
|
|
209
|
+
"Unit Price": numberText(item.unit_price),
|
|
210
|
+
"Item Subtotal": numberText(item.subtotal),
|
|
211
|
+
"Item Discount Total": numberText(item.discount_total),
|
|
212
|
+
"Item Tax Total": numberText(item.tax_total),
|
|
213
|
+
"Item Total": numberText(item.total),
|
|
214
|
+
};
|
|
215
|
+
rows.push(exports.ORDER_EXPORT_HEADERS.map((header) => values[header] || ""));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
headers: [...exports.ORDER_EXPORT_HEADERS],
|
|
220
|
+
rows,
|
|
221
|
+
order_count: orders.length,
|
|
222
|
+
line_count: rows.length,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function asRecord(value) {
|
|
226
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
227
|
+
? value
|
|
228
|
+
: {};
|
|
229
|
+
}
|
|
230
|
+
function array(value) {
|
|
231
|
+
return Array.isArray(value) ? value : [];
|
|
232
|
+
}
|
|
233
|
+
function text(value) {
|
|
234
|
+
if (value == null)
|
|
235
|
+
return "";
|
|
236
|
+
if (typeof value === "string")
|
|
237
|
+
return value;
|
|
238
|
+
if (typeof value === "number" || typeof value === "bigint" || typeof value === "boolean")
|
|
239
|
+
return String(value);
|
|
240
|
+
if (typeof value === "object" && "value" in value)
|
|
241
|
+
return text(value.value);
|
|
242
|
+
return "";
|
|
243
|
+
}
|
|
244
|
+
function numberText(value) {
|
|
245
|
+
const raw = text(value);
|
|
246
|
+
if (!raw)
|
|
247
|
+
return "";
|
|
248
|
+
const parsed = Number(raw);
|
|
249
|
+
return Number.isFinite(parsed) ? String(parsed) : raw;
|
|
250
|
+
}
|
|
251
|
+
function booleanText(value) {
|
|
252
|
+
if (value === true)
|
|
253
|
+
return "true";
|
|
254
|
+
if (value === false)
|
|
255
|
+
return "false";
|
|
256
|
+
return "";
|
|
257
|
+
}
|
|
258
|
+
function iso(value) {
|
|
259
|
+
if (!value)
|
|
260
|
+
return "";
|
|
261
|
+
const date = value instanceof Date ? value : new Date(String(value));
|
|
262
|
+
return Number.isNaN(date.getTime()) ? text(value) : date.toISOString();
|
|
263
|
+
}
|
|
264
|
+
function unique(values) {
|
|
265
|
+
return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
|
|
266
|
+
}
|
|
267
|
+
function sumDirect(records, key) {
|
|
268
|
+
let found = false;
|
|
269
|
+
let total = 0;
|
|
270
|
+
for (const record of records) {
|
|
271
|
+
const raw = text(record?.[key]);
|
|
272
|
+
if (!raw)
|
|
273
|
+
continue;
|
|
274
|
+
const value = Number(raw);
|
|
275
|
+
if (!Number.isFinite(value))
|
|
276
|
+
continue;
|
|
277
|
+
found = true;
|
|
278
|
+
total += value;
|
|
279
|
+
}
|
|
280
|
+
return found ? total : "";
|
|
281
|
+
}
|
|
282
|
+
function readTrackingNumbers(fulfillment) {
|
|
283
|
+
const direct = array(fulfillment.tracking_numbers).map(text);
|
|
284
|
+
const labels = array(fulfillment.labels).flatMap((label) => {
|
|
285
|
+
const value = asRecord(label);
|
|
286
|
+
return [text(value.tracking_number), text(value.trackingNumber)];
|
|
287
|
+
});
|
|
288
|
+
const data = asRecord(fulfillment.data);
|
|
289
|
+
return unique([
|
|
290
|
+
...direct,
|
|
291
|
+
...labels,
|
|
292
|
+
text(fulfillment.tracking_number),
|
|
293
|
+
text(data.tracking_number),
|
|
294
|
+
text(data.trackingNumber),
|
|
295
|
+
]);
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZXhwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvb3JkZXItZXhwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdIQSwwREE2SEM7QUE3T1ksUUFBQSxvQkFBb0IsR0FBRztJQUNsQyxVQUFVO0lBQ1YsWUFBWTtJQUNaLFlBQVk7SUFDWixjQUFjO0lBQ2QsVUFBVTtJQUNWLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLGNBQWM7SUFDZCxxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLHNCQUFzQjtJQUN0QixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCxZQUFZO0lBQ1osS0FBSztJQUNMLGVBQWU7SUFDZixlQUFlO0lBQ2YsVUFBVTtJQUNWLFlBQVk7SUFDWixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLHNCQUFzQjtJQUN0Qix5QkFBeUI7SUFDekIseUJBQXlCO0lBQ3pCLDhCQUE4QjtJQUM5QiwrQkFB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
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export type ReviewRequestTrigger = "order" | "fulfillment" | "delivery";
|
|
2
|
+
type ReviewRequestTokenPayload = {
|
|
3
|
+
order_id: string;
|
|
4
|
+
customer_id: string;
|
|
5
|
+
exp: number;
|
|
6
|
+
};
|
|
7
|
+
type OrderLike = {
|
|
8
|
+
id: string;
|
|
9
|
+
customer_id?: string | null;
|
|
10
|
+
email?: string | null;
|
|
11
|
+
created_at?: string | Date | null;
|
|
12
|
+
fulfillment_status?: string | null;
|
|
13
|
+
fulfillments?: Array<{
|
|
14
|
+
created_at?: string | Date | null;
|
|
15
|
+
}> | null;
|
|
16
|
+
metadata?: Record<string, any> | null;
|
|
17
|
+
};
|
|
18
|
+
export declare function reviewRequestDueAt(order: OrderLike, trigger: ReviewRequestTrigger, delayDays: number): Date | null;
|
|
19
|
+
export declare function triggerTimestamp(order: OrderLike, trigger: ReviewRequestTrigger): Date | null;
|
|
20
|
+
export declare function createReviewRequestToken(orderId: string, customerId: string, ttlDays?: number): string;
|
|
21
|
+
export declare function verifyReviewRequestToken(token: string): ReviewRequestTokenPayload | null;
|
|
22
|
+
export declare function reviewRequestUrl(orderId: string, customerId: string): string;
|
|
23
|
+
export declare function sendReviewRequestEmail(input: {
|
|
24
|
+
container: {
|
|
25
|
+
resolve: (key: string) => unknown;
|
|
26
|
+
};
|
|
27
|
+
order: OrderLike & {
|
|
28
|
+
customer?: {
|
|
29
|
+
first_name?: string | null;
|
|
30
|
+
} | null;
|
|
31
|
+
};
|
|
32
|
+
}): Promise<{
|
|
33
|
+
skipped: boolean;
|
|
34
|
+
reason: "missing-email";
|
|
35
|
+
locale?: undefined;
|
|
36
|
+
template?: undefined;
|
|
37
|
+
} | {
|
|
38
|
+
skipped: boolean;
|
|
39
|
+
reason: "disabled";
|
|
40
|
+
locale?: undefined;
|
|
41
|
+
template?: undefined;
|
|
42
|
+
} | {
|
|
43
|
+
skipped: boolean;
|
|
44
|
+
locale: string;
|
|
45
|
+
template: string;
|
|
46
|
+
reason?: undefined;
|
|
47
|
+
} | {
|
|
48
|
+
skipped: boolean;
|
|
49
|
+
reason: "provider-disabled";
|
|
50
|
+
locale?: undefined;
|
|
51
|
+
template?: undefined;
|
|
52
|
+
} | {
|
|
53
|
+
skipped: boolean;
|
|
54
|
+
reason: "missing-template";
|
|
55
|
+
locale?: undefined;
|
|
56
|
+
template?: undefined;
|
|
57
|
+
} | {
|
|
58
|
+
skipped: boolean;
|
|
59
|
+
reason: "missing-customer";
|
|
60
|
+
}>;
|
|
61
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reviewRequestDueAt = reviewRequestDueAt;
|
|
4
|
+
exports.triggerTimestamp = triggerTimestamp;
|
|
5
|
+
exports.createReviewRequestToken = createReviewRequestToken;
|
|
6
|
+
exports.verifyReviewRequestToken = verifyReviewRequestToken;
|
|
7
|
+
exports.reviewRequestUrl = reviewRequestUrl;
|
|
8
|
+
exports.sendReviewRequestEmail = sendReviewRequestEmail;
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const customer_email_1 = require("./customer-email");
|
|
11
|
+
function reviewRequestDueAt(order, trigger, delayDays) {
|
|
12
|
+
const base = triggerTimestamp(order, trigger);
|
|
13
|
+
if (!base)
|
|
14
|
+
return null;
|
|
15
|
+
const delay = Math.max(0, Math.min(90, Math.trunc(Number(delayDays) || 0)));
|
|
16
|
+
return new Date(base.getTime() + delay * 86_400_000);
|
|
17
|
+
}
|
|
18
|
+
function triggerTimestamp(order, trigger) {
|
|
19
|
+
if (trigger === "order")
|
|
20
|
+
return asDate(order.created_at);
|
|
21
|
+
if (trigger === "fulfillment") {
|
|
22
|
+
const fulfillments = Array.isArray(order.fulfillments) ? order.fulfillments : [];
|
|
23
|
+
if (!fulfillments.length)
|
|
24
|
+
return null;
|
|
25
|
+
const dates = fulfillments.map((item) => asDate(item.created_at)).filter(Boolean);
|
|
26
|
+
if (!dates.length)
|
|
27
|
+
return null;
|
|
28
|
+
return new Date(Math.max(...dates.map((date) => date.getTime())));
|
|
29
|
+
}
|
|
30
|
+
const metadata = order.metadata || {};
|
|
31
|
+
for (const carrier of ["foxpost", "gls", "packeta", "dpd", "mpl"]) {
|
|
32
|
+
const shipment = metadata[carrier];
|
|
33
|
+
if (!shipment || String(shipment.status || "").toUpperCase() !== "DELIVERED")
|
|
34
|
+
continue;
|
|
35
|
+
const deliveredAt = asDate(shipment.statusUpdatedAt || shipment.status_updated_at || shipment.deliveredAt || shipment.delivered_at);
|
|
36
|
+
if (deliveredAt)
|
|
37
|
+
return deliveredAt;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
function createReviewRequestToken(orderId, customerId, ttlDays = 30) {
|
|
42
|
+
const payload = {
|
|
43
|
+
order_id: orderId,
|
|
44
|
+
customer_id: customerId,
|
|
45
|
+
exp: Math.floor(Date.now() / 1000) + Math.max(1, Math.min(180, Math.trunc(ttlDays))) * 86_400,
|
|
46
|
+
};
|
|
47
|
+
const encoded = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
48
|
+
return `${encoded}.${sign(encoded)}`;
|
|
49
|
+
}
|
|
50
|
+
function verifyReviewRequestToken(token) {
|
|
51
|
+
const [encoded, signature] = String(token || "").split(".");
|
|
52
|
+
if (!encoded || !signature)
|
|
53
|
+
return null;
|
|
54
|
+
const expected = Buffer.from(sign(encoded));
|
|
55
|
+
const actual = Buffer.from(signature);
|
|
56
|
+
if (expected.length !== actual.length || !(0, node_crypto_1.timingSafeEqual)(expected, actual))
|
|
57
|
+
return null;
|
|
58
|
+
try {
|
|
59
|
+
const payload = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
|
|
60
|
+
if (!payload.order_id || !payload.customer_id || !payload.exp || payload.exp <= Math.floor(Date.now() / 1000))
|
|
61
|
+
return null;
|
|
62
|
+
return payload;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function reviewRequestUrl(orderId, customerId) {
|
|
69
|
+
const token = createReviewRequestToken(orderId, customerId);
|
|
70
|
+
return `${(0, customer_email_1.storefrontUrl)()}/ertekeles?token=${encodeURIComponent(token)}`;
|
|
71
|
+
}
|
|
72
|
+
async function sendReviewRequestEmail(input) {
|
|
73
|
+
const email = String(input.order.email || "").trim().toLowerCase();
|
|
74
|
+
const customerId = String(input.order.customer_id || "").trim();
|
|
75
|
+
if (!email || !customerId)
|
|
76
|
+
return { skipped: true, reason: "missing-customer" };
|
|
77
|
+
return (0, customer_email_1.queueCustomerAccountEmail)({
|
|
78
|
+
container: input.container,
|
|
79
|
+
kind: "review_request",
|
|
80
|
+
to: email,
|
|
81
|
+
resourceId: customerId,
|
|
82
|
+
idempotencyKey: `product-review-request:${input.order.id}`,
|
|
83
|
+
data: {
|
|
84
|
+
first_name: input.order.customer?.first_name || "",
|
|
85
|
+
order_id: input.order.id,
|
|
86
|
+
review_url: reviewRequestUrl(input.order.id, customerId),
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function sign(value) {
|
|
91
|
+
return (0, node_crypto_1.createHmac)("sha256", tokenSecret()).update(value).digest("base64url");
|
|
92
|
+
}
|
|
93
|
+
function tokenSecret() {
|
|
94
|
+
const secret = process.env.REVIEW_REQUEST_TOKEN_SECRET || process.env.COOKIE_SECRET || process.env.JWT_SECRET;
|
|
95
|
+
if (!secret || secret.length < 16)
|
|
96
|
+
throw new Error("REVIEW_REQUEST_TOKEN_SECRET, COOKIE_SECRET vagy JWT_SECRET szükséges az értékelési linkekhez.");
|
|
97
|
+
return secret;
|
|
98
|
+
}
|
|
99
|
+
function asDate(value) {
|
|
100
|
+
if (!value)
|
|
101
|
+
return null;
|
|
102
|
+
const date = value instanceof Date ? value : new Date(String(value));
|
|
103
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2aWV3LXJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9yZXZpZXctcmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXFCQSxnREFLQztBQUVELDRDQW1CQztBQUVELDREQVFDO0FBRUQsNERBYUM7QUFFRCw0Q0FHQztBQUVELHdEQW1CQztBQWxHRCw2Q0FBeUQ7QUFDekQscURBQTJFO0FBb0IzRSxTQUFnQixrQkFBa0IsQ0FBQyxLQUFnQixFQUFFLE9BQTZCLEVBQUUsU0FBaUI7SUFDbkcsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzdDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzNFLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQTtBQUN0RCxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsS0FBZ0IsRUFBRSxPQUE2QjtJQUM5RSxJQUFJLE9BQU8sS0FBSyxPQUFPO1FBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRXhELElBQUksT0FBTyxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDaEYsSUFBSSxDQUFDLFlB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
|