medusa-pos-plugin 0.0.33 → 0.0.35
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/api/admin/barcode-template/route.js +132 -0
- package/.medusa/server/src/api/admin/barcodes/bulk-generate/route.js +57 -0
- package/.medusa/server/src/api/admin/pos/manual-discounts/route.js +51 -32
- package/.medusa/server/src/api/admin/pos/setup/route.js +32 -0
- package/.medusa/server/src/utils/barcode-ean13.js +66 -0
- package/.medusa/server/src/utils/barcode-labels.js +336 -0
- package/.medusa/server/src/utils/barcode-template-default.js +434 -0
- package/.medusa/server/src/utils/pos-access.js +2 -1
- package/.medusa/server/src/utils/pos-manual-fulfillment.js +11 -2
- package/.medusa/server/src/utils/pos-setup.js +178 -0
- package/README.md +30 -0
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
exports.POST = POST;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const barcode_labels_1 = require("../../../utils/barcode-labels");
|
|
7
|
+
const VARIANT_FIELDS = [
|
|
8
|
+
"id",
|
|
9
|
+
"barcode",
|
|
10
|
+
"sku",
|
|
11
|
+
"product.id",
|
|
12
|
+
"product.title",
|
|
13
|
+
"options.value",
|
|
14
|
+
"options.option.title",
|
|
15
|
+
"calculated_price.*",
|
|
16
|
+
"price_set.prices.amount",
|
|
17
|
+
"price_set.prices.currency_code",
|
|
18
|
+
"price_set.prices.price_list_id",
|
|
19
|
+
];
|
|
20
|
+
function isVariantRow(value) {
|
|
21
|
+
return (!!value &&
|
|
22
|
+
typeof value === "object" &&
|
|
23
|
+
typeof value.id === "string");
|
|
24
|
+
}
|
|
25
|
+
async function loadContactDetails(scope) {
|
|
26
|
+
try {
|
|
27
|
+
const dynamicConfigService = scope.resolve("dynamic_config");
|
|
28
|
+
return (0, barcode_labels_1.contactDetailsFromConfig)(await dynamicConfigService.listValues());
|
|
29
|
+
}
|
|
30
|
+
catch (configError) {
|
|
31
|
+
console.warn("[barcode-template] Could not fetch dynamic config:", configError);
|
|
32
|
+
return { phone: "", email: "", address: "" };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function resolveRegionId(scope, requested) {
|
|
36
|
+
if (requested)
|
|
37
|
+
return requested;
|
|
38
|
+
try {
|
|
39
|
+
const regionModule = scope.resolve(utils_1.Modules.REGION);
|
|
40
|
+
const regions = await regionModule.listRegions({}, { take: 20 });
|
|
41
|
+
const inr = regions.find((r) => (r.currency_code || "").toLowerCase() === "inr");
|
|
42
|
+
return inr?.id || regions[0]?.id || "";
|
|
43
|
+
}
|
|
44
|
+
catch (regionError) {
|
|
45
|
+
console.warn("[barcode-template] region resolve failed:", regionError);
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* GET /admin/barcode-template
|
|
51
|
+
* Returns raw template + contact details (legacy / preview).
|
|
52
|
+
*/
|
|
53
|
+
async function GET(req, res) {
|
|
54
|
+
try {
|
|
55
|
+
const template = (0, barcode_labels_1.loadBarcodeTemplate)();
|
|
56
|
+
const contactDetails = await loadContactDetails(req.scope);
|
|
57
|
+
res.json({ template, contactDetails });
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error("Error reading barcode template:", error);
|
|
61
|
+
res.status(500).json({ error: "Failed to load barcode template" });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* POST /admin/barcode-template
|
|
66
|
+
* Body: { items: [{ variant_id, quantity }], region_id?, print_width?, print_height? }
|
|
67
|
+
* or legacy { variant_ids: string[] }
|
|
68
|
+
* Returns ready-to-print HTML with all variables filled on the backend.
|
|
69
|
+
* Quantity repeats labels (unique SVG ids per copy).
|
|
70
|
+
*/
|
|
71
|
+
async function POST(req, res) {
|
|
72
|
+
try {
|
|
73
|
+
const body = (0, barcode_labels_1.parseBarcodePrintBody)(req.body);
|
|
74
|
+
const printQueue = (0, barcode_labels_1.buildPrintQueue)(body);
|
|
75
|
+
if (printQueue.length === 0) {
|
|
76
|
+
res.status(400).json({ error: "items or variant_ids is required" });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const uniqueVariantIds = [...new Set(printQueue)];
|
|
80
|
+
const printWidth = Number(body.print_width) || 2;
|
|
81
|
+
const printHeight = Number(body.print_height) || 60;
|
|
82
|
+
const template = (0, barcode_labels_1.loadBarcodeTemplate)();
|
|
83
|
+
const contactHtml = (0, barcode_labels_1.buildContactHtml)(await loadContactDetails(req.scope));
|
|
84
|
+
const regionId = await resolveRegionId(req.scope, body.region_id);
|
|
85
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
86
|
+
const { data: variantsRaw = [] } = await query.graph({
|
|
87
|
+
entity: "product_variant",
|
|
88
|
+
fields: VARIANT_FIELDS,
|
|
89
|
+
filters: { id: uniqueVariantIds },
|
|
90
|
+
...(regionId
|
|
91
|
+
? {
|
|
92
|
+
context: {
|
|
93
|
+
calculated_price: (0, utils_1.QueryContext)({
|
|
94
|
+
region_id: regionId,
|
|
95
|
+
currency_code: "inr",
|
|
96
|
+
}),
|
|
97
|
+
},
|
|
98
|
+
}
|
|
99
|
+
: {}),
|
|
100
|
+
});
|
|
101
|
+
const variants = (Array.isArray(variantsRaw) ? variantsRaw : []).filter(isVariantRow);
|
|
102
|
+
const byId = new Map(variants.map((v) => [v.id, v]));
|
|
103
|
+
const ordered = printQueue
|
|
104
|
+
.map((id) => byId.get(id))
|
|
105
|
+
.filter((v) => !!v);
|
|
106
|
+
if (ordered.length === 0) {
|
|
107
|
+
res.status(404).json({ error: "No variants found for the given ids" });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const { html, count } = (0, barcode_labels_1.renderBarcodeLabelsHtml)({
|
|
111
|
+
template,
|
|
112
|
+
variants: ordered,
|
|
113
|
+
contactHtml,
|
|
114
|
+
printWidth,
|
|
115
|
+
printHeight,
|
|
116
|
+
});
|
|
117
|
+
res.json({
|
|
118
|
+
html,
|
|
119
|
+
count,
|
|
120
|
+
variants: uniqueVariantIds.length,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error("[barcode-template] POST error:", error);
|
|
125
|
+
res.status(500).json({
|
|
126
|
+
error: error instanceof Error && error.message
|
|
127
|
+
? error.message
|
|
128
|
+
: "Failed to build barcode print HTML",
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JhcmNvZGUtdGVtcGxhdGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErRkEsa0JBWUM7QUFTRCxvQkF3RUM7QUEzTEQscURBSWtDO0FBQ2xDLGtFQVNzQztBQXVCdEMsTUFBTSxjQUFjLEdBQUc7SUFDckIsSUFBSTtJQUNKLFNBQVM7SUFDVCxLQUFLO0lBQ0wsWUFBWTtJQUNaLGVBQWU7SUFDZixlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQix5QkFBeUI7SUFDekIsZ0NBQWdDO0lBQ2hDLGdDQUFnQztDQUNqQyxDQUFBO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxPQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUs7UUFDUCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLE9BQVEsS0FBMEIsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUNuRCxDQUFBO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxrQkFBa0IsQ0FDL0IsS0FBNkI7SUFFN0IsSUFBSSxDQUFDO1FBQ0gsTUFBTSxvQkFBb0IsR0FDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBdUIsZ0JBQWdCLENBQUMsQ0FBQTtRQUN2RCxPQUFPLElBQUEseUNBQXdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0RBQW9ELEVBQUUsV0FBVyxDQUFDLENBQUE7UUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUE7SUFDOUMsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsZUFBZSxDQUM1QixLQUE2QixFQUM3QixTQUFr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
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const barcode_ean13_1 = require("../../../../utils/barcode-ean13");
|
|
6
|
+
function readVariantIds(body) {
|
|
7
|
+
if (!body || typeof body !== "object")
|
|
8
|
+
return [];
|
|
9
|
+
const ids = body.variantIds;
|
|
10
|
+
if (!Array.isArray(ids))
|
|
11
|
+
return [];
|
|
12
|
+
return ids.filter((id) => typeof id === "string" && !!id);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* POST /admin/barcodes/bulk-generate
|
|
16
|
+
* Body: { variantIds: string[] }
|
|
17
|
+
* Writes a deterministic SHA-256 EAN-13 barcode onto each variant.
|
|
18
|
+
*/
|
|
19
|
+
const POST = async (req, res) => {
|
|
20
|
+
try {
|
|
21
|
+
const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
|
|
22
|
+
const variantIds = readVariantIds(req.body);
|
|
23
|
+
if (variantIds.length === 0) {
|
|
24
|
+
res.json({ success: true, message: "No variants requested.", count: 0 });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Fetch variant details with parent product & options relations
|
|
28
|
+
const variants = await productModuleService.listProductVariants({ id: variantIds }, { relations: ["product", "options", "options.option"] });
|
|
29
|
+
const updates = [];
|
|
30
|
+
for (const id of variantIds) {
|
|
31
|
+
const variant = variants.find((v) => v.id === id);
|
|
32
|
+
const barcode = (0, barcode_ean13_1.generateDeterministicBarcodeSHA256)(variant?.product?.title || "", variant?.title || "", variant?.options || [], variant?.weight, variant?.width, variant?.length, variant?.height);
|
|
33
|
+
updates.push({ id, barcode });
|
|
34
|
+
}
|
|
35
|
+
for (const update of updates) {
|
|
36
|
+
await productModuleService.updateProductVariants(update.id, {
|
|
37
|
+
barcode: update.barcode,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
res.json({
|
|
41
|
+
success: true,
|
|
42
|
+
message: `Successfully generated SHA-256 deterministic barcodes for ${updates.length} variants.`,
|
|
43
|
+
count: updates.length,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error("Bulk barcode generation error:", error);
|
|
48
|
+
res.status(500).json({
|
|
49
|
+
success: false,
|
|
50
|
+
message: error instanceof Error && error.message
|
|
51
|
+
? error.message
|
|
52
|
+
: "Internal server error",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
exports.POST = POST;
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JhcmNvZGVzL2J1bGstZ2VuZXJhdGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEscURBQW1EO0FBQ25ELG1FQUd3QztBQWF4QyxTQUFTLGNBQWMsQ0FBQyxJQUFhO0lBQ25DLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ2hELE1BQU0sR0FBRyxHQUFJLElBQWlDLENBQUMsVUFBVSxDQUFBO0lBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ2xDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBZ0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDekUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ0osRUFBRTtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUM1QyxlQUFPLENBQUMsT0FBTyxDQUNoQixDQUFBO1FBRUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMzQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3hFLE9BQU07UUFDUixDQUFDO1FBRUQsZ0VBQWdFO1FBQ2hFLE1BQU0sUUFBUSxHQUNaLE1BQU0sb0JBQW9CLENBQUMsbUJBQW1CLENBQzVDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUNsQixFQUFFLFNBQVMsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUN4RCxDQUFBO1FBRUgsTUFBTSxPQUFPLEdBQTJDLEVBQUUsQ0FBQTtRQUUxRCxLQUFLLE1BQU0sRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBQSxrREFBa0MsRUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRSxFQUM3QixPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFDcEIsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFLEVBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQ2YsT0FBTyxFQUFFLEtBQUssRUFDZCxPQUFPLEVBQUUsTUFBTSxFQUNmLE9BQU8sRUFBRSxNQUFNLENBQ2hCLENBQUE7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDL0IsQ0FBQztRQUVELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsTUFBTSxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO2dCQUMxRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87YUFDeEIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDUCxPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSw2REFBNkQsT0FBTyxDQUFDLE1BQU0sWUFBWTtZQUNoRyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU07U0FDdEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3RELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUNMLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU87Z0JBQ3JDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztnQkFDZixDQUFDLENBQUMsdUJBQXVCO1NBQzlCLENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDLENBQUE7QUEzRFksUUFBQSxJQUFJLFFBMkRoQiJ9
|
|
@@ -3,38 +3,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.GET = GET;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
5
|
const POSMAN_PREFIX = "POSMAN-";
|
|
6
|
+
function isPosManualPromotion(p) {
|
|
7
|
+
const code = String(p.code || "");
|
|
8
|
+
return code.startsWith(POSMAN_PREFIX) || p.metadata?.source === "pos_manual";
|
|
9
|
+
}
|
|
6
10
|
/**
|
|
7
11
|
* GET /admin/pos/manual-discounts
|
|
8
|
-
* Lists POS manual-discount promotions (POSMAN-*)
|
|
9
|
-
*
|
|
12
|
+
* Lists POS manual-discount promotions (POSMAN-*) and Admin-created promo codes
|
|
13
|
+
* for the POS Discounts page. Includes inactive codes.
|
|
10
14
|
*/
|
|
11
15
|
async function GET(req, res) {
|
|
12
16
|
const query = (req.query || {});
|
|
13
|
-
const limit = Math.min(Math.max(Number(query.limit) || 50, 1),
|
|
17
|
+
const limit = Math.min(Math.max(Number(query.limit) || 50, 1), 200);
|
|
14
18
|
const offset = Math.max(Number(query.offset) || 0, 0);
|
|
15
19
|
const q = (query.q || "").trim().toLowerCase();
|
|
16
20
|
try {
|
|
17
21
|
const promotionModule = req.scope.resolve(utils_1.Modules.PROMOTION);
|
|
18
|
-
|
|
19
|
-
const take = Math.min(offset + limit + 200, 500);
|
|
20
|
-
const [rows] = await promotionModule.listAndCountPromotions({}, {
|
|
21
|
-
take,
|
|
22
|
-
skip: 0,
|
|
22
|
+
const config = {
|
|
23
23
|
order: { created_at: "DESC" },
|
|
24
24
|
relations: ["application_method"],
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
};
|
|
26
|
+
// POSMAN codes are created per sale, so Admin promos are queried separately
|
|
27
|
+
// to keep them from being pushed out of the POSMAN window.
|
|
28
|
+
const take = Math.min(offset + limit + 200, 500);
|
|
29
|
+
const [manualRows, adminRows] = await Promise.all([
|
|
30
|
+
promotionModule.listPromotions({}, { ...config, take, skip: 0 }),
|
|
31
|
+
promotionModule.listPromotions({ code: { $not: { $like: `${POSMAN_PREFIX}%` } } }, { ...config, take: 500, skip: 0 }),
|
|
32
|
+
]);
|
|
33
|
+
const manual = (manualRows || []).filter(isPosManualPromotion);
|
|
34
|
+
const admin = (adminRows || []).filter((p) => !isPosManualPromotion(p));
|
|
35
|
+
let combined = [...manual, ...admin].sort((a, b) => {
|
|
36
|
+
const at = new Date(a.created_at ?? 0).getTime();
|
|
37
|
+
const bt = new Date(b.created_at ?? 0).getTime();
|
|
38
|
+
return bt - at;
|
|
30
39
|
});
|
|
31
40
|
if (q) {
|
|
32
|
-
|
|
41
|
+
combined = combined.filter((p) => {
|
|
33
42
|
const hay = [
|
|
34
43
|
p.code,
|
|
35
44
|
p.metadata?.draft_order_id,
|
|
36
45
|
p.metadata?.applied_by,
|
|
37
46
|
String(p.metadata?.amount ?? ""),
|
|
47
|
+
String(p.application_method?.value ?? ""),
|
|
38
48
|
]
|
|
39
49
|
.filter(Boolean)
|
|
40
50
|
.join(" ")
|
|
@@ -42,23 +52,32 @@ async function GET(req, res) {
|
|
|
42
52
|
return hay.includes(q);
|
|
43
53
|
});
|
|
44
54
|
}
|
|
45
|
-
const count =
|
|
46
|
-
const page =
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
p.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
const count = combined.length;
|
|
56
|
+
const page = combined.slice(offset, offset + limit).map((p) => {
|
|
57
|
+
const posManual = isPosManualPromotion(p);
|
|
58
|
+
const method = p.application_method;
|
|
59
|
+
const methodType = method?.type === "percentage" ? "percentage" : method?.type === "fixed" ? "fixed" : null;
|
|
60
|
+
return {
|
|
61
|
+
id: p.id,
|
|
62
|
+
code: p.code,
|
|
63
|
+
status: p.status,
|
|
64
|
+
origin: posManual ? "pos_manual" : "admin",
|
|
65
|
+
// Admin percentage promos have no rupee amount until applied to a cart.
|
|
66
|
+
amount: posManual
|
|
67
|
+
? p.metadata?.amount ?? method?.value ?? null
|
|
68
|
+
: methodType === "fixed"
|
|
69
|
+
? method?.value ?? null
|
|
70
|
+
: null,
|
|
71
|
+
discount_type: posManual ? p.metadata?.discount_type ?? null : methodType,
|
|
72
|
+
discount_value: posManual ? p.metadata?.discount_value ?? null : method?.value ?? null,
|
|
73
|
+
currency_code: p.metadata?.currency_code ?? method?.currency_code ?? null,
|
|
74
|
+
draft_order_id: p.metadata?.draft_order_id ?? null,
|
|
75
|
+
applied_by: posManual ? p.metadata?.applied_by ?? null : "admin",
|
|
76
|
+
applied_at: posManual ? p.metadata?.applied_at ?? p.created_at ?? null : p.created_at ?? null,
|
|
77
|
+
created_at: p.created_at ?? null,
|
|
78
|
+
metadata: p.metadata ?? null,
|
|
79
|
+
};
|
|
80
|
+
});
|
|
62
81
|
res.json({
|
|
63
82
|
manual_discounts: page,
|
|
64
83
|
count,
|
|
@@ -73,4 +92,4 @@ async function GET(req, res) {
|
|
|
73
92
|
});
|
|
74
93
|
}
|
|
75
94
|
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9tYW51YWwtZGlzY291bnRzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBdUJBLGtCQWdHQztBQXRIRCxxREFBbUQ7QUFFbkQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBVS9CLFNBQVMsb0JBQW9CLENBQUMsQ0FBZTtJQUMzQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNqQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEtBQUssWUFBWSxDQUFBO0FBQzlFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQy9ELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQWMsQ0FBQTtJQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDbkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNyRCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFFOUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxP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
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const pos_setup_1 = require("../../../../utils/pos-setup");
|
|
6
|
+
const bodySchema = zod_1.z
|
|
7
|
+
.object({
|
|
8
|
+
stock_location_id: zod_1.z.string().min(1).optional(),
|
|
9
|
+
sales_channel_id: zod_1.z.string().min(1).optional(),
|
|
10
|
+
region_id: zod_1.z.string().min(1).optional(),
|
|
11
|
+
include_all_products: zod_1.z.boolean().optional(),
|
|
12
|
+
})
|
|
13
|
+
.strict();
|
|
14
|
+
async function POST(req, res) {
|
|
15
|
+
const parsed = bodySchema.safeParse(req.body ?? {});
|
|
16
|
+
if (!parsed.success) {
|
|
17
|
+
res.status(400).json({
|
|
18
|
+
message: parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; "),
|
|
19
|
+
type: "INVALID_DATA",
|
|
20
|
+
});
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const result = await (0, pos_setup_1.runPosSetup)(req.scope, parsed.data);
|
|
25
|
+
res.status(200).json(result);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
const message = error instanceof Error ? error.message : "POS setup failed";
|
|
29
|
+
res.status(message.endsWith("not found") ? 400 : 500).json({ message, type: "POS_SETUP_FAILED" });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9zZXR1cC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW9CQSxvQkFpQkM7QUE3QkQsNkJBQXVCO0FBQ3ZCLDJEQUF5RDtBQUV6RCxNQUFNLFVBQVUsR0FBRyxPQUFDO0tBQ2pCLE1BQU0sQ0FBQztJQUNOLGlCQUFpQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQy9DLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzlDLFNBQVMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUN2QyxvQkFBb0IsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzdDLENBQUM7S0FDRCxNQUFNLEVBQUUsQ0FBQTtBQUVKLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUE7SUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkYsSUFBSSxFQUFFLGNBQWM7U0FDckIsQ0FBQyxDQUFBO1FBQ0YsT0FBTTtJQUNSLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsdUJBQVcsRUFBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4RCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQTtRQUMzRSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUE7SUFDbkcsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,66 @@
|
|
|
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.generateDeterministicBarcodeSHA256 = generateDeterministicBarcodeSHA256;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
/**
|
|
9
|
+
* Deterministic EAN-13 Barcode Generator using SHA-256 Hashing.
|
|
10
|
+
* Format: Product Title|Variant Title|Color=White|Size=3-4Y|Weight=200|Width=20|Length=30|Height=2
|
|
11
|
+
*
|
|
12
|
+
* Algorithm Pipeline:
|
|
13
|
+
* Fixed Input String -> SHA-256 -> Numeric Conversion -> 12-Digit Base -> EAN-13 Check Digit -> Final 13-Digit Barcode
|
|
14
|
+
*
|
|
15
|
+
* Output must stay stable: printed labels already carry these values.
|
|
16
|
+
*/
|
|
17
|
+
function generateDeterministicBarcodeSHA256(productTitle, variantTitle, options, weight, width, length, height, prefix = "200" // Standard 3-digit in-store retail prefix
|
|
18
|
+
) {
|
|
19
|
+
const parts = [];
|
|
20
|
+
const pTitle = (productTitle || "").trim();
|
|
21
|
+
if (pTitle)
|
|
22
|
+
parts.push(pTitle);
|
|
23
|
+
const vTitle = (variantTitle || "").trim();
|
|
24
|
+
if (vTitle)
|
|
25
|
+
parts.push(vTitle);
|
|
26
|
+
// Append option attributes (e.g. Color=White|Size=3-4Y)
|
|
27
|
+
if (Array.isArray(options)) {
|
|
28
|
+
options.forEach((opt) => {
|
|
29
|
+
const optTitle = (opt?.option?.title || "").trim();
|
|
30
|
+
const optVal = (opt?.value || "").trim();
|
|
31
|
+
if (optTitle && optVal) {
|
|
32
|
+
parts.push(`${optTitle}=${optVal}`);
|
|
33
|
+
}
|
|
34
|
+
else if (optVal) {
|
|
35
|
+
parts.push(optVal);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Append physical attributes if present
|
|
40
|
+
if (weight != null && !isNaN(Number(weight)))
|
|
41
|
+
parts.push(`Weight=${weight}`);
|
|
42
|
+
if (width != null && !isNaN(Number(width)))
|
|
43
|
+
parts.push(`Width=${width}`);
|
|
44
|
+
if (length != null && !isNaN(Number(length)))
|
|
45
|
+
parts.push(`Length=${length}`);
|
|
46
|
+
if (height != null && !isNaN(Number(height)))
|
|
47
|
+
parts.push(`Height=${height}`);
|
|
48
|
+
const inputString = parts.join("|");
|
|
49
|
+
// Step 1: Compute SHA-256 Hash
|
|
50
|
+
const sha256Hex = crypto_1.default.createHash("sha256").update(inputString).digest("hex");
|
|
51
|
+
// Step 2: Convert SHA-256 hash slice to 9-digit numeric payload
|
|
52
|
+
const numericVal = BigInt("0x" + sha256Hex.slice(0, 15));
|
|
53
|
+
const payload9Digits = String(numericVal % 1000000000n).padStart(9, "0");
|
|
54
|
+
// Step 3: Create 12-digit base number (3-digit prefix + 9-digit payload)
|
|
55
|
+
const base12 = `${prefix}${payload9Digits}`;
|
|
56
|
+
// Step 4: Calculate EAN-13 Check Digit
|
|
57
|
+
let sum = 0;
|
|
58
|
+
for (let i = 0; i < 12; i++) {
|
|
59
|
+
const digit = parseInt(base12.charAt(i), 10);
|
|
60
|
+
sum += i % 2 === 0 ? digit : digit * 3;
|
|
61
|
+
}
|
|
62
|
+
const checkDigit = (10 - (sum % 10)) % 10;
|
|
63
|
+
// Step 5: Final 13-digit EAN-13 Barcode
|
|
64
|
+
return `${base12}${checkDigit}`;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyY29kZS1lYW4xMy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9iYXJjb2RlLWVhbjEzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0JBLGdGQTJEQztBQTNFRCxvREFBMkI7QUFPM0I7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixrQ0FBa0MsQ0FDaEQsWUFBb0IsRUFDcEIsWUFBb0IsRUFDcEIsT0FBdUMsRUFDdkMsTUFBc0IsRUFDdEIsS0FBcUIsRUFDckIsTUFBc0IsRUFDdEIsTUFBc0IsRUFDdEIsTUFBTSxHQUFHLEtBQUssQ0FBQywwQ0FBMEM7O0lBRXpELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUUxQixNQUFNLE1BQU0sR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMxQyxJQUFJLE1BQU07UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTlCLE1BQU0sTUFBTSxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzFDLElBQUksTUFBTTtRQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFOUIsd0RBQXdEO0lBQ3hELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0QixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ2xELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUN4QyxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztn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
|