@flowselections/offertes-installatie-techniek 1.21.5 → 1.22.1

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 (44) hide show
  1. package/dist-lib/components/offertes/ExtraWerkOffertePaneel.js +3 -3
  2. package/dist-lib/components/offertes/HandtekeningVlak.d.ts +4 -0
  3. package/dist-lib/components/offertes/HandtekeningVlak.d.ts.map +1 -0
  4. package/dist-lib/components/offertes/HandtekeningVlak.js +66 -0
  5. package/dist-lib/components/offertes/InterneNotitie.d.ts +8 -0
  6. package/dist-lib/components/offertes/InterneNotitie.d.ts.map +1 -0
  7. package/dist-lib/components/offertes/InterneNotitie.js +16 -0
  8. package/dist-lib/components/offertes/KlikbareTekst.d.ts +5 -0
  9. package/dist-lib/components/offertes/KlikbareTekst.d.ts.map +1 -0
  10. package/dist-lib/components/offertes/KlikbareTekst.js +10 -0
  11. package/dist-lib/components/offertes/NieuweOfferteFormulier.d.ts +1 -0
  12. package/dist-lib/components/offertes/NieuweOfferteFormulier.d.ts.map +1 -1
  13. package/dist-lib/components/offertes/NieuweOfferteFormulier.js +30 -10
  14. package/dist-lib/components/offertes/OfferteA4.d.ts.map +1 -1
  15. package/dist-lib/components/offertes/OfferteA4.js +2 -1
  16. package/dist-lib/components/offertes/OfferteAkkoordPage.d.ts.map +1 -1
  17. package/dist-lib/components/offertes/OfferteAkkoordPage.js +7 -2
  18. package/dist-lib/components/offertes/OfferteDetailPage.d.ts.map +1 -1
  19. package/dist-lib/components/offertes/OfferteDetailPage.js +13 -4
  20. package/dist-lib/components/offertes/VoorstelOffertePaneel.d.ts.map +1 -1
  21. package/dist-lib/components/offertes/VoorstelOffertePaneel.js +3 -0
  22. package/dist-lib/components/settings/OfferteVoorwaardenSettingsCard.d.ts.map +1 -1
  23. package/dist-lib/components/settings/OfferteVoorwaardenSettingsCard.js +2 -1
  24. package/dist-lib/index.d.ts +1 -0
  25. package/dist-lib/index.d.ts.map +1 -1
  26. package/dist-lib/index.js +2 -2
  27. package/dist-lib/integrations/supabase/types.d.ts +10121 -406
  28. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  29. package/dist-lib/integrations/supabase/types.js +1 -0
  30. package/dist-lib/lib/offerteAcceptatie.functions.d.ts +1 -0
  31. package/dist-lib/lib/offerteAcceptatie.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/offerteAcceptatie.functions.js +6 -0
  33. package/dist-lib/lib/offerteMail.d.ts.map +1 -1
  34. package/dist-lib/lib/offerteMail.js +14 -0
  35. package/dist-lib/lib/offerteRegels.d.ts +18 -0
  36. package/dist-lib/lib/offerteRegels.d.ts.map +1 -1
  37. package/dist-lib/lib/offerteRegels.js +15 -0
  38. package/dist-lib/lib/offerteRegels.test.js +13 -1
  39. package/dist-lib/lib/offerteReistijd.functions.d.ts +1 -1
  40. package/dist-lib/lib/offerteReistijd.functions.d.ts.map +1 -1
  41. package/dist-lib/lib/offerteReistijd.functions.js +4 -2
  42. package/dist-lib/lib/offertes.d.ts +3 -0
  43. package/dist-lib/lib/offertes.d.ts.map +1 -1
  44. package/package.json +2 -2
@@ -40,6 +40,7 @@ export const Constants = {
40
40
  "afleverbrief",
41
41
  "veilingbrief",
42
42
  "traysticker",
43
+ "eigen_sticker",
43
44
  ],
44
45
  doc_orientation: ["portrait", "landscape"],
45
46
  exact_env: ["staging", "live"],
@@ -3,5 +3,6 @@ export declare const accepteerPubliekeOfferte: import("@tanstack/start-client-co
3
3
  naam: string;
4
4
  email: string;
5
5
  akkoord: true;
6
+ handtekening: string;
6
7
  }, Promise<import("../integrations/supabase/types").Json>>;
7
8
  //# sourceMappingURL=offerteAcceptatie.functions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"offerteAcceptatie.functions.d.ts","sourceRoot":"","sources":["../../src/lib/offerteAcceptatie.functions.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,wBAAwB;;;;;0DAiBjC,CAAC"}
1
+ {"version":3,"file":"offerteAcceptatie.functions.d.ts","sourceRoot":"","sources":["../../src/lib/offerteAcceptatie.functions.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,wBAAwB;;;;;;0DAkBjC,CAAC"}
@@ -6,6 +6,11 @@ const acceptatieSchema = z.object({
6
6
  naam: z.string().trim().min(2).max(200),
7
7
  email: z.string().trim().email().max(254),
8
8
  akkoord: z.literal(true),
9
+ handtekening: z
10
+ .string()
11
+ .min(200, "Zet uw handtekening.")
12
+ .max(400000, "De handtekening is te groot.")
13
+ .regex(/^data:image\/png;base64,[A-Za-z0-9+/=]+$/, "Zet uw handtekening."),
9
14
  });
10
15
  export const accepteerPubliekeOfferte = createServerFn({ method: "POST" })
11
16
  .inputValidator((input) => acceptatieSchema.parse(input))
@@ -21,6 +26,7 @@ export const accepteerPubliekeOfferte = createServerFn({ method: "POST" })
21
26
  _akkoord: data.akkoord,
22
27
  _ip_address: ipAddress,
23
28
  _user_agent: userAgent,
29
+ _handtekening: data.handtekening,
24
30
  });
25
31
  if (error)
26
32
  throw new Error(error.message || "Offerte accepteren is mislukt.");
@@ -1 +1 @@
1
- {"version":3,"file":"offerteMail.d.ts","sourceRoot":"","sources":["../../src/lib/offerteMail.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQxE,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKtE;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU9E;AAGD,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAK9D;AAED,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3E;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAMnG;AAED,6EAA6E;AAC7E,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7E;AAED,wBAAsB,oBAAoB,CAAC,CAAC,EAAE;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ChB"}
1
+ {"version":3,"file":"offerteMail.d.ts","sourceRoot":"","sources":["../../src/lib/offerteMail.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQxE,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKtE;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU9E;AAGD,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAK9D;AAED,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3E;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAMnG;AAED,6EAA6E;AAC7E,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC7E;AAED,wBAAsB,oBAAoB,CAAC,CAAC,EAAE;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ChB"}
@@ -81,6 +81,20 @@ export async function a4NaarPdfBase64(paginas) {
81
81
  const w = 210;
82
82
  const h = Math.min((canvas.height * w) / canvas.width, 297);
83
83
  pdf.addImage(canvas.toDataURL("image/jpeg", 0.92), "JPEG", 0, 0, w, h);
84
+ // Klikbare links in de PDF: elke <a data-offerte-link> krijgt een linkkader op de juiste plek.
85
+ const xFactor = w / canvas.width;
86
+ const yFactor = h / canvas.height;
87
+ const paginaRect = paginas[i].getBoundingClientRect();
88
+ const ankers = Array.from(paginas[i].querySelectorAll("a[data-offerte-link]"));
89
+ for (const anker of ankers) {
90
+ const r = anker.getBoundingClientRect();
91
+ if (!r.width || !r.height)
92
+ continue;
93
+ const href = anker.getAttribute("data-offerte-link") || anker.href;
94
+ if (!href || !/^https?:\/\//i.test(href))
95
+ continue;
96
+ pdf.link((r.left - paginaRect.left) * xFactor, (r.top - paginaRect.top) * yFactor, r.width * xFactor, r.height * yFactor, { url: href });
97
+ }
84
98
  }
85
99
  const base64 = pdf.output("datauristring").split(",")[1] ?? "";
86
100
  if (base64.length < 1000)
@@ -1,5 +1,23 @@
1
1
  /** Restant van minder dan dit aantal minuten valt weg; vanaf dit aantal telt een extra pakket. */
2
2
  export declare const RESTGRENS_MINUTEN = 6;
3
+ /** Eén basispakket met extra tijd in hele kwartieren; overige pakketten behouden hun aantal. */
4
+ export declare function pakketBerekening(pakket: {
5
+ package_type?: string | null;
6
+ unit_price_cents?: number | null;
7
+ duration_minutes?: number | null;
8
+ extra_quarter_price_cents?: number | null;
9
+ }, regel: {
10
+ quantity: number;
11
+ extra_minutes?: number;
12
+ }): {
13
+ quantity: number;
14
+ extra_minutes: number;
15
+ kwartieren: number;
16
+ extraPrijs: number;
17
+ totaalPrijs: number;
18
+ gedekteMinuten: number;
19
+ };
20
+ export declare function wijzigExtraMinuten(minuten: number, richting: -1 | 1): number;
3
21
  /** Aantal reispakketten voor een enkele rit: heen + terug, afgerond per pakketduur. */
4
22
  export declare function reisPakketAantal(enkeleRitMinuten: number, pakketMinuten: number): number;
5
23
  /** Verkoopprijs in centen: inkoop (netto, anders bruto) plus eigen of algemene marge. */
@@ -1 +1 @@
1
- {"version":3,"file":"offerteRegels.d.ts","sourceRoot":"","sources":["../../src/lib/offerteRegels.ts"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAIxF;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAInL;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtE"}
1
+ {"version":3,"file":"offerteRegels.d.ts","sourceRoot":"","sources":["../../src/lib/offerteRegels.ts"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,yBAAyB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;EAU5O;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAE5E;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAIxF;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAInL;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtE"}
@@ -1,6 +1,21 @@
1
1
  // Vaste rekenregels van de offertemodule (los van UI en database, zodat ze getest kunnen worden).
2
2
  /** Restant van minder dan dit aantal minuten valt weg; vanaf dit aantal telt een extra pakket. */
3
3
  export const RESTGRENS_MINUTEN = 6;
4
+ /** Eén basispakket met extra tijd in hele kwartieren; overige pakketten behouden hun aantal. */
5
+ export function pakketBerekening(pakket, regel) {
6
+ const basis = pakket.package_type === "basis";
7
+ const quantity = basis ? 1 : regel.quantity;
8
+ const invoer = Number(regel.extra_minutes ?? 0);
9
+ const extra_minutes = basis && Number.isFinite(invoer) ? Math.max(0, Math.floor(invoer / 15) * 15) : 0;
10
+ const kwartieren = extra_minutes / 15;
11
+ const extraPrijs = kwartieren * Number(pakket.extra_quarter_price_cents ?? 0);
12
+ return { quantity, extra_minutes, kwartieren, extraPrijs,
13
+ totaalPrijs: Math.round(quantity * Number(pakket.unit_price_cents ?? 0)) + extraPrijs,
14
+ gedekteMinuten: Math.round(quantity * Number(pakket.duration_minutes ?? 0)) + extra_minutes };
15
+ }
16
+ export function wijzigExtraMinuten(minuten, richting) {
17
+ return Math.max(0, minuten + richting * 15);
18
+ }
4
19
  /** Aantal reispakketten voor een enkele rit: heen + terug, afgerond per pakketduur. */
5
20
  export function reisPakketAantal(enkeleRitMinuten, pakketMinuten) {
6
21
  if (!(pakketMinuten > 0) || !(enkeleRitMinuten > 0))
@@ -1,6 +1,6 @@
1
1
  // @ts-ignore -- bun test-runner types are not installed in this project
2
2
  import { describe, expect, test } from "bun:test";
3
- import { offerteNummer, reisPakketAantal, verkoopPrijsCent } from "./offerteRegels";
3
+ import { offerteNummer, reisPakketAantal, verkoopPrijsCent, pakketBerekening, wijzigExtraMinuten } from "./offerteRegels";
4
4
  describe("reistijd heen en terug per kwartier", () => {
5
5
  test("19 min enkele rit = 38 min = 3 kwartieren", () => expect(reisPakketAantal(19, 15)).toBe(3));
6
6
  test("restant onder 6 min valt weg (35 min = 2)", () => expect(reisPakketAantal(17.5, 15)).toBe(2));
@@ -15,3 +15,15 @@ describe("prijs met marge", () => {
15
15
  describe("offertenummer", () => {
16
16
  test("eerste offerte 2026", () => expect(offerteNummer(2026, 1)).toBe("OFF2600001"));
17
17
  });
18
+ describe("basispakket met losse kwartieren", () => {
19
+ const basis = { package_type: "basis", unit_price_cents: 10000, extra_quarter_price_cents: 1250, duration_minutes: 30 };
20
+ test("basis blijft eenmaal ongeacht ingevoerd aantal", () => expect(pakketBerekening(basis, { quantity: 4 }).quantity).toBe(1));
21
+ test("plus verhoogt extra tijd met 15 minuten", () => expect(wijzigExtraMinuten(45, 1)).toBe(60));
22
+ test("min verlaagt extra tijd met 15 minuten", () => expect(wijzigExtraMinuten(60, -1)).toBe(45));
23
+ test("min stopt bij nul kwartieren", () => expect(wijzigExtraMinuten(0, -1)).toBe(0));
24
+ test("60 minuten is vier losse kwartieren", () => expect(pakketBerekening(basis, { quantity: 1, extra_minutes: 60 }).kwartieren).toBe(4));
25
+ test("extra prijs gebruikt de pakketkwartierprijs", () => expect(pakketBerekening(basis, { quantity: 1, extra_minutes: 60 }).extraPrijs).toBe(5000));
26
+ test("mandaat omvat basis plus kwartieren", () => expect(pakketBerekening(basis, { quantity: 4, extra_minutes: 60 }).totaalPrijs).toBe(15000));
27
+ test("extra minuten tellen mee in gedekte pakkettijd", () => expect(pakketBerekening(basis, { quantity: 4, extra_minutes: 60 }).gedekteMinuten).toBe(90));
28
+ test("overige pakketten behouden aantal en krijgen geen extra tijd", () => expect(pakketBerekening({ ...basis, package_type: "overig" }, { quantity: 3, extra_minutes: 60 })).toMatchObject({ quantity: 3, extra_minutes: 0, totaalPrijs: 30000, gedekteMinuten: 90 }));
29
+ });
@@ -1,4 +1,4 @@
1
- type ReistijdStatus = "ok" | "wacht" | "onbekend" | "niet_ingesteld" | "geen_pakket" | "kaarten_fout";
1
+ type ReistijdStatus = "ok" | "wacht" | "onbekend" | "niet_ingesteld" | "geen_pakket" | "kaarten_fout" | "niet_ingelogd";
2
2
  export interface OfferteReistijdResultaat {
3
3
  status: ReistijdStatus;
4
4
  /** Totale reistijd (heen + terug) in minuten. */
@@ -1 +1 @@
1
- {"version":3,"file":"offerteReistijd.functions.d.ts","sourceRoot":"","sources":["../../src/lib/offerteReistijd.functions.ts"],"names":[],"mappings":"AAIA,KAAK,cAAc,GAAG,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,gBAAgB,GAAG,aAAa,GAAG,cAAc,CAAC;AAEtG,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,cAAc,CAAC;IACvB,iDAAiD;IACjD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,OAAO;;;EAKrC;AA4CD,eAAO,MAAM,sBAAsB,4HAmI/B,CAAC"}
1
+ {"version":3,"file":"offerteReistijd.functions.d.ts","sourceRoot":"","sources":["../../src/lib/offerteReistijd.functions.ts"],"names":[],"mappings":"AAIA,KAAK,cAAc,GAAG,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,gBAAgB,GAAG,aAAa,GAAG,cAAc,GAAG,eAAe,CAAC;AAExH,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,cAAc,CAAC;IACvB,iDAAiD;IACjD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,OAAO;;;EAKrC;AA4CD,eAAO,MAAM,sBAAsB,4HAsI/B,CAAC"}
@@ -56,8 +56,10 @@ export const berekenOfferteReistijd = createServerFn({ method: "POST" })
56
56
  throw new Error("Databaseconfiguratie ontbreekt");
57
57
  const authClient = createClient(url, publishableKey, { auth: { persistSession: false, autoRefreshToken: false } });
58
58
  const { data: gebruiker, error: authFout } = await authClient.auth.getUser(data.accessToken);
59
- if (authFout || !gebruiker.user)
60
- throw new Error("Niet ingelogd");
59
+ // Verlopen of ongeldige sessie: geen harde fout (die geeft een leeg scherm), maar een status die de client kan afhandelen.
60
+ if (authFout || !gebruiker.user) {
61
+ return { status: "niet_ingelogd", minuten: null, pakket: null, melding: "Je sessie is verlopen. Log opnieuw in om de reistijd te berekenen." };
62
+ }
61
63
  const gebruikerId = gebruiker.user.id;
62
64
  if (!adresLijktCompleet(data.destination)) {
63
65
  return { status: "onbekend", minuten: null, pakket: null, melding: "Vul een volledig werkadres in (straat, huisnummer, plaats)." };
@@ -29,6 +29,7 @@ export interface Offerte {
29
29
  aandachtspunten: string | null;
30
30
  voorwaarden: string | null;
31
31
  notities: string | null;
32
+ interne_notitie?: string | null;
32
33
  subtotal_cents: number;
33
34
  vat_rate: number;
34
35
  vat_cents: number;
@@ -76,6 +77,8 @@ export interface Pakket {
76
77
  duration_minutes: number | null;
77
78
  labor_minutes: number | null;
78
79
  travel_minutes: number | null;
80
+ package_type?: string | null;
81
+ extra_quarter_price_cents?: number | null;
79
82
  }
80
83
  export declare const OFFERTE_STATUS_LABELS: Record<string, string>;
81
84
  /** Tabbladen in het overzicht — key `alle` toont alles. */
@@ -1 +1 @@
1
- {"version":3,"file":"offertes.d.ts","sourceRoot":"","sources":["../../src/lib/offertes.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,GACT,aAAa,GACb,kBAAkB,GAClB,SAAS,GACT,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wEAAwE;AACxE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUxD,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,YAAY,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAS7E,CAAC;AAEF,eAAO,MAAM,aAAa,UAAiD,CAAC;AAE5E,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAMnE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAOpE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAIpD;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAEzD"}
1
+ {"version":3,"file":"offertes.d.ts","sourceRoot":"","sources":["../../src/lib/offertes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/offertes-installatie-techniek",
3
- "version": "1.21.5",
3
+ "version": "1.22.1",
4
4
  "flowselections": {
5
5
  "moduleId": "offertes-installatietechniek",
6
6
  "pages": [
@@ -152,7 +152,7 @@
152
152
  "devDependencies": {
153
153
  "@cloudflare/vite-plugin": "^1.25.5",
154
154
  "@eslint/js": "^9.32.0",
155
- "@flowselections/core": "1.0.30",
155
+ "@flowselections/core": "1.0.35",
156
156
  "@lovable.dev/vite-tanstack-config": "2.26.5",
157
157
  "@rsbuild/core": "^1.0.0",
158
158
  "@tailwindcss/vite": "^4.2.1",