@murumets-ee/imports 0.48.0 → 0.51.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/dist/carmaker-feed-C_MnDaOC.mjs +2 -0
- package/dist/{carmaker-feed-CxhZBrkO.mjs.map → carmaker-feed-C_MnDaOC.mjs.map} +1 -1
- package/dist/carmaker-feed-DlD2xPs0.d.mts +58 -0
- package/dist/carmaker-feed-DlD2xPs0.d.mts.map +1 -0
- package/dist/{cleanup-CHjDgvKT.mjs → cleanup-DdILFoAP.mjs} +2 -2
- package/dist/{cleanup-CHjDgvKT.mjs.map → cleanup-DdILFoAP.mjs.map} +1 -1
- package/dist/index.d.mts +5 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/mapping/index.d.mts +2 -359
- package/dist/mapping/index.d.mts.map +1 -1
- package/dist/mapping/index.mjs +1 -1
- package/dist/{mapping-transform-D76b-P-p.mjs → mapping-transform-AMFEg1rS.mjs} +2 -2
- package/dist/{mapping-transform-D76b-P-p.mjs.map → mapping-transform-AMFEg1rS.mjs.map} +1 -1
- package/dist/{parts-schema-D0gMhNWj.mjs → parts-schema-BBUINSdN.mjs} +2 -2
- package/dist/{parts-schema-D0gMhNWj.mjs.map → parts-schema-BBUINSdN.mjs.map} +1 -1
- package/dist/{parts-schema-x8_GRYWc.d.mts → parts-schema-u5kr5zFg.d.mts} +359 -3
- package/dist/parts-schema-u5kr5zFg.d.mts.map +1 -0
- package/dist/plugin.d.mts +33 -6
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +1 -1
- package/dist/plugin.mjs.map +1 -1
- package/dist/runner-wPnCZlB4.mjs +2 -0
- package/dist/runner-wPnCZlB4.mjs.map +1 -0
- package/dist/{schema-registry-C_lQje-K.mjs → schema-registry-B_7AweTa.mjs} +2 -2
- package/dist/{schema-registry-C_lQje-K.mjs.map → schema-registry-B_7AweTa.mjs.map} +1 -1
- package/dist/storage-resolver.d.mts +1 -1
- package/dist/transform-DwAQ4b-j.mjs +2 -0
- package/dist/transform-DwAQ4b-j.mjs.map +1 -0
- package/dist/{transform-CABBaYmF.d.mts → transform-WeiiLdYP.d.mts} +12 -1
- package/dist/transform-WeiiLdYP.d.mts.map +1 -0
- package/dist/transforms.d.mts +2 -46
- package/dist/transforms.mjs +1 -1
- package/dist/{worker-DRTgbtT7.d.mts → worker-DH3SN-91.d.mts} +189 -4
- package/dist/worker-DH3SN-91.d.mts.map +1 -0
- package/dist/worker.d.mts +1 -1
- package/dist/worker.mjs +1 -1
- package/dist/worker.mjs.map +1 -1
- package/dist/{xlsx-reader-Ccesszbc.mjs → xlsx-reader-Dsq_ERiB.mjs} +2 -2
- package/dist/{xlsx-reader-Ccesszbc.mjs.map → xlsx-reader-Dsq_ERiB.mjs.map} +1 -1
- package/package.json +8 -8
- package/dist/carmaker-feed-CxhZBrkO.mjs +0 -2
- package/dist/parts-schema-x8_GRYWc.d.mts.map +0 -1
- package/dist/runner-C-s6SD7t.mjs +0 -2
- package/dist/runner-C-s6SD7t.mjs.map +0 -1
- package/dist/transform-CABBaYmF.d.mts.map +0 -1
- package/dist/transform-DIzWppgJ.mjs +0 -2
- package/dist/transform-DIzWppgJ.mjs.map +0 -1
- package/dist/transforms.d.mts.map +0 -1
- package/dist/worker-DRTgbtT7.d.mts.map +0 -1
package/dist/mapping/index.d.mts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { i as RowTransform } from "../transform-
|
|
2
|
-
import { C as
|
|
3
|
-
import { z } from "zod";
|
|
1
|
+
import { i as RowTransform } from "../transform-WeiiLdYP.mjs";
|
|
2
|
+
import { A as parseNumber, C as ColumnTransform, D as columnTransformSchema, E as applyColumnTransforms, O as NumberFormat, S as CellValue, T as ColumnTransformOpDescriptor, _ as TargetSchema, a as MappingColumn, b as textOrNull, c as buildMappingTransform, d as numberFormatSchema, f as resolveMapping, g as TargetField, h as NumberOutcome, i as partsSchema, j as toMinorUnits, k as parseEuropeanNumber, l as mappingColumnSchema, m as MappedRow, n as normalizeCode, o as MappingConfig, p as BuildRowContext, r as partsParamsSchema, s as ResolvableMapping, t as PartsParams, u as mappingConfigSchema, v as numberCell, w as ColumnTransformOp, x as COLUMN_TRANSFORM_OPS, y as rowError } from "../parts-schema-u5kr5zFg.mjs";
|
|
4
3
|
|
|
5
4
|
//#region src/mapping/discount-table-schema.d.ts
|
|
6
5
|
/** One parsed discount-table row: a group token + the purchase discount % off list. */
|
|
@@ -10,362 +9,6 @@ interface DiscountTableRow {
|
|
|
10
9
|
}
|
|
11
10
|
declare const discountTableSchema: TargetSchema<DiscountTableRow>;
|
|
12
11
|
//#endregion
|
|
13
|
-
//#region src/mapping/engine.d.ts
|
|
14
|
-
/** One column-map entry. `target` is checked against the schema whitelist separately. */
|
|
15
|
-
declare const mappingColumnSchema: z.ZodObject<{
|
|
16
|
-
/** Source header name (or positional index string for headerless feeds). */source: z.ZodString; /** Target field key — must be in the chosen schema's whitelist (enforced in `buildMappingTransform`). */
|
|
17
|
-
target: z.ZodString; /** Ordered per-column cleaning ops. Defaults to none. */
|
|
18
|
-
transforms: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"op", [z.ZodObject<{
|
|
19
|
-
op: z.ZodLiteral<"trim">;
|
|
20
|
-
}, "strip", z.ZodTypeAny, {
|
|
21
|
-
op: "trim";
|
|
22
|
-
}, {
|
|
23
|
-
op: "trim";
|
|
24
|
-
}>, z.ZodObject<{
|
|
25
|
-
op: z.ZodLiteral<"uppercase">;
|
|
26
|
-
}, "strip", z.ZodTypeAny, {
|
|
27
|
-
op: "uppercase";
|
|
28
|
-
}, {
|
|
29
|
-
op: "uppercase";
|
|
30
|
-
}>, z.ZodObject<{
|
|
31
|
-
op: z.ZodLiteral<"lowercase">;
|
|
32
|
-
}, "strip", z.ZodTypeAny, {
|
|
33
|
-
op: "lowercase";
|
|
34
|
-
}, {
|
|
35
|
-
op: "lowercase";
|
|
36
|
-
}>, z.ZodObject<{
|
|
37
|
-
op: z.ZodLiteral<"stripPrefix">;
|
|
38
|
-
value: z.ZodString;
|
|
39
|
-
}, "strip", z.ZodTypeAny, {
|
|
40
|
-
value: string;
|
|
41
|
-
op: "stripPrefix";
|
|
42
|
-
}, {
|
|
43
|
-
value: string;
|
|
44
|
-
op: "stripPrefix";
|
|
45
|
-
}>, z.ZodObject<{
|
|
46
|
-
op: z.ZodLiteral<"stripSuffix">;
|
|
47
|
-
value: z.ZodString;
|
|
48
|
-
}, "strip", z.ZodTypeAny, {
|
|
49
|
-
value: string;
|
|
50
|
-
op: "stripSuffix";
|
|
51
|
-
}, {
|
|
52
|
-
value: string;
|
|
53
|
-
op: "stripSuffix";
|
|
54
|
-
}>, z.ZodObject<{
|
|
55
|
-
op: z.ZodLiteral<"defaultIfEmpty">;
|
|
56
|
-
value: z.ZodString;
|
|
57
|
-
}, "strip", z.ZodTypeAny, {
|
|
58
|
-
value: string;
|
|
59
|
-
op: "defaultIfEmpty";
|
|
60
|
-
}, {
|
|
61
|
-
value: string;
|
|
62
|
-
op: "defaultIfEmpty";
|
|
63
|
-
}>, z.ZodObject<{
|
|
64
|
-
op: z.ZodLiteral<"number">;
|
|
65
|
-
}, "strip", z.ZodTypeAny, {
|
|
66
|
-
op: "number";
|
|
67
|
-
}, {
|
|
68
|
-
op: "number";
|
|
69
|
-
}>, z.ZodObject<{
|
|
70
|
-
op: z.ZodLiteral<"europeanNumber">;
|
|
71
|
-
}, "strip", z.ZodTypeAny, {
|
|
72
|
-
op: "europeanNumber";
|
|
73
|
-
}, {
|
|
74
|
-
op: "europeanNumber";
|
|
75
|
-
}>]>, "many">>;
|
|
76
|
-
}, "strip", z.ZodTypeAny, {
|
|
77
|
-
source: string;
|
|
78
|
-
target: string;
|
|
79
|
-
transforms: ({
|
|
80
|
-
op: "trim";
|
|
81
|
-
} | {
|
|
82
|
-
op: "uppercase";
|
|
83
|
-
} | {
|
|
84
|
-
op: "lowercase";
|
|
85
|
-
} | {
|
|
86
|
-
value: string;
|
|
87
|
-
op: "stripPrefix";
|
|
88
|
-
} | {
|
|
89
|
-
value: string;
|
|
90
|
-
op: "stripSuffix";
|
|
91
|
-
} | {
|
|
92
|
-
value: string;
|
|
93
|
-
op: "defaultIfEmpty";
|
|
94
|
-
} | {
|
|
95
|
-
op: "number";
|
|
96
|
-
} | {
|
|
97
|
-
op: "europeanNumber";
|
|
98
|
-
})[];
|
|
99
|
-
}, {
|
|
100
|
-
source: string;
|
|
101
|
-
target: string;
|
|
102
|
-
transforms?: ({
|
|
103
|
-
op: "trim";
|
|
104
|
-
} | {
|
|
105
|
-
op: "uppercase";
|
|
106
|
-
} | {
|
|
107
|
-
op: "lowercase";
|
|
108
|
-
} | {
|
|
109
|
-
value: string;
|
|
110
|
-
op: "stripPrefix";
|
|
111
|
-
} | {
|
|
112
|
-
value: string;
|
|
113
|
-
op: "stripSuffix";
|
|
114
|
-
} | {
|
|
115
|
-
value: string;
|
|
116
|
-
op: "defaultIfEmpty";
|
|
117
|
-
} | {
|
|
118
|
-
op: "number";
|
|
119
|
-
} | {
|
|
120
|
-
op: "europeanNumber";
|
|
121
|
-
})[] | undefined;
|
|
122
|
-
}>;
|
|
123
|
-
type MappingColumn = z.infer<typeof mappingColumnSchema>;
|
|
124
|
-
/**
|
|
125
|
-
* Decimal + thousands separators for the `number` transform.
|
|
126
|
-
*
|
|
127
|
-
* The two MUST differ: `parseNumber` strips every thousands separator FIRST, so a
|
|
128
|
-
* config where `decimal === thousands` (e.g. both `,`) would strip the decimal
|
|
129
|
-
* separator too — `326,88` → `32688`, a silent 100× error rather than a row error.
|
|
130
|
-
* Rejected at save (`assertValidMapping`) AND at run (`mappingConfigSchema`).
|
|
131
|
-
*/
|
|
132
|
-
declare const numberFormatSchema: z.ZodEffects<z.ZodObject<{
|
|
133
|
-
decimal: z.ZodEnum<[".", ","]>;
|
|
134
|
-
thousands: z.ZodEnum<["", ".", ",", " "]>;
|
|
135
|
-
}, "strip", z.ZodTypeAny, {
|
|
136
|
-
decimal: "." | ",";
|
|
137
|
-
thousands: "" | "." | "," | " ";
|
|
138
|
-
}, {
|
|
139
|
-
decimal: "." | ",";
|
|
140
|
-
thousands: "" | "." | "," | " ";
|
|
141
|
-
}>, {
|
|
142
|
-
decimal: "." | ",";
|
|
143
|
-
thousands: "" | "." | "," | " ";
|
|
144
|
-
}, {
|
|
145
|
-
decimal: "." | ",";
|
|
146
|
-
thousands: "" | "." | "," | " ";
|
|
147
|
-
}>;
|
|
148
|
-
/**
|
|
149
|
-
* The portable mapping config — the subset of an `import_mapping` row the engine
|
|
150
|
-
* needs. The enqueuer SNAPSHOTS this into `import_run.params.mapping` so a run
|
|
151
|
-
* records the exact mapping it used (reproducible) and the transform stays a pure
|
|
152
|
-
* function of `(row, ctx)` with no per-row DB I/O.
|
|
153
|
-
*/
|
|
154
|
-
declare const mappingConfigSchema: z.ZodObject<{
|
|
155
|
-
targetSchema: z.ZodString;
|
|
156
|
-
numberFormat: z.ZodEffects<z.ZodObject<{
|
|
157
|
-
decimal: z.ZodEnum<[".", ","]>;
|
|
158
|
-
thousands: z.ZodEnum<["", ".", ",", " "]>;
|
|
159
|
-
}, "strip", z.ZodTypeAny, {
|
|
160
|
-
decimal: "." | ",";
|
|
161
|
-
thousands: "" | "." | "," | " ";
|
|
162
|
-
}, {
|
|
163
|
-
decimal: "." | ",";
|
|
164
|
-
thousands: "" | "." | "," | " ";
|
|
165
|
-
}>, {
|
|
166
|
-
decimal: "." | ",";
|
|
167
|
-
thousands: "" | "." | "," | " ";
|
|
168
|
-
}, {
|
|
169
|
-
decimal: "." | ",";
|
|
170
|
-
thousands: "" | "." | "," | " ";
|
|
171
|
-
}>;
|
|
172
|
-
columnMap: z.ZodArray<z.ZodObject<{
|
|
173
|
-
/** Source header name (or positional index string for headerless feeds). */source: z.ZodString; /** Target field key — must be in the chosen schema's whitelist (enforced in `buildMappingTransform`). */
|
|
174
|
-
target: z.ZodString; /** Ordered per-column cleaning ops. Defaults to none. */
|
|
175
|
-
transforms: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"op", [z.ZodObject<{
|
|
176
|
-
op: z.ZodLiteral<"trim">;
|
|
177
|
-
}, "strip", z.ZodTypeAny, {
|
|
178
|
-
op: "trim";
|
|
179
|
-
}, {
|
|
180
|
-
op: "trim";
|
|
181
|
-
}>, z.ZodObject<{
|
|
182
|
-
op: z.ZodLiteral<"uppercase">;
|
|
183
|
-
}, "strip", z.ZodTypeAny, {
|
|
184
|
-
op: "uppercase";
|
|
185
|
-
}, {
|
|
186
|
-
op: "uppercase";
|
|
187
|
-
}>, z.ZodObject<{
|
|
188
|
-
op: z.ZodLiteral<"lowercase">;
|
|
189
|
-
}, "strip", z.ZodTypeAny, {
|
|
190
|
-
op: "lowercase";
|
|
191
|
-
}, {
|
|
192
|
-
op: "lowercase";
|
|
193
|
-
}>, z.ZodObject<{
|
|
194
|
-
op: z.ZodLiteral<"stripPrefix">;
|
|
195
|
-
value: z.ZodString;
|
|
196
|
-
}, "strip", z.ZodTypeAny, {
|
|
197
|
-
value: string;
|
|
198
|
-
op: "stripPrefix";
|
|
199
|
-
}, {
|
|
200
|
-
value: string;
|
|
201
|
-
op: "stripPrefix";
|
|
202
|
-
}>, z.ZodObject<{
|
|
203
|
-
op: z.ZodLiteral<"stripSuffix">;
|
|
204
|
-
value: z.ZodString;
|
|
205
|
-
}, "strip", z.ZodTypeAny, {
|
|
206
|
-
value: string;
|
|
207
|
-
op: "stripSuffix";
|
|
208
|
-
}, {
|
|
209
|
-
value: string;
|
|
210
|
-
op: "stripSuffix";
|
|
211
|
-
}>, z.ZodObject<{
|
|
212
|
-
op: z.ZodLiteral<"defaultIfEmpty">;
|
|
213
|
-
value: z.ZodString;
|
|
214
|
-
}, "strip", z.ZodTypeAny, {
|
|
215
|
-
value: string;
|
|
216
|
-
op: "defaultIfEmpty";
|
|
217
|
-
}, {
|
|
218
|
-
value: string;
|
|
219
|
-
op: "defaultIfEmpty";
|
|
220
|
-
}>, z.ZodObject<{
|
|
221
|
-
op: z.ZodLiteral<"number">;
|
|
222
|
-
}, "strip", z.ZodTypeAny, {
|
|
223
|
-
op: "number";
|
|
224
|
-
}, {
|
|
225
|
-
op: "number";
|
|
226
|
-
}>, z.ZodObject<{
|
|
227
|
-
op: z.ZodLiteral<"europeanNumber">;
|
|
228
|
-
}, "strip", z.ZodTypeAny, {
|
|
229
|
-
op: "europeanNumber";
|
|
230
|
-
}, {
|
|
231
|
-
op: "europeanNumber";
|
|
232
|
-
}>]>, "many">>;
|
|
233
|
-
}, "strip", z.ZodTypeAny, {
|
|
234
|
-
source: string;
|
|
235
|
-
target: string;
|
|
236
|
-
transforms: ({
|
|
237
|
-
op: "trim";
|
|
238
|
-
} | {
|
|
239
|
-
op: "uppercase";
|
|
240
|
-
} | {
|
|
241
|
-
op: "lowercase";
|
|
242
|
-
} | {
|
|
243
|
-
value: string;
|
|
244
|
-
op: "stripPrefix";
|
|
245
|
-
} | {
|
|
246
|
-
value: string;
|
|
247
|
-
op: "stripSuffix";
|
|
248
|
-
} | {
|
|
249
|
-
value: string;
|
|
250
|
-
op: "defaultIfEmpty";
|
|
251
|
-
} | {
|
|
252
|
-
op: "number";
|
|
253
|
-
} | {
|
|
254
|
-
op: "europeanNumber";
|
|
255
|
-
})[];
|
|
256
|
-
}, {
|
|
257
|
-
source: string;
|
|
258
|
-
target: string;
|
|
259
|
-
transforms?: ({
|
|
260
|
-
op: "trim";
|
|
261
|
-
} | {
|
|
262
|
-
op: "uppercase";
|
|
263
|
-
} | {
|
|
264
|
-
op: "lowercase";
|
|
265
|
-
} | {
|
|
266
|
-
value: string;
|
|
267
|
-
op: "stripPrefix";
|
|
268
|
-
} | {
|
|
269
|
-
value: string;
|
|
270
|
-
op: "stripSuffix";
|
|
271
|
-
} | {
|
|
272
|
-
value: string;
|
|
273
|
-
op: "defaultIfEmpty";
|
|
274
|
-
} | {
|
|
275
|
-
op: "number";
|
|
276
|
-
} | {
|
|
277
|
-
op: "europeanNumber";
|
|
278
|
-
})[] | undefined;
|
|
279
|
-
}>, "many">;
|
|
280
|
-
}, "strip", z.ZodTypeAny, {
|
|
281
|
-
targetSchema: string;
|
|
282
|
-
numberFormat: {
|
|
283
|
-
decimal: "." | ",";
|
|
284
|
-
thousands: "" | "." | "," | " ";
|
|
285
|
-
};
|
|
286
|
-
columnMap: {
|
|
287
|
-
source: string;
|
|
288
|
-
target: string;
|
|
289
|
-
transforms: ({
|
|
290
|
-
op: "trim";
|
|
291
|
-
} | {
|
|
292
|
-
op: "uppercase";
|
|
293
|
-
} | {
|
|
294
|
-
op: "lowercase";
|
|
295
|
-
} | {
|
|
296
|
-
value: string;
|
|
297
|
-
op: "stripPrefix";
|
|
298
|
-
} | {
|
|
299
|
-
value: string;
|
|
300
|
-
op: "stripSuffix";
|
|
301
|
-
} | {
|
|
302
|
-
value: string;
|
|
303
|
-
op: "defaultIfEmpty";
|
|
304
|
-
} | {
|
|
305
|
-
op: "number";
|
|
306
|
-
} | {
|
|
307
|
-
op: "europeanNumber";
|
|
308
|
-
})[];
|
|
309
|
-
}[];
|
|
310
|
-
}, {
|
|
311
|
-
targetSchema: string;
|
|
312
|
-
numberFormat: {
|
|
313
|
-
decimal: "." | ",";
|
|
314
|
-
thousands: "" | "." | "," | " ";
|
|
315
|
-
};
|
|
316
|
-
columnMap: {
|
|
317
|
-
source: string;
|
|
318
|
-
target: string;
|
|
319
|
-
transforms?: ({
|
|
320
|
-
op: "trim";
|
|
321
|
-
} | {
|
|
322
|
-
op: "uppercase";
|
|
323
|
-
} | {
|
|
324
|
-
op: "lowercase";
|
|
325
|
-
} | {
|
|
326
|
-
value: string;
|
|
327
|
-
op: "stripPrefix";
|
|
328
|
-
} | {
|
|
329
|
-
value: string;
|
|
330
|
-
op: "stripSuffix";
|
|
331
|
-
} | {
|
|
332
|
-
value: string;
|
|
333
|
-
op: "defaultIfEmpty";
|
|
334
|
-
} | {
|
|
335
|
-
op: "number";
|
|
336
|
-
} | {
|
|
337
|
-
op: "europeanNumber";
|
|
338
|
-
})[] | undefined;
|
|
339
|
-
}[];
|
|
340
|
-
}>;
|
|
341
|
-
type MappingConfig = z.infer<typeof mappingConfigSchema>;
|
|
342
|
-
/**
|
|
343
|
-
* Build a `RowTransform` from a validated mapping config + its target schema.
|
|
344
|
-
*
|
|
345
|
-
* Throws at BUILD time if any `column_map` target is outside the schema's
|
|
346
|
-
* whitelist (deny-by-default, R02) — so a misconfigured mapping fails loudly
|
|
347
|
-
* before a single row is written, rather than silently dropping a column.
|
|
348
|
-
*
|
|
349
|
-
* Generic over the schema's output type, so passing the concrete `partsSchema`
|
|
350
|
-
* yields a `RowTransform<PartsDocument>` (the carmaker path keeps its typing); the
|
|
351
|
-
* registry-resolved `TargetSchema<unknown>` yields `RowTransform<unknown>` (the
|
|
352
|
-
* `commerce:mapping` path, where the output type isn't known until runtime).
|
|
353
|
-
*/
|
|
354
|
-
declare function buildMappingTransform<TOut>(config: MappingConfig, schema: TargetSchema<TOut>): RowTransform<TOut>;
|
|
355
|
-
/** The minimal shape `resolveMapping` needs — satisfied by an `import_mapping` row or a test fixture. */
|
|
356
|
-
interface ResolvableMapping {
|
|
357
|
-
/** `null` = supplier default (applies to all brands). */
|
|
358
|
-
brandId: string | null;
|
|
359
|
-
active: boolean;
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Most-specific resolution (D002 ladder): given the candidate mappings for one
|
|
363
|
-
* `(supplier, target_schema)` and the requested brand, return the brand-specific
|
|
364
|
-
* mapping if one exists, else the supplier-default (`brandId === null`). Inactive
|
|
365
|
-
* mappings are skipped. Returns `undefined` when nothing matches.
|
|
366
|
-
*/
|
|
367
|
-
declare function resolveMapping<M extends ResolvableMapping>(mappings: readonly M[], brandId: string | null): M | undefined;
|
|
368
|
-
//#endregion
|
|
369
12
|
//#region src/mapping/mapping-transform.d.ts
|
|
370
13
|
/** Stable name under which the mapping-driven transform is registered. */
|
|
371
14
|
declare const MAPPING_TRANSFORM_NAME = "commerce:mapping";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/mapping/discount-table-schema.ts","../../src/mapping/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/mapping/discount-table-schema.ts","../../src/mapping/mapping-transform.ts","../../src/mapping/schema-registry.ts"],"mappings":";;;;;UAqBiB,gBAAA;EACf,aAAA;EACA,WAAW;AAAA;AAAA,cAQA,mBAAA,EAAqB,YAAY,CAAC,gBAAA;;;AC6BJ;AAAA,cA5B9B,sBAAA;;;ACPb;;;cDmCa,gBAAA,EAAkB,YAAY;;;ADrC9B;AAAA,iBEEG,eAAA,CAAgB,IAAA,WAAe,YAAY;;iBAK3C,iBAAA,CAAA;;UAKC,mBAAA;EACf,IAAA;EACA,MAAA,WAAiB,WAAW;AAAA;ADL9B;;;;AAAmC;AA4BnC;AA5BA,iBCcgB,qBAAA,CAAA,GAAyB,mBAAmB"}
|
package/dist/mapping/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,u as g}from"../parts-schema-
|
|
1
|
+
import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,u as g}from"../parts-schema-BBUINSdN.mjs";import{i as _,n as v,r as y,t as b}from"../schema-registry-B_7AweTa.mjs";import{n as x,t as S}from"../mapping-transform-AMFEg1rS.mjs";export{i as COLUMN_TRANSFORM_OPS,S as MAPPING_TRANSFORM_NAME,f as applyColumnTransforms,m as buildMappingTransform,l as columnTransformSchema,b as describeTargetSchemas,_ as discountTableSchema,v as getTargetSchema,y as listTargetSchemas,n as mappingColumnSchema,c as mappingConfigSchema,x as mappingTransform,h as normalizeCode,s as numberCell,g as numberFormatSchema,o as parseEuropeanNumber,a as parseNumber,u as partsParamsSchema,p as partsSchema,r as resolveMapping,t as rowError,d as textOrNull,e as toMinorUnits};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{l as e,s as t}from"./parts-schema-
|
|
2
|
-
//# sourceMappingURL=mapping-transform-
|
|
1
|
+
import{l as e,s as t}from"./parts-schema-BBUINSdN.mjs";import{n,r}from"./schema-registry-B_7AweTa.mjs";import{z as i}from"zod";const a=`commerce:mapping`,o=i.object({mapping:e}),s=new WeakMap;function c(e){let i=s.get(e);if(i)return i;let{mapping:a}=o.parse(e),c=n(a.targetSchema);if(!c)throw Error(`Unknown target schema "${a.targetSchema}" (registered: ${r().join(`, `)})`);let l=t(a,c);return s.set(e,l),l}const l=async(e,t)=>c(t.params)(e,t);export{l as n,a as t};
|
|
2
|
+
//# sourceMappingURL=mapping-transform-AMFEg1rS.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping-transform-
|
|
1
|
+
{"version":3,"file":"mapping-transform-AMFEg1rS.mjs","names":[],"sources":["../src/mapping/mapping-transform.ts"],"sourcesContent":["/**\n * `commerce:mapping` — the registered transform for runs driven by a saved\n * `import_mapping` (commerce-demo phase 02; the PR3 wizard enqueues these).\n *\n * The run's `params.mapping` carries a SNAPSHOT of the mapping config, so the run\n * is reproducible (it records the exact mapping used) and the transform stays a\n * pure function of `(row, ctx)` with no per-row DB I/O. This transform compiles\n * the snapshot once per `ctx.params` reference (memoized via a `WeakMap`, the same\n * shape as the carmaker path) and applies it.\n *\n * Output type is `unknown` because the target schema (parts vs discount_table)\n * isn't known until the snapshot is read at runtime. The parts schema additionally\n * reads brand/supplier identity from the SAME `params` object (alongside `mapping`).\n *\n * **Sink caveat.** The `runImport` runner bulk-writes whatever doc this produces\n * into the ES `parts` index. That's correct for a `parts` mapping but WRONG for a\n * `discount_table` mapping — its rows belong in Postgres (`supplier_discount_group`),\n * not ES. PR2 ships the discount_table SCHEMA (so the engine parses it) but no sink;\n * a `discount_table` run must NOT be enqueued through the parts-ES `runImport` path.\n * PR4 wires the Postgres sink + the route that enqueues discount runs.\n *\n * PR2 shipped + tested this transform; the wizard that creates the mappings +\n * sets `params.feed` for the reader landed in PR3. Registration is plugin-owned:\n * the `imports()` plugin registers this transform at its own init.\n */\n\nimport { z } from 'zod'\nimport type { RowTransform } from '../transform.js'\nimport { buildMappingTransform, mappingConfigSchema } from './engine.js'\nimport { getTargetSchema, listTargetSchemas } from './schema-registry.js'\n\n/** Stable name under which the mapping-driven transform is registered. */\nexport const MAPPING_TRANSFORM_NAME = 'commerce:mapping'\n\n/** The mapping snapshot lives under `params.mapping`; other params flow to the schema. */\nconst mappingParamsSchema = z.object({ mapping: mappingConfigSchema })\n\n/** Compiled-transform cache, keyed on the `ctx.params` object identity (per run). */\nconst compiledCache = new WeakMap<object, RowTransform<unknown>>()\n\nfunction compile(params: Record<string, unknown>): RowTransform<unknown> {\n const cached = compiledCache.get(params)\n if (cached) return cached\n const { mapping } = mappingParamsSchema.parse(params)\n const schema = getTargetSchema(mapping.targetSchema)\n if (!schema) {\n throw new Error(\n `Unknown target schema \"${mapping.targetSchema}\" (registered: ${listTargetSchemas().join(', ')})`,\n )\n }\n const transform = buildMappingTransform(mapping, schema)\n compiledCache.set(params, transform)\n return transform\n}\n\n/**\n * The registered transform. Resolves + compiles the mapping snapshot from\n * `ctx.params` (memoized), then delegates each row to it. A malformed snapshot or\n * unknown schema throws — surfaced by the runner as a row-level `transform_threw`.\n */\nexport const mappingTransform: RowTransform<unknown> = async (row, ctx) => {\n const transform = compile(ctx.params)\n return transform(row, ctx)\n}\n"],"mappings":"+HAgCA,MAAa,EAAyB,mBAGhC,EAAsB,EAAE,OAAO,CAAE,QAAS,CAAoB,CAAC,EAG/D,EAAgB,IAAI,QAE1B,SAAS,EAAQ,EAAwD,CACvE,IAAM,EAAS,EAAc,IAAI,CAAM,EACvC,GAAI,EAAQ,OAAO,EACnB,GAAM,CAAE,WAAY,EAAoB,MAAM,CAAM,EAC9C,EAAS,EAAgB,EAAQ,YAAY,EACnD,GAAI,CAAC,EACH,MAAU,MACR,0BAA0B,EAAQ,aAAa,iBAAiB,EAAkB,CAAC,CAAC,KAAK,IAAI,EAAE,EACjG,EAEF,IAAM,EAAY,EAAsB,EAAS,CAAM,EAEvD,OADA,EAAc,IAAI,EAAQ,CAAS,EAC5B,CACT,CAOA,MAAa,EAA0C,MAAO,EAAK,IAC/C,EAAQ,EAAI,MACf,CAAC,CAAC,EAAK,CAAG"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{z as e}from"zod";const t=/^-?\d+(\.\d+)?$/;function n(e,n){let r=e.trim();if(r===``||r.toUpperCase()===`NA`)return null;let{decimal:i,thousands:a}=n,o=r;if(a!==``&&(o=o.split(a).join(``)),i===`,`){if(o.includes(`.`))return NaN;o=o.split(`,`).join(`.`)}else if(o.includes(`,`))return NaN;return t.test(o)?Number.parseFloat(o):NaN}function r(e){return Math.round(e*100)}function i(e){let n=e.trim();if(n===``||n.toUpperCase()===`NA`)return null;let r=n.includes(`,`),i=n.includes(`.`),a;if(r&&i)a=n.replace(/\./g,``).replace(`,`,`.`);else if(r)a=n.replace(`,`,`.`);else if(i)return NaN;else a=n;return t.test(a)?Number.parseFloat(a):NaN}const a=e.discriminatedUnion(`op`,[e.object({op:e.literal(`trim`)}),e.object({op:e.literal(`uppercase`)}),e.object({op:e.literal(`lowercase`)}),e.object({op:e.literal(`stripPrefix`),value:e.string().min(1).max(32)}),e.object({op:e.literal(`stripSuffix`),value:e.string().min(1).max(32)}),e.object({op:e.literal(`defaultIfEmpty`),value:e.string().max(255)}),e.object({op:e.literal(`number`)}),e.object({op:e.literal(`europeanNumber`)})]),o=[{op:`trim`,label:`Trim whitespace`,hasValue:!1},{op:`uppercase`,label:`Uppercase`,hasValue:!1},{op:`lowercase`,label:`Lowercase`,hasValue:!1},{op:`stripPrefix`,label:`Strip prefix`,hasValue:!0},{op:`stripSuffix`,label:`Strip suffix`,hasValue:!0},{op:`defaultIfEmpty`,label:`Default if empty`,hasValue:!0},{op:`number`,label:`Parse number (uses number format)`,hasValue:!1},{op:`europeanNumber`,label:`Parse European number (1.234,56)`,hasValue:!1}];function s(e,t,r){let a=e;for(let e of t)if(typeof a==`string`)switch(e.op){case`trim`:a=a.trim();break;case`uppercase`:a=a.toUpperCase();break;case`lowercase`:a=a.toLowerCase();break;case`stripPrefix`:a=a.startsWith(e.value)?a.slice(e.value.length):a;break;case`stripSuffix`:a=a.endsWith(e.value)?a.slice(0,a.length-e.value.length):a;break;case`defaultIfEmpty`:a=a.trim()===``?e.value:a;break;case`number`:a=n(a,r);break;case`europeanNumber`:a=i(a);break}return a}const c=e.object({source:e.string().min(1).max(256),target:e.string().min(1).max(64),transforms:e.array(a).default([])}),l=e.object({decimal:e.enum([`.`,`,`]),thousands:e.enum([``,`.`,`,`,` `])}).refine(e=>e.decimal!==e.thousands,{message:`decimal and thousands separators must differ`,path:[`thousands`]}),u=e.object({targetSchema:e.string().min(1).max(64),numberFormat:l,columnMap:e.array(c)});function d(e,t){let n=new Set(t.fields.map(e=>e.key));for(let r of e.columnMap)if(!n.has(r.target))throw Error(`Mapping target "${r.target}" is not a field of schema "${t.name}" (allowed: ${[...n].join(`, `)})`);let r=e.numberFormat,i=e.columnMap;return async(e,n)=>{let a={};for(let t of i){let n=e[t.source]??``;a[t.target]=s(n,t.transforms,r)}return t.buildRow(a,{importRunId:n.importRunId,rowNumber:n.rowNumber,params:n.params})}}function f(e,t){let n=e.filter(e=>e.active);if(t!==null){let e=n.find(e=>e.brandId===t);if(e)return e}return n.find(e=>e.brandId===null)}function p(e){if(typeof e!=`string`)return null;let t=e.trim();return t===``?null:t}function m(e){return e==null?{kind:`absent`}:typeof e==`number`?Number.isNaN(e)?{kind:`invalid`}:{kind:`value`,value:e}:e.trim()===``?{kind:`absent`}:{kind:`invalid`}}function h(e,t,n){return{kind:`error`,error:{errorType:e,message:t,field:n}}}const g=e.object({brandId:e.string().uuid(),brandSlug:e.string().min(1).max(64),supplierId:e.string().uuid(),supplierDisplayName:e.string().min(1).max(255),importBatchId:e.string().uuid(),supplierCodePrefix:e.string().max(8).regex(/^[A-Z0-9-]+$/,`must be uppercase alphanumeric or "-"`).optional(),discountGroups:e.record(e.string(),e.number().min(0).max(100)).optional()}),_=new WeakMap;function v(e){let t=_.get(e);if(t)return t;let n=g.parse(e);return _.set(e,n),n}const y=[`de`,`en`,`es`,`fr`,`it`,`nl`,`pt`,`ro`],b=e=>`name_${e}`,x=[{key:`code`,label:`Code`,required:!0,type:`string`,aliases:[`part no`,`part number`,`article name`,`article no`,`article number`,`sku`,`varuosa kood`,`kood`,`artikelnummer`,`artikel nr`]},{key:`net_price`,label:`Net price`,required:!1,type:`number`,aliases:[`price`,`net price discount`,`nettopreis`,`netto`]},{key:`gross_price`,label:`Gross price`,required:!1,type:`number`,aliases:[`bruttopreis`,`brutto`]},{key:`list_price`,label:`List price`,required:!1,type:`number`,aliases:[`retail price`,`rrp`,`jaehind`,`jaehind km ta`,`listenpreis`]},{key:`currency`,label:`Currency`,required:!1,type:`string`,aliases:[`currency cd`,`currency code`,`valuuta`]},{key:`barcode`,label:`Barcode`,required:!1,type:`string`,aliases:[`ean`,`ean code`,`gtin`,`gtin code`,`triipkood`]},{key:`description1`,label:`Description 1`,required:!1,type:`string`,aliases:[`description`,`kirjeldus`,`beschreibung`]},{key:`description2`,label:`Description 2`,required:!1,type:`string`},{key:`discount_group`,label:`Discount group`,required:!1,type:`string`,aliases:[`product group`,`tootegrupp`,`rabattgruppe`]},{key:`superseding_code`,label:`Replaced by (newer code)`,required:!1,type:`string`,aliases:[`replaced by`,`successor`,`successor code`,`new code`,`ersetzt durch`,`wird ersetzt durch`,`nachfolgenummer`,`vervangen door`]},{key:`replaces_code`,label:`Replaces (older code)`,required:!1,type:`string`,aliases:[`replaces`,`supersedes`,`old code`,`previous code`,`predecessor`,`vorgaengernummer`]},{key:`core_charge`,label:`Core charge`,required:!1,type:`number`,aliases:[`surcharge`,`deposit`,`core deposit`,`korpusetasu`,`pfand`]},...y.map(e=>({key:b(e),label:`Name (${e})`,required:!1,type:`string`,aliases:[`description ${e}`,`name ${e}`]}))],S=/[\s-]/g;function C(e){return e.toUpperCase().replace(S,``)}function w(e,t){let n=p(e);if(n===null)return null;let r=C(t&&n.startsWith(t)?n.slice(t.length):n);return r===``?null:r}function T(e,t){return Math.round(e*(1-t/100))}function E(e){return e===null?{core_charge_minor:null,core_charge_currency:null,core_charge_refundable:null,core_charge_tax_class:null,core_charge_tax_inclusive:null}:{core_charge_minor:e,core_charge_currency:`EUR`,core_charge_refundable:!0,core_charge_tax_class:null,core_charge_tax_inclusive:!1}}const D={name:`parts`,fields:x,buildRow(e,t){let n=v(t.params),i=typeof e.code==`string`?e.code.trim():``;if(!i)return h(`missing_code`,`code is empty`,`code`);let a=C(n.supplierCodePrefix&&i.startsWith(n.supplierCodePrefix)?i.slice(n.supplierCodePrefix.length):i);if(!a)return h(`empty_normalized_code`,`Code "${i}" is empty after normalization`,`code`);let o=p(e.currency)??`EUR`;if(o!==`EUR`)return h(`unsupported_currency`,`Currency "${o}" not supported (EUR-only)`,`currency`);if(a.endsWith(`*S`)){let t=a.slice(0,-2);if(!t)return h(`core_charge_no_parent`,`Core-fee row "${i}" has no part code before the "*S" marker`,`code`);let o=m(e.net_price);if(o.kind===`invalid`)return h(`invalid_core_charge`,`core-fee (*S) row net_price is not a number`,`net_price`);if(o.kind===`absent`)return h(`missing_core_charge`,`core-fee (*S) row has no net_price to use as the deposit`,`net_price`);let s=r(o.value);return s<=0?{kind:`skip`,reason:`core_fee_zero`}:{kind:`skip`,reason:`core_charge_marker`,patches:[{id:`${t}__${n.supplierId}`,doc:E(s),orphanWarning:{warningType:`orphan_core_charge`,message:`core-fee (*S) row references a part not present in this import`,field:`code`}}]}}let s=m(e.net_price);if(s.kind===`invalid`)return h(`invalid_net_price`,`net_price is not a number`,`net_price`);let c=m(e.gross_price);if(c.kind===`invalid`)return h(`invalid_gross_price`,`gross_price is not a number`,`gross_price`);let l=m(e.list_price);if(l.kind===`invalid`)return h(`invalid_list_price`,`list_price is not a number`,`list_price`);let u=s.kind===`value`?s.value:null,d=l.kind===`value`?l.value:null,f=u??d;if(f===null)return h(`missing_price`,`no net_price or list_price provided`,`price`);let g=p(e.discount_group),_=d===null?null:r(d),y=null,b=[];if(u!==null)y=r(u);else if(_!==null){let e=g===null?void 0:n.discountGroups?.[g];e===void 0?b.push({warningType:`no_purchase_price`,message:g===null?`list price present but no discount group on the row — cost pending`:`no discount group "${g}" configured for this supplier — cost pending`,field:`discount_group`}):y=T(_,e)}let x=[],S=w(e.superseding_code,n.supplierCodePrefix);S!==null&&S!==a&&x.push({from:a,to:S});let D=w(e.replaces_code,n.supplierCodePrefix);D!==null&&D!==a&&x.push({from:D,to:a});let O=m(e.core_charge);if(O.kind===`invalid`)return h(`invalid_core_charge`,`core_charge is not a number`,`core_charge`);let k=O.kind===`value`?r(O.value):null,A=k!==null&&k>0?k:null,j=`${a}__${n.supplierId}`;return{kind:`success`,id:j,doc:{doc_id:j,code:i,code_normalized:a,brand_id:n.brandId,brand_slug:n.brandSlug,supplier_id:n.supplierId,supplier_display_name:n.supplierDisplayName,net_price_eur:f,gross_price_eur:c.kind===`value`?c.value:null,currency:`EUR`,barcode:p(e.barcode),name_de:p(e.name_de),name_en:p(e.name_en),name_es:p(e.name_es),name_fr:p(e.name_fr),name_it:p(e.name_it),name_nl:p(e.name_nl),name_pt:p(e.name_pt),name_ro:p(e.name_ro),description1:p(e.description1),description2:p(e.description2),list_price_minor:_,discount_group:g,superseding_code:p(e.superseding_code),purchase_price_minor:y,...E(A),import_batch_id:n.importBatchId,imported_at:new Date().toISOString()},...b.length>0&&{warnings:b},...x.length>0&&{pairs:x}}}};export{r as _,h as a,c,f as d,o as f,n as g,i as h,m as i,u as l,a as m,g as n,p as o,s as p,D as r,d as s,C as t,l as u};
|
|
2
|
-
//# sourceMappingURL=parts-schema-
|
|
1
|
+
import{z as e}from"zod";const t=/^-?\d+(\.\d+)?$/;function n(e,n){let r=e.trim();if(r===``||r.toUpperCase()===`NA`)return null;let{decimal:i,thousands:a}=n,o=r;if(a!==``&&(o=o.split(a).join(``)),i===`,`){if(o.includes(`.`))return NaN;o=o.split(`,`).join(`.`)}else if(o.includes(`,`))return NaN;return t.test(o)?Number.parseFloat(o):NaN}function r(e){return Math.round(e*100)}function i(e){let n=e.trim();if(n===``||n.toUpperCase()===`NA`)return null;let r=n.includes(`,`),i=n.includes(`.`),a;if(r&&i)a=n.replace(/\./g,``).replace(`,`,`.`);else if(r)a=n.replace(`,`,`.`);else if(i)return NaN;else a=n;return t.test(a)?Number.parseFloat(a):NaN}const a=e.discriminatedUnion(`op`,[e.object({op:e.literal(`trim`)}),e.object({op:e.literal(`uppercase`)}),e.object({op:e.literal(`lowercase`)}),e.object({op:e.literal(`stripPrefix`),value:e.string().min(1).max(32)}),e.object({op:e.literal(`stripSuffix`),value:e.string().min(1).max(32)}),e.object({op:e.literal(`defaultIfEmpty`),value:e.string().max(255)}),e.object({op:e.literal(`number`)}),e.object({op:e.literal(`europeanNumber`)})]),o=[{op:`trim`,label:`Trim whitespace`,hasValue:!1},{op:`uppercase`,label:`Uppercase`,hasValue:!1},{op:`lowercase`,label:`Lowercase`,hasValue:!1},{op:`stripPrefix`,label:`Strip prefix`,hasValue:!0},{op:`stripSuffix`,label:`Strip suffix`,hasValue:!0},{op:`defaultIfEmpty`,label:`Default if empty`,hasValue:!0},{op:`number`,label:`Parse number (uses number format)`,hasValue:!1},{op:`europeanNumber`,label:`Parse European number (1.234,56)`,hasValue:!1}];function s(e,t,r){let a=e;for(let e of t)if(typeof a==`string`)switch(e.op){case`trim`:a=a.trim();break;case`uppercase`:a=a.toUpperCase();break;case`lowercase`:a=a.toLowerCase();break;case`stripPrefix`:a=a.startsWith(e.value)?a.slice(e.value.length):a;break;case`stripSuffix`:a=a.endsWith(e.value)?a.slice(0,a.length-e.value.length):a;break;case`defaultIfEmpty`:a=a.trim()===``?e.value:a;break;case`number`:a=n(a,r);break;case`europeanNumber`:a=i(a);break}return a}const c=e.object({source:e.string().min(1).max(256),target:e.string().min(1).max(64),transforms:e.array(a).default([])}),l=e.object({decimal:e.enum([`.`,`,`]),thousands:e.enum([``,`.`,`,`,` `])}).refine(e=>e.decimal!==e.thousands,{message:`decimal and thousands separators must differ`,path:[`thousands`]}),u=e.object({targetSchema:e.string().min(1).max(64),numberFormat:l,columnMap:e.array(c)});function d(e,t){let n=new Set(t.fields.map(e=>e.key));for(let r of e.columnMap)if(!n.has(r.target))throw Error(`Mapping target "${r.target}" is not a field of schema "${t.name}" (allowed: ${[...n].join(`, `)})`);let r=e.numberFormat,i=e.columnMap;return async(e,n)=>{let a={};for(let t of i){let n=e[t.source]??``;a[t.target]=s(n,t.transforms,r)}return t.buildRow(a,{importRunId:n.importRunId,rowNumber:n.rowNumber,params:n.params})}}function f(e,t){let n=e.filter(e=>e.active);if(t!==null){let e=n.find(e=>e.brandId===t);if(e)return e}return n.find(e=>e.brandId===null)}function p(e){if(typeof e!=`string`)return null;let t=e.trim();return t===``?null:t}function m(e){return e==null?{kind:`absent`}:typeof e==`number`?Number.isNaN(e)?{kind:`invalid`}:{kind:`value`,value:e}:e.trim()===``?{kind:`absent`}:{kind:`invalid`}}function h(e,t,n){return{kind:`error`,error:{errorType:e,message:t,field:n}}}const g=e.object({brandId:e.string().uuid(),brandSlug:e.string().min(1).max(64),supplierId:e.string().uuid(),supplierDisplayName:e.string().min(1).max(255),importBatchId:e.string().uuid(),supplierCodePrefix:e.string().max(8).regex(/^[A-Z0-9-]+$/,`must be uppercase alphanumeric or "-"`).optional(),discountGroups:e.record(e.string(),e.number().min(0).max(100)).optional()}),_=new WeakMap;function v(e){let t=_.get(e);if(t)return t;let n=g.parse(e);return _.set(e,n),n}const y=[`de`,`en`,`es`,`fr`,`it`,`nl`,`pt`,`ro`],b=e=>`name_${e}`,x=[{key:`code`,label:`Code`,required:!0,type:`string`,aliases:[`part no`,`part number`,`article name`,`article no`,`article number`,`sku`,`varuosa kood`,`kood`,`artikelnummer`,`artikel nr`]},{key:`net_price`,label:`Net price`,required:!1,type:`number`,aliases:[`price`,`net price discount`,`nettopreis`,`netto`]},{key:`gross_price`,label:`Gross price`,required:!1,type:`number`,aliases:[`bruttopreis`,`brutto`]},{key:`list_price`,label:`List price`,required:!1,type:`number`,aliases:[`retail price`,`rrp`,`jaehind`,`jaehind km ta`,`listenpreis`]},{key:`currency`,label:`Currency`,required:!1,type:`string`,aliases:[`currency cd`,`currency code`,`valuuta`]},{key:`barcode`,label:`Barcode`,required:!1,type:`string`,aliases:[`ean`,`ean code`,`gtin`,`gtin code`,`triipkood`]},{key:`description1`,label:`Description 1`,required:!1,type:`string`,aliases:[`description`,`kirjeldus`,`beschreibung`]},{key:`description2`,label:`Description 2`,required:!1,type:`string`},{key:`discount_group`,label:`Discount group`,required:!1,type:`string`,aliases:[`product group`,`tootegrupp`,`rabattgruppe`]},{key:`superseding_code`,label:`Replaced by (newer code)`,required:!1,type:`string`,aliases:[`replaced by`,`successor`,`successor code`,`new code`,`ersetzt durch`,`wird ersetzt durch`,`nachfolgenummer`,`vervangen door`]},{key:`replaces_code`,label:`Replaces (older code)`,required:!1,type:`string`,aliases:[`replaces`,`supersedes`,`old code`,`previous code`,`predecessor`,`vorgaengernummer`]},{key:`core_charge`,label:`Core charge`,required:!1,type:`number`,aliases:[`surcharge`,`deposit`,`core deposit`,`korpusetasu`,`pfand`]},...y.map(e=>({key:b(e),label:`Name (${e})`,required:!1,type:`string`,aliases:[`description ${e}`,`name ${e}`]}))],S=/[\s-]/g;function C(e){return e.toUpperCase().replace(S,``)}function w(e,t){let n=p(e);if(n===null)return null;let r=C(t&&n.startsWith(t)?n.slice(t.length):n);return r===``?null:r}function T(e,t){return Math.round(e*(1-t/100))}function E(e){return e===null?{core_charge_minor:null,core_charge_currency:null,core_charge_refundable:null,core_charge_tax_class:null,core_charge_tax_inclusive:null}:{core_charge_minor:e,core_charge_currency:`EUR`,core_charge_refundable:!0,core_charge_tax_class:null,core_charge_tax_inclusive:!1}}const D={name:`parts`,fields:x,buildRow(e,t){let n=v(t.params),i=typeof e.code==`string`?e.code.trim():``;if(!i)return h(`missing_code`,`code is empty`,`code`);let a=C(n.supplierCodePrefix&&i.startsWith(n.supplierCodePrefix)?i.slice(n.supplierCodePrefix.length):i);if(!a)return h(`empty_normalized_code`,`Code "${i}" is empty after normalization`,`code`);let o=p(e.currency)??`EUR`;if(o!==`EUR`)return h(`unsupported_currency`,`Currency "${o}" not supported (EUR-only)`,`currency`);if(a.endsWith(`*S`)){let t=a.slice(0,-2);if(!t)return h(`core_charge_no_parent`,`Core-fee row "${i}" has no part code before the "*S" marker`,`code`);let o=m(e.net_price);if(o.kind===`invalid`)return h(`invalid_core_charge`,`core-fee (*S) row net_price is not a number`,`net_price`);if(o.kind===`absent`)return h(`missing_core_charge`,`core-fee (*S) row has no net_price to use as the deposit`,`net_price`);let s=r(o.value);return s<=0?{kind:`skip`,reason:`core_fee_zero`}:{kind:`skip`,reason:`core_charge_marker`,patches:[{id:`${t}__${n.supplierId}`,doc:E(s),orphanWarning:{warningType:`orphan_core_charge`,message:`core-fee (*S) row references a part not present in this import`,field:`code`}}]}}let s=m(e.net_price);if(s.kind===`invalid`)return h(`invalid_net_price`,`net_price is not a number`,`net_price`);let c=m(e.gross_price);if(c.kind===`invalid`)return h(`invalid_gross_price`,`gross_price is not a number`,`gross_price`);let l=m(e.list_price);if(l.kind===`invalid`)return h(`invalid_list_price`,`list_price is not a number`,`list_price`);let u=s.kind===`value`?s.value:null,d=l.kind===`value`?l.value:null,f=u??d;if(f===null)return h(`missing_price`,`no net_price or list_price provided`,`price`);let g=p(e.discount_group),_=d===null?null:r(d),y=null,b=[];if(u!==null)y=r(u);else if(_!==null){let e=g===null?void 0:n.discountGroups?.[g];e===void 0?b.push({warningType:`no_purchase_price`,message:g===null?`list price present but no discount group on the row — cost pending`:`no discount group "${g}" configured for this supplier — cost pending`,field:`discount_group`}):y=T(_,e)}let x=[],S=w(e.superseding_code,n.supplierCodePrefix);S!==null&&S!==a&&x.push({from:a,to:S});let D=w(e.replaces_code,n.supplierCodePrefix);D!==null&&D!==a&&x.push({from:D,to:a});let O=m(e.core_charge);if(O.kind===`invalid`)return h(`invalid_core_charge`,`core_charge is not a number`,`core_charge`);let k=O.kind===`value`?r(O.value):null,A=k!==null&&k>0?k:null,j=`${a}__${n.supplierId}`;return{kind:`success`,id:j,doc:{doc_id:j,code:i,code_normalized:a,brand_id:n.brandId,brand_slug:n.brandSlug,supplier_id:n.supplierId,supplier_display_name:n.supplierDisplayName,net_price_eur:f,gross_price_eur:c.kind===`value`?c.value:null,currency:`EUR`,barcode:p(e.barcode),name_de:p(e.name_de),name_en:p(e.name_en),name_es:p(e.name_es),name_fr:p(e.name_fr),name_it:p(e.name_it),name_nl:p(e.name_nl),name_pt:p(e.name_pt),name_ro:p(e.name_ro),description1:p(e.description1),description2:p(e.description2),list_price_minor:_,discount_group:g,superseding_code:p(e.superseding_code),purchase_price_minor:y,...E(A),import_batch_id:n.importBatchId,imported_at:new Date().toISOString()},...b.length>0&&{warnings:b},...x.length>0&&{pairs:x},...y!==null&&{priceSample:y}}}};export{r as _,h as a,c,f as d,o as f,n as g,i as h,m as i,u as l,a as m,g as n,p as o,s as p,D as r,d as s,C as t,l as u};
|
|
2
|
+
//# sourceMappingURL=parts-schema-BBUINSdN.mjs.map
|