@ingenx-io/valets-schema-mcp-server 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/docs/collections/firestore-paths.md +49 -0
- package/data/docs/decisions/migrations.md +56 -0
- package/data/docs/decisions/summary.md +78 -0
- package/data/docs/enums/booking-status.md +26 -0
- package/data/docs/enums/customer-payment-status.md +26 -0
- package/data/docs/enums/customer-payment-target-type.md +23 -0
- package/data/docs/enums/delivery-type.md +23 -0
- package/data/docs/enums/event-status.md +30 -0
- package/data/docs/enums/fulfillment-status.md +32 -0
- package/data/docs/enums/loyalty-transaction-type.md +32 -0
- package/data/docs/enums/order-status.md +65 -0
- package/data/docs/enums/payment-method.md +36 -0
- package/data/docs/enums/payment-proof-status.md +23 -0
- package/data/docs/enums/payment-status.md +34 -0
- package/data/docs/enums/return-status.md +32 -0
- package/data/docs/enums/session-status.md +32 -0
- package/data/docs/enums/ticket-status.md +29 -0
- package/data/docs/index.md +102 -0
- package/data/docs/models/booking-version.md +295 -0
- package/data/docs/models/booking.md +1754 -0
- package/data/docs/models/customer-payment-allocation.md +336 -0
- package/data/docs/models/customer-payment.md +392 -0
- package/data/docs/models/customer.md +475 -0
- package/data/docs/models/event.md +386 -0
- package/data/docs/models/loyalty-config.md +317 -0
- package/data/docs/models/loyalty-reward.md +236 -0
- package/data/docs/models/loyalty-status.md +328 -0
- package/data/docs/models/loyalty-transaction.md +326 -0
- package/data/docs/models/metrics-current.md +532 -0
- package/data/docs/models/metrics-daily.md +548 -0
- package/data/docs/models/metrics-monthly.md +548 -0
- package/data/docs/models/order-item.md +361 -0
- package/data/docs/models/order.md +1637 -0
- package/data/docs/models/payment-summary.md +123 -0
- package/data/docs/models/sale.md +540 -0
- package/data/docs/models/ticket.md +405 -0
- package/data/docs/triggers/event-ticket-triggers.md +204 -0
- package/data/docs/triggers/loyalty-automation.md +123 -0
- package/data/static/decisions.json +966 -0
- package/data/static/llms.txt +1056 -0
- package/data/static/openapi.yaml +3090 -0
- package/data/static/schemas.json +4055 -0
- package/package.json +1 -1
|
@@ -0,0 +1,1754 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Booking"
|
|
3
|
+
sidebar_label: "Booking"
|
|
4
|
+
sidebar_position: 1
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Booking
|
|
8
|
+
|
|
9
|
+
<details>
|
|
10
|
+
<summary>Example JSON</summary>
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"id": "bk_abc123def456",
|
|
15
|
+
"uid": "user_u8x92kqm",
|
|
16
|
+
"companyId": null,
|
|
17
|
+
"status": "status",
|
|
18
|
+
"totalAmount": 45000,
|
|
19
|
+
"bookingDates": [
|
|
20
|
+
{
|
|
21
|
+
"date": "2026-02-15",
|
|
22
|
+
"selectedTimeSlots": [
|
|
23
|
+
{
|
|
24
|
+
"id": 0,
|
|
25
|
+
"name": "Morning Full Session",
|
|
26
|
+
"timeRange": "09:00 - 11:00",
|
|
27
|
+
"price": 15000,
|
|
28
|
+
"notMainPurposePrice": 10000,
|
|
29
|
+
"hours": "2h",
|
|
30
|
+
"startTime": "09:00",
|
|
31
|
+
"endTime": "11:00"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"slotKitTypes": {},
|
|
35
|
+
"slotAddOns": {},
|
|
36
|
+
"extraHours": 0
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"customerId": null,
|
|
40
|
+
"client": null,
|
|
41
|
+
"customerName": null,
|
|
42
|
+
"customerEmail": null,
|
|
43
|
+
"customerPhone": null,
|
|
44
|
+
"clientName": null,
|
|
45
|
+
"clientReference": "CLI-2026-0017",
|
|
46
|
+
"clientEmail": null,
|
|
47
|
+
"clientPhone": null,
|
|
48
|
+
"service": null,
|
|
49
|
+
"serviceId": null,
|
|
50
|
+
"serviceName": null,
|
|
51
|
+
"timeSlot": null,
|
|
52
|
+
"date": null,
|
|
53
|
+
"startDate": null,
|
|
54
|
+
"endDate": null,
|
|
55
|
+
"startTime": null,
|
|
56
|
+
"endTime": null,
|
|
57
|
+
"notes": null,
|
|
58
|
+
"technicalInfo": null,
|
|
59
|
+
"paymentStatus": "paymentStatus",
|
|
60
|
+
"amountPaid": null,
|
|
61
|
+
"amountRefunded": null,
|
|
62
|
+
"amountPending": null,
|
|
63
|
+
"purchaseId": null,
|
|
64
|
+
"paymentStatusChangeReason": null,
|
|
65
|
+
"paymentStatusChangedBy": null,
|
|
66
|
+
"paymentStatusChangedAt": "paymentStatusChangedAt",
|
|
67
|
+
"paymentProofUrl": null,
|
|
68
|
+
"paymentProofStatus": "paymentProofStatus",
|
|
69
|
+
"paymentProofAddedAt": "paymentProofAddedAt",
|
|
70
|
+
"paymentProofAddedBy": null,
|
|
71
|
+
"paymentProofReviewedBy": null,
|
|
72
|
+
"paymentProofReviewedAt": "paymentProofReviewedAt",
|
|
73
|
+
"paymentProofRejectionReason": null,
|
|
74
|
+
"cancellationRequestedById": null,
|
|
75
|
+
"cancellationRequestReason": null,
|
|
76
|
+
"cancellationProcessedById": null,
|
|
77
|
+
"cancellationProcessedAt": "cancellationProcessedAt",
|
|
78
|
+
"cancelledByRole": null,
|
|
79
|
+
"cancellationReason": null,
|
|
80
|
+
"createdAt": "createdAt",
|
|
81
|
+
"updatedAt": "updatedAt",
|
|
82
|
+
"createdBy": null,
|
|
83
|
+
"updatedBy": null,
|
|
84
|
+
"createdFromBackend": null
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
</details>
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
- [1. Property `id`](#id)
|
|
92
|
+
- [2. Property `uid`](#uid)
|
|
93
|
+
- [3. Property `companyId`](#companyId)
|
|
94
|
+
- [4. Property `status`](#status)
|
|
95
|
+
- [5. Property `totalAmount`](#totalAmount)
|
|
96
|
+
- [6. Property `bookingDates`](#bookingDates)
|
|
97
|
+
- [6.1. bookingDates items](#bookingDates_items)
|
|
98
|
+
- [6.1.1. Property `date`](#bookingDates_items_date)
|
|
99
|
+
- [6.1.2. Property `selectedTimeSlots`](#bookingDates_items_selectedTimeSlots)
|
|
100
|
+
- [6.1.2.1. selectedTimeSlots items](#bookingDates_items_selectedTimeSlots_items)
|
|
101
|
+
- [6.1.2.1.1. Property `id`](#bookingDates_items_selectedTimeSlots_items_id)
|
|
102
|
+
- [6.1.2.1.2. Property `name`](#bookingDates_items_selectedTimeSlots_items_name)
|
|
103
|
+
- [6.1.2.1.3. Property `timeRange`](#bookingDates_items_selectedTimeSlots_items_timeRange)
|
|
104
|
+
- [6.1.2.1.4. Property `price`](#bookingDates_items_selectedTimeSlots_items_price)
|
|
105
|
+
- [6.1.2.1.5. Property `notMainPurposePrice`](#bookingDates_items_selectedTimeSlots_items_notMainPurposePrice)
|
|
106
|
+
- [6.1.2.1.6. Property `hours`](#bookingDates_items_selectedTimeSlots_items_hours)
|
|
107
|
+
- [6.1.2.1.7. Property `startTime`](#bookingDates_items_selectedTimeSlots_items_startTime)
|
|
108
|
+
- [6.1.2.1.8. Property `endTime`](#bookingDates_items_selectedTimeSlots_items_endTime)
|
|
109
|
+
- [6.1.2.1.9. Property `isNightSlot`](#bookingDates_items_selectedTimeSlots_items_isNightSlot)
|
|
110
|
+
- [6.1.2.1.10. Property `isNotMainPurpose`](#bookingDates_items_selectedTimeSlots_items_isNotMainPurpose)
|
|
111
|
+
- [6.1.2.1.11. Property `isNotMainPurposeReason`](#bookingDates_items_selectedTimeSlots_items_isNotMainPurposeReason)
|
|
112
|
+
- [6.1.2.1.12. Property `isNotMainPurposeOtherReason`](#bookingDates_items_selectedTimeSlots_items_isNotMainPurposeOtherReason)
|
|
113
|
+
- [6.1.2.1.13. Property `_deleted`](#bookingDates_items_selectedTimeSlots_items__deleted)
|
|
114
|
+
- [6.1.2.1.14. Property `_deletedAt`](#bookingDates_items_selectedTimeSlots_items__deletedAt)
|
|
115
|
+
- [6.1.2.1.14.1. Property `_seconds`](#bookingDates_items_selectedTimeSlots_items__deletedAt__seconds)
|
|
116
|
+
- [6.1.2.1.14.2. Property `_nanoseconds`](#bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds)
|
|
117
|
+
- [6.1.2.1.15. Property `_deletedBy`](#bookingDates_items_selectedTimeSlots_items__deletedBy)
|
|
118
|
+
- [6.1.2.1.16. Property `_lastModifiedAt`](#bookingDates_items_selectedTimeSlots_items__lastModifiedAt)
|
|
119
|
+
- [6.1.2.1.17. Property `_lastModifiedBy`](#bookingDates_items_selectedTimeSlots_items__lastModifiedBy)
|
|
120
|
+
- [6.1.2.1.18. Property `_version`](#bookingDates_items_selectedTimeSlots_items__version)
|
|
121
|
+
- [6.1.3. Property `slotKitTypes`](#bookingDates_items_slotKitTypes)
|
|
122
|
+
- [6.1.3.1. Property `additionalProperties`](#bookingDates_items_slotKitTypes_additionalProperties)
|
|
123
|
+
- [6.1.4. Property `slotAddOns`](#bookingDates_items_slotAddOns)
|
|
124
|
+
- [6.1.4.1. Property `additionalProperties`](#bookingDates_items_slotAddOns_additionalProperties)
|
|
125
|
+
- [6.1.4.1.1. additionalProperties items](#bookingDates_items_slotAddOns_additionalProperties_items)
|
|
126
|
+
- [6.1.5. Property `extraHours`](#bookingDates_items_extraHours)
|
|
127
|
+
- [6.1.6. Property `status`](#bookingDates_items_status)
|
|
128
|
+
- [6.1.7. Property `statusUpdatedAt`](#bookingDates_items_statusUpdatedAt)
|
|
129
|
+
- [6.1.7.1. Property `_seconds`](#bookingDates_items_selectedTimeSlots_items__deletedAt__seconds)
|
|
130
|
+
- [6.1.7.2. Property `_nanoseconds`](#bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds)
|
|
131
|
+
- [6.1.8. Property `statusUpdatedBy`](#bookingDates_items_statusUpdatedBy)
|
|
132
|
+
- [6.1.9. Property `slotStatuses`](#bookingDates_items_slotStatuses)
|
|
133
|
+
- [6.1.9.1. Property `session-status`](#bookingDates_items_slotStatuses_additionalProperties)
|
|
134
|
+
- [6.1.10. Property `slotStatusUpdatedAt`](#bookingDates_items_slotStatusUpdatedAt)
|
|
135
|
+
- [6.1.10.1. Property `firestore-timestamp`](#bookingDates_items_slotStatusUpdatedAt_additionalProperties)
|
|
136
|
+
- [6.1.11. Property `slotStatusUpdatedBy`](#bookingDates_items_slotStatusUpdatedBy)
|
|
137
|
+
- [6.1.11.1. Property `additionalProperties`](#bookingDates_items_slotStatusUpdatedBy_additionalProperties)
|
|
138
|
+
- [6.1.12. Property `_deleted`](#bookingDates_items__deleted)
|
|
139
|
+
- [6.1.13. Property `_deletedAt`](#bookingDates_items__deletedAt)
|
|
140
|
+
- [6.1.14. Property `_deletedBy`](#bookingDates_items__deletedBy)
|
|
141
|
+
- [6.1.15. Property `_lastModifiedAt`](#bookingDates_items__lastModifiedAt)
|
|
142
|
+
- [6.1.16. Property `_lastModifiedBy`](#bookingDates_items__lastModifiedBy)
|
|
143
|
+
- [6.1.17. Property `_version`](#bookingDates_items__version)
|
|
144
|
+
- [7. Property `customerId`](#customerId)
|
|
145
|
+
- [8. Property `client`](#client)
|
|
146
|
+
- [8.1. Property `firstName`](#client_firstName)
|
|
147
|
+
- [8.2. Property `lastName`](#client_lastName)
|
|
148
|
+
- [8.3. Property `email`](#client_email)
|
|
149
|
+
- [8.4. Property `phone`](#client_phone)
|
|
150
|
+
- [9. Property `customerName`](#customerName)
|
|
151
|
+
- [10. Property `customerEmail`](#customerEmail)
|
|
152
|
+
- [11. Property `customerPhone`](#customerPhone)
|
|
153
|
+
- [12. Property `clientName`](#clientName)
|
|
154
|
+
- [13. Property `clientReference`](#clientReference)
|
|
155
|
+
- [14. Property `clientEmail`](#clientEmail)
|
|
156
|
+
- [15. Property `clientPhone`](#clientPhone)
|
|
157
|
+
- [16. Property `service`](#service)
|
|
158
|
+
- [16.1. Property `name`](#service_name)
|
|
159
|
+
- [17. Property `serviceId`](#serviceId)
|
|
160
|
+
- [18. Property `serviceName`](#serviceName)
|
|
161
|
+
- [19. Property `timeSlot`](#timeSlot)
|
|
162
|
+
- [20. Property `date`](#date)
|
|
163
|
+
- [21. Property `startDate`](#startDate)
|
|
164
|
+
- [22. Property `endDate`](#endDate)
|
|
165
|
+
- [23. Property `startTime`](#startTime)
|
|
166
|
+
- [24. Property `endTime`](#endTime)
|
|
167
|
+
- [25. Property `notes`](#notes)
|
|
168
|
+
- [25.1. notes items](#notes_items)
|
|
169
|
+
- [25.1.1. Property `id`](#notes_items_id)
|
|
170
|
+
- [25.1.2. Property `text`](#notes_items_text)
|
|
171
|
+
- [25.1.3. Property `createdAt`](#notes_items_createdAt)
|
|
172
|
+
- [25.1.3.1. Property `_seconds`](#bookingDates_items_selectedTimeSlots_items__deletedAt__seconds)
|
|
173
|
+
- [25.1.3.2. Property `_nanoseconds`](#bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds)
|
|
174
|
+
- [25.1.4. Property `createdBy`](#notes_items_createdBy)
|
|
175
|
+
- [25.1.5. Property `createdByName`](#notes_items_createdByName)
|
|
176
|
+
- [25.1.6. Property `_deleted`](#notes_items__deleted)
|
|
177
|
+
- [25.1.7. Property `_deletedAt`](#notes_items__deletedAt)
|
|
178
|
+
- [25.1.8. Property `_deletedBy`](#notes_items__deletedBy)
|
|
179
|
+
- [25.1.9. Property `_lastModifiedAt`](#notes_items__lastModifiedAt)
|
|
180
|
+
- [25.1.10. Property `_lastModifiedBy`](#notes_items__lastModifiedBy)
|
|
181
|
+
- [25.1.11. Property `_version`](#notes_items__version)
|
|
182
|
+
- [26. Property `technicalInfo`](#technicalInfo)
|
|
183
|
+
- [27. Property `paymentStatus`](#paymentStatus)
|
|
184
|
+
- [27.1. Property `payment-status`](#paymentStatus_anyOf_i0)
|
|
185
|
+
- [27.2. Property `item 1`](#paymentStatus_anyOf_i1)
|
|
186
|
+
- [28. Property `amountPaid`](#amountPaid)
|
|
187
|
+
- [29. Property `amountRefunded`](#amountRefunded)
|
|
188
|
+
- [30. Property `amountPending`](#amountPending)
|
|
189
|
+
- [31. Property `purchaseId`](#purchaseId)
|
|
190
|
+
- [32. Property `paymentStatusChangeReason`](#paymentStatusChangeReason)
|
|
191
|
+
- [33. Property `paymentStatusChangedBy`](#paymentStatusChangedBy)
|
|
192
|
+
- [34. Property `paymentStatusChangedAt`](#paymentStatusChangedAt)
|
|
193
|
+
- [34.1. Property `firestore-timestamp`](#paymentStatusChangedAt_anyOf_i0)
|
|
194
|
+
- [34.2. Property `item 1`](#paymentStatusChangedAt_anyOf_i1)
|
|
195
|
+
- [35. Property `paymentProofUrl`](#paymentProofUrl)
|
|
196
|
+
- [36. Property `paymentProofStatus`](#paymentProofStatus)
|
|
197
|
+
- [36.1. Property `payment-proof-status`](#paymentProofStatus_anyOf_i0)
|
|
198
|
+
- [36.2. Property `item 1`](#paymentProofStatus_anyOf_i1)
|
|
199
|
+
- [37. Property `paymentProofAddedAt`](#paymentProofAddedAt)
|
|
200
|
+
- [37.1. Property `firestore-timestamp`](#paymentProofAddedAt_anyOf_i0)
|
|
201
|
+
- [37.2. Property `item 1`](#paymentProofAddedAt_anyOf_i1)
|
|
202
|
+
- [38. Property `paymentProofAddedBy`](#paymentProofAddedBy)
|
|
203
|
+
- [39. Property `paymentProofReviewedBy`](#paymentProofReviewedBy)
|
|
204
|
+
- [40. Property `paymentProofReviewedAt`](#paymentProofReviewedAt)
|
|
205
|
+
- [40.1. Property `firestore-timestamp`](#paymentProofReviewedAt_anyOf_i0)
|
|
206
|
+
- [40.2. Property `item 1`](#paymentProofReviewedAt_anyOf_i1)
|
|
207
|
+
- [41. Property `paymentProofRejectionReason`](#paymentProofRejectionReason)
|
|
208
|
+
- [42. Property `cancellationRequestedById`](#cancellationRequestedById)
|
|
209
|
+
- [43. Property `cancellationRequestReason`](#cancellationRequestReason)
|
|
210
|
+
- [44. Property `cancellationProcessedById`](#cancellationProcessedById)
|
|
211
|
+
- [45. Property `cancellationProcessedAt`](#cancellationProcessedAt)
|
|
212
|
+
- [45.1. Property `firestore-timestamp`](#cancellationProcessedAt_anyOf_i0)
|
|
213
|
+
- [45.2. Property `item 1`](#cancellationProcessedAt_anyOf_i1)
|
|
214
|
+
- [46. Property `cancelledByRole`](#cancelledByRole)
|
|
215
|
+
- [47. Property `cancellationReason`](#cancellationReason)
|
|
216
|
+
- [48. Property `createdAt`](#createdAt)
|
|
217
|
+
- [48.1. Property `_seconds`](#bookingDates_items_selectedTimeSlots_items__deletedAt__seconds)
|
|
218
|
+
- [48.2. Property `_nanoseconds`](#bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds)
|
|
219
|
+
- [49. Property `updatedAt`](#updatedAt)
|
|
220
|
+
- [49.1. Property `firestore-timestamp`](#updatedAt_anyOf_i0)
|
|
221
|
+
- [49.2. Property `item 1`](#updatedAt_anyOf_i1)
|
|
222
|
+
- [50. Property `createdBy`](#createdBy)
|
|
223
|
+
- [51. Property `updatedBy`](#updatedBy)
|
|
224
|
+
- [52. Property `createdFromBackend`](#createdFromBackend)
|
|
225
|
+
|
|
226
|
+
| | |
|
|
227
|
+
| ------------------------- | --------------------- |
|
|
228
|
+
| **Type** | `object` |
|
|
229
|
+
| **Required** | No |
|
|
230
|
+
| **Additional properties** | Not allowed |
|
|
231
|
+
| **Defined in** | #/definitions/booking |
|
|
232
|
+
|
|
233
|
+
**Description:** Booking model. Collection: companies/\{companyId\}/bookings/\{bookingId\}. All platforms. Uses BookingStatus (6 values) and SessionStatus (D19) for per-date/slot tracking.
|
|
234
|
+
|
|
235
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
236
|
+
| -------------------------------------------------------------- | ------- | ----------------------- | ---------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
|
|
237
|
+
| + [id](#id ) | No | string | No | - | (Read-only) Firestore document ID. |
|
|
238
|
+
| + [uid](#uid ) | No | string | No | - | (Read-only) Entity UID. Often mirrors id. |
|
|
239
|
+
| - [companyId](#companyId ) | No | string or null | No | - | (Immutable) FK → Company document ID. Note: optional in current schema — should be required (see ID consistency audit). |
|
|
240
|
+
| + [status](#status ) | No | enum (of string) | No | In #/definitions/booking-status | Booking lifecycle status. COMPLETED_MIXED = some sessions completed, others cancelled/no-show. |
|
|
241
|
+
| + [totalAmount](#totalAmount ) | No | number | No | - | - |
|
|
242
|
+
| + [bookingDates](#bookingDates ) | No | array of object | No | - | - |
|
|
243
|
+
| - [customerId](#customerId ) | No | string or null | No | - | FK → Customer.id (Firestore doc ID). Links booking to customer record. |
|
|
244
|
+
| - [client](#client ) | No | object or null | No | - | (Denormalized) Embedded client snapshot from Customer at write time. |
|
|
245
|
+
| - [customerName](#customerName ) | No | string or null | No | - | (Denormalized) From Customer.name at write time. Canonical field per D24. |
|
|
246
|
+
| - [customerEmail](#customerEmail ) | No | string or null | No | - | (Denormalized) From Customer.email at write time. Canonical field per D24. |
|
|
247
|
+
| - [customerPhone](#customerPhone ) | No | string or null | No | - | (Denormalized) From Customer.phone at write time. Canonical field per D24. |
|
|
248
|
+
| - [clientName](#clientName ) | No | string or null | No | - | (Denormalized) Legacy — use \`customerName\`. D24 standardized to customer* prefix. |
|
|
249
|
+
| + [clientReference](#clientReference ) | No | string | No | - | - |
|
|
250
|
+
| - [clientEmail](#clientEmail ) | No | string or null | No | - | (Denormalized) Legacy — use \`customerEmail\`. D24 standardized to customer* prefix. |
|
|
251
|
+
| - [clientPhone](#clientPhone ) | No | string or null | No | - | (Denormalized) Legacy — use \`customerPhone\`. D24 standardized to customer* prefix. |
|
|
252
|
+
| - [service](#service ) | No | object or null | No | - | - |
|
|
253
|
+
| - [serviceId](#serviceId ) | No | string or null | No | - | FK → Service document ID. |
|
|
254
|
+
| - [serviceName](#serviceName ) | No | string or null | No | - | (Denormalized) From Service.name at write time. |
|
|
255
|
+
| - [timeSlot](#timeSlot ) | No | string or null | No | - | - |
|
|
256
|
+
| - [date](#date ) | No | string or null | No | - | - |
|
|
257
|
+
| - [startDate](#startDate ) | No | string or null | No | - | - |
|
|
258
|
+
| - [endDate](#endDate ) | No | string or null | No | - | - |
|
|
259
|
+
| - [startTime](#startTime ) | No | string or null | No | - | - |
|
|
260
|
+
| - [endTime](#endTime ) | No | string or null | No | - | - |
|
|
261
|
+
| - [notes](#notes ) | No | array of object or null | No | - | - |
|
|
262
|
+
| - [technicalInfo](#technicalInfo ) | No | string or null | No | - | - |
|
|
263
|
+
| - [paymentStatus](#paymentStatus ) | No | Combination | No | - | Payment lifecycle status (D01 amended). Used by Order, Sale/Purchase, Booking. |
|
|
264
|
+
| - [amountPaid](#amountPaid ) | No | number or null | No | - | - |
|
|
265
|
+
| - [amountRefunded](#amountRefunded ) | No | number or null | No | - | - |
|
|
266
|
+
| - [amountPending](#amountPending ) | No | number or null | No | - | - |
|
|
267
|
+
| - [purchaseId](#purchaseId ) | No | string or null | No | - | FK → Sale.id. Link to associated Sale document. |
|
|
268
|
+
| - [paymentStatusChangeReason](#paymentStatusChangeReason ) | No | string or null | No | - | - |
|
|
269
|
+
| - [paymentStatusChangedBy](#paymentStatusChangedBy ) | No | string or null | No | - | FK → User/staff UID who changed payment status. |
|
|
270
|
+
| - [paymentStatusChangedAt](#paymentStatusChangedAt ) | No | Combination | No | - | Firestore Timestamp serialized representation |
|
|
271
|
+
| - [paymentProofUrl](#paymentProofUrl ) | No | string or null | No | - | URL to uploaded payment proof image/document. |
|
|
272
|
+
| - [paymentProofStatus](#paymentProofStatus ) | No | Combination | No | - | Payment proof review status. Used by Order and Booking payment proof workflows. |
|
|
273
|
+
| - [paymentProofAddedAt](#paymentProofAddedAt ) | No | Combination | No | - | Firestore Timestamp serialized representation |
|
|
274
|
+
| - [paymentProofAddedBy](#paymentProofAddedBy ) | No | string or null | No | - | FK → User/staff UID who uploaded the payment proof. |
|
|
275
|
+
| - [paymentProofReviewedBy](#paymentProofReviewedBy ) | No | string or null | No | - | FK → User/staff UID who reviewed the payment proof. |
|
|
276
|
+
| - [paymentProofReviewedAt](#paymentProofReviewedAt ) | No | Combination | No | - | Firestore Timestamp serialized representation |
|
|
277
|
+
| - [paymentProofRejectionReason](#paymentProofRejectionReason ) | No | string or null | No | - | - |
|
|
278
|
+
| - [cancellationRequestedById](#cancellationRequestedById ) | No | string or null | No | - | FK → User/staff UID who requested cancellation. |
|
|
279
|
+
| - [cancellationRequestReason](#cancellationRequestReason ) | No | string or null | No | - | - |
|
|
280
|
+
| - [cancellationProcessedById](#cancellationProcessedById ) | No | string or null | No | - | FK → User/staff UID who processed the cancellation. |
|
|
281
|
+
| - [cancellationProcessedAt](#cancellationProcessedAt ) | No | Combination | No | - | Firestore Timestamp serialized representation |
|
|
282
|
+
| - [cancelledByRole](#cancelledByRole ) | No | string or null | No | - | - |
|
|
283
|
+
| - [cancellationReason](#cancellationReason ) | No | string or null | No | - | - |
|
|
284
|
+
| + [createdAt](#createdAt ) | No | object | No | In #/definitions/firestore-timestamp | (Read-only) Server-generated creation timestamp. |
|
|
285
|
+
| - [updatedAt](#updatedAt ) | No | Combination | No | - | (Read-only) Server-generated update timestamp. |
|
|
286
|
+
| - [createdBy](#createdBy ) | No | string or null | No | - | (Immutable) FK → User/staff UID who created this booking. |
|
|
287
|
+
| - [updatedBy](#updatedBy ) | No | string or null | No | - | FK → User/staff UID who last updated this booking. |
|
|
288
|
+
| - [createdFromBackend](#createdFromBackend ) | No | boolean or null | No | - | When true, suppresses Firebase notification triggers (D20/IG-8). |
|
|
289
|
+
|
|
290
|
+
## <a name="id"></a>1. Property `id`
|
|
291
|
+
|
|
292
|
+
| | |
|
|
293
|
+
| ------------ | -------- |
|
|
294
|
+
| **Type** | `string` |
|
|
295
|
+
| **Required** | Yes |
|
|
296
|
+
|
|
297
|
+
**Description:** (Read-only) Firestore document ID.
|
|
298
|
+
|
|
299
|
+
:::warning Server-set
|
|
300
|
+
Do not include in write requests. This field is set exclusively by the server (Firestore trigger or Admin SDK). Clients that send it will have the value silently ignored or may receive a validation error.
|
|
301
|
+
:::
|
|
302
|
+
|
|
303
|
+
## <a name="uid"></a>2. Property `uid`
|
|
304
|
+
|
|
305
|
+
| | |
|
|
306
|
+
| ------------ | -------- |
|
|
307
|
+
| **Type** | `string` |
|
|
308
|
+
| **Required** | Yes |
|
|
309
|
+
|
|
310
|
+
**Description:** (Read-only) Entity UID. Often mirrors id.
|
|
311
|
+
|
|
312
|
+
:::warning Server-set
|
|
313
|
+
Do not include in write requests. This field is set exclusively by the server (Firestore trigger or Admin SDK). Clients that send it will have the value silently ignored or may receive a validation error.
|
|
314
|
+
:::
|
|
315
|
+
|
|
316
|
+
## <a name="companyId"></a>3. Property `companyId`
|
|
317
|
+
|
|
318
|
+
| | |
|
|
319
|
+
| ------------ | ---------------- |
|
|
320
|
+
| **Type** | `string or null` |
|
|
321
|
+
| **Required** | No |
|
|
322
|
+
|
|
323
|
+
**Description:** (Immutable) FK → Company document ID. Note: optional in current schema — should be required (see ID consistency audit).
|
|
324
|
+
|
|
325
|
+
:::info Immutable
|
|
326
|
+
Set at creation only. This field cannot be modified after the document is created. Include it in CREATE payloads; omit it (or leave unchanged) in UPDATE payloads.
|
|
327
|
+
:::
|
|
328
|
+
|
|
329
|
+
## <a name="status"></a>4. Property `status`
|
|
330
|
+
|
|
331
|
+
| | |
|
|
332
|
+
| -------------- | ---------------------------- |
|
|
333
|
+
| **Type** | `enum (of string)` |
|
|
334
|
+
| **Required** | Yes |
|
|
335
|
+
| **Defined in** | #/definitions/booking-status |
|
|
336
|
+
|
|
337
|
+
**Description:** Booking lifecycle status. COMPLETED_MIXED = some sessions completed, others cancelled/no-show.
|
|
338
|
+
|
|
339
|
+
Must be one of:
|
|
340
|
+
* "PENDING"
|
|
341
|
+
* "CONFIRMED"
|
|
342
|
+
* "COMPLETED"
|
|
343
|
+
* "CANCELLED"
|
|
344
|
+
* "CANCELLATION_REQUESTED"
|
|
345
|
+
* "COMPLETED_MIXED"
|
|
346
|
+
|
|
347
|
+
## <a name="totalAmount"></a>5. Property `totalAmount`
|
|
348
|
+
|
|
349
|
+
| | |
|
|
350
|
+
| ------------ | -------- |
|
|
351
|
+
| **Type** | `number` |
|
|
352
|
+
| **Required** | Yes |
|
|
353
|
+
|
|
354
|
+
:::note
|
|
355
|
+
Booking uses `totalAmount`; Order uses `amount` for the equivalent field (D05 locked `amount` as canonical for orders). Pending cross-model alignment.
|
|
356
|
+
:::
|
|
357
|
+
|
|
358
|
+
:::info See also
|
|
359
|
+
**Decisions:** `D05`
|
|
360
|
+
:::
|
|
361
|
+
|
|
362
|
+
## <a name="bookingDates"></a>6. Property `bookingDates`
|
|
363
|
+
|
|
364
|
+
| | |
|
|
365
|
+
| ------------ | ----------------- |
|
|
366
|
+
| **Type** | `array of object` |
|
|
367
|
+
| **Required** | Yes |
|
|
368
|
+
|
|
369
|
+
| | Array restrictions |
|
|
370
|
+
| -------------------- | ------------------ |
|
|
371
|
+
| **Min items** | N/A |
|
|
372
|
+
| **Max items** | N/A |
|
|
373
|
+
| **Items unicity** | False |
|
|
374
|
+
| **Additional items** | False |
|
|
375
|
+
| **Tuple validation** | See below |
|
|
376
|
+
|
|
377
|
+
| Each item of this array must be | Description |
|
|
378
|
+
| ----------------------------------------- | --------------------------------------------------------------------------------------------------- |
|
|
379
|
+
| [bookingDates items](#bookingDates_items) | Single date entry within a Booking. Contains time slots, session statuses (D19), and CRDT metadata. |
|
|
380
|
+
|
|
381
|
+
### <a name="bookingDates_items"></a>6.1. bookingDates items
|
|
382
|
+
|
|
383
|
+
| | |
|
|
384
|
+
| ------------------------- | ----------- |
|
|
385
|
+
| **Type** | `object` |
|
|
386
|
+
| **Required** | No |
|
|
387
|
+
| **Additional properties** | Not allowed |
|
|
388
|
+
|
|
389
|
+
**Description:** Single date entry within a Booking. Contains time slots, session statuses (D19), and CRDT metadata.
|
|
390
|
+
|
|
391
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
392
|
+
| ----------------------------------------------------------------- | ------- | ---------------- | ---------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
393
|
+
| + [date](#bookingDates_items_date ) | No | string | No | - | - |
|
|
394
|
+
| + [selectedTimeSlots](#bookingDates_items_selectedTimeSlots ) | No | array of object | No | - | - |
|
|
395
|
+
| + [slotKitTypes](#bookingDates_items_slotKitTypes ) | No | object | No | - | Kit type per slot (IG-11). Firebase parity gap — exists in Firestore but Firebase type lacked it. |
|
|
396
|
+
| + [slotAddOns](#bookingDates_items_slotAddOns ) | No | object | No | - | Add-on IDs per slot. Numeric IDs to be normalized to descriptive names (MIG-07/D10). |
|
|
397
|
+
| + [extraHours](#bookingDates_items_extraHours ) | No | number | No | - | - |
|
|
398
|
+
| - [status](#bookingDates_items_status ) | No | enum (of string) | No | In #/definitions/session-status | Per-date session status (D19). Dashboard is sole writer; Mobile is read-only. |
|
|
399
|
+
| - [statusUpdatedAt](#bookingDates_items_statusUpdatedAt ) | No | object | No | In #/definitions/firestore-timestamp | (Read-only) Timestamp of last status change. |
|
|
400
|
+
| - [statusUpdatedBy](#bookingDates_items_statusUpdatedBy ) | No | string | No | - | FK → User/staff UID who updated this date status. |
|
|
401
|
+
| - [slotStatuses](#bookingDates_items_slotStatuses ) | No | object | No | - | Per-slot session statuses (D19). Keyed by slot ID string. |
|
|
402
|
+
| - [slotStatusUpdatedAt](#bookingDates_items_slotStatusUpdatedAt ) | No | object | No | - | - |
|
|
403
|
+
| - [slotStatusUpdatedBy](#bookingDates_items_slotStatusUpdatedBy ) | No | object | No | - | - |
|
|
404
|
+
| - [_deleted](#bookingDates_items__deleted ) | No | boolean | No | - | Soft-delete flag. Dashboard writes; Mobile filters (IG-6). |
|
|
405
|
+
| - [_deletedAt](#bookingDates_items__deletedAt ) | No | object | No | Same as [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt ) | Firestore Timestamp serialized representation |
|
|
406
|
+
| - [_deletedBy](#bookingDates_items__deletedBy ) | No | string | No | - | FK → User/staff UID who soft-deleted this item. |
|
|
407
|
+
| - [_lastModifiedAt](#bookingDates_items__lastModifiedAt ) | No | object | No | Same as [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt ) | Firestore Timestamp serialized representation |
|
|
408
|
+
| - [_lastModifiedBy](#bookingDates_items__lastModifiedBy ) | No | string | No | - | FK → User/staff UID who last modified this item. |
|
|
409
|
+
| - [_version](#bookingDates_items__version ) | No | number | No | - | Monotonic version counter for conflict detection. |
|
|
410
|
+
|
|
411
|
+
#### <a name="bookingDates_items_date"></a>6.1.1. Property `date`
|
|
412
|
+
|
|
413
|
+
| | |
|
|
414
|
+
| ------------ | -------- |
|
|
415
|
+
| **Type** | `string` |
|
|
416
|
+
| **Required** | Yes |
|
|
417
|
+
|
|
418
|
+
#### <a name="bookingDates_items_selectedTimeSlots"></a>6.1.2. Property `selectedTimeSlots`
|
|
419
|
+
|
|
420
|
+
| | |
|
|
421
|
+
| ------------ | ----------------- |
|
|
422
|
+
| **Type** | `array of object` |
|
|
423
|
+
| **Required** | Yes |
|
|
424
|
+
|
|
425
|
+
| | Array restrictions |
|
|
426
|
+
| -------------------- | ------------------ |
|
|
427
|
+
| **Min items** | N/A |
|
|
428
|
+
| **Max items** | N/A |
|
|
429
|
+
| **Items unicity** | False |
|
|
430
|
+
| **Additional items** | False |
|
|
431
|
+
| **Tuple validation** | See below |
|
|
432
|
+
|
|
433
|
+
| Each item of this array must be | Description |
|
|
434
|
+
| ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
435
|
+
| [selectedTimeSlots items](#bookingDates_items_selectedTimeSlots_items) | Selected time slot within a BookingDate. Carries CRDT metadata for conflict-free editing. |
|
|
436
|
+
|
|
437
|
+
##### <a name="bookingDates_items_selectedTimeSlots_items"></a>6.1.2.1. selectedTimeSlots items
|
|
438
|
+
|
|
439
|
+
| | |
|
|
440
|
+
| ------------------------- | ----------- |
|
|
441
|
+
| **Type** | `object` |
|
|
442
|
+
| **Required** | No |
|
|
443
|
+
| **Additional properties** | Not allowed |
|
|
444
|
+
|
|
445
|
+
**Description:** Selected time slot within a BookingDate. Carries CRDT metadata for conflict-free editing.
|
|
446
|
+
|
|
447
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
448
|
+
| --------------------------------------------------------------------------------------------------------- | ------- | ------- | ---------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
|
|
449
|
+
| + [id](#bookingDates_items_selectedTimeSlots_items_id ) | No | number | No | - | - |
|
|
450
|
+
| + [name](#bookingDates_items_selectedTimeSlots_items_name ) | No | string | No | - | - |
|
|
451
|
+
| + [timeRange](#bookingDates_items_selectedTimeSlots_items_timeRange ) | No | string | No | - | - |
|
|
452
|
+
| + [price](#bookingDates_items_selectedTimeSlots_items_price ) | No | number | No | - | Canonical price field (D11). Replaces legacy standardPrice/fullPrice (MIG-08). |
|
|
453
|
+
| + [notMainPurposePrice](#bookingDates_items_selectedTimeSlots_items_notMainPurposePrice ) | No | number | No | - | Price when slot is not the main purpose (D11). Canonical name; replaces legacy aliases (MIG-08). |
|
|
454
|
+
| + [hours](#bookingDates_items_selectedTimeSlots_items_hours ) | No | string | No | - | - |
|
|
455
|
+
| + [startTime](#bookingDates_items_selectedTimeSlots_items_startTime ) | No | string | No | - | - |
|
|
456
|
+
| + [endTime](#bookingDates_items_selectedTimeSlots_items_endTime ) | No | string | No | - | - |
|
|
457
|
+
| - [isNightSlot](#bookingDates_items_selectedTimeSlots_items_isNightSlot ) | No | boolean | No | - | - |
|
|
458
|
+
| - [isNotMainPurpose](#bookingDates_items_selectedTimeSlots_items_isNotMainPurpose ) | No | boolean | No | - | - |
|
|
459
|
+
| - [isNotMainPurposeReason](#bookingDates_items_selectedTimeSlots_items_isNotMainPurposeReason ) | No | string | No | - | - |
|
|
460
|
+
| - [isNotMainPurposeOtherReason](#bookingDates_items_selectedTimeSlots_items_isNotMainPurposeOtherReason ) | No | string | No | - | - |
|
|
461
|
+
| - [_deleted](#bookingDates_items_selectedTimeSlots_items__deleted ) | No | boolean | No | - | Soft-delete flag. Dashboard writes; Mobile filters (IG-6). |
|
|
462
|
+
| - [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt ) | No | object | No | In #/definitions/firestore-timestamp | Firestore Timestamp serialized representation |
|
|
463
|
+
| - [_deletedBy](#bookingDates_items_selectedTimeSlots_items__deletedBy ) | No | string | No | - | FK → User/staff UID who soft-deleted this item. |
|
|
464
|
+
| - [_lastModifiedAt](#bookingDates_items_selectedTimeSlots_items__lastModifiedAt ) | No | object | No | Same as [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt ) | Firestore Timestamp serialized representation |
|
|
465
|
+
| - [_lastModifiedBy](#bookingDates_items_selectedTimeSlots_items__lastModifiedBy ) | No | string | No | - | FK → User/staff UID who last modified this item. |
|
|
466
|
+
| - [_version](#bookingDates_items_selectedTimeSlots_items__version ) | No | number | No | - | Monotonic version counter for conflict detection. |
|
|
467
|
+
|
|
468
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_id"></a>6.1.2.1.1. Property `id`
|
|
469
|
+
|
|
470
|
+
| | |
|
|
471
|
+
| ------------ | -------- |
|
|
472
|
+
| **Type** | `number` |
|
|
473
|
+
| **Required** | Yes |
|
|
474
|
+
|
|
475
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_name"></a>6.1.2.1.2. Property `name`
|
|
476
|
+
|
|
477
|
+
| | |
|
|
478
|
+
| ------------ | -------- |
|
|
479
|
+
| **Type** | `string` |
|
|
480
|
+
| **Required** | Yes |
|
|
481
|
+
|
|
482
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_timeRange"></a>6.1.2.1.3. Property `timeRange`
|
|
483
|
+
|
|
484
|
+
| | |
|
|
485
|
+
| ------------ | -------- |
|
|
486
|
+
| **Type** | `string` |
|
|
487
|
+
| **Required** | Yes |
|
|
488
|
+
|
|
489
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_price"></a>6.1.2.1.4. Property `price`
|
|
490
|
+
|
|
491
|
+
| | |
|
|
492
|
+
| ------------ | -------- |
|
|
493
|
+
| **Type** | `number` |
|
|
494
|
+
| **Required** | Yes |
|
|
495
|
+
|
|
496
|
+
**Description:** Canonical price field (D11). Replaces legacy standardPrice/fullPrice (MIG-08).
|
|
497
|
+
|
|
498
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_notMainPurposePrice"></a>6.1.2.1.5. Property `notMainPurposePrice`
|
|
499
|
+
|
|
500
|
+
| | |
|
|
501
|
+
| ------------ | -------- |
|
|
502
|
+
| **Type** | `number` |
|
|
503
|
+
| **Required** | Yes |
|
|
504
|
+
|
|
505
|
+
**Description:** Price when slot is not the main purpose (D11). Canonical name; replaces legacy aliases (MIG-08).
|
|
506
|
+
|
|
507
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_hours"></a>6.1.2.1.6. Property `hours`
|
|
508
|
+
|
|
509
|
+
| | |
|
|
510
|
+
| ------------ | -------- |
|
|
511
|
+
| **Type** | `string` |
|
|
512
|
+
| **Required** | Yes |
|
|
513
|
+
|
|
514
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_startTime"></a>6.1.2.1.7. Property `startTime`
|
|
515
|
+
|
|
516
|
+
| | |
|
|
517
|
+
| ------------ | -------- |
|
|
518
|
+
| **Type** | `string` |
|
|
519
|
+
| **Required** | Yes |
|
|
520
|
+
|
|
521
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_endTime"></a>6.1.2.1.8. Property `endTime`
|
|
522
|
+
|
|
523
|
+
| | |
|
|
524
|
+
| ------------ | -------- |
|
|
525
|
+
| **Type** | `string` |
|
|
526
|
+
| **Required** | Yes |
|
|
527
|
+
|
|
528
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_isNightSlot"></a>6.1.2.1.9. Property `isNightSlot`
|
|
529
|
+
|
|
530
|
+
| | |
|
|
531
|
+
| ------------ | --------- |
|
|
532
|
+
| **Type** | `boolean` |
|
|
533
|
+
| **Required** | No |
|
|
534
|
+
|
|
535
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_isNotMainPurpose"></a>6.1.2.1.10. Property `isNotMainPurpose`
|
|
536
|
+
|
|
537
|
+
| | |
|
|
538
|
+
| ------------ | --------- |
|
|
539
|
+
| **Type** | `boolean` |
|
|
540
|
+
| **Required** | No |
|
|
541
|
+
|
|
542
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_isNotMainPurposeReason"></a>6.1.2.1.11. Property `isNotMainPurposeReason`
|
|
543
|
+
|
|
544
|
+
| | |
|
|
545
|
+
| ------------ | -------- |
|
|
546
|
+
| **Type** | `string` |
|
|
547
|
+
| **Required** | No |
|
|
548
|
+
|
|
549
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items_isNotMainPurposeOtherReason"></a>6.1.2.1.12. Property `isNotMainPurposeOtherReason`
|
|
550
|
+
|
|
551
|
+
| | |
|
|
552
|
+
| ------------ | -------- |
|
|
553
|
+
| **Type** | `string` |
|
|
554
|
+
| **Required** | No |
|
|
555
|
+
|
|
556
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items__deleted"></a>6.1.2.1.13. Property `_deleted`
|
|
557
|
+
|
|
558
|
+
| | |
|
|
559
|
+
| ------------ | --------- |
|
|
560
|
+
| **Type** | `boolean` |
|
|
561
|
+
| **Required** | No |
|
|
562
|
+
|
|
563
|
+
**Description:** Soft-delete flag. Dashboard writes; Mobile filters (IG-6).
|
|
564
|
+
|
|
565
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items__deletedAt"></a>6.1.2.1.14. Property `_deletedAt`
|
|
566
|
+
|
|
567
|
+
| | |
|
|
568
|
+
| ------------------------- | --------------------------------- |
|
|
569
|
+
| **Type** | `object` |
|
|
570
|
+
| **Required** | No |
|
|
571
|
+
| **Additional properties** | Not allowed |
|
|
572
|
+
| **Defined in** | #/definitions/firestore-timestamp |
|
|
573
|
+
|
|
574
|
+
**Description:** Firestore Timestamp serialized representation
|
|
575
|
+
|
|
576
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
577
|
+
| -------------------------------------------------------------------------------------- | ------- | ------- | ---------- | ---------- | ----------------- |
|
|
578
|
+
| + [_seconds](#bookingDates_items_selectedTimeSlots_items__deletedAt__seconds ) | No | integer | No | - | - |
|
|
579
|
+
| + [_nanoseconds](#bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds ) | No | integer | No | - | - |
|
|
580
|
+
|
|
581
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items__deletedAt__seconds"></a>6.1.2.1.14.1. Property `_seconds`
|
|
582
|
+
|
|
583
|
+
| | |
|
|
584
|
+
| ------------ | --------- |
|
|
585
|
+
| **Type** | `integer` |
|
|
586
|
+
| **Required** | Yes |
|
|
587
|
+
|
|
588
|
+
| Restrictions | |
|
|
589
|
+
| ------------ | ---------------------- |
|
|
590
|
+
| **Minimum** | ≥ -9007199254740991 |
|
|
591
|
+
| **Maximum** | ≤ 9007199254740991 |
|
|
592
|
+
|
|
593
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds"></a>6.1.2.1.14.2. Property `_nanoseconds`
|
|
594
|
+
|
|
595
|
+
| | |
|
|
596
|
+
| ------------ | --------- |
|
|
597
|
+
| **Type** | `integer` |
|
|
598
|
+
| **Required** | Yes |
|
|
599
|
+
|
|
600
|
+
| Restrictions | |
|
|
601
|
+
| ------------ | ---------------------- |
|
|
602
|
+
| **Minimum** | ≥ -9007199254740991 |
|
|
603
|
+
| **Maximum** | ≤ 9007199254740991 |
|
|
604
|
+
|
|
605
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items__deletedBy"></a>6.1.2.1.15. Property `_deletedBy`
|
|
606
|
+
|
|
607
|
+
| | |
|
|
608
|
+
| ------------ | -------- |
|
|
609
|
+
| **Type** | `string` |
|
|
610
|
+
| **Required** | No |
|
|
611
|
+
|
|
612
|
+
**Description:** FK → User/staff UID who soft-deleted this item.
|
|
613
|
+
|
|
614
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items__lastModifiedAt"></a>6.1.2.1.16. Property `_lastModifiedAt`
|
|
615
|
+
|
|
616
|
+
| | |
|
|
617
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
618
|
+
| **Type** | `object` |
|
|
619
|
+
| **Required** | No |
|
|
620
|
+
| **Additional properties** | Not allowed |
|
|
621
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
622
|
+
|
|
623
|
+
**Description:** Firestore Timestamp serialized representation
|
|
624
|
+
|
|
625
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items__lastModifiedBy"></a>6.1.2.1.17. Property `_lastModifiedBy`
|
|
626
|
+
|
|
627
|
+
| | |
|
|
628
|
+
| ------------ | -------- |
|
|
629
|
+
| **Type** | `string` |
|
|
630
|
+
| **Required** | No |
|
|
631
|
+
|
|
632
|
+
**Description:** FK → User/staff UID who last modified this item.
|
|
633
|
+
|
|
634
|
+
###### <a name="bookingDates_items_selectedTimeSlots_items__version"></a>6.1.2.1.18. Property `_version`
|
|
635
|
+
|
|
636
|
+
| | |
|
|
637
|
+
| ------------ | -------- |
|
|
638
|
+
| **Type** | `number` |
|
|
639
|
+
| **Required** | No |
|
|
640
|
+
|
|
641
|
+
**Description:** Monotonic version counter for conflict detection.
|
|
642
|
+
|
|
643
|
+
#### <a name="bookingDates_items_slotKitTypes"></a>6.1.3. Property `slotKitTypes`
|
|
644
|
+
|
|
645
|
+
| | |
|
|
646
|
+
| ------------------------- | ------------------------------------------------------------------------------------------------------------ |
|
|
647
|
+
| **Type** | `object` |
|
|
648
|
+
| **Required** | Yes |
|
|
649
|
+
| **Additional properties** | [Each additional property must conform to the schema](#bookingDates_items_slotKitTypes_additionalProperties) |
|
|
650
|
+
|
|
651
|
+
**Description:** Kit type per slot (IG-11). Firebase parity gap — exists in Firestore but Firebase type lacked it.
|
|
652
|
+
|
|
653
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
654
|
+
| ------------------------------------------------------------ | ------- | ------ | ---------- | ---------- | ----------------- |
|
|
655
|
+
| - [](#bookingDates_items_slotKitTypes_additionalProperties ) | No | string | No | - | - |
|
|
656
|
+
|
|
657
|
+
##### <a name="bookingDates_items_slotKitTypes_additionalProperties"></a>6.1.3.1. Property `additionalProperties`
|
|
658
|
+
|
|
659
|
+
| | |
|
|
660
|
+
| ------------ | -------- |
|
|
661
|
+
| **Type** | `string` |
|
|
662
|
+
| **Required** | No |
|
|
663
|
+
|
|
664
|
+
#### <a name="bookingDates_items_slotAddOns"></a>6.1.4. Property `slotAddOns`
|
|
665
|
+
|
|
666
|
+
| | |
|
|
667
|
+
| ------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
668
|
+
| **Type** | `object` |
|
|
669
|
+
| **Required** | Yes |
|
|
670
|
+
| **Additional properties** | [Each additional property must conform to the schema](#bookingDates_items_slotAddOns_additionalProperties) |
|
|
671
|
+
|
|
672
|
+
**Description:** Add-on IDs per slot. Numeric IDs to be normalized to descriptive names (MIG-07/D10).
|
|
673
|
+
|
|
674
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
675
|
+
| ---------------------------------------------------------- | ------- | --------------- | ---------- | ---------- | ----------------- |
|
|
676
|
+
| - [](#bookingDates_items_slotAddOns_additionalProperties ) | No | array of string | No | - | - |
|
|
677
|
+
|
|
678
|
+
##### <a name="bookingDates_items_slotAddOns_additionalProperties"></a>6.1.4.1. Property `additionalProperties`
|
|
679
|
+
|
|
680
|
+
| | |
|
|
681
|
+
| ------------ | ----------------- |
|
|
682
|
+
| **Type** | `array of string` |
|
|
683
|
+
| **Required** | No |
|
|
684
|
+
|
|
685
|
+
| | Array restrictions |
|
|
686
|
+
| -------------------- | ------------------ |
|
|
687
|
+
| **Min items** | N/A |
|
|
688
|
+
| **Max items** | N/A |
|
|
689
|
+
| **Items unicity** | False |
|
|
690
|
+
| **Additional items** | False |
|
|
691
|
+
| **Tuple validation** | See below |
|
|
692
|
+
|
|
693
|
+
| Each item of this array must be | Description |
|
|
694
|
+
| --------------------------------------------------------------------------------------- | ----------- |
|
|
695
|
+
| [additionalProperties items](#bookingDates_items_slotAddOns_additionalProperties_items) | - |
|
|
696
|
+
|
|
697
|
+
###### <a name="bookingDates_items_slotAddOns_additionalProperties_items"></a>6.1.4.1.1. additionalProperties items
|
|
698
|
+
|
|
699
|
+
| | |
|
|
700
|
+
| ------------ | -------- |
|
|
701
|
+
| **Type** | `string` |
|
|
702
|
+
| **Required** | No |
|
|
703
|
+
|
|
704
|
+
#### <a name="bookingDates_items_extraHours"></a>6.1.5. Property `extraHours`
|
|
705
|
+
|
|
706
|
+
| | |
|
|
707
|
+
| ------------ | -------- |
|
|
708
|
+
| **Type** | `number` |
|
|
709
|
+
| **Required** | Yes |
|
|
710
|
+
|
|
711
|
+
#### <a name="bookingDates_items_status"></a>6.1.6. Property `status`
|
|
712
|
+
|
|
713
|
+
| | |
|
|
714
|
+
| -------------- | ---------------------------- |
|
|
715
|
+
| **Type** | `enum (of string)` |
|
|
716
|
+
| **Required** | No |
|
|
717
|
+
| **Defined in** | #/definitions/session-status |
|
|
718
|
+
|
|
719
|
+
**Description:** Per-date session status (D19). Dashboard is sole writer; Mobile is read-only.
|
|
720
|
+
|
|
721
|
+
Must be one of:
|
|
722
|
+
* "PENDING"
|
|
723
|
+
* "CONFIRMED"
|
|
724
|
+
* "CANCELLATION_REQUESTED"
|
|
725
|
+
* "COMPLETED"
|
|
726
|
+
* "NO_SHOW"
|
|
727
|
+
* "CANCELLED"
|
|
728
|
+
|
|
729
|
+
#### <a name="bookingDates_items_statusUpdatedAt"></a>6.1.7. Property `statusUpdatedAt`
|
|
730
|
+
|
|
731
|
+
| | |
|
|
732
|
+
| ------------------------- | --------------------------------- |
|
|
733
|
+
| **Type** | `object` |
|
|
734
|
+
| **Required** | No |
|
|
735
|
+
| **Additional properties** | Not allowed |
|
|
736
|
+
| **Defined in** | #/definitions/firestore-timestamp |
|
|
737
|
+
|
|
738
|
+
**Description:** (Read-only) Timestamp of last status change.
|
|
739
|
+
|
|
740
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
741
|
+
| -------------------------------------------------------------------------------------- | ------- | ------- | ---------- | ---------- | ----------------- |
|
|
742
|
+
| + [_seconds](#bookingDates_items_selectedTimeSlots_items__deletedAt__seconds ) | No | integer | No | - | - |
|
|
743
|
+
| + [_nanoseconds](#bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds ) | No | integer | No | - | - |
|
|
744
|
+
|
|
745
|
+
##### <a name="bookingDates_items_selectedTimeSlots_items__deletedAt__seconds"></a>6.1.7.1. Property `_seconds`
|
|
746
|
+
|
|
747
|
+
| | |
|
|
748
|
+
| ------------ | --------- |
|
|
749
|
+
| **Type** | `integer` |
|
|
750
|
+
| **Required** | Yes |
|
|
751
|
+
|
|
752
|
+
| Restrictions | |
|
|
753
|
+
| ------------ | ---------------------- |
|
|
754
|
+
| **Minimum** | ≥ -9007199254740991 |
|
|
755
|
+
| **Maximum** | ≤ 9007199254740991 |
|
|
756
|
+
|
|
757
|
+
##### <a name="bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds"></a>6.1.7.2. Property `_nanoseconds`
|
|
758
|
+
|
|
759
|
+
| | |
|
|
760
|
+
| ------------ | --------- |
|
|
761
|
+
| **Type** | `integer` |
|
|
762
|
+
| **Required** | Yes |
|
|
763
|
+
|
|
764
|
+
| Restrictions | |
|
|
765
|
+
| ------------ | ---------------------- |
|
|
766
|
+
| **Minimum** | ≥ -9007199254740991 |
|
|
767
|
+
| **Maximum** | ≤ 9007199254740991 |
|
|
768
|
+
|
|
769
|
+
#### <a name="bookingDates_items_statusUpdatedBy"></a>6.1.8. Property `statusUpdatedBy`
|
|
770
|
+
|
|
771
|
+
| | |
|
|
772
|
+
| ------------ | -------- |
|
|
773
|
+
| **Type** | `string` |
|
|
774
|
+
| **Required** | No |
|
|
775
|
+
|
|
776
|
+
**Description:** FK → User/staff UID who updated this date status.
|
|
777
|
+
|
|
778
|
+
#### <a name="bookingDates_items_slotStatuses"></a>6.1.9. Property `slotStatuses`
|
|
779
|
+
|
|
780
|
+
| | |
|
|
781
|
+
| ------------------------- | ------------------------------------------------------------------------------------------------------------ |
|
|
782
|
+
| **Type** | `object` |
|
|
783
|
+
| **Required** | No |
|
|
784
|
+
| **Additional properties** | [Each additional property must conform to the schema](#bookingDates_items_slotStatuses_additionalProperties) |
|
|
785
|
+
|
|
786
|
+
**Description:** Per-slot session statuses (D19). Keyed by slot ID string.
|
|
787
|
+
|
|
788
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
789
|
+
| ------------------------------------------------------------ | ------- | ---------------- | ---------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
790
|
+
| - [](#bookingDates_items_slotStatuses_additionalProperties ) | No | enum (of string) | No | Same as [status](#bookingDates_items_status ) | Per-date/per-slot booking session status (D19). Dashboard is sole writer; Mobile is read-only. |
|
|
791
|
+
|
|
792
|
+
##### <a name="bookingDates_items_slotStatuses_additionalProperties"></a>6.1.9.1. Property `session-status`
|
|
793
|
+
|
|
794
|
+
| | |
|
|
795
|
+
| ---------------------- | ------------------------------------ |
|
|
796
|
+
| **Type** | `enum (of string)` |
|
|
797
|
+
| **Required** | No |
|
|
798
|
+
| **Same definition as** | [status](#bookingDates_items_status) |
|
|
799
|
+
|
|
800
|
+
**Description:** Per-date/per-slot booking session status (D19). Dashboard is sole writer; Mobile is read-only.
|
|
801
|
+
|
|
802
|
+
#### <a name="bookingDates_items_slotStatusUpdatedAt"></a>6.1.10. Property `slotStatusUpdatedAt`
|
|
803
|
+
|
|
804
|
+
| | |
|
|
805
|
+
| ------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
806
|
+
| **Type** | `object` |
|
|
807
|
+
| **Required** | No |
|
|
808
|
+
| **Additional properties** | [Each additional property must conform to the schema](#bookingDates_items_slotStatusUpdatedAt_additionalProperties) |
|
|
809
|
+
|
|
810
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
811
|
+
| ------------------------------------------------------------------- | ------- | ------ | ---------- | ----------------------------------------------------------------------------- | --------------------------------------------- |
|
|
812
|
+
| - [](#bookingDates_items_slotStatusUpdatedAt_additionalProperties ) | No | object | No | Same as [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt ) | Firestore Timestamp serialized representation |
|
|
813
|
+
|
|
814
|
+
##### <a name="bookingDates_items_slotStatusUpdatedAt_additionalProperties"></a>6.1.10.1. Property `firestore-timestamp`
|
|
815
|
+
|
|
816
|
+
| | |
|
|
817
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
818
|
+
| **Type** | `object` |
|
|
819
|
+
| **Required** | No |
|
|
820
|
+
| **Additional properties** | Not allowed |
|
|
821
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
822
|
+
|
|
823
|
+
**Description:** Firestore Timestamp serialized representation
|
|
824
|
+
|
|
825
|
+
#### <a name="bookingDates_items_slotStatusUpdatedBy"></a>6.1.11. Property `slotStatusUpdatedBy`
|
|
826
|
+
|
|
827
|
+
| | |
|
|
828
|
+
| ------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
829
|
+
| **Type** | `object` |
|
|
830
|
+
| **Required** | No |
|
|
831
|
+
| **Additional properties** | [Each additional property must conform to the schema](#bookingDates_items_slotStatusUpdatedBy_additionalProperties) |
|
|
832
|
+
|
|
833
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
834
|
+
| ------------------------------------------------------------------- | ------- | ------ | ---------- | ---------- | ----------------- |
|
|
835
|
+
| - [](#bookingDates_items_slotStatusUpdatedBy_additionalProperties ) | No | string | No | - | - |
|
|
836
|
+
|
|
837
|
+
##### <a name="bookingDates_items_slotStatusUpdatedBy_additionalProperties"></a>6.1.11.1. Property `additionalProperties`
|
|
838
|
+
|
|
839
|
+
| | |
|
|
840
|
+
| ------------ | -------- |
|
|
841
|
+
| **Type** | `string` |
|
|
842
|
+
| **Required** | No |
|
|
843
|
+
|
|
844
|
+
#### <a name="bookingDates_items__deleted"></a>6.1.12. Property `_deleted`
|
|
845
|
+
|
|
846
|
+
| | |
|
|
847
|
+
| ------------ | --------- |
|
|
848
|
+
| **Type** | `boolean` |
|
|
849
|
+
| **Required** | No |
|
|
850
|
+
|
|
851
|
+
**Description:** Soft-delete flag. Dashboard writes; Mobile filters (IG-6).
|
|
852
|
+
|
|
853
|
+
#### <a name="bookingDates_items__deletedAt"></a>6.1.13. Property `_deletedAt`
|
|
854
|
+
|
|
855
|
+
| | |
|
|
856
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
857
|
+
| **Type** | `object` |
|
|
858
|
+
| **Required** | No |
|
|
859
|
+
| **Additional properties** | Not allowed |
|
|
860
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
861
|
+
|
|
862
|
+
**Description:** Firestore Timestamp serialized representation
|
|
863
|
+
|
|
864
|
+
#### <a name="bookingDates_items__deletedBy"></a>6.1.14. Property `_deletedBy`
|
|
865
|
+
|
|
866
|
+
| | |
|
|
867
|
+
| ------------ | -------- |
|
|
868
|
+
| **Type** | `string` |
|
|
869
|
+
| **Required** | No |
|
|
870
|
+
|
|
871
|
+
**Description:** FK → User/staff UID who soft-deleted this item.
|
|
872
|
+
|
|
873
|
+
#### <a name="bookingDates_items__lastModifiedAt"></a>6.1.15. Property `_lastModifiedAt`
|
|
874
|
+
|
|
875
|
+
| | |
|
|
876
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
877
|
+
| **Type** | `object` |
|
|
878
|
+
| **Required** | No |
|
|
879
|
+
| **Additional properties** | Not allowed |
|
|
880
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
881
|
+
|
|
882
|
+
**Description:** Firestore Timestamp serialized representation
|
|
883
|
+
|
|
884
|
+
#### <a name="bookingDates_items__lastModifiedBy"></a>6.1.16. Property `_lastModifiedBy`
|
|
885
|
+
|
|
886
|
+
| | |
|
|
887
|
+
| ------------ | -------- |
|
|
888
|
+
| **Type** | `string` |
|
|
889
|
+
| **Required** | No |
|
|
890
|
+
|
|
891
|
+
**Description:** FK → User/staff UID who last modified this item.
|
|
892
|
+
|
|
893
|
+
#### <a name="bookingDates_items__version"></a>6.1.17. Property `_version`
|
|
894
|
+
|
|
895
|
+
| | |
|
|
896
|
+
| ------------ | -------- |
|
|
897
|
+
| **Type** | `number` |
|
|
898
|
+
| **Required** | No |
|
|
899
|
+
|
|
900
|
+
**Description:** Monotonic version counter for conflict detection.
|
|
901
|
+
|
|
902
|
+
## <a name="customerId"></a>7. Property `customerId`
|
|
903
|
+
|
|
904
|
+
| | |
|
|
905
|
+
| ------------ | ---------------- |
|
|
906
|
+
| **Type** | `string or null` |
|
|
907
|
+
| **Required** | No |
|
|
908
|
+
|
|
909
|
+
**Description:** FK → Customer.id (Firestore doc ID). Links booking to customer record.
|
|
910
|
+
|
|
911
|
+
## <a name="client"></a>8. Property `client`
|
|
912
|
+
|
|
913
|
+
| | |
|
|
914
|
+
| ------------ | ---------------- |
|
|
915
|
+
| **Type** | `object or null` |
|
|
916
|
+
| **Required** | No |
|
|
917
|
+
|
|
918
|
+
**Description:** (Denormalized) Embedded client snapshot from Customer at write time.
|
|
919
|
+
|
|
920
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
921
|
+
| --------------------------------- | ------- | ------ | ---------- | ---------- | ----------------- |
|
|
922
|
+
| - [firstName](#client_firstName ) | No | string | No | - | - |
|
|
923
|
+
| - [lastName](#client_lastName ) | No | string | No | - | - |
|
|
924
|
+
| - [email](#client_email ) | No | string | No | - | - |
|
|
925
|
+
| - [phone](#client_phone ) | No | string | No | - | - |
|
|
926
|
+
|
|
927
|
+
### <a name="client_firstName"></a>8.1. Property `firstName`
|
|
928
|
+
|
|
929
|
+
| | |
|
|
930
|
+
| ------------ | -------- |
|
|
931
|
+
| **Type** | `string` |
|
|
932
|
+
| **Required** | No |
|
|
933
|
+
|
|
934
|
+
### <a name="client_lastName"></a>8.2. Property `lastName`
|
|
935
|
+
|
|
936
|
+
| | |
|
|
937
|
+
| ------------ | -------- |
|
|
938
|
+
| **Type** | `string` |
|
|
939
|
+
| **Required** | No |
|
|
940
|
+
|
|
941
|
+
### <a name="client_email"></a>8.3. Property `email`
|
|
942
|
+
|
|
943
|
+
| | |
|
|
944
|
+
| ------------ | -------- |
|
|
945
|
+
| **Type** | `string` |
|
|
946
|
+
| **Required** | No |
|
|
947
|
+
|
|
948
|
+
### <a name="client_phone"></a>8.4. Property `phone`
|
|
949
|
+
|
|
950
|
+
| | |
|
|
951
|
+
| ------------ | -------- |
|
|
952
|
+
| **Type** | `string` |
|
|
953
|
+
| **Required** | No |
|
|
954
|
+
|
|
955
|
+
## <a name="customerName"></a>9. Property `customerName`
|
|
956
|
+
|
|
957
|
+
| | |
|
|
958
|
+
| ------------ | ---------------- |
|
|
959
|
+
| **Type** | `string or null` |
|
|
960
|
+
| **Required** | No |
|
|
961
|
+
|
|
962
|
+
**Description:** (Denormalized) From Customer.name at write time. Canonical field per D24.
|
|
963
|
+
|
|
964
|
+
## <a name="customerEmail"></a>10. Property `customerEmail`
|
|
965
|
+
|
|
966
|
+
| | |
|
|
967
|
+
| ------------ | ---------------- |
|
|
968
|
+
| **Type** | `string or null` |
|
|
969
|
+
| **Required** | No |
|
|
970
|
+
|
|
971
|
+
**Description:** (Denormalized) From Customer.email at write time. Canonical field per D24.
|
|
972
|
+
|
|
973
|
+
## <a name="customerPhone"></a>11. Property `customerPhone`
|
|
974
|
+
|
|
975
|
+
| | |
|
|
976
|
+
| ------------ | ---------------- |
|
|
977
|
+
| **Type** | `string or null` |
|
|
978
|
+
| **Required** | No |
|
|
979
|
+
|
|
980
|
+
**Description:** (Denormalized) From Customer.phone at write time. Canonical field per D24.
|
|
981
|
+
|
|
982
|
+
## <a name="clientName"></a>12. Property `clientName`
|
|
983
|
+
|
|
984
|
+
| | |
|
|
985
|
+
| ------------ | ---------------- |
|
|
986
|
+
| **Type** | `string or null` |
|
|
987
|
+
| **Required** | No |
|
|
988
|
+
|
|
989
|
+
**Description:** (Denormalized) Legacy — use `customerName`. D24 standardized to customer* prefix.
|
|
990
|
+
|
|
991
|
+
:::danger Deprecated
|
|
992
|
+
This field is deprecated. Do not write it in new code.
|
|
993
|
+
:::
|
|
994
|
+
|
|
995
|
+
:::warning Deprecated
|
|
996
|
+
Use `customerName` instead.
|
|
997
|
+
:::
|
|
998
|
+
|
|
999
|
+
## <a name="clientReference"></a>13. Property `clientReference`
|
|
1000
|
+
|
|
1001
|
+
| | |
|
|
1002
|
+
| ------------ | -------- |
|
|
1003
|
+
| **Type** | `string` |
|
|
1004
|
+
| **Required** | Yes |
|
|
1005
|
+
|
|
1006
|
+
## <a name="clientEmail"></a>14. Property `clientEmail`
|
|
1007
|
+
|
|
1008
|
+
| | |
|
|
1009
|
+
| ------------ | ---------------- |
|
|
1010
|
+
| **Type** | `string or null` |
|
|
1011
|
+
| **Required** | No |
|
|
1012
|
+
|
|
1013
|
+
**Description:** (Denormalized) Legacy — use `customerEmail`. D24 standardized to customer* prefix.
|
|
1014
|
+
|
|
1015
|
+
:::danger Deprecated
|
|
1016
|
+
This field is deprecated. Do not write it in new code.
|
|
1017
|
+
:::
|
|
1018
|
+
|
|
1019
|
+
:::warning Deprecated
|
|
1020
|
+
Use `customerEmail` instead.
|
|
1021
|
+
:::
|
|
1022
|
+
|
|
1023
|
+
## <a name="clientPhone"></a>15. Property `clientPhone`
|
|
1024
|
+
|
|
1025
|
+
| | |
|
|
1026
|
+
| ------------ | ---------------- |
|
|
1027
|
+
| **Type** | `string or null` |
|
|
1028
|
+
| **Required** | No |
|
|
1029
|
+
|
|
1030
|
+
**Description:** (Denormalized) Legacy — use `customerPhone`. D24 standardized to customer* prefix.
|
|
1031
|
+
|
|
1032
|
+
:::danger Deprecated
|
|
1033
|
+
This field is deprecated. Do not write it in new code.
|
|
1034
|
+
:::
|
|
1035
|
+
|
|
1036
|
+
:::warning Deprecated
|
|
1037
|
+
Use `customerPhone` instead.
|
|
1038
|
+
:::
|
|
1039
|
+
|
|
1040
|
+
## <a name="service"></a>16. Property `service`
|
|
1041
|
+
|
|
1042
|
+
| | |
|
|
1043
|
+
| ------------ | ---------------- |
|
|
1044
|
+
| **Type** | `object or null` |
|
|
1045
|
+
| **Required** | No |
|
|
1046
|
+
|
|
1047
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
1048
|
+
| ------------------------ | ------- | ------ | ---------- | ---------- | ----------------- |
|
|
1049
|
+
| - [name](#service_name ) | No | string | No | - | - |
|
|
1050
|
+
|
|
1051
|
+
### <a name="service_name"></a>16.1. Property `name`
|
|
1052
|
+
|
|
1053
|
+
| | |
|
|
1054
|
+
| ------------ | -------- |
|
|
1055
|
+
| **Type** | `string` |
|
|
1056
|
+
| **Required** | No |
|
|
1057
|
+
|
|
1058
|
+
## <a name="serviceId"></a>17. Property `serviceId`
|
|
1059
|
+
|
|
1060
|
+
| | |
|
|
1061
|
+
| ------------ | ---------------- |
|
|
1062
|
+
| **Type** | `string or null` |
|
|
1063
|
+
| **Required** | No |
|
|
1064
|
+
|
|
1065
|
+
**Description:** FK → Service document ID.
|
|
1066
|
+
|
|
1067
|
+
## <a name="serviceName"></a>18. Property `serviceName`
|
|
1068
|
+
|
|
1069
|
+
| | |
|
|
1070
|
+
| ------------ | ---------------- |
|
|
1071
|
+
| **Type** | `string or null` |
|
|
1072
|
+
| **Required** | No |
|
|
1073
|
+
|
|
1074
|
+
**Description:** (Denormalized) From Service.name at write time.
|
|
1075
|
+
|
|
1076
|
+
## <a name="timeSlot"></a>19. Property `timeSlot`
|
|
1077
|
+
|
|
1078
|
+
| | |
|
|
1079
|
+
| ------------ | ---------------- |
|
|
1080
|
+
| **Type** | `string or null` |
|
|
1081
|
+
| **Required** | No |
|
|
1082
|
+
|
|
1083
|
+
## <a name="date"></a>20. Property `date`
|
|
1084
|
+
|
|
1085
|
+
| | |
|
|
1086
|
+
| ------------ | ---------------- |
|
|
1087
|
+
| **Type** | `string or null` |
|
|
1088
|
+
| **Required** | No |
|
|
1089
|
+
|
|
1090
|
+
## <a name="startDate"></a>21. Property `startDate`
|
|
1091
|
+
|
|
1092
|
+
| | |
|
|
1093
|
+
| ------------ | ---------------- |
|
|
1094
|
+
| **Type** | `string or null` |
|
|
1095
|
+
| **Required** | No |
|
|
1096
|
+
|
|
1097
|
+
## <a name="endDate"></a>22. Property `endDate`
|
|
1098
|
+
|
|
1099
|
+
| | |
|
|
1100
|
+
| ------------ | ---------------- |
|
|
1101
|
+
| **Type** | `string or null` |
|
|
1102
|
+
| **Required** | No |
|
|
1103
|
+
|
|
1104
|
+
## <a name="startTime"></a>23. Property `startTime`
|
|
1105
|
+
|
|
1106
|
+
| | |
|
|
1107
|
+
| ------------ | ---------------- |
|
|
1108
|
+
| **Type** | `string or null` |
|
|
1109
|
+
| **Required** | No |
|
|
1110
|
+
|
|
1111
|
+
## <a name="endTime"></a>24. Property `endTime`
|
|
1112
|
+
|
|
1113
|
+
| | |
|
|
1114
|
+
| ------------ | ---------------- |
|
|
1115
|
+
| **Type** | `string or null` |
|
|
1116
|
+
| **Required** | No |
|
|
1117
|
+
|
|
1118
|
+
## <a name="notes"></a>25. Property `notes`
|
|
1119
|
+
|
|
1120
|
+
| | |
|
|
1121
|
+
| ------------ | ------------------------- |
|
|
1122
|
+
| **Type** | `array of object or null` |
|
|
1123
|
+
| **Required** | No |
|
|
1124
|
+
|
|
1125
|
+
| | Array restrictions |
|
|
1126
|
+
| -------------------- | ------------------ |
|
|
1127
|
+
| **Min items** | N/A |
|
|
1128
|
+
| **Max items** | N/A |
|
|
1129
|
+
| **Items unicity** | False |
|
|
1130
|
+
| **Additional items** | False |
|
|
1131
|
+
| **Tuple validation** | See below |
|
|
1132
|
+
|
|
1133
|
+
| Each item of this array must be | Description |
|
|
1134
|
+
| ------------------------------- | -------------------------------------------------------------- |
|
|
1135
|
+
| [notes items](#notes_items) | Timestamped note attached to a Booking. Carries CRDT metadata. |
|
|
1136
|
+
|
|
1137
|
+
### <a name="notes_items"></a>25.1. notes items
|
|
1138
|
+
|
|
1139
|
+
| | |
|
|
1140
|
+
| ------------------------- | ----------- |
|
|
1141
|
+
| **Type** | `object` |
|
|
1142
|
+
| **Required** | No |
|
|
1143
|
+
| **Additional properties** | Not allowed |
|
|
1144
|
+
|
|
1145
|
+
**Description:** Timestamped note attached to a Booking. Carries CRDT metadata.
|
|
1146
|
+
|
|
1147
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
1148
|
+
| -------------------------------------------------- | ------- | ------- | ---------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------- |
|
|
1149
|
+
| + [id](#notes_items_id ) | No | string | No | - | (Read-only) Note ID. |
|
|
1150
|
+
| + [text](#notes_items_text ) | No | string | No | - | - |
|
|
1151
|
+
| + [createdAt](#notes_items_createdAt ) | No | object | No | In #/definitions/firestore-timestamp | (Read-only) Firestore Timestamp serialized representation. |
|
|
1152
|
+
| - [createdBy](#notes_items_createdBy ) | No | string | No | - | (Immutable) FK → User/staff UID who created this note. |
|
|
1153
|
+
| - [createdByName](#notes_items_createdByName ) | No | string | No | - | (Denormalized) From User display name at write time. |
|
|
1154
|
+
| - [_deleted](#notes_items__deleted ) | No | boolean | No | - | Soft-delete flag. Dashboard writes; Mobile filters (IG-6). |
|
|
1155
|
+
| - [_deletedAt](#notes_items__deletedAt ) | No | object | No | Same as [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt ) | Firestore Timestamp serialized representation |
|
|
1156
|
+
| - [_deletedBy](#notes_items__deletedBy ) | No | string | No | - | FK → User/staff UID who soft-deleted this item. |
|
|
1157
|
+
| - [_lastModifiedAt](#notes_items__lastModifiedAt ) | No | object | No | Same as [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt ) | Firestore Timestamp serialized representation |
|
|
1158
|
+
| - [_lastModifiedBy](#notes_items__lastModifiedBy ) | No | string | No | - | FK → User/staff UID who last modified this item. |
|
|
1159
|
+
| - [_version](#notes_items__version ) | No | number | No | - | Monotonic version counter for conflict detection. |
|
|
1160
|
+
|
|
1161
|
+
#### <a name="notes_items_id"></a>25.1.1. Property `id`
|
|
1162
|
+
|
|
1163
|
+
| | |
|
|
1164
|
+
| ------------ | -------- |
|
|
1165
|
+
| **Type** | `string` |
|
|
1166
|
+
| **Required** | Yes |
|
|
1167
|
+
|
|
1168
|
+
**Description:** (Read-only) Note ID.
|
|
1169
|
+
|
|
1170
|
+
#### <a name="notes_items_text"></a>25.1.2. Property `text`
|
|
1171
|
+
|
|
1172
|
+
| | |
|
|
1173
|
+
| ------------ | -------- |
|
|
1174
|
+
| **Type** | `string` |
|
|
1175
|
+
| **Required** | Yes |
|
|
1176
|
+
|
|
1177
|
+
#### <a name="notes_items_createdAt"></a>25.1.3. Property `createdAt`
|
|
1178
|
+
|
|
1179
|
+
| | |
|
|
1180
|
+
| ------------------------- | --------------------------------- |
|
|
1181
|
+
| **Type** | `object` |
|
|
1182
|
+
| **Required** | Yes |
|
|
1183
|
+
| **Additional properties** | Not allowed |
|
|
1184
|
+
| **Defined in** | #/definitions/firestore-timestamp |
|
|
1185
|
+
|
|
1186
|
+
**Description:** (Read-only) Firestore Timestamp serialized representation.
|
|
1187
|
+
|
|
1188
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
1189
|
+
| -------------------------------------------------------------------------------------- | ------- | ------- | ---------- | ---------- | ----------------- |
|
|
1190
|
+
| + [_seconds](#bookingDates_items_selectedTimeSlots_items__deletedAt__seconds ) | No | integer | No | - | - |
|
|
1191
|
+
| + [_nanoseconds](#bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds ) | No | integer | No | - | - |
|
|
1192
|
+
|
|
1193
|
+
##### <a name="bookingDates_items_selectedTimeSlots_items__deletedAt__seconds"></a>25.1.3.1. Property `_seconds`
|
|
1194
|
+
|
|
1195
|
+
| | |
|
|
1196
|
+
| ------------ | --------- |
|
|
1197
|
+
| **Type** | `integer` |
|
|
1198
|
+
| **Required** | Yes |
|
|
1199
|
+
|
|
1200
|
+
| Restrictions | |
|
|
1201
|
+
| ------------ | ---------------------- |
|
|
1202
|
+
| **Minimum** | ≥ -9007199254740991 |
|
|
1203
|
+
| **Maximum** | ≤ 9007199254740991 |
|
|
1204
|
+
|
|
1205
|
+
##### <a name="bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds"></a>25.1.3.2. Property `_nanoseconds`
|
|
1206
|
+
|
|
1207
|
+
| | |
|
|
1208
|
+
| ------------ | --------- |
|
|
1209
|
+
| **Type** | `integer` |
|
|
1210
|
+
| **Required** | Yes |
|
|
1211
|
+
|
|
1212
|
+
| Restrictions | |
|
|
1213
|
+
| ------------ | ---------------------- |
|
|
1214
|
+
| **Minimum** | ≥ -9007199254740991 |
|
|
1215
|
+
| **Maximum** | ≤ 9007199254740991 |
|
|
1216
|
+
|
|
1217
|
+
#### <a name="notes_items_createdBy"></a>25.1.4. Property `createdBy`
|
|
1218
|
+
|
|
1219
|
+
| | |
|
|
1220
|
+
| ------------ | -------- |
|
|
1221
|
+
| **Type** | `string` |
|
|
1222
|
+
| **Required** | No |
|
|
1223
|
+
|
|
1224
|
+
**Description:** (Immutable) FK → User/staff UID who created this note.
|
|
1225
|
+
|
|
1226
|
+
#### <a name="notes_items_createdByName"></a>25.1.5. Property `createdByName`
|
|
1227
|
+
|
|
1228
|
+
| | |
|
|
1229
|
+
| ------------ | -------- |
|
|
1230
|
+
| **Type** | `string` |
|
|
1231
|
+
| **Required** | No |
|
|
1232
|
+
|
|
1233
|
+
**Description:** (Denormalized) From User display name at write time.
|
|
1234
|
+
|
|
1235
|
+
#### <a name="notes_items__deleted"></a>25.1.6. Property `_deleted`
|
|
1236
|
+
|
|
1237
|
+
| | |
|
|
1238
|
+
| ------------ | --------- |
|
|
1239
|
+
| **Type** | `boolean` |
|
|
1240
|
+
| **Required** | No |
|
|
1241
|
+
|
|
1242
|
+
**Description:** Soft-delete flag. Dashboard writes; Mobile filters (IG-6).
|
|
1243
|
+
|
|
1244
|
+
#### <a name="notes_items__deletedAt"></a>25.1.7. Property `_deletedAt`
|
|
1245
|
+
|
|
1246
|
+
| | |
|
|
1247
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
1248
|
+
| **Type** | `object` |
|
|
1249
|
+
| **Required** | No |
|
|
1250
|
+
| **Additional properties** | Not allowed |
|
|
1251
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
1252
|
+
|
|
1253
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1254
|
+
|
|
1255
|
+
#### <a name="notes_items__deletedBy"></a>25.1.8. Property `_deletedBy`
|
|
1256
|
+
|
|
1257
|
+
| | |
|
|
1258
|
+
| ------------ | -------- |
|
|
1259
|
+
| **Type** | `string` |
|
|
1260
|
+
| **Required** | No |
|
|
1261
|
+
|
|
1262
|
+
**Description:** FK → User/staff UID who soft-deleted this item.
|
|
1263
|
+
|
|
1264
|
+
#### <a name="notes_items__lastModifiedAt"></a>25.1.9. Property `_lastModifiedAt`
|
|
1265
|
+
|
|
1266
|
+
| | |
|
|
1267
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
1268
|
+
| **Type** | `object` |
|
|
1269
|
+
| **Required** | No |
|
|
1270
|
+
| **Additional properties** | Not allowed |
|
|
1271
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
1272
|
+
|
|
1273
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1274
|
+
|
|
1275
|
+
#### <a name="notes_items__lastModifiedBy"></a>25.1.10. Property `_lastModifiedBy`
|
|
1276
|
+
|
|
1277
|
+
| | |
|
|
1278
|
+
| ------------ | -------- |
|
|
1279
|
+
| **Type** | `string` |
|
|
1280
|
+
| **Required** | No |
|
|
1281
|
+
|
|
1282
|
+
**Description:** FK → User/staff UID who last modified this item.
|
|
1283
|
+
|
|
1284
|
+
#### <a name="notes_items__version"></a>25.1.11. Property `_version`
|
|
1285
|
+
|
|
1286
|
+
| | |
|
|
1287
|
+
| ------------ | -------- |
|
|
1288
|
+
| **Type** | `number` |
|
|
1289
|
+
| **Required** | No |
|
|
1290
|
+
|
|
1291
|
+
**Description:** Monotonic version counter for conflict detection.
|
|
1292
|
+
|
|
1293
|
+
## <a name="technicalInfo"></a>26. Property `technicalInfo`
|
|
1294
|
+
|
|
1295
|
+
| | |
|
|
1296
|
+
| ------------ | ---------------- |
|
|
1297
|
+
| **Type** | `string or null` |
|
|
1298
|
+
| **Required** | No |
|
|
1299
|
+
|
|
1300
|
+
## <a name="paymentStatus"></a>27. Property `paymentStatus`
|
|
1301
|
+
|
|
1302
|
+
| | |
|
|
1303
|
+
| ------------------------- | ---------------- |
|
|
1304
|
+
| **Type** | `combining` |
|
|
1305
|
+
| **Required** | No |
|
|
1306
|
+
| **Additional properties** | Any type allowed |
|
|
1307
|
+
|
|
1308
|
+
**Description:** Payment lifecycle status (D01 amended). Used by Order, Sale/Purchase, Booking.
|
|
1309
|
+
|
|
1310
|
+
| Any of(Option) |
|
|
1311
|
+
| ----------------------------------------- |
|
|
1312
|
+
| [payment-status](#paymentStatus_anyOf_i0) |
|
|
1313
|
+
| [item 1](#paymentStatus_anyOf_i1) |
|
|
1314
|
+
|
|
1315
|
+
### <a name="paymentStatus_anyOf_i0"></a>27.1. Property `payment-status`
|
|
1316
|
+
|
|
1317
|
+
| | |
|
|
1318
|
+
| -------------- | ---------------------------- |
|
|
1319
|
+
| **Type** | `enum (of string)` |
|
|
1320
|
+
| **Required** | No |
|
|
1321
|
+
| **Defined in** | #/definitions/payment-status |
|
|
1322
|
+
|
|
1323
|
+
**Description:** Payment lifecycle status (D01 amended). Used by Order, Sale/Purchase, Booking.
|
|
1324
|
+
|
|
1325
|
+
Must be one of:
|
|
1326
|
+
* "PENDING"
|
|
1327
|
+
* "PAID"
|
|
1328
|
+
* "PARTIALLY_PAID"
|
|
1329
|
+
* "FAILED"
|
|
1330
|
+
* "REFUND_PROCESSING"
|
|
1331
|
+
* "REFUNDED"
|
|
1332
|
+
* "PARTIALLY_REFUNDED"
|
|
1333
|
+
|
|
1334
|
+
### <a name="paymentStatus_anyOf_i1"></a>27.2. Property `item 1`
|
|
1335
|
+
|
|
1336
|
+
| | |
|
|
1337
|
+
| ------------ | ------ |
|
|
1338
|
+
| **Type** | `null` |
|
|
1339
|
+
| **Required** | No |
|
|
1340
|
+
|
|
1341
|
+
## <a name="amountPaid"></a>28. Property `amountPaid`
|
|
1342
|
+
|
|
1343
|
+
| | |
|
|
1344
|
+
| ------------ | ---------------- |
|
|
1345
|
+
| **Type** | `number or null` |
|
|
1346
|
+
| **Required** | No |
|
|
1347
|
+
|
|
1348
|
+
## <a name="amountRefunded"></a>29. Property `amountRefunded`
|
|
1349
|
+
|
|
1350
|
+
| | |
|
|
1351
|
+
| ------------ | ---------------- |
|
|
1352
|
+
| **Type** | `number or null` |
|
|
1353
|
+
| **Required** | No |
|
|
1354
|
+
|
|
1355
|
+
## <a name="amountPending"></a>30. Property `amountPending`
|
|
1356
|
+
|
|
1357
|
+
| | |
|
|
1358
|
+
| ------------ | ---------------- |
|
|
1359
|
+
| **Type** | `number or null` |
|
|
1360
|
+
| **Required** | No |
|
|
1361
|
+
|
|
1362
|
+
## <a name="purchaseId"></a>31. Property `purchaseId`
|
|
1363
|
+
|
|
1364
|
+
| | |
|
|
1365
|
+
| ------------ | ---------------- |
|
|
1366
|
+
| **Type** | `string or null` |
|
|
1367
|
+
| **Required** | No |
|
|
1368
|
+
|
|
1369
|
+
**Description:** FK → Sale.id. Link to associated Sale document.
|
|
1370
|
+
|
|
1371
|
+
## <a name="paymentStatusChangeReason"></a>32. Property `paymentStatusChangeReason`
|
|
1372
|
+
|
|
1373
|
+
| | |
|
|
1374
|
+
| ------------ | ---------------- |
|
|
1375
|
+
| **Type** | `string or null` |
|
|
1376
|
+
| **Required** | No |
|
|
1377
|
+
|
|
1378
|
+
## <a name="paymentStatusChangedBy"></a>33. Property `paymentStatusChangedBy`
|
|
1379
|
+
|
|
1380
|
+
| | |
|
|
1381
|
+
| ------------ | ---------------- |
|
|
1382
|
+
| **Type** | `string or null` |
|
|
1383
|
+
| **Required** | No |
|
|
1384
|
+
|
|
1385
|
+
**Description:** FK → User/staff UID who changed payment status.
|
|
1386
|
+
|
|
1387
|
+
## <a name="paymentStatusChangedAt"></a>34. Property `paymentStatusChangedAt`
|
|
1388
|
+
|
|
1389
|
+
| | |
|
|
1390
|
+
| ------------------------- | ---------------- |
|
|
1391
|
+
| **Type** | `combining` |
|
|
1392
|
+
| **Required** | No |
|
|
1393
|
+
| **Additional properties** | Any type allowed |
|
|
1394
|
+
|
|
1395
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1396
|
+
|
|
1397
|
+
| Any of(Option) |
|
|
1398
|
+
| ------------------------------------------------------- |
|
|
1399
|
+
| [firestore-timestamp](#paymentStatusChangedAt_anyOf_i0) |
|
|
1400
|
+
| [item 1](#paymentStatusChangedAt_anyOf_i1) |
|
|
1401
|
+
|
|
1402
|
+
### <a name="paymentStatusChangedAt_anyOf_i0"></a>34.1. Property `firestore-timestamp`
|
|
1403
|
+
|
|
1404
|
+
| | |
|
|
1405
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
1406
|
+
| **Type** | `object` |
|
|
1407
|
+
| **Required** | No |
|
|
1408
|
+
| **Additional properties** | Not allowed |
|
|
1409
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
1410
|
+
|
|
1411
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1412
|
+
|
|
1413
|
+
### <a name="paymentStatusChangedAt_anyOf_i1"></a>34.2. Property `item 1`
|
|
1414
|
+
|
|
1415
|
+
| | |
|
|
1416
|
+
| ------------ | ------ |
|
|
1417
|
+
| **Type** | `null` |
|
|
1418
|
+
| **Required** | No |
|
|
1419
|
+
|
|
1420
|
+
## <a name="paymentProofUrl"></a>35. Property `paymentProofUrl`
|
|
1421
|
+
|
|
1422
|
+
| | |
|
|
1423
|
+
| ------------ | ---------------- |
|
|
1424
|
+
| **Type** | `string or null` |
|
|
1425
|
+
| **Required** | No |
|
|
1426
|
+
|
|
1427
|
+
**Description:** URL to uploaded payment proof image/document.
|
|
1428
|
+
|
|
1429
|
+
## <a name="paymentProofStatus"></a>36. Property `paymentProofStatus`
|
|
1430
|
+
|
|
1431
|
+
| | |
|
|
1432
|
+
| ------------------------- | ---------------- |
|
|
1433
|
+
| **Type** | `combining` |
|
|
1434
|
+
| **Required** | No |
|
|
1435
|
+
| **Additional properties** | Any type allowed |
|
|
1436
|
+
|
|
1437
|
+
**Description:** Payment proof review status. Used by Order and Booking payment proof workflows.
|
|
1438
|
+
|
|
1439
|
+
| Any of(Option) |
|
|
1440
|
+
| ---------------------------------------------------- |
|
|
1441
|
+
| [payment-proof-status](#paymentProofStatus_anyOf_i0) |
|
|
1442
|
+
| [item 1](#paymentProofStatus_anyOf_i1) |
|
|
1443
|
+
|
|
1444
|
+
### <a name="paymentProofStatus_anyOf_i0"></a>36.1. Property `payment-proof-status`
|
|
1445
|
+
|
|
1446
|
+
| | |
|
|
1447
|
+
| -------------- | ---------------------------------- |
|
|
1448
|
+
| **Type** | `enum (of string)` |
|
|
1449
|
+
| **Required** | No |
|
|
1450
|
+
| **Defined in** | #/definitions/payment-proof-status |
|
|
1451
|
+
|
|
1452
|
+
**Description:** Payment proof review status. Used by Order and Booking payment proof workflows.
|
|
1453
|
+
|
|
1454
|
+
Must be one of:
|
|
1455
|
+
* "PENDING"
|
|
1456
|
+
* "APPROVED"
|
|
1457
|
+
* "REJECTED"
|
|
1458
|
+
|
|
1459
|
+
### <a name="paymentProofStatus_anyOf_i1"></a>36.2. Property `item 1`
|
|
1460
|
+
|
|
1461
|
+
| | |
|
|
1462
|
+
| ------------ | ------ |
|
|
1463
|
+
| **Type** | `null` |
|
|
1464
|
+
| **Required** | No |
|
|
1465
|
+
|
|
1466
|
+
## <a name="paymentProofAddedAt"></a>37. Property `paymentProofAddedAt`
|
|
1467
|
+
|
|
1468
|
+
| | |
|
|
1469
|
+
| ------------------------- | ---------------- |
|
|
1470
|
+
| **Type** | `combining` |
|
|
1471
|
+
| **Required** | No |
|
|
1472
|
+
| **Additional properties** | Any type allowed |
|
|
1473
|
+
|
|
1474
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1475
|
+
|
|
1476
|
+
| Any of(Option) |
|
|
1477
|
+
| ---------------------------------------------------- |
|
|
1478
|
+
| [firestore-timestamp](#paymentProofAddedAt_anyOf_i0) |
|
|
1479
|
+
| [item 1](#paymentProofAddedAt_anyOf_i1) |
|
|
1480
|
+
|
|
1481
|
+
### <a name="paymentProofAddedAt_anyOf_i0"></a>37.1. Property `firestore-timestamp`
|
|
1482
|
+
|
|
1483
|
+
| | |
|
|
1484
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
1485
|
+
| **Type** | `object` |
|
|
1486
|
+
| **Required** | No |
|
|
1487
|
+
| **Additional properties** | Not allowed |
|
|
1488
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
1489
|
+
|
|
1490
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1491
|
+
|
|
1492
|
+
### <a name="paymentProofAddedAt_anyOf_i1"></a>37.2. Property `item 1`
|
|
1493
|
+
|
|
1494
|
+
| | |
|
|
1495
|
+
| ------------ | ------ |
|
|
1496
|
+
| **Type** | `null` |
|
|
1497
|
+
| **Required** | No |
|
|
1498
|
+
|
|
1499
|
+
## <a name="paymentProofAddedBy"></a>38. Property `paymentProofAddedBy`
|
|
1500
|
+
|
|
1501
|
+
| | |
|
|
1502
|
+
| ------------ | ---------------- |
|
|
1503
|
+
| **Type** | `string or null` |
|
|
1504
|
+
| **Required** | No |
|
|
1505
|
+
|
|
1506
|
+
**Description:** FK → User/staff UID who uploaded the payment proof.
|
|
1507
|
+
|
|
1508
|
+
## <a name="paymentProofReviewedBy"></a>39. Property `paymentProofReviewedBy`
|
|
1509
|
+
|
|
1510
|
+
| | |
|
|
1511
|
+
| ------------ | ---------------- |
|
|
1512
|
+
| **Type** | `string or null` |
|
|
1513
|
+
| **Required** | No |
|
|
1514
|
+
|
|
1515
|
+
**Description:** FK → User/staff UID who reviewed the payment proof.
|
|
1516
|
+
|
|
1517
|
+
## <a name="paymentProofReviewedAt"></a>40. Property `paymentProofReviewedAt`
|
|
1518
|
+
|
|
1519
|
+
| | |
|
|
1520
|
+
| ------------------------- | ---------------- |
|
|
1521
|
+
| **Type** | `combining` |
|
|
1522
|
+
| **Required** | No |
|
|
1523
|
+
| **Additional properties** | Any type allowed |
|
|
1524
|
+
|
|
1525
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1526
|
+
|
|
1527
|
+
| Any of(Option) |
|
|
1528
|
+
| ------------------------------------------------------- |
|
|
1529
|
+
| [firestore-timestamp](#paymentProofReviewedAt_anyOf_i0) |
|
|
1530
|
+
| [item 1](#paymentProofReviewedAt_anyOf_i1) |
|
|
1531
|
+
|
|
1532
|
+
### <a name="paymentProofReviewedAt_anyOf_i0"></a>40.1. Property `firestore-timestamp`
|
|
1533
|
+
|
|
1534
|
+
| | |
|
|
1535
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
1536
|
+
| **Type** | `object` |
|
|
1537
|
+
| **Required** | No |
|
|
1538
|
+
| **Additional properties** | Not allowed |
|
|
1539
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
1540
|
+
|
|
1541
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1542
|
+
|
|
1543
|
+
### <a name="paymentProofReviewedAt_anyOf_i1"></a>40.2. Property `item 1`
|
|
1544
|
+
|
|
1545
|
+
| | |
|
|
1546
|
+
| ------------ | ------ |
|
|
1547
|
+
| **Type** | `null` |
|
|
1548
|
+
| **Required** | No |
|
|
1549
|
+
|
|
1550
|
+
## <a name="paymentProofRejectionReason"></a>41. Property `paymentProofRejectionReason`
|
|
1551
|
+
|
|
1552
|
+
| | |
|
|
1553
|
+
| ------------ | ---------------- |
|
|
1554
|
+
| **Type** | `string or null` |
|
|
1555
|
+
| **Required** | No |
|
|
1556
|
+
|
|
1557
|
+
## <a name="cancellationRequestedById"></a>42. Property `cancellationRequestedById`
|
|
1558
|
+
|
|
1559
|
+
| | |
|
|
1560
|
+
| ------------ | ---------------- |
|
|
1561
|
+
| **Type** | `string or null` |
|
|
1562
|
+
| **Required** | No |
|
|
1563
|
+
|
|
1564
|
+
**Description:** FK → User/staff UID who requested cancellation.
|
|
1565
|
+
|
|
1566
|
+
## <a name="cancellationRequestReason"></a>43. Property `cancellationRequestReason`
|
|
1567
|
+
|
|
1568
|
+
| | |
|
|
1569
|
+
| ------------ | ---------------- |
|
|
1570
|
+
| **Type** | `string or null` |
|
|
1571
|
+
| **Required** | No |
|
|
1572
|
+
|
|
1573
|
+
## <a name="cancellationProcessedById"></a>44. Property `cancellationProcessedById`
|
|
1574
|
+
|
|
1575
|
+
| | |
|
|
1576
|
+
| ------------ | ---------------- |
|
|
1577
|
+
| **Type** | `string or null` |
|
|
1578
|
+
| **Required** | No |
|
|
1579
|
+
|
|
1580
|
+
**Description:** FK → User/staff UID who processed the cancellation.
|
|
1581
|
+
|
|
1582
|
+
## <a name="cancellationProcessedAt"></a>45. Property `cancellationProcessedAt`
|
|
1583
|
+
|
|
1584
|
+
| | |
|
|
1585
|
+
| ------------------------- | ---------------- |
|
|
1586
|
+
| **Type** | `combining` |
|
|
1587
|
+
| **Required** | No |
|
|
1588
|
+
| **Additional properties** | Any type allowed |
|
|
1589
|
+
|
|
1590
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1591
|
+
|
|
1592
|
+
| Any of(Option) |
|
|
1593
|
+
| -------------------------------------------------------- |
|
|
1594
|
+
| [firestore-timestamp](#cancellationProcessedAt_anyOf_i0) |
|
|
1595
|
+
| [item 1](#cancellationProcessedAt_anyOf_i1) |
|
|
1596
|
+
|
|
1597
|
+
### <a name="cancellationProcessedAt_anyOf_i0"></a>45.1. Property `firestore-timestamp`
|
|
1598
|
+
|
|
1599
|
+
| | |
|
|
1600
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
1601
|
+
| **Type** | `object` |
|
|
1602
|
+
| **Required** | No |
|
|
1603
|
+
| **Additional properties** | Not allowed |
|
|
1604
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
1605
|
+
|
|
1606
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1607
|
+
|
|
1608
|
+
### <a name="cancellationProcessedAt_anyOf_i1"></a>45.2. Property `item 1`
|
|
1609
|
+
|
|
1610
|
+
| | |
|
|
1611
|
+
| ------------ | ------ |
|
|
1612
|
+
| **Type** | `null` |
|
|
1613
|
+
| **Required** | No |
|
|
1614
|
+
|
|
1615
|
+
## <a name="cancelledByRole"></a>46. Property `cancelledByRole`
|
|
1616
|
+
|
|
1617
|
+
| | |
|
|
1618
|
+
| ------------ | ---------------- |
|
|
1619
|
+
| **Type** | `string or null` |
|
|
1620
|
+
| **Required** | No |
|
|
1621
|
+
|
|
1622
|
+
## <a name="cancellationReason"></a>47. Property `cancellationReason`
|
|
1623
|
+
|
|
1624
|
+
| | |
|
|
1625
|
+
| ------------ | ---------------- |
|
|
1626
|
+
| **Type** | `string or null` |
|
|
1627
|
+
| **Required** | No |
|
|
1628
|
+
|
|
1629
|
+
## <a name="createdAt"></a>48. Property `createdAt`
|
|
1630
|
+
|
|
1631
|
+
| | |
|
|
1632
|
+
| ------------------------- | --------------------------------- |
|
|
1633
|
+
| **Type** | `object` |
|
|
1634
|
+
| **Required** | Yes |
|
|
1635
|
+
| **Additional properties** | Not allowed |
|
|
1636
|
+
| **Defined in** | #/definitions/firestore-timestamp |
|
|
1637
|
+
|
|
1638
|
+
**Description:** (Read-only) Server-generated creation timestamp.
|
|
1639
|
+
|
|
1640
|
+
| Property | Pattern | Type | Deprecated | Definition | Title/Description |
|
|
1641
|
+
| -------------------------------------------------------------------------------------- | ------- | ------- | ---------- | ---------- | ----------------- |
|
|
1642
|
+
| + [_seconds](#bookingDates_items_selectedTimeSlots_items__deletedAt__seconds ) | No | integer | No | - | - |
|
|
1643
|
+
| + [_nanoseconds](#bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds ) | No | integer | No | - | - |
|
|
1644
|
+
|
|
1645
|
+
### <a name="bookingDates_items_selectedTimeSlots_items__deletedAt__seconds"></a>48.1. Property `_seconds`
|
|
1646
|
+
|
|
1647
|
+
| | |
|
|
1648
|
+
| ------------ | --------- |
|
|
1649
|
+
| **Type** | `integer` |
|
|
1650
|
+
| **Required** | Yes |
|
|
1651
|
+
|
|
1652
|
+
| Restrictions | |
|
|
1653
|
+
| ------------ | ---------------------- |
|
|
1654
|
+
| **Minimum** | ≥ -9007199254740991 |
|
|
1655
|
+
| **Maximum** | ≤ 9007199254740991 |
|
|
1656
|
+
|
|
1657
|
+
### <a name="bookingDates_items_selectedTimeSlots_items__deletedAt__nanoseconds"></a>48.2. Property `_nanoseconds`
|
|
1658
|
+
|
|
1659
|
+
| | |
|
|
1660
|
+
| ------------ | --------- |
|
|
1661
|
+
| **Type** | `integer` |
|
|
1662
|
+
| **Required** | Yes |
|
|
1663
|
+
|
|
1664
|
+
| Restrictions | |
|
|
1665
|
+
| ------------ | ---------------------- |
|
|
1666
|
+
| **Minimum** | ≥ -9007199254740991 |
|
|
1667
|
+
| **Maximum** | ≤ 9007199254740991 |
|
|
1668
|
+
|
|
1669
|
+
:::warning Server-set
|
|
1670
|
+
Do not include in write requests. This field is set exclusively by the server (Firestore trigger or Admin SDK). Clients that send it will have the value silently ignored or may receive a validation error.
|
|
1671
|
+
:::
|
|
1672
|
+
|
|
1673
|
+
## <a name="updatedAt"></a>49. Property `updatedAt`
|
|
1674
|
+
|
|
1675
|
+
| | |
|
|
1676
|
+
| ------------------------- | ---------------- |
|
|
1677
|
+
| **Type** | `combining` |
|
|
1678
|
+
| **Required** | No |
|
|
1679
|
+
| **Additional properties** | Any type allowed |
|
|
1680
|
+
|
|
1681
|
+
**Description:** (Read-only) Server-generated update timestamp.
|
|
1682
|
+
|
|
1683
|
+
| Any of(Option) |
|
|
1684
|
+
| ------------------------------------------ |
|
|
1685
|
+
| [firestore-timestamp](#updatedAt_anyOf_i0) |
|
|
1686
|
+
| [item 1](#updatedAt_anyOf_i1) |
|
|
1687
|
+
|
|
1688
|
+
### <a name="updatedAt_anyOf_i0"></a>49.1. Property `firestore-timestamp`
|
|
1689
|
+
|
|
1690
|
+
| | |
|
|
1691
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
1692
|
+
| **Type** | `object` |
|
|
1693
|
+
| **Required** | No |
|
|
1694
|
+
| **Additional properties** | Not allowed |
|
|
1695
|
+
| **Same definition as** | [_deletedAt](#bookingDates_items_selectedTimeSlots_items__deletedAt) |
|
|
1696
|
+
|
|
1697
|
+
**Description:** Firestore Timestamp serialized representation
|
|
1698
|
+
|
|
1699
|
+
### <a name="updatedAt_anyOf_i1"></a>49.2. Property `item 1`
|
|
1700
|
+
|
|
1701
|
+
| | |
|
|
1702
|
+
| ------------ | ------ |
|
|
1703
|
+
| **Type** | `null` |
|
|
1704
|
+
| **Required** | No |
|
|
1705
|
+
|
|
1706
|
+
:::warning Server-set
|
|
1707
|
+
Do not include in write requests. This field is set exclusively by the server (Firestore trigger or Admin SDK). Clients that send it will have the value silently ignored or may receive a validation error.
|
|
1708
|
+
:::
|
|
1709
|
+
|
|
1710
|
+
## <a name="createdBy"></a>50. Property `createdBy`
|
|
1711
|
+
|
|
1712
|
+
| | |
|
|
1713
|
+
| ------------ | ---------------- |
|
|
1714
|
+
| **Type** | `string or null` |
|
|
1715
|
+
| **Required** | No |
|
|
1716
|
+
|
|
1717
|
+
**Description:** (Immutable) FK → User/staff UID who created this booking.
|
|
1718
|
+
|
|
1719
|
+
:::info Immutable
|
|
1720
|
+
Set at creation only. This field cannot be modified after the document is created. Include it in CREATE payloads; omit it (or leave unchanged) in UPDATE payloads.
|
|
1721
|
+
:::
|
|
1722
|
+
|
|
1723
|
+
## <a name="updatedBy"></a>51. Property `updatedBy`
|
|
1724
|
+
|
|
1725
|
+
| | |
|
|
1726
|
+
| ------------ | ---------------- |
|
|
1727
|
+
| **Type** | `string or null` |
|
|
1728
|
+
| **Required** | No |
|
|
1729
|
+
|
|
1730
|
+
**Description:** FK → User/staff UID who last updated this booking.
|
|
1731
|
+
|
|
1732
|
+
## <a name="createdFromBackend"></a>52. Property `createdFromBackend`
|
|
1733
|
+
|
|
1734
|
+
| | |
|
|
1735
|
+
| ------------ | ----------------- |
|
|
1736
|
+
| **Type** | `boolean or null` |
|
|
1737
|
+
| **Required** | No |
|
|
1738
|
+
|
|
1739
|
+
**Description:** When true, suppresses Firebase notification triggers (D20/IG-8).
|
|
1740
|
+
|
|
1741
|
+
----------------------------------------------------------------------------------------------------------------------------
|
|
1742
|
+
Generated using [json-schema-for-humans](https://github.com/coveooss/json-schema-for-humans) on 2026-04-06 at 19:27:48 +0000
|
|
1743
|
+
|
|
1744
|
+
## Related Decisions
|
|
1745
|
+
|
|
1746
|
+
| Decision | Title |
|
|
1747
|
+
|---|---|
|
|
1748
|
+
| **D09** | Canonical startDate/endDate type for bookings |
|
|
1749
|
+
| **D10** | Canonical booking add-on IDs |
|
|
1750
|
+
| **D11** | Canonical price field names in booking slots |
|
|
1751
|
+
| **D17** | Mobile CRDT write behavior for bookings |
|
|
1752
|
+
| **D18** | Firebase BookingVersion ownership |
|
|
1753
|
+
| **D20** | createdFromBackend behavior for dashboard-created bookings |
|
|
1754
|
+
| **D24** | Customer reference naming standardization |
|