@lodashventure/medusa-parcel-shipping 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/.medusa/server/src/admin/index.js +1165 -0
  2. package/.medusa/server/src/admin/index.mjs +1166 -0
  3. package/.medusa/server/src/api/admin/parcel-boxes/[id]/route.js +47 -0
  4. package/.medusa/server/src/api/admin/parcel-boxes/route.js +48 -0
  5. package/.medusa/server/src/api/admin/shipping-config/areas/[id]/route.js +44 -0
  6. package/.medusa/server/src/api/admin/shipping-config/areas/route.js +48 -0
  7. package/.medusa/server/src/api/admin/shipping-config/rates/[id]/route.js +53 -0
  8. package/.medusa/server/src/api/admin/shipping-config/rates/route.js +55 -0
  9. package/.medusa/server/src/api/store/parcel-box-selector/route.js +53 -0
  10. package/.medusa/server/src/index.js +24 -0
  11. package/.medusa/server/src/modules/parcel-shipping/index.js +28 -0
  12. package/.medusa/server/src/modules/parcel-shipping/migrations/Migration20251015120000.js +70 -0
  13. package/.medusa/server/src/modules/parcel-shipping/models/parcel-box.js +21 -0
  14. package/.medusa/server/src/modules/parcel-shipping/models/service-area.js +20 -0
  15. package/.medusa/server/src/modules/parcel-shipping/models/shipping-rate.js +20 -0
  16. package/.medusa/server/src/modules/parcel-shipping/service.js +172 -0
  17. package/.medusa/server/src/modules/parcel-shipping/types.js +3 -0
  18. package/.medusa/server/src/modules/parcel-shipping/utils/packing.js +319 -0
  19. package/.medusa/server/src/providers/company-truck/index.js +19 -0
  20. package/.medusa/server/src/providers/parcel-fulfillment-base.js +180 -0
  21. package/.medusa/server/src/providers/private-carrier/index.js +19 -0
  22. package/package.json +81 -0
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const parcel_box_1 = require("./models/parcel-box");
5
+ const shipping_rate_1 = require("./models/shipping-rate");
6
+ const service_area_1 = require("./models/service-area");
7
+ const packing_1 = require("./utils/packing");
8
+ const CACHE_TTL_MS = 60_000;
9
+ class ParcelShippingModuleService extends (0, utils_1.MedusaService)({
10
+ ParcelBox: parcel_box_1.ParcelBox,
11
+ ShippingRate: shipping_rate_1.ShippingRate,
12
+ ServiceArea: service_area_1.ServiceArea,
13
+ }) {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.cache = {
17
+ boxes: { data: null, expiresAt: 0 },
18
+ rates: { data: null, expiresAt: 0 },
19
+ areas: { data: null, expiresAt: 0 },
20
+ };
21
+ }
22
+ invalidateCache(keys) {
23
+ if (!keys || keys.length === 0) {
24
+ Object.keys(this.cache).forEach((key) => {
25
+ this.cache[key] = { data: null, expiresAt: 0 };
26
+ });
27
+ return;
28
+ }
29
+ for (const key of keys) {
30
+ this.cache[key] = { data: null, expiresAt: 0 };
31
+ }
32
+ }
33
+ async quote(input) {
34
+ if (!input.items?.length) {
35
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "At least one line item is required.");
36
+ }
37
+ if (!input.shipping_address) {
38
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Shipping address is required.");
39
+ }
40
+ const address = input.shipping_address;
41
+ if (address.country?.toUpperCase() !== "TH") {
42
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "country_not_supported");
43
+ }
44
+ const [boxes, rates, serviceAreas] = await Promise.all([
45
+ this.getActiveBoxes(),
46
+ this.getActiveRates(),
47
+ this.getActiveServiceAreas(),
48
+ ]);
49
+ if (!boxes.length) {
50
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "No active parcel boxes configured.");
51
+ }
52
+ const packing = (0, packing_1.selectBestPacking)(input.items, boxes);
53
+ if (!packing.success) {
54
+ return {
55
+ success: false,
56
+ failure: packing,
57
+ };
58
+ }
59
+ const totalWeight = packing.result.metrics.totalWeightKg;
60
+ const shippingQuote = this.resolveShippingQuote(address, totalWeight, rates, serviceAreas);
61
+ return {
62
+ success: true,
63
+ best_box: packing.result.box,
64
+ packing: packing.result.metrics,
65
+ shipping_quote: shippingQuote,
66
+ };
67
+ }
68
+ async getActiveBoxes() {
69
+ return this.readThroughCache("boxes", async () => {
70
+ const records = await this.listParcelBoxes({ active: true }, { order: { price_thb: "ASC" } });
71
+ return records.map((record) => ({
72
+ id: record.id,
73
+ name: record.name,
74
+ width_cm: Number(record.width_cm),
75
+ length_cm: Number(record.length_cm),
76
+ height_cm: Number(record.height_cm),
77
+ max_weight_kg: Number(record.max_weight_kg),
78
+ price_thb: Number(record.price_thb),
79
+ }));
80
+ });
81
+ }
82
+ async quoteShippingOnly(address, totalWeightKg) {
83
+ if (!address) {
84
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Shipping address is required.");
85
+ }
86
+ if (!totalWeightKg || !Number.isFinite(totalWeightKg) || totalWeightKg <= 0) {
87
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "A positive shipment weight in kilograms is required.");
88
+ }
89
+ const [rates, serviceAreas] = await Promise.all([
90
+ this.getActiveRates(),
91
+ this.getActiveServiceAreas(),
92
+ ]);
93
+ return this.resolveShippingQuote(address, Number(totalWeightKg.toFixed(4)), rates, serviceAreas);
94
+ }
95
+ async getActiveRates() {
96
+ return this.readThroughCache("rates", async () => {
97
+ const records = await this.listShippingRates({ active: true }, { order: { carrier: "ASC", max_weight_kg: "ASC" } });
98
+ return records.map((record) => ({
99
+ id: record.id,
100
+ carrier: record.carrier,
101
+ min_weight_kg: Number(record.min_weight_kg ?? 0),
102
+ max_weight_kg: Number(record.max_weight_kg),
103
+ price_thb: Number(record.price_thb),
104
+ currency: record.currency || "THB",
105
+ }));
106
+ });
107
+ }
108
+ async getActiveServiceAreas() {
109
+ return this.readThroughCache("areas", async () => {
110
+ const records = await this.listServiceAreas({ active: true }, { order: { kind: "ASC", value: "ASC" } });
111
+ return records.map((record) => ({
112
+ id: record.id,
113
+ kind: record.kind,
114
+ value: record.value,
115
+ }));
116
+ });
117
+ }
118
+ resolveShippingQuote(address, totalWeightKg, rates, areas) {
119
+ const inServiceArea = this.isInServiceArea(address, areas);
120
+ const carrier = inServiceArea
121
+ ? "COMPANY_TRUCK"
122
+ : "PRIVATE_CARRIER";
123
+ const carrierRates = rates
124
+ .filter((rate) => rate.carrier === carrier)
125
+ .sort((a, b) => a.max_weight_kg - b.max_weight_kg);
126
+ if (!carrierRates.length) {
127
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `rate_missing(${carrier})`);
128
+ }
129
+ const selectedRate = carrierRates.find((rate) => {
130
+ const min = rate.min_weight_kg ?? 0;
131
+ return totalWeightKg >= min && totalWeightKg <= rate.max_weight_kg;
132
+ });
133
+ if (!selectedRate) {
134
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `weight_slab_missing_${carrier}`);
135
+ }
136
+ return {
137
+ method: carrier,
138
+ area: inServiceArea ? "SERVICE_AREA" : "OUT_OF_AREA",
139
+ weightKg: Number(totalWeightKg.toFixed(3)),
140
+ price: selectedRate.price_thb,
141
+ currency: selectedRate.currency || "THB",
142
+ };
143
+ }
144
+ isInServiceArea(address, areas) {
145
+ const provinceNormalized = address.province.trim().toLowerCase();
146
+ const postcode = (address.postcode || "").trim();
147
+ return areas.some((area) => {
148
+ if (area.kind === "PROVINCE") {
149
+ return area.value.trim().toLowerCase() === provinceNormalized;
150
+ }
151
+ if (area.kind === "POSTCODE_PREFIX") {
152
+ return postcode.startsWith(area.value.trim());
153
+ }
154
+ return false;
155
+ });
156
+ }
157
+ async readThroughCache(key, loader) {
158
+ const entry = this.cache[key];
159
+ const now = Date.now();
160
+ if (entry.data && entry.expiresAt > now) {
161
+ return entry.data;
162
+ }
163
+ const data = await loader();
164
+ this.cache[key] = {
165
+ data,
166
+ expiresAt: now + CACHE_TTL_MS,
167
+ };
168
+ return data;
169
+ }
170
+ }
171
+ exports.default = ParcelShippingModuleService;
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3BhcmNlbC1zaGlwcGluZy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQXNFO0FBQ3RFLG9EQUErQztBQUMvQywwREFBcUQ7QUFDckQsd0RBQW1EO0FBV25ELDZDQUFtRDtBQUVuRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUE7QUFJM0IsTUFBcUIsMkJBQTRCLFNBQVEsSUFBQSxxQkFBYSxFQUFDO0lBQ3JFLFNBQVMsRUFBVCxzQkFBUztJQUNULFlBQVksRUFBWiw0QkFBWTtJQUNaLFdBQVcsRUFBWCwwQkFBVztDQUNaLENBQUM7SUFKRjs7UUFLVSxVQUFLLEdBR1Q7WUFDRixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7WUFDbkMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRTtTQUNwQyxDQUFBO0lBZ1BILENBQUM7SUE5T0MsZUFBZSxDQUFDLElBQWlCO1FBQy9CLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFlLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFBO1lBQzVELENBQUMsQ0FBQyxDQUFBO1lBQ0YsT0FBTTtRQUNSLENBQUM7UUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElB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
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wYXJjZWwtc2hpcHBpbmcvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,319 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.selectBestPacking = selectBestPacking;
4
+ const PADDING_PER_SIDE_CM = 2;
5
+ const PADDING_TOTAL = PADDING_PER_SIDE_CM * 2;
6
+ function selectBestPacking(items, boxes) {
7
+ const expandedItems = expandItems(items);
8
+ if (!expandedItems.length) {
9
+ return {
10
+ success: false,
11
+ code: "invalid_items",
12
+ message: "No items with positive quantity were provided.",
13
+ };
14
+ }
15
+ const successful = [];
16
+ const overweight = [];
17
+ const nearFits = [];
18
+ for (const box of boxes) {
19
+ const evaluation = evaluateBox(box, expandedItems);
20
+ if (evaluation.status === "success") {
21
+ successful.push(evaluation.evaluation);
22
+ continue;
23
+ }
24
+ if (evaluation.evaluation) {
25
+ if (evaluation.status === "overweight") {
26
+ overweight.push(evaluation.evaluation);
27
+ }
28
+ else if (evaluation.status === "no_fit") {
29
+ nearFits.push(evaluation.evaluation);
30
+ }
31
+ }
32
+ }
33
+ if (successful.length) {
34
+ const sorted = successful.sort(comparePacking);
35
+ return {
36
+ success: true,
37
+ result: sorted[0],
38
+ };
39
+ }
40
+ if (overweight.length) {
41
+ return {
42
+ success: false,
43
+ code: "no_fit_weight",
44
+ message: "Total weight exceeds the maximum weight limit for available boxes.",
45
+ alternatives: overweight.slice(0, 3).sort(comparePacking),
46
+ };
47
+ }
48
+ return {
49
+ success: false,
50
+ code: "no_fit",
51
+ message: "No configured box can fit the provided items.",
52
+ alternatives: nearFits.slice(0, 3).sort(comparePacking),
53
+ };
54
+ }
55
+ function evaluateBox(box, items) {
56
+ const totalActualWeight = items.reduce((acc, item) => acc + item.weight, 0);
57
+ const packedVolume = items.reduce((acc, item) => acc + item.volume, 0);
58
+ const initialMetrics = {
59
+ usedHeight: 0,
60
+ headroom: box.height_cm,
61
+ wasteAreaSum: box.width_cm * box.length_cm,
62
+ voidVolume: Math.max(box.width_cm * box.length_cm * box.height_cm - packedVolume, 0),
63
+ layers: 0,
64
+ placements: [],
65
+ totalWeightKg: Number(totalActualWeight.toFixed(4)),
66
+ };
67
+ if (totalActualWeight > box.max_weight_kg) {
68
+ return {
69
+ status: "overweight",
70
+ overBy: totalActualWeight - box.max_weight_kg,
71
+ evaluation: {
72
+ box,
73
+ metrics: initialMetrics,
74
+ },
75
+ };
76
+ }
77
+ const layers = [];
78
+ const sortedItems = items
79
+ .map((item) => ({ item }))
80
+ .sort((a, b) => b.item.volume - a.item.volume);
81
+ for (const { item } of sortedItems) {
82
+ const orientations = getOrientations(item, Boolean(item.attributes?.noStack));
83
+ let placed = false;
84
+ for (const orientation of orientations) {
85
+ for (const layer of layers) {
86
+ if (item.attributes?.noStack && layer.index !== 0) {
87
+ continue;
88
+ }
89
+ const totalHeightIfPlaced = layers.reduce((acc, existingLayer) => acc +
90
+ (existingLayer === layer
91
+ ? Math.max(existingLayer.height, orientation.height)
92
+ : existingLayer.height), 0);
93
+ if (totalHeightIfPlaced > box.height_cm + 1e-6) {
94
+ continue;
95
+ }
96
+ const placement = placeInLayer(layer, orientation);
97
+ if (placement) {
98
+ placed = true;
99
+ layer.height = Math.max(layer.height, orientation.height);
100
+ layer.hasNoStack =
101
+ layer.hasNoStack || Boolean(item.attributes?.noStack);
102
+ layer.placements.push({
103
+ sku: item.sku,
104
+ orientation,
105
+ position: [placement.x, placement.y, layer.startHeight],
106
+ });
107
+ recalculateLayerHeights(layers);
108
+ updateWasteArea(initialMetrics, layers);
109
+ break;
110
+ }
111
+ }
112
+ if (placed) {
113
+ break;
114
+ }
115
+ const totalUsedHeight = layers.reduce((acc, layer) => acc + layer.height, 0);
116
+ if (totalUsedHeight + orientation.height > box.height_cm + 1e-6) {
117
+ continue;
118
+ }
119
+ if (item.attributes?.noStack && layers.length > 0) {
120
+ continue;
121
+ }
122
+ const newLayer = {
123
+ index: layers.length,
124
+ startHeight: totalUsedHeight,
125
+ height: orientation.height,
126
+ spaces: [
127
+ {
128
+ x: 0,
129
+ y: 0,
130
+ width: box.width_cm,
131
+ length: box.length_cm,
132
+ },
133
+ ],
134
+ placements: [],
135
+ hasNoStack: Boolean(item.attributes?.noStack),
136
+ };
137
+ const placement = placeInLayer(newLayer, orientation);
138
+ if (!placement) {
139
+ continue;
140
+ }
141
+ newLayer.placements.push({
142
+ sku: item.sku,
143
+ orientation,
144
+ position: [placement.x, placement.y, newLayer.startHeight],
145
+ });
146
+ layers.push(newLayer);
147
+ recalculateLayerHeights(layers);
148
+ updateWasteArea(initialMetrics, layers);
149
+ placed = true;
150
+ break;
151
+ }
152
+ if (!placed) {
153
+ return {
154
+ status: "no_fit",
155
+ slackScore: calculateSlackScore(box, items),
156
+ evaluation: {
157
+ box,
158
+ metrics: initialMetrics,
159
+ },
160
+ };
161
+ }
162
+ }
163
+ initialMetrics.layers = layers.length;
164
+ initialMetrics.usedHeight = layers.reduce((acc, layer) => acc + layer.height, 0);
165
+ initialMetrics.headroom = Number(Math.max(box.height_cm - initialMetrics.usedHeight, 0).toFixed(2));
166
+ initialMetrics.placements = layers.flatMap((layer, layerIdx) => layer.placements.map((placement) => ({
167
+ sku: placement.sku,
168
+ orientation: [
169
+ Number(placement.orientation.width.toFixed(2)),
170
+ Number(placement.orientation.length.toFixed(2)),
171
+ Number(placement.orientation.height.toFixed(2)),
172
+ ],
173
+ position: placement.position,
174
+ layerIndex: layerIdx,
175
+ })));
176
+ initialMetrics.wasteAreaSum = layers.reduce((acc, layer) => acc +
177
+ layer.spaces.reduce((spaceAcc, space) => {
178
+ return spaceAcc + space.width * space.length;
179
+ }, 0), 0);
180
+ return {
181
+ status: "success",
182
+ evaluation: {
183
+ box,
184
+ metrics: initialMetrics,
185
+ },
186
+ };
187
+ }
188
+ function expandItems(items) {
189
+ const expanded = [];
190
+ for (const item of items) {
191
+ const qty = Math.max(0, Math.floor(item.quantity));
192
+ if (!qty) {
193
+ continue;
194
+ }
195
+ const paddedWidth = item.width + PADDING_TOTAL;
196
+ const paddedLength = item.length + PADDING_TOTAL;
197
+ const paddedHeight = item.height + PADDING_TOTAL;
198
+ const volume = paddedWidth * paddedLength * paddedHeight;
199
+ for (let i = 0; i < qty; i++) {
200
+ expanded.push({
201
+ sku: item.sku,
202
+ baseWidth: item.width,
203
+ baseLength: item.length,
204
+ baseHeight: item.height,
205
+ width: paddedWidth,
206
+ length: paddedLength,
207
+ height: paddedHeight,
208
+ weight: item.weight,
209
+ volume,
210
+ attributes: item.attributes,
211
+ });
212
+ }
213
+ }
214
+ return expanded;
215
+ }
216
+ function getOrientations(item, noStack) {
217
+ const orientations = [];
218
+ const dims = [item.width, item.length, item.height];
219
+ const permutations = [
220
+ [dims[0], dims[1], dims[2]],
221
+ [dims[0], dims[2], dims[1]],
222
+ [dims[1], dims[0], dims[2]],
223
+ [dims[1], dims[2], dims[0]],
224
+ [dims[2], dims[0], dims[1]],
225
+ [dims[2], dims[1], dims[0]],
226
+ ];
227
+ for (const [w, l, h] of permutations) {
228
+ if (noStack && h > Math.min(w, l)) {
229
+ continue;
230
+ }
231
+ orientations.push({
232
+ width: Number(w.toFixed(2)),
233
+ length: Number(l.toFixed(2)),
234
+ height: Number(h.toFixed(2)),
235
+ volume: Number((w * l * h).toFixed(2)),
236
+ });
237
+ }
238
+ return orientations.sort((a, b) => a.height - b.height || a.volume - b.volume);
239
+ }
240
+ function placeInLayer(layer, orientation) {
241
+ for (let i = 0; i < layer.spaces.length; i++) {
242
+ const space = layer.spaces[i];
243
+ if (orientation.width <= space.width + 1e-6 &&
244
+ orientation.length <= space.length + 1e-6) {
245
+ layer.spaces.splice(i, 1);
246
+ splitSpace(layer, space, orientation);
247
+ return {
248
+ x: space.x,
249
+ y: space.y,
250
+ width: orientation.width,
251
+ length: orientation.length,
252
+ };
253
+ }
254
+ }
255
+ return null;
256
+ }
257
+ function splitSpace(layer, space, orientation) {
258
+ const remainingWidth = Number(Math.max(space.width - orientation.width, 0).toFixed(2));
259
+ const remainingLength = Number(Math.max(space.length - orientation.length, 0).toFixed(2));
260
+ if (remainingWidth > 0) {
261
+ layer.spaces.push({
262
+ x: Number((space.x + orientation.width).toFixed(2)),
263
+ y: space.y,
264
+ width: remainingWidth,
265
+ length: orientation.length,
266
+ });
267
+ }
268
+ if (remainingLength > 0) {
269
+ layer.spaces.push({
270
+ x: space.x,
271
+ y: Number((space.y + orientation.length).toFixed(2)),
272
+ width: space.width,
273
+ length: remainingLength,
274
+ });
275
+ }
276
+ }
277
+ function recalculateLayerHeights(layers) {
278
+ let cursor = 0;
279
+ for (const layer of layers) {
280
+ layer.startHeight = Number(cursor.toFixed(2));
281
+ cursor += layer.height;
282
+ }
283
+ }
284
+ function updateWasteArea(metrics, layers) {
285
+ metrics.wasteAreaSum = layers.reduce((acc, layer) => {
286
+ return (acc +
287
+ layer.spaces.reduce((spaceAcc, space) => {
288
+ return spaceAcc + space.width * space.length;
289
+ }, 0));
290
+ }, 0);
291
+ }
292
+ function calculateSlackScore(box, items) {
293
+ const totalVolume = items.reduce((acc, item) => acc + item.volume, 0);
294
+ const boxVolume = box.width_cm * box.length_cm * box.height_cm;
295
+ const volumeSlack = boxVolume - totalVolume;
296
+ const maxWidth = Math.max(...items.map((item) => item.width));
297
+ const maxLength = Math.max(...items.map((item) => item.length));
298
+ const totalHeight = items.reduce((acc, item) => acc + item.height, 0);
299
+ const widthSlack = box.width_cm - maxWidth;
300
+ const lengthSlack = box.length_cm - maxLength;
301
+ const heightSlack = box.height_cm - totalHeight;
302
+ return ((volumeSlack > 0 ? volumeSlack : Number.MAX_SAFE_INTEGER) +
303
+ (widthSlack > 0 ? widthSlack : Number.MAX_SAFE_INTEGER / 2) +
304
+ (lengthSlack > 0 ? lengthSlack : Number.MAX_SAFE_INTEGER / 2) +
305
+ (heightSlack > 0 ? heightSlack : Number.MAX_SAFE_INTEGER / 2));
306
+ }
307
+ function comparePacking(a, b) {
308
+ if (a.metrics.usedHeight !== b.metrics.usedHeight) {
309
+ return a.metrics.usedHeight - b.metrics.usedHeight;
310
+ }
311
+ if (a.metrics.wasteAreaSum !== b.metrics.wasteAreaSum) {
312
+ return a.metrics.wasteAreaSum - b.metrics.wasteAreaSum;
313
+ }
314
+ if (a.metrics.voidVolume !== b.metrics.voidVolume) {
315
+ return a.metrics.voidVolume - b.metrics.voidVolume;
316
+ }
317
+ return a.box.price_thb - b.box.price_thb;
318
+ }
319
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3BhcmNlbC1zaGlwcGluZy91dGlscy9wYWNraW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0VBLDhDQTJEQztBQXJIRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLGFBQWEsR0FBRyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUF5RDlDLFNBQWdCLGlCQUFpQixDQUMvQixLQUFrQixFQUNsQixLQUFxQjtJQUVyQixNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixPQUFPO1lBQ0wsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsZUFBZTtZQUNyQixPQUFPLEVBQUUsZ0RBQWdEO1NBQzFELENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQXdCLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFVBQVUsR0FBd0IsRUFBRSxDQUFDO0lBQzNDLE1BQU0sUUFBUSxHQUF3QixFQUFFLENBQUM7SUFFekMsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN4QixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRW5ELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN2QyxTQUFTO1FBQ1gsQ0FBQztRQUVELElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFCLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDdkMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxD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
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompanyTruckFulfillmentProvider = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const parcel_fulfillment_base_1 = require("../parcel-fulfillment-base");
6
+ class CompanyTruckFulfillmentProvider extends parcel_fulfillment_base_1.ParcelFulfillmentProviderBase {
7
+ constructor(deps, options = {}) {
8
+ super(deps, options);
9
+ this.carrier = "COMPANY_TRUCK";
10
+ this.optionId = "parcel-company-truck";
11
+ this.optionLabel = "Company Truck Delivery";
12
+ }
13
+ }
14
+ exports.CompanyTruckFulfillmentProvider = CompanyTruckFulfillmentProvider;
15
+ CompanyTruckFulfillmentProvider.identifier = "parcel-company-truck";
16
+ exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.FULFILLMENT, {
17
+ services: [CompanyTruckFulfillmentProvider],
18
+ });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2NvbXBhbnktdHJ1Y2svaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQW1FO0FBRW5FLHdFQUEwRTtBQUUxRSxNQUFhLCtCQUNYLFNBQVEsdURBQTZCO0lBUXJDLFlBQ0UsSUFBb0UsRUFDcEUsVUFBNEMsRUFBRTtRQUU5QyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBUkgsWUFBTyxHQUFHLGVBQXdCLENBQUE7UUFDbEMsYUFBUSxHQUFHLHNCQUFzQixDQUFBO1FBQ2pDLGdCQUFXLEdBQUcsd0JBQXdCLENBQUE7SUFPekQsQ0FBQzs7QUFkSCwwRUFlQztBQVpRLDBDQUFVLEdBQUcsc0JBQXNCLEFBQXpCLENBQXlCO0FBYzVDLGtCQUFlLElBQUEsc0JBQWMsRUFBQyxlQUFPLENBQUMsV0FBVyxFQUFFO0lBQ2pELFFBQVEsRUFBRSxDQUFDLCtCQUErQixDQUFDO0NBQzVDLENBQUMsQ0FBQSJ9