@bash-app/bash-common 30.215.0 → 30.217.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.
Files changed (65) hide show
  1. package/dist/definitions.d.ts +7 -6
  2. package/dist/definitions.d.ts.map +1 -1
  3. package/dist/definitions.js.map +1 -1
  4. package/dist/extendedSchemas.d.ts +100 -0
  5. package/dist/extendedSchemas.d.ts.map +1 -1
  6. package/dist/extendedSchemas.js +2 -0
  7. package/dist/extendedSchemas.js.map +1 -1
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +2 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/legalTemplates.d.ts +11 -0
  13. package/dist/legalTemplates.d.ts.map +1 -0
  14. package/dist/legalTemplates.js +19 -0
  15. package/dist/legalTemplates.js.map +1 -0
  16. package/dist/utils/index.d.ts +0 -1
  17. package/dist/utils/index.d.ts.map +1 -1
  18. package/dist/utils/index.js +0 -1
  19. package/dist/utils/index.js.map +1 -1
  20. package/dist/utils/service/__tests__/apiServiceBookingApiUtils.test.d.ts +2 -0
  21. package/dist/utils/service/__tests__/apiServiceBookingApiUtils.test.d.ts.map +1 -0
  22. package/dist/utils/service/__tests__/apiServiceBookingApiUtils.test.js +101 -0
  23. package/dist/utils/service/__tests__/apiServiceBookingApiUtils.test.js.map +1 -0
  24. package/dist/utils/service/__tests__/cancellationPolicyRefundResolver.test.d.ts +2 -0
  25. package/dist/utils/service/__tests__/cancellationPolicyRefundResolver.test.d.ts.map +1 -0
  26. package/dist/utils/service/__tests__/cancellationPolicyRefundResolver.test.js +125 -0
  27. package/dist/utils/service/__tests__/cancellationPolicyRefundResolver.test.js.map +1 -0
  28. package/dist/utils/service/__tests__/serviceBookingStatusUtils.test.d.ts +2 -0
  29. package/dist/utils/service/__tests__/serviceBookingStatusUtils.test.d.ts.map +1 -0
  30. package/dist/utils/service/__tests__/serviceBookingStatusUtils.test.js +226 -0
  31. package/dist/utils/service/__tests__/serviceBookingStatusUtils.test.js.map +1 -0
  32. package/dist/utils/service/__tests__/serviceRateUtils.test.d.ts +2 -0
  33. package/dist/utils/service/__tests__/serviceRateUtils.test.d.ts.map +1 -0
  34. package/dist/utils/service/__tests__/serviceRateUtils.test.js +237 -0
  35. package/dist/utils/service/__tests__/serviceRateUtils.test.js.map +1 -0
  36. package/dist/utils/service/serviceDBUtils.d.ts +11 -6
  37. package/dist/utils/service/serviceDBUtils.d.ts.map +1 -1
  38. package/dist/utils/service/serviceDBUtils.js +9 -4
  39. package/dist/utils/service/serviceDBUtils.js.map +1 -1
  40. package/dist/utils/service/serviceUtils.d.ts +5 -0
  41. package/dist/utils/service/serviceUtils.d.ts.map +1 -1
  42. package/dist/utils/service/serviceUtils.js +8 -1
  43. package/dist/utils/service/serviceUtils.js.map +1 -1
  44. package/dist/utmAttribution.d.ts +1 -5
  45. package/dist/utmAttribution.d.ts.map +1 -1
  46. package/dist/utmAttribution.js.map +1 -1
  47. package/dist/venueLoyaltyRedemption.d.ts +21 -0
  48. package/dist/venueLoyaltyRedemption.d.ts.map +1 -0
  49. package/dist/venueLoyaltyRedemption.js +5 -0
  50. package/dist/venueLoyaltyRedemption.js.map +1 -0
  51. package/package.json +1 -1
  52. package/prisma/schema.prisma +115 -3
  53. package/src/definitions.ts +7 -7
  54. package/src/extendedSchemas.ts +3 -0
  55. package/src/index.ts +2 -0
  56. package/src/legalTemplates.ts +21 -0
  57. package/src/utils/index.ts +0 -1
  58. package/src/utils/service/__tests__/apiServiceBookingApiUtils.test.ts +128 -0
  59. package/src/utils/service/__tests__/cancellationPolicyRefundResolver.test.ts +170 -0
  60. package/src/utils/service/__tests__/serviceBookingStatusUtils.test.ts +273 -0
  61. package/src/utils/service/__tests__/serviceRateUtils.test.ts +288 -0
  62. package/src/utils/service/serviceDBUtils.ts +13 -8
  63. package/src/utils/service/serviceUtils.ts +8 -0
  64. package/src/utmAttribution.ts +1 -5
  65. package/src/venueLoyaltyRedemption.ts +22 -0
@@ -0,0 +1,226 @@
1
+ import { serviceBookingIsRequest, serviceBookingIsConfirmed, serviceBookingIsPaid, serviceBookingIsRefunded, serviceBookingAllowPromisePay, serviceBookingIsCanceled, serviceBookingIsApproved, serviceBookingIsDeclined, serviceBookingIsPending, serviceBookingHasApprovalDecision, serviceBookingCanBePaid, serviceBookingCanBeRefunded, serviceBookingCanHaveApprovalDecision, serviceBookingCanBeCanceled, serviceBookingCanBeConfirmed, } from "../serviceBookingStatusUtils";
2
+ // Minimal booking factory — only supply the fields each predicate inspects
3
+ function makeBooking(overrides = {}) {
4
+ return {
5
+ id: "b1",
6
+ status: "Pending",
7
+ bookingType: "Instant",
8
+ allowPromiseToPay: false,
9
+ checkout: null,
10
+ ...overrides,
11
+ };
12
+ }
13
+ // ---------------------------------------------------------------------------
14
+ // Simple predicates
15
+ // ---------------------------------------------------------------------------
16
+ describe("serviceBookingIsRequest", () => {
17
+ it("returns true when bookingType is Request", () => {
18
+ expect(serviceBookingIsRequest(makeBooking({ bookingType: "Request" }))).toBe(true);
19
+ });
20
+ it("returns false when bookingType is Instant", () => {
21
+ expect(serviceBookingIsRequest(makeBooking({ bookingType: "Instant" }))).toBe(false);
22
+ });
23
+ });
24
+ describe("serviceBookingIsConfirmed", () => {
25
+ it("returns true for Confirmed status", () => {
26
+ expect(serviceBookingIsConfirmed(makeBooking({ status: "Confirmed" }))).toBe(true);
27
+ });
28
+ it("returns false for non-Confirmed statuses", () => {
29
+ for (const status of ["Pending", "Approved", "Rejected", "Canceled"]) {
30
+ expect(serviceBookingIsConfirmed(makeBooking({ status }))).toBe(false);
31
+ }
32
+ });
33
+ });
34
+ describe("serviceBookingIsPaid", () => {
35
+ it("returns true when checkout.paidOn is set", () => {
36
+ expect(serviceBookingIsPaid(makeBooking({ checkout: { paidOn: new Date() } }))).toBe(true);
37
+ });
38
+ it("returns false when checkout is null", () => {
39
+ expect(serviceBookingIsPaid(makeBooking({ checkout: null }))).toBe(false);
40
+ });
41
+ it("returns false when paidOn is null", () => {
42
+ expect(serviceBookingIsPaid(makeBooking({ checkout: { paidOn: null } }))).toBe(false);
43
+ });
44
+ });
45
+ describe("serviceBookingIsRefunded", () => {
46
+ it("returns true when checkout.refundedOn is set", () => {
47
+ expect(serviceBookingIsRefunded(makeBooking({ checkout: { refundedOn: new Date() } }))).toBe(true);
48
+ });
49
+ it("returns false when checkout is null", () => {
50
+ expect(serviceBookingIsRefunded(makeBooking({ checkout: null }))).toBe(false);
51
+ });
52
+ it("returns false when refundedOn is null", () => {
53
+ expect(serviceBookingIsRefunded(makeBooking({ checkout: { refundedOn: null } }))).toBe(false);
54
+ });
55
+ });
56
+ describe("serviceBookingAllowPromisePay", () => {
57
+ it("returns true when allowPromiseToPay is true", () => {
58
+ expect(serviceBookingAllowPromisePay(makeBooking({ allowPromiseToPay: true }))).toBe(true);
59
+ });
60
+ it("returns false when allowPromiseToPay is false", () => {
61
+ expect(serviceBookingAllowPromisePay(makeBooking({ allowPromiseToPay: false }))).toBe(false);
62
+ });
63
+ });
64
+ describe("serviceBookingIsCanceled", () => {
65
+ it("returns true for Canceled status", () => {
66
+ expect(serviceBookingIsCanceled(makeBooking({ status: "Canceled" }))).toBe(true);
67
+ });
68
+ it("returns false for other statuses", () => {
69
+ expect(serviceBookingIsCanceled(makeBooking({ status: "Pending" }))).toBe(false);
70
+ });
71
+ });
72
+ describe("serviceBookingIsApproved", () => {
73
+ it("returns true for Approved status", () => {
74
+ expect(serviceBookingIsApproved(makeBooking({ status: "Approved" }))).toBe(true);
75
+ });
76
+ it("returns false for Rejected", () => {
77
+ expect(serviceBookingIsApproved(makeBooking({ status: "Rejected" }))).toBe(false);
78
+ });
79
+ });
80
+ describe("serviceBookingIsDeclined", () => {
81
+ it("returns true for Rejected status", () => {
82
+ expect(serviceBookingIsDeclined(makeBooking({ status: "Rejected" }))).toBe(true);
83
+ });
84
+ it("returns false for Approved", () => {
85
+ expect(serviceBookingIsDeclined(makeBooking({ status: "Approved" }))).toBe(false);
86
+ });
87
+ });
88
+ describe("serviceBookingIsPending", () => {
89
+ it("returns true for Pending status", () => {
90
+ expect(serviceBookingIsPending(makeBooking({ status: "Pending" }))).toBe(true);
91
+ });
92
+ it("returns false for Approved", () => {
93
+ expect(serviceBookingIsPending(makeBooking({ status: "Approved" }))).toBe(false);
94
+ });
95
+ });
96
+ describe("serviceBookingHasApprovalDecision", () => {
97
+ it("returns true when Rejected", () => {
98
+ expect(serviceBookingHasApprovalDecision(makeBooking({ status: "Rejected" }))).toBe(true);
99
+ });
100
+ it("returns true when Approved", () => {
101
+ expect(serviceBookingHasApprovalDecision(makeBooking({ status: "Approved" }))).toBe(true);
102
+ });
103
+ it("returns false when Pending", () => {
104
+ expect(serviceBookingHasApprovalDecision(makeBooking({ status: "Pending" }))).toBe(false);
105
+ });
106
+ });
107
+ // ---------------------------------------------------------------------------
108
+ // Compound predicates — canBePaid
109
+ // ---------------------------------------------------------------------------
110
+ describe("serviceBookingCanBePaid", () => {
111
+ it("returns valid for an Approved, unpaid, non-canceled booking", () => {
112
+ expect(serviceBookingCanBePaid(makeBooking({ status: "Approved" }))).toEqual({ valid: true });
113
+ });
114
+ it("blocks payment for a Canceled booking", () => {
115
+ const result = serviceBookingCanBePaid(makeBooking({ status: "Canceled" }));
116
+ expect(result.valid).toBe(false);
117
+ expect(result.errorMessage).toMatch(/canceled/i);
118
+ });
119
+ it("blocks payment when already paid", () => {
120
+ const result = serviceBookingCanBePaid(makeBooking({ status: "Approved", checkout: { paidOn: new Date() } }));
121
+ expect(result.valid).toBe(false);
122
+ expect(result.errorMessage).toMatch(/already been paid/i);
123
+ });
124
+ it("blocks payment for a Rejected booking", () => {
125
+ const result = serviceBookingCanBePaid(makeBooking({ status: "Rejected" }));
126
+ expect(result.valid).toBe(false);
127
+ expect(result.errorMessage).toMatch(/declined/i);
128
+ });
129
+ it("blocks payment for a Pending Request", () => {
130
+ const result = serviceBookingCanBePaid(makeBooking({ status: "Pending", bookingType: "Request" }));
131
+ expect(result.valid).toBe(false);
132
+ expect(result.errorMessage).toMatch(/pending booking request/i);
133
+ });
134
+ it("allows payment for a Pending non-Request booking", () => {
135
+ expect(serviceBookingCanBePaid(makeBooking({ status: "Pending", bookingType: "Instant" }))).toEqual({ valid: true });
136
+ });
137
+ });
138
+ // ---------------------------------------------------------------------------
139
+ // canBeRefunded
140
+ // ---------------------------------------------------------------------------
141
+ describe("serviceBookingCanBeRefunded", () => {
142
+ const paidBooking = makeBooking({
143
+ status: "Approved",
144
+ checkout: { paidOn: new Date() },
145
+ });
146
+ it("returns valid for a paid, non-canceled, non-refunded booking", () => {
147
+ expect(serviceBookingCanBeRefunded(paidBooking)).toEqual({ valid: true });
148
+ });
149
+ it("blocks refund for a Canceled booking", () => {
150
+ const result = serviceBookingCanBeRefunded(makeBooking({ status: "Canceled" }));
151
+ expect(result.valid).toBe(false);
152
+ expect(result.errorMessage).toMatch(/already canceled/i);
153
+ });
154
+ it("blocks refund for an already refunded booking", () => {
155
+ const result = serviceBookingCanBeRefunded(makeBooking({ checkout: { paidOn: new Date(), refundedOn: new Date() } }));
156
+ expect(result.valid).toBe(false);
157
+ expect(result.errorMessage).toMatch(/already refunded/i);
158
+ });
159
+ it("blocks refund for an unpaid booking", () => {
160
+ const result = serviceBookingCanBeRefunded(makeBooking({ checkout: null }));
161
+ expect(result.valid).toBe(false);
162
+ expect(result.errorMessage).toMatch(/not been paid/i);
163
+ });
164
+ });
165
+ // ---------------------------------------------------------------------------
166
+ // canHaveApprovalDecision
167
+ // ---------------------------------------------------------------------------
168
+ describe("serviceBookingCanHaveApprovalDecision", () => {
169
+ it("returns valid for a Pending Request that is not canceled or confirmed", () => {
170
+ const booking = makeBooking({ bookingType: "Request", status: "Pending" });
171
+ expect(serviceBookingCanHaveApprovalDecision(booking)).toEqual({ valid: true });
172
+ });
173
+ it("blocks non-Request bookings", () => {
174
+ const result = serviceBookingCanHaveApprovalDecision(makeBooking({ bookingType: "Instant" }));
175
+ expect(result.valid).toBe(false);
176
+ expect(result.errorMessage).toMatch(/booking requests/i);
177
+ });
178
+ it("blocks Canceled requests", () => {
179
+ const result = serviceBookingCanHaveApprovalDecision(makeBooking({ bookingType: "Request", status: "Canceled" }));
180
+ expect(result.valid).toBe(false);
181
+ expect(result.errorMessage).toMatch(/canceled/i);
182
+ });
183
+ it("blocks Confirmed requests", () => {
184
+ const result = serviceBookingCanHaveApprovalDecision(makeBooking({ bookingType: "Request", status: "Confirmed" }));
185
+ expect(result.valid).toBe(false);
186
+ expect(result.errorMessage).toMatch(/confirmed/i);
187
+ });
188
+ });
189
+ // ---------------------------------------------------------------------------
190
+ // canBeCanceled
191
+ // ---------------------------------------------------------------------------
192
+ describe("serviceBookingCanBeCanceled", () => {
193
+ const service = {};
194
+ it("returns valid for an active Pending booking", () => {
195
+ expect(serviceBookingCanBeCanceled(service, makeBooking({ status: "Pending" }))).toEqual({ valid: true });
196
+ });
197
+ it("blocks canceling an already Canceled booking", () => {
198
+ const result = serviceBookingCanBeCanceled(service, makeBooking({ status: "Canceled" }));
199
+ expect(result.valid).toBe(false);
200
+ expect(result.errorMessage).toMatch(/may not be canceled/i);
201
+ });
202
+ it("blocks canceling a refunded booking", () => {
203
+ const result = serviceBookingCanBeCanceled(service, makeBooking({ checkout: { refundedOn: new Date() } }));
204
+ expect(result.valid).toBe(false);
205
+ expect(result.errorMessage).toMatch(/refunded/i);
206
+ });
207
+ it("blocks canceling a Rejected booking", () => {
208
+ const result = serviceBookingCanBeCanceled(service, makeBooking({ status: "Rejected" }));
209
+ expect(result.valid).toBe(false);
210
+ expect(result.errorMessage).toMatch(/declined/i);
211
+ });
212
+ });
213
+ // ---------------------------------------------------------------------------
214
+ // canBeConfirmed
215
+ // ---------------------------------------------------------------------------
216
+ describe("serviceBookingCanBeConfirmed", () => {
217
+ it("returns valid for an Approved booking", () => {
218
+ expect(serviceBookingCanBeConfirmed(makeBooking({ status: "Approved" }))).toEqual({ valid: true });
219
+ });
220
+ it("blocks confirming a Canceled booking", () => {
221
+ const result = serviceBookingCanBeConfirmed(makeBooking({ status: "Canceled" }));
222
+ expect(result.valid).toBe(false);
223
+ expect(result.errorMessage).toMatch(/canceled/i);
224
+ });
225
+ });
226
+ //# sourceMappingURL=serviceBookingStatusUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceBookingStatusUtils.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/serviceBookingStatusUtils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,EAC7B,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,iCAAiC,EACjC,uBAAuB,EACvB,2BAA2B,EAC3B,qCAAqC,EACrC,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AAGtC,2EAA2E;AAC3E,SAAS,WAAW,CAAC,YAAwC,EAAE;IAC7D,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,SAAS;QACtB,iBAAiB,EAAE,KAAK;QACxB,QAAQ,EAAE,IAAI;QACd,GAAG,SAAS;KACmB,CAAC;AACpC,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;YACrE,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAgC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvG,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,EAAgC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3H,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAgC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,EAAgC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnI,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAgC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9H,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,6BAA6B,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,6BAA6B,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,iCAAiC,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,iCAAiC,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,iCAAiC,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,uBAAuB,CACpC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,EAAgC,CAAC,CACpG,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QACnG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,MAAM,WAAW,GAAG,WAAW,CAAC;QAC9B,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE;KACH,CAAC,CAAC;IAEjC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,2BAA2B,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,2BAA2B,CACxC,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,EAAgC,CAAC,CACxG,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,2BAA2B,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,qCAAqC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,qCAAqC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,MAAM,GAAG,qCAAqC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAClH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,qCAAqC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACnH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,MAAM,OAAO,GAAG,EAAS,CAAC;IAE1B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,2BAA2B,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5G,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,2BAA2B,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,2BAA2B,CACxC,OAAO,EACP,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,EAAgC,CAAC,CACpF,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,2BAA2B,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,4BAA4B,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,4BAA4B,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serviceRateUtils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceRateUtils.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/serviceRateUtils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,237 @@
1
+ import { ServiceRatePricingType, ServiceRateType } from "@prisma/client";
2
+ import { DateTime } from "luxon";
3
+ import { SERVICE_DAILY_RATE_HOURS_MIN, serviceBookingCalcDayPriceBreakdown, serviceBookingPriceBreakdownGetTypeText, getServiceRatePricingInfo, serviceRatesFilter, serviceRatesHasRates, } from "../serviceRateUtils";
4
+ // ---------------------------------------------------------------------------
5
+ // Helpers
6
+ // ---------------------------------------------------------------------------
7
+ function makeRange(startISO, endISO) {
8
+ return {
9
+ start: DateTime.fromISO(startISO, { zone: "utc" }),
10
+ end: DateTime.fromISO(endISO, { zone: "utc" }),
11
+ };
12
+ }
13
+ function makeRate(overrides = {}) {
14
+ return {
15
+ id: "r1",
16
+ rateType: ServiceRateType.General,
17
+ hourlyRateCents: null,
18
+ dailyRateCents: null,
19
+ flatRateCents: null,
20
+ serviceRatesAssociationId: "sra1",
21
+ createdAt: new Date(),
22
+ updatedAt: new Date(),
23
+ ...overrides,
24
+ };
25
+ }
26
+ const RANGE_8H = makeRange("2025-07-01T09:00:00Z", "2025-07-01T17:00:00Z");
27
+ // ---------------------------------------------------------------------------
28
+ // serviceBookingPriceBreakdownGetTypeText
29
+ // ---------------------------------------------------------------------------
30
+ describe("serviceBookingPriceBreakdownGetTypeText", () => {
31
+ it("returns rateType + space + pricingType", () => {
32
+ const info = {
33
+ rateType: ServiceRateType.General,
34
+ pricingType: ServiceRatePricingType.Hourly,
35
+ hours: 2,
36
+ piTotalCents: 200,
37
+ rateCents: 100,
38
+ unitCount: 2,
39
+ dateTimeRange: RANGE_8H,
40
+ };
41
+ expect(serviceBookingPriceBreakdownGetTypeText(info)).toBe("General Hourly");
42
+ });
43
+ });
44
+ // ---------------------------------------------------------------------------
45
+ // serviceBookingCalcDayPriceBreakdown — flat rate
46
+ // ---------------------------------------------------------------------------
47
+ describe("serviceBookingCalcDayPriceBreakdown — flat rate", () => {
48
+ it("uses flat rate when flatRateCents is set, ignoring hourly", () => {
49
+ const rate = makeRate({ flatRateCents: 50000, hourlyRateCents: 10000 });
50
+ const result = serviceBookingCalcDayPriceBreakdown(RANGE_8H, [rate], false, 8);
51
+ expect(result.pricingType).toBe("Flat");
52
+ expect(result.rateCents).toBe(50000);
53
+ expect(result.piTotalCents).toBe(50000);
54
+ expect(result.unitCount).toBe(1);
55
+ });
56
+ it("assigns rateType from the matching rate", () => {
57
+ const rate = makeRate({ flatRateCents: 20000, rateType: ServiceRateType.Special });
58
+ const result = serviceBookingCalcDayPriceBreakdown(RANGE_8H, [rate], false, 4);
59
+ expect(result.rateType).toBe(ServiceRateType.Special);
60
+ });
61
+ });
62
+ // ---------------------------------------------------------------------------
63
+ // serviceBookingCalcDayPriceBreakdown — hourly rate
64
+ // ---------------------------------------------------------------------------
65
+ describe("serviceBookingCalcDayPriceBreakdown — hourly rate", () => {
66
+ it("calculates hourly total correctly", () => {
67
+ const rate = makeRate({ hourlyRateCents: 5000 });
68
+ const result = serviceBookingCalcDayPriceBreakdown(RANGE_8H, [rate], false, 3);
69
+ expect(result.pricingType).toBe(ServiceRatePricingType.Hourly);
70
+ expect(result.rateCents).toBe(5000);
71
+ expect(result.unitCount).toBe(3);
72
+ expect(result.piTotalCents).toBe(15000);
73
+ });
74
+ it("returns zero total when no hourly rate available", () => {
75
+ const result = serviceBookingCalcDayPriceBreakdown(RANGE_8H, [], false, 3);
76
+ expect(result.piTotalCents).toBe(0);
77
+ });
78
+ });
79
+ // ---------------------------------------------------------------------------
80
+ // serviceBookingCalcDayPriceBreakdown — daily rate
81
+ // ---------------------------------------------------------------------------
82
+ describe("serviceBookingCalcDayPriceBreakdown — daily rate", () => {
83
+ it("calculates daily total based on full-day slots", () => {
84
+ const rate = makeRate({ dailyRateCents: 40000 });
85
+ // 16 hours = floor(16/8) = 2 days
86
+ const result = serviceBookingCalcDayPriceBreakdown(RANGE_8H, [rate], true, 16);
87
+ expect(result.pricingType).toBe(ServiceRatePricingType.Daily);
88
+ expect(result.rateCents).toBe(40000);
89
+ expect(result.unitCount).toBe(2);
90
+ expect(result.piTotalCents).toBe(80000);
91
+ });
92
+ it("falls back to hourly when isFullDay=true but no daily rate available", () => {
93
+ const rate = makeRate({ hourlyRateCents: 3000 });
94
+ const result = serviceBookingCalcDayPriceBreakdown(RANGE_8H, [rate], true, 8);
95
+ expect(result.pricingType).toBe(ServiceRatePricingType.Hourly);
96
+ });
97
+ });
98
+ // ---------------------------------------------------------------------------
99
+ // getServiceRatePricingInfo
100
+ // ---------------------------------------------------------------------------
101
+ describe("getServiceRatePricingInfo", () => {
102
+ it("returns hourly pricing when hours < SERVICE_DAILY_RATE_HOURS_MIN", () => {
103
+ const generalRate = makeRate({ hourlyRateCents: 2000 });
104
+ const result = getServiceRatePricingInfo(RANGE_8H, generalRate, [], [], "UTC", 4);
105
+ expect(result.pricingType).toBe(ServiceRatePricingType.Hourly);
106
+ expect(result.piTotalCents).toBe(8000);
107
+ });
108
+ it("returns daily pricing when hours >= SERVICE_DAILY_RATE_HOURS_MIN", () => {
109
+ const generalRate = makeRate({ dailyRateCents: 30000 });
110
+ const result = getServiceRatePricingInfo(RANGE_8H, generalRate, [], [], "UTC", SERVICE_DAILY_RATE_HOURS_MIN);
111
+ expect(result.pricingType).toBe(ServiceRatePricingType.Daily);
112
+ expect(result.piTotalCents).toBe(30000);
113
+ });
114
+ it("prefers special rate over general rate", () => {
115
+ const generalRate = makeRate({ hourlyRateCents: 1000 });
116
+ const specialRate = {
117
+ id: "sp1",
118
+ isAvailable: true,
119
+ serviceRate: makeRate({ hourlyRateCents: 9999 }),
120
+ dateTimeRange: RANGE_8H,
121
+ };
122
+ const result = getServiceRatePricingInfo(RANGE_8H, generalRate, [], [specialRate], "UTC", 2);
123
+ expect(result.rateCents).toBe(9999);
124
+ });
125
+ });
126
+ // ---------------------------------------------------------------------------
127
+ // serviceRatesFilter
128
+ // ---------------------------------------------------------------------------
129
+ describe("serviceRatesFilter", () => {
130
+ const range = makeRange("2025-07-01T09:00:00Z", "2025-07-01T17:00:00Z");
131
+ it("keeps special rates that intersect and are available", () => {
132
+ const specialRate = {
133
+ id: "sp1",
134
+ isAvailable: true,
135
+ serviceRate: makeRate({ hourlyRateCents: 5000 }),
136
+ dateTimeRange: makeRange("2025-07-01T10:00:00Z", "2025-07-01T14:00:00Z"),
137
+ };
138
+ const rates = {
139
+ generalRate: null,
140
+ specialRates: [specialRate],
141
+ dailyRates: [],
142
+ };
143
+ const result = serviceRatesFilter(rates, [range]);
144
+ expect(result.specialRates).toHaveLength(1);
145
+ });
146
+ it("excludes special rates that are unavailable", () => {
147
+ const blockedRate = {
148
+ id: "sp2",
149
+ isAvailable: false,
150
+ serviceRate: makeRate(),
151
+ dateTimeRange: range,
152
+ };
153
+ const rates = {
154
+ generalRate: null,
155
+ specialRates: [blockedRate],
156
+ dailyRates: [],
157
+ };
158
+ const result = serviceRatesFilter(rates, [range]);
159
+ expect(result.specialRates).toHaveLength(0);
160
+ });
161
+ it("excludes special rates outside the requested range", () => {
162
+ const outsideRate = {
163
+ id: "sp3",
164
+ isAvailable: true,
165
+ serviceRate: makeRate({ hourlyRateCents: 5000 }),
166
+ dateTimeRange: makeRange("2025-08-01T09:00:00Z", "2025-08-01T17:00:00Z"),
167
+ };
168
+ const rates = {
169
+ generalRate: null,
170
+ specialRates: [outsideRate],
171
+ dailyRates: [],
172
+ };
173
+ const result = serviceRatesFilter(rates, [range]);
174
+ expect(result.specialRates).toHaveLength(0);
175
+ });
176
+ it("preserves the generalRate unchanged", () => {
177
+ const generalRate = makeRate({ hourlyRateCents: 1000 });
178
+ const rates = {
179
+ generalRate,
180
+ specialRates: [],
181
+ dailyRates: [],
182
+ };
183
+ expect(serviceRatesFilter(rates, [range]).generalRate).toBe(generalRate);
184
+ });
185
+ });
186
+ // ---------------------------------------------------------------------------
187
+ // serviceRatesHasRates
188
+ // ---------------------------------------------------------------------------
189
+ describe("serviceRatesHasRates", () => {
190
+ it("returns true when generalRate has hourly rate", () => {
191
+ const rates = {
192
+ generalRate: makeRate({ hourlyRateCents: 1000 }),
193
+ specialRates: [],
194
+ dailyRates: [],
195
+ };
196
+ expect(serviceRatesHasRates(rates)).toBe(true);
197
+ });
198
+ it("returns true when generalRate has flat rate", () => {
199
+ const rates = {
200
+ generalRate: makeRate({ flatRateCents: 5000 }),
201
+ specialRates: [],
202
+ dailyRates: [],
203
+ };
204
+ expect(serviceRatesHasRates(rates)).toBe(true);
205
+ });
206
+ it("returns false when all rates are zero/null", () => {
207
+ const rates = {
208
+ generalRate: makeRate(),
209
+ specialRates: [],
210
+ dailyRates: [],
211
+ };
212
+ expect(serviceRatesHasRates(rates)).toBe(false);
213
+ });
214
+ it("returns true when a special rate has a daily rate", () => {
215
+ const specialRate = {
216
+ id: "sp1",
217
+ isAvailable: true,
218
+ serviceRate: makeRate({ dailyRateCents: 10000 }),
219
+ dateTimeRange: RANGE_8H,
220
+ };
221
+ const rates = {
222
+ generalRate: null,
223
+ specialRates: [specialRate],
224
+ dailyRates: [],
225
+ };
226
+ expect(serviceRatesHasRates(rates)).toBe(true);
227
+ });
228
+ it("returns falsy when generalRate is null and no special/daily rates", () => {
229
+ const rates = {
230
+ generalRate: null,
231
+ specialRates: [],
232
+ dailyRates: [],
233
+ };
234
+ expect(serviceRatesHasRates(rates)).toBeFalsy();
235
+ });
236
+ });
237
+ //# sourceMappingURL=serviceRateUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceRateUtils.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/serviceRateUtils.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,12 @@
1
- import { ServiceExt } from "../../extendedSchemas.js";
2
- import { DeepPartial } from "../typeUtils.js";
3
- /** Converts service data for DB write. Currently a pass-through; rate conversion was removed. */
4
- export declare function serviceToDb(service: DeepPartial<ServiceExt>): DeepPartial<ServiceExt>;
5
- /** Converts service data from DB read. Currently a pass-through; rate conversion was removed. */
6
- export declare function serviceFromDb(service: ServiceExt): ServiceExt;
1
+ import type { ServiceExt } from "../../extendedSchemas.js";
2
+ import type { DeepPartial } from "../typeUtils.js";
3
+ /**
4
+ * Maps a service record from the API / DB into the client `ServiceExt` shape
5
+ * (e.g. date normalization). Identity until a stricter transform is needed.
6
+ */
7
+ export declare function serviceFromDb<T extends ServiceExt | null | undefined>(service: T): T;
8
+ /**
9
+ * Maps a partial `ServiceExt` from the client for upsert payloads.
10
+ */
11
+ export declare function serviceToDb<T extends DeepPartial<ServiceExt>>(service: T): T;
7
12
  //# sourceMappingURL=serviceDBUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serviceDBUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/service/serviceDBUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,iGAAiG;AACjG,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,GAC/B,WAAW,CAAC,UAAU,CAAC,CAEzB;AAED,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CAE7D"}
1
+ {"version":3,"file":"serviceDBUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/service/serviceDBUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,UAAU,GAAG,IAAI,GAAG,SAAS,EACnE,OAAO,EAAE,CAAC,GACT,CAAC,CAEH;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAE5E"}
@@ -1,9 +1,14 @@
1
- /** Converts service data for DB write. Currently a pass-through; rate conversion was removed. */
2
- export function serviceToDb(service) {
1
+ /**
2
+ * Maps a service record from the API / DB into the client `ServiceExt` shape
3
+ * (e.g. date normalization). Identity until a stricter transform is needed.
4
+ */
5
+ export function serviceFromDb(service) {
3
6
  return service;
4
7
  }
5
- /** Converts service data from DB read. Currently a pass-through; rate conversion was removed. */
6
- export function serviceFromDb(service) {
8
+ /**
9
+ * Maps a partial `ServiceExt` from the client for upsert payloads.
10
+ */
11
+ export function serviceToDb(service) {
7
12
  return service;
8
13
  }
9
14
  //# sourceMappingURL=serviceDBUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serviceDBUtils.js","sourceRoot":"","sources":["../../../src/utils/service/serviceDBUtils.ts"],"names":[],"mappings":"AAGA,iGAAiG;AACjG,MAAM,UAAU,WAAW,CACzB,OAAgC;IAEhC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,aAAa,CAAC,OAAmB;IAC/C,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"serviceDBUtils.js","sourceRoot":"","sources":["../../../src/utils/service/serviceDBUtils.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAU;IAEV,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAoC,OAAU;IACvE,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -96,5 +96,10 @@ export declare function serviceExcludeRates(service: Partial<ServiceExt>): Parti
96
96
  export declare function serviceExcludeDates(service: Partial<ServiceExt>): Partial<ServiceExtNoIds>;
97
97
  export declare function serviceExcludeMiscData(service: Partial<ServiceExt>): Partial<ServiceExtNoIds>;
98
98
  export declare function serviceRelevantData(service: Partial<ServiceExt>): Partial<ServiceExtNoIds>;
99
+ /**
100
+ * Returns the contextually correct label for a service's sellable items.
101
+ * Vendors sell "Products"; entertainers and other service types sell "Merch".
102
+ */
103
+ export declare function getVendorSalesLabel(serviceType: ServiceTypes): "Products" | "Merch";
99
104
  export {};
100
105
  //# sourceMappingURL=serviceUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serviceUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/service/serviceUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serviceUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/service/serviceUtils.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ServiceCancellationPolicy as ServiceCancellationPolicyOption, ServiceSubscriptionStatus, } from "@prisma/client";
1
+ import { ServiceCancellationPolicy as ServiceCancellationPolicyOption, ServiceSubscriptionStatus, ServiceTypes, } from "@prisma/client";
2
2
  export const SERVICE_CANCELLATION_POLICY_DATA = {
3
3
  [ServiceCancellationPolicyOption.None]: {
4
4
  name: "None",
@@ -640,4 +640,11 @@ export function serviceExcludeMiscData(service) {
640
640
  export function serviceRelevantData(service) {
641
641
  return serviceExcludeOwners(serviceExcludeDates(serviceExcludeRates(serviceExcludeIds(serviceExcludeMiscData(service)))));
642
642
  }
643
+ /**
644
+ * Returns the contextually correct label for a service's sellable items.
645
+ * Vendors sell "Products"; entertainers and other service types sell "Merch".
646
+ */
647
+ export function getVendorSalesLabel(serviceType) {
648
+ return serviceType === ServiceTypes.Vendors ? "Products" : "Merch";
649
+ }
643
650
  //# sourceMappingURL=serviceUtils.js.map