@flowselections/mailbox-orders 1.0.39 → 1.0.42

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.
@@ -165,6 +165,7 @@ export declare const approveProposal: import("@tanstack/start-client-core").Opti
165
165
  customerReference?: string | null | undefined;
166
166
  momentKey?: string | null | undefined;
167
167
  acceptMissingPrice?: boolean | undefined;
168
+ zeroPriceConfirmed?: boolean | undefined;
168
169
  lateSignup?: {
169
170
  reason: string;
170
171
  } | null | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"mailbox.functions.d.ts","sourceRoot":"","sources":["../../src/lib/mailbox.functions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mailbox.functions.d.ts","sourceRoot":"","sources":["../../src/lib/mailbox.functions.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { classifyVerkoopRefusal, existingOrderOrFilter, defaultNeedsSticker } from "./verkoop-order.js";
1
+ import { classifyVerkoopRefusal, existingOrderOrFilter, defaultNeedsSticker, checkLinePrices, zeroPriceFlag } from "./verkoop-order.js";
2
2
  // Server functions voor de Mailbox-bestellingen module
3
3
  import { createServerFn } from "@tanstack/react-start";
4
4
  import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
@@ -287,6 +287,7 @@ export const approveProposal = createServerFn({ method: "POST" })
287
287
  customerReference: z.string().max(120).nullable().optional(),
288
288
  momentKey: z.string().max(200).nullable().optional(),
289
289
  acceptMissingPrice: z.boolean().optional(),
290
+ zeroPriceConfirmed: z.boolean().optional(),
290
291
  lateSignup: z.object({ reason: z.string().min(3).max(500) }).nullable().optional(),
291
292
  }).parse(input))
292
293
  .handler(async ({ data, context }) => {
@@ -309,10 +310,10 @@ export const approveProposal = createServerFn({ method: "POST" })
309
310
  }
310
311
  customFields["load_carrier"] = loadCarrierType;
311
312
  // ─── Prijs en referentie ────────────────────────────────────────────────
312
- // Verkoop accepteert geen regel zonder prijs; dus hier al blokkeren.
313
- if (data.lines.some((l) => l.unit_price === null || l.unit_price === undefined || l.unit_price <= 0)) {
314
- throw new Error("Niet alle regels hebben een prijs. Vul bij elke regel een prijs per stuk in.");
315
- }
313
+ // Leeg/negatief altijd blokkeren; € 0 alleen met uitdrukkelijke bevestiging.
314
+ const priceCheck = checkLinePrices(data.lines.map((l) => l.unit_price), data.zeroPriceConfirmed === true);
315
+ if (!priceCheck.ok)
316
+ throw new Error(priceCheck.message);
316
317
  const reference = (data.customerReference ?? "").trim();
317
318
  if (reference)
318
319
  customFields["customer_reference"] = reference;
@@ -391,6 +392,7 @@ export const approveProposal = createServerFn({ method: "POST" })
391
392
  quantity_plants: Math.round(line.quantity ?? 0),
392
393
  unit_price: line.unit_price,
393
394
  needs_sticker: line.needs_sticker === true,
395
+ ...(zeroPriceFlag(line.unit_price, data.zeroPriceConfirmed === true) ? { zero_price_confirmed: true } : {}),
394
396
  })),
395
397
  p_customer_reference: reference || null,
396
398
  p_moment_key: data.momentKey ?? null,
@@ -11,4 +11,17 @@ export declare function defaultNeedsSticker(stickers: {
11
11
  customer_key: string | null;
12
12
  trade_item_key: string | null;
13
13
  }[], customerId: string | null, productId: string | null): boolean;
14
+ /**
15
+ * Prijscontrole vóór Verkoop. Leeg blijft leeg (nooit stil 0); negatief altijd
16
+ * geweigerd; € 0 alleen met uitdrukkelijke bevestiging.
17
+ */
18
+ export declare function checkLinePrices(prices: (number | null | undefined)[], zeroConfirmed: boolean): {
19
+ ok: true;
20
+ zeroLines: number;
21
+ } | {
22
+ ok: false;
23
+ message: string;
24
+ };
25
+ /** Vlag per regel voor p_lines: alleen bij exact € 0 én bevestiging. */
26
+ export declare function zeroPriceFlag(price: number | null | undefined, zeroConfirmed: boolean): boolean;
14
27
  //# sourceMappingURL=verkoop-order.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verkoop-order.d.ts","sourceRoot":"","sources":["../../src/lib/verkoop-order.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,CAAC;AAEtE,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,kBAAkB,CAK1E;AAED,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE1G;AAED,mGAAmG;AACnG,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE;IAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,EAC1E,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAGT"}
1
+ {"version":3,"file":"verkoop-order.d.ts","sourceRoot":"","sources":["../../src/lib/verkoop-order.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,CAAC;AAEtE,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,kBAAkB,CAK1E;AAED,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE1G;AAED,mGAAmG;AACnG,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE;IAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,EAC1E,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAGT;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EACrC,aAAa,EAAE,OAAO,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAUlE;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,aAAa,EAAE,OAAO,GAAG,OAAO,CAE/F"}
@@ -22,3 +22,26 @@ export function defaultNeedsSticker(stickers, customerId, productId) {
22
22
  return false;
23
23
  return stickers.some((s) => s.customer_key === customerId && s.trade_item_key === productId);
24
24
  }
25
+ /**
26
+ * Prijscontrole vóór Verkoop. Leeg blijft leeg (nooit stil 0); negatief altijd
27
+ * geweigerd; € 0 alleen met uitdrukkelijke bevestiging.
28
+ */
29
+ export function checkLinePrices(prices, zeroConfirmed) {
30
+ let zero = 0;
31
+ for (let i = 0; i < prices.length; i++) {
32
+ const p = prices[i];
33
+ if (p === null || p === undefined || Number.isNaN(p))
34
+ return { ok: false, message: `Regel ${i + 1}: prijs ontbreekt.` };
35
+ if (p < 0)
36
+ return { ok: false, message: `Regel ${i + 1}: prijs mag niet negatief zijn.` };
37
+ if (p === 0)
38
+ zero++;
39
+ }
40
+ if (zero > 0 && !zeroConfirmed)
41
+ return { ok: false, message: `${zero} regel(s) met prijs € 0: vul de prijs in of vink "Prijs € 0 klopt" aan.` };
42
+ return { ok: true, zeroLines: zero };
43
+ }
44
+ /** Vlag per regel voor p_lines: alleen bij exact € 0 én bevestiging. */
45
+ export function zeroPriceFlag(price, zeroConfirmed) {
46
+ return zeroConfirmed && price === 0;
47
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/mailbox-orders",
3
- "version": "1.0.39",
3
+ "version": "1.0.42",
4
4
  "private": false,
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -50,7 +50,7 @@
50
50
  "devDependencies": {
51
51
  "@cloudflare/vite-plugin": "^1.25.5",
52
52
  "@eslint/js": "^9.32.0",
53
- "@flowselections/core": "1.0.29",
53
+ "@flowselections/core": "1.0.30",
54
54
  "@lovable.dev/vite-tanstack-config": "2.26.5",
55
55
  "@rsbuild/core": "^1.0.0",
56
56
  "@tailwindcss/vite": "^4.2.1",