payservedb 9.6.0 → 9.6.2
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/.env +2 -2
- package/ZOHO_INTEGRATION_SCHEMA.md +644 -644
- package/index.js +418 -418
- package/package.json +17 -17
- package/src/models/InvoiceWithholdingTax.js +67 -67
- package/src/models/account.js +59 -59
- package/src/models/agent_departments.js +59 -59
- package/src/models/agent_notifications.js +53 -53
- package/src/models/agent_performance.js +127 -127
- package/src/models/agent_roles.js +77 -77
- package/src/models/agents.js +154 -154
- package/src/models/apilog.js +18 -18
- package/src/models/approvalsWorkflows.js +49 -49
- package/src/models/archivedapilog.js +18 -18
- package/src/models/asset.js +92 -92
- package/src/models/assetsAssignment.js +64 -64
- package/src/models/auditTrail.js +346 -346
- package/src/models/auto_reply_rule.js +68 -68
- package/src/models/bankdetails.js +47 -47
- package/src/models/billerAddress.js +124 -124
- package/src/models/booking_invoice.js +187 -187
- package/src/models/bookinganalytics.js +63 -63
- package/src/models/bookingconfig.js +74 -74
- package/src/models/bookingproperty.js +211 -211
- package/src/models/bookingreservation.js +298 -298
- package/src/models/bookingrevenuerecord.js +84 -84
- package/src/models/budget.js +95 -95
- package/src/models/budgetCategory.js +19 -19
- package/src/models/campaigns.js +108 -108
- package/src/models/cancellation_policy.js +56 -56
- package/src/models/cashpayment.js +289 -289
- package/src/models/combinedUnits.js +62 -62
- package/src/models/combined_invoice.js +424 -424
- package/src/models/common_area_electricity.js +38 -38
- package/src/models/common_area_generator.js +41 -41
- package/src/models/common_area_utility_alert.js +37 -37
- package/src/models/common_area_water.js +39 -39
- package/src/models/communication_status.js +33 -33
- package/src/models/communication_user_opt.js +32 -32
- package/src/models/community_guidelines.js +35 -35
- package/src/models/company.js +53 -53
- package/src/models/coreBaseSettings.js +16 -16
- package/src/models/coreInvoiceSettings.js +100 -100
- package/src/models/counter_schema.js +21 -21
- package/src/models/country_tax.js +42 -42
- package/src/models/currency_settings.js +39 -39
- package/src/models/customer.js +251 -251
- package/src/models/customer_preference.js +52 -52
- package/src/models/customer_satisfaction_survey.js +297 -297
- package/src/models/customer_surveys.js +139 -139
- package/src/models/customer_tickets.js +237 -237
- package/src/models/dailyChecklist.js +312 -312
- package/src/models/default_payment_details.js +17 -17
- package/src/models/deliveryTimeMarks.js +18 -18
- package/src/models/document_type.js +19 -19
- package/src/models/dutyRosterChecklist.js +250 -250
- package/src/models/dutyroster.js +136 -136
- package/src/models/email.js +37 -37
- package/src/models/email_cc_config.js +48 -48
- package/src/models/email_sms_queue.js +61 -61
- package/src/models/email_thread.js +35 -35
- package/src/models/entry_exit.js +53 -53
- package/src/models/expense.js +99 -99
- package/src/models/expense_category.js +45 -45
- package/src/models/facility.js +100 -100
- package/src/models/facilityBillingPrices.js +29 -29
- package/src/models/facilityInvoice.js +240 -240
- package/src/models/facilityInvoicePayment.js +52 -52
- package/src/models/facilityInvoiceRecipient.js +32 -32
- package/src/models/facilityWalletTransactionsMetadata.js +236 -236
- package/src/models/facility_departements.js +20 -20
- package/src/models/facility_etims_config.js +116 -116
- package/src/models/facility_payment_details.js +20 -20
- package/src/models/facility_rating.js +78 -78
- package/src/models/facilityasset.js +25 -25
- package/src/models/faq.js +15 -15
- package/src/models/gl_account_double_entries.js +25 -25
- package/src/models/gl_accounts.js +56 -56
- package/src/models/gl_entries.js +49 -49
- package/src/models/goodsReceivedNotes.js +115 -115
- package/src/models/guard.js +47 -47
- package/src/models/handover.js +258 -258
- package/src/models/inspection_category.js +38 -38
- package/src/models/invoice.js +598 -569
- package/src/models/invoiceCreditAdjustment.js +45 -45
- package/src/models/invoice_edit_log.js +81 -81
- package/src/models/invoice_generation_approval.js +86 -86
- package/src/models/invoicing_schedule.js +40 -40
- package/src/models/item_inspection.js +96 -96
- package/src/models/knowledge_base.js +109 -109
- package/src/models/knowledge_base_rating.js +44 -44
- package/src/models/leaseagreement.js +266 -266
- package/src/models/leasetemplate.js +17 -17
- package/src/models/levy.js +231 -231
- package/src/models/levy_deposits.js +114 -114
- package/src/models/levy_invoice_settings.js +26 -26
- package/src/models/levy_payment_receipt.js +156 -156
- package/src/models/levycontract.js +213 -213
- package/src/models/levytype.js +23 -23
- package/src/models/maintenance_service_vendor.js +38 -38
- package/src/models/maintenance_services.js +17 -17
- package/src/models/maintenancerequisition.js +31 -31
- package/src/models/master_workplan.js +32 -32
- package/src/models/master_workplan_child.js +34 -34
- package/src/models/message.js +38 -38
- package/src/models/module.js +21 -21
- package/src/models/movein_amenity.js +13 -13
- package/src/models/movein_application.js +28 -28
- package/src/models/movein_audit_log.js +21 -21
- package/src/models/movein_booking.js +33 -33
- package/src/models/movein_commission.js +46 -46
- package/src/models/movein_conversation.js +25 -25
- package/src/models/movein_deal.js +79 -79
- package/src/models/movein_disbursement.js +36 -36
- package/src/models/movein_email_thread.js +19 -19
- package/src/models/movein_enquiry.js +16 -16
- package/src/models/movein_featured_package.js +16 -16
- package/src/models/movein_handoff_token.js +16 -16
- package/src/models/movein_invoice.js +24 -24
- package/src/models/movein_landlord.js +18 -18
- package/src/models/movein_landlord_user.js +20 -20
- package/src/models/movein_lease.js +37 -37
- package/src/models/movein_message.js +27 -27
- package/src/models/movein_notification.js +27 -27
- package/src/models/movein_otp.js +14 -14
- package/src/models/movein_payment.js +46 -46
- package/src/models/movein_reminder.js +77 -77
- package/src/models/movein_reservation.js +31 -31
- package/src/models/movein_settings.js +25 -25
- package/src/models/movein_tenancy.js +55 -55
- package/src/models/movein_unit.js +59 -59
- package/src/models/movein_user.js +15 -15
- package/src/models/movein_viewing_slot.js +21 -21
- package/src/models/movein_want_unit.js +20 -20
- package/src/models/notification.js +44 -44
- package/src/models/paymentTermsMarks.js +19 -19
- package/src/models/penalty.js +76 -76
- package/src/models/pendingCredentials.js +32 -32
- package/src/models/powerMeterCommunicationProtocol.js +17 -17
- package/src/models/powerMeterCustomerAccount.js +78 -78
- package/src/models/powerMeterCustomerBand.js +14 -14
- package/src/models/powerMeterDailyReading.js +30 -30
- package/src/models/powerMeterGateways.js +40 -40
- package/src/models/powerMeterMonthlyReading.js +34 -34
- package/src/models/powerMeterPowerCharges.js +85 -85
- package/src/models/powerMeterSettings.js +211 -211
- package/src/models/powerMeterSingleDayReading.js +32 -32
- package/src/models/powerMeters.js +149 -149
- package/src/models/powerMetersManufacturer.js +14 -14
- package/src/models/power_invoice.js +371 -371
- package/src/models/power_meter_account.js +81 -81
- package/src/models/power_meter_command_logs.js +30 -30
- package/src/models/power_meter_command_queue.js +33 -33
- package/src/models/power_meter_negative_balance.js +44 -44
- package/src/models/power_prepaid_credits.js +47 -47
- package/src/models/power_prepaid_debits.js +53 -53
- package/src/models/power_prepaid_orders.js +78 -78
- package/src/models/power_sms_notification.js +26 -26
- package/src/models/privacy_policy.js +19 -19
- package/src/models/propertyManagementSettings.js +55 -55
- package/src/models/propertyManagerContract.js +611 -611
- package/src/models/propertyManagerRevenue.js +195 -195
- package/src/models/propertyManagerRevenueEntry.js +118 -118
- package/src/models/purchaseOrderInvoice.js +74 -74
- package/src/models/purchase_order.js +213 -213
- package/src/models/purchase_request.js +110 -110
- package/src/models/quickbooks_config.js +52 -52
- package/src/models/recipient_group.js +61 -61
- package/src/models/recipient_group_member.js +62 -62
- package/src/models/refresh_token.js +23 -23
- package/src/models/reminder.js +197 -197
- package/src/models/report.js +13 -13
- package/src/models/resident.js +121 -121
- package/src/models/rfq_details.js +131 -131
- package/src/models/rfq_response.js +153 -153
- package/src/models/service_charge_invoice_upload.js +42 -42
- package/src/models/service_charge_payments.js +27 -27
- package/src/models/servicerequest.js +55 -55
- package/src/models/settings.js +62 -62
- package/src/models/short_urls.js +21 -21
- package/src/models/smart_meter_daily_consumption.js +44 -44
- package/src/models/sms_africastalking.js +20 -20
- package/src/models/sms_balance_notification.js +26 -26
- package/src/models/sms_meliora.js +20 -20
- package/src/models/staff.js +36 -36
- package/src/models/stocksandspare.js +161 -161
- package/src/models/suppliers.js +79 -79
- package/src/models/terms_and_conditions.js +19 -19
- package/src/models/tickets.js +186 -186
- package/src/models/tickets_category.js +72 -72
- package/src/models/unitManagementTemplate.js +44 -44
- package/src/models/unitasset.js +25 -25
- package/src/models/units.js +148 -148
- package/src/models/user.js +186 -186
- package/src/models/valueaddedservices.js +50 -50
- package/src/models/vas_invoices_upload.js +50 -50
- package/src/models/vas_payments.js +24 -24
- package/src/models/vasinvoice.js +196 -196
- package/src/models/vasvendor.js +52 -52
- package/src/models/visitLog.js +108 -108
- package/src/models/visitor.js +67 -67
- package/src/models/waitlist.js +45 -45
- package/src/models/wallet.js +44 -44
- package/src/models/wallet_transaction.js +67 -67
- package/src/models/wallet_transactions.js +72 -72
- package/src/models/water_invoice.js +362 -362
- package/src/models/water_meter_Command_Queue.js +33 -33
- package/src/models/water_meter_account.js +86 -86
- package/src/models/water_meter_billing.js +58 -58
- package/src/models/water_meter_combined_accounts.js +92 -92
- package/src/models/water_meter_communication.js +17 -17
- package/src/models/water_meter_communication_logs.js +39 -39
- package/src/models/water_meter_concentrator.js +77 -77
- package/src/models/water_meter_daily_history.js +32 -32
- package/src/models/water_meter_high_risk.js +36 -36
- package/src/models/water_meter_iot_cards.js +34 -34
- package/src/models/water_meter_loan_deduction.js +134 -134
- package/src/models/water_meter_manufacturer.js +35 -35
- package/src/models/water_meter_monthly_history.js +36 -36
- package/src/models/water_meter_negative_amounts.js +44 -44
- package/src/models/water_meter_settings.js +303 -303
- package/src/models/water_meter_single_day_history.js +34 -34
- package/src/models/water_meter_size.js +15 -15
- package/src/models/water_meters.js +176 -176
- package/src/models/water_meters_delivery.js +76 -76
- package/src/models/water_prepaid_credit.js +47 -47
- package/src/models/water_prepaid_debit.js +50 -50
- package/src/models/whatsapp_conversation.js +23 -23
- package/src/models/workorder.js +49 -49
- package/src/models/zohoAccount.js +453 -453
- package/src/models/zohoIntegration.js +262 -262
- package/src/models/zohoItem.js +504 -504
|
@@ -1,299 +1,299 @@
|
|
|
1
|
-
const mongoose = require('mongoose');
|
|
2
|
-
|
|
3
|
-
// Define the schema for Booking Reservations
|
|
4
|
-
const bookingReservationSchema = new mongoose.Schema({
|
|
5
|
-
checkOutActual: {
|
|
6
|
-
type: Date
|
|
7
|
-
},
|
|
8
|
-
// When the guest was actually checked in (set by the Check In action)
|
|
9
|
-
checkedInAt: {
|
|
10
|
-
type: Date
|
|
11
|
-
},
|
|
12
|
-
// Field for checkout notes
|
|
13
|
-
checkoutNotes: {
|
|
14
|
-
type: String,
|
|
15
|
-
default: ''
|
|
16
|
-
},
|
|
17
|
-
// Field for the final amount paid (may differ from original totalAmount)
|
|
18
|
-
finalAmount: {
|
|
19
|
-
type: Number
|
|
20
|
-
},
|
|
21
|
-
// Field for additional charges at checkout
|
|
22
|
-
additionalCheckoutCharges: [{
|
|
23
|
-
description: {
|
|
24
|
-
type: String,
|
|
25
|
-
required: true
|
|
26
|
-
},
|
|
27
|
-
amount: {
|
|
28
|
-
type: Number,
|
|
29
|
-
required: true
|
|
30
|
-
},
|
|
31
|
-
reason: {
|
|
32
|
-
type: String
|
|
33
|
-
},
|
|
34
|
-
status: {
|
|
35
|
-
type: String,
|
|
36
|
-
enum: ['Unpaid', 'Partially Paid', 'Paid'],
|
|
37
|
-
default: 'Unpaid'
|
|
38
|
-
},
|
|
39
|
-
paidAmount: {
|
|
40
|
-
type: Number,
|
|
41
|
-
default: 0
|
|
42
|
-
},
|
|
43
|
-
addedAt: {
|
|
44
|
-
type: Date,
|
|
45
|
-
default: Date.now
|
|
46
|
-
}
|
|
47
|
-
}],
|
|
48
|
-
// Field to track if this reservation has been included in revenue calculations
|
|
49
|
-
revenueProcessed: {
|
|
50
|
-
type: Boolean,
|
|
51
|
-
default: false
|
|
52
|
-
},
|
|
53
|
-
// Field to store the checkout date
|
|
54
|
-
checkoutDate: {
|
|
55
|
-
type: Date
|
|
56
|
-
},
|
|
57
|
-
// Flag to indicate checkout is pending finance approval
|
|
58
|
-
checkoutPending: {
|
|
59
|
-
type: Boolean,
|
|
60
|
-
default: false
|
|
61
|
-
},
|
|
62
|
-
facilityId: {
|
|
63
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
64
|
-
ref: 'Facility',
|
|
65
|
-
required: true
|
|
66
|
-
},
|
|
67
|
-
bookingPropertyId: {
|
|
68
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
69
|
-
ref: 'BookingProperty',
|
|
70
|
-
required: true
|
|
71
|
-
},
|
|
72
|
-
unitId: {
|
|
73
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
74
|
-
ref: 'Unit',
|
|
75
|
-
required: true
|
|
76
|
-
},
|
|
77
|
-
bookingReservationId: {
|
|
78
|
-
type: String,
|
|
79
|
-
required: true,
|
|
80
|
-
unique: true
|
|
81
|
-
},
|
|
82
|
-
// Which staff member created this booking - always an explicit manual
|
|
83
|
-
// selection (never auto-filled from the logged-in user), so the invoice
|
|
84
|
-
// can show "You were served by <name>".
|
|
85
|
-
servedBy: {
|
|
86
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
87
|
-
ref: 'User'
|
|
88
|
-
},
|
|
89
|
-
servedByName: {
|
|
90
|
-
type: String,
|
|
91
|
-
default: ''
|
|
92
|
-
},
|
|
93
|
-
guestInfo: {
|
|
94
|
-
name: {
|
|
95
|
-
type: String,
|
|
96
|
-
required: true
|
|
97
|
-
},
|
|
98
|
-
email: {
|
|
99
|
-
type: String,
|
|
100
|
-
required: true
|
|
101
|
-
},
|
|
102
|
-
phone: {
|
|
103
|
-
type: String,
|
|
104
|
-
required: true
|
|
105
|
-
},
|
|
106
|
-
// Not required: guests booking online (external API / widget) often
|
|
107
|
-
// don't have this to hand until check-in, and both create_reservation.js
|
|
108
|
-
// (internal) and create_booking.js (external) already treat it as
|
|
109
|
-
// optional at their own validation layer, defaulting to '' - this
|
|
110
|
-
// schema requirement was rejecting exactly those bookings.
|
|
111
|
-
idNumber: {
|
|
112
|
-
type: String,
|
|
113
|
-
default: ''
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
checkIn: {
|
|
117
|
-
type: Date,
|
|
118
|
-
required: true
|
|
119
|
-
},
|
|
120
|
-
checkOut: {
|
|
121
|
-
type: Date,
|
|
122
|
-
required: true
|
|
123
|
-
},
|
|
124
|
-
guests: {
|
|
125
|
-
adults: {
|
|
126
|
-
type: Number,
|
|
127
|
-
default: 1
|
|
128
|
-
},
|
|
129
|
-
children: {
|
|
130
|
-
type: Number,
|
|
131
|
-
default: 0
|
|
132
|
-
}
|
|
133
|
-
},
|
|
134
|
-
basePrice: {
|
|
135
|
-
type: Number,
|
|
136
|
-
required: false
|
|
137
|
-
},
|
|
138
|
-
totalAmount: {
|
|
139
|
-
type: Number,
|
|
140
|
-
required: false
|
|
141
|
-
},
|
|
142
|
-
// Running total of confirmed payments applied to this reservation's
|
|
143
|
-
// invoice - kept in sync by applyBookingInvoicePayment.js so the
|
|
144
|
-
// booking list can gate check-in eligibility (paymentTiming rules)
|
|
145
|
-
// without an extra invoice lookup per row.
|
|
146
|
-
totalPaidAmount: {
|
|
147
|
-
type: Number,
|
|
148
|
-
default: 0
|
|
149
|
-
},
|
|
150
|
-
commission: {
|
|
151
|
-
type: Number,
|
|
152
|
-
required: false
|
|
153
|
-
},
|
|
154
|
-
landlordAmount: {
|
|
155
|
-
type: Number,
|
|
156
|
-
required: false
|
|
157
|
-
},
|
|
158
|
-
currencyId: {
|
|
159
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
160
|
-
ref: 'Currency',
|
|
161
|
-
required: false
|
|
162
|
-
},
|
|
163
|
-
paymentMethod: {
|
|
164
|
-
type: String,
|
|
165
|
-
enum: ['Cash', 'Card', 'Bank Transfer', 'Mobile Money', 'Other'],
|
|
166
|
-
required: false
|
|
167
|
-
},
|
|
168
|
-
paymentTiming: {
|
|
169
|
-
type: String,
|
|
170
|
-
enum: ['Before', 'After', 'Split', 'PerNight'],
|
|
171
|
-
default: 'Before'
|
|
172
|
-
},
|
|
173
|
-
// Only used when paymentTiming is 'Split' - guest must pay at least
|
|
174
|
-
// this percentage of the total before check-in is allowed.
|
|
175
|
-
splitPaymentPercentage: {
|
|
176
|
-
type: Number,
|
|
177
|
-
min: 1,
|
|
178
|
-
max: 100,
|
|
179
|
-
default: null
|
|
180
|
-
},
|
|
181
|
-
// Only used when paymentTiming is 'PerNight' - prevents sending more
|
|
182
|
-
// than one payment reminder per business day.
|
|
183
|
-
lastPerNightReminderSentAt: {
|
|
184
|
-
type: Date,
|
|
185
|
-
default: null
|
|
186
|
-
},
|
|
187
|
-
invoiceId: {
|
|
188
|
-
type: String
|
|
189
|
-
},
|
|
190
|
-
// For additional services
|
|
191
|
-
additionalServices: [{
|
|
192
|
-
serviceId: {
|
|
193
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
194
|
-
ref: 'ValueAddedService'
|
|
195
|
-
},
|
|
196
|
-
serviceName: {
|
|
197
|
-
type: String,
|
|
198
|
-
required: true
|
|
199
|
-
},
|
|
200
|
-
quantity: {
|
|
201
|
-
type: Number,
|
|
202
|
-
default: 1
|
|
203
|
-
},
|
|
204
|
-
price: {
|
|
205
|
-
type: Number,
|
|
206
|
-
required: true
|
|
207
|
-
}
|
|
208
|
-
}],
|
|
209
|
-
specialRequests: {
|
|
210
|
-
type: String
|
|
211
|
-
},
|
|
212
|
-
// This enum is a superset shared across companies on this multitenant
|
|
213
|
-
// platform (payservedb has no per-company branch) - each company's own
|
|
214
|
-
// controller code decides how 'booked'/'reserved' are actually used, so
|
|
215
|
-
// do not change the default here without checking every consumer.
|
|
216
|
-
// Swan: booked = created, zero payment. reserved = has payment (partial
|
|
217
|
-
// or full), not yet checked in. checked-in = guest on premises.
|
|
218
|
-
// checked-out = guest left but balance outstanding (e.g. damage
|
|
219
|
-
// charges). completed = balance cleared. cancelled = terminal, reachable
|
|
220
|
-
// from booked/reserved.
|
|
221
|
-
status: {
|
|
222
|
-
type: String,
|
|
223
|
-
enum: ['reserved', 'booked', 'canceled', 'cancelled', 'checked-in', 'checked-out', 'completed'],
|
|
224
|
-
default: 'reserved'
|
|
225
|
-
},
|
|
226
|
-
statusHistory: [{
|
|
227
|
-
status: {
|
|
228
|
-
type: String,
|
|
229
|
-
enum: ['reserved', 'booked', 'canceled', 'cancelled', 'checked-in', 'checked-out', 'completed'],
|
|
230
|
-
required: true
|
|
231
|
-
},
|
|
232
|
-
timestamp: {
|
|
233
|
-
type: Date,
|
|
234
|
-
default: Date.now
|
|
235
|
-
},
|
|
236
|
-
updatedBy: mongoose.Schema.Types.ObjectId
|
|
237
|
-
}],
|
|
238
|
-
// Partial payment and reservation settings
|
|
239
|
-
partialPaymentAllowed: {
|
|
240
|
-
type: Boolean,
|
|
241
|
-
default: true
|
|
242
|
-
},
|
|
243
|
-
paymentDeadline: {
|
|
244
|
-
type: Date
|
|
245
|
-
},
|
|
246
|
-
reassignmentAllowed: {
|
|
247
|
-
type: Boolean,
|
|
248
|
-
default: true
|
|
249
|
-
},
|
|
250
|
-
// Reservation policy details
|
|
251
|
-
reservationPolicy: {
|
|
252
|
-
type: String,
|
|
253
|
-
default: 'Units can be reserved with partial payment. Full payment required before check-in. Reserved units may be reassigned if payment deadline is not met.'
|
|
254
|
-
},
|
|
255
|
-
cancellationDetails: {
|
|
256
|
-
date: Date,
|
|
257
|
-
reason: String,
|
|
258
|
-
refundAmount: Number,
|
|
259
|
-
refundStatus: {
|
|
260
|
-
type: String,
|
|
261
|
-
enum: ["Pending", "Approved", "Rejected"],
|
|
262
|
-
default: "Pending"
|
|
263
|
-
},
|
|
264
|
-
refundPaymentId: {
|
|
265
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
266
|
-
ref: "CashPayment"
|
|
267
|
-
},
|
|
268
|
-
refundReference: String,
|
|
269
|
-
refundRequestedAt: Date,
|
|
270
|
-
refundApprovedAt: Date,
|
|
271
|
-
refundRejectedAt: Date,
|
|
272
|
-
refundRejectionReason: String,
|
|
273
|
-
// Records which named CancellationPolicy (if any) determined
|
|
274
|
-
// refundAmount, for display/audit purposes
|
|
275
|
-
appliedPolicy: {
|
|
276
|
-
policyId: {
|
|
277
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
278
|
-
ref: 'CancellationPolicy'
|
|
279
|
-
},
|
|
280
|
-
policyName: String,
|
|
281
|
-
refundPercentage: Number
|
|
282
|
-
}
|
|
283
|
-
},
|
|
284
|
-
createdBy: {
|
|
285
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
286
|
-
ref: 'User',
|
|
287
|
-
},
|
|
288
|
-
updatedBy: {
|
|
289
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
290
|
-
ref: 'User'
|
|
291
|
-
}
|
|
292
|
-
}, {
|
|
293
|
-
timestamps: true
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
// Create model from schema
|
|
297
|
-
const BookingReservation = mongoose.model('BookingReservation', bookingReservationSchema);
|
|
298
|
-
|
|
1
|
+
const mongoose = require('mongoose');
|
|
2
|
+
|
|
3
|
+
// Define the schema for Booking Reservations
|
|
4
|
+
const bookingReservationSchema = new mongoose.Schema({
|
|
5
|
+
checkOutActual: {
|
|
6
|
+
type: Date
|
|
7
|
+
},
|
|
8
|
+
// When the guest was actually checked in (set by the Check In action)
|
|
9
|
+
checkedInAt: {
|
|
10
|
+
type: Date
|
|
11
|
+
},
|
|
12
|
+
// Field for checkout notes
|
|
13
|
+
checkoutNotes: {
|
|
14
|
+
type: String,
|
|
15
|
+
default: ''
|
|
16
|
+
},
|
|
17
|
+
// Field for the final amount paid (may differ from original totalAmount)
|
|
18
|
+
finalAmount: {
|
|
19
|
+
type: Number
|
|
20
|
+
},
|
|
21
|
+
// Field for additional charges at checkout
|
|
22
|
+
additionalCheckoutCharges: [{
|
|
23
|
+
description: {
|
|
24
|
+
type: String,
|
|
25
|
+
required: true
|
|
26
|
+
},
|
|
27
|
+
amount: {
|
|
28
|
+
type: Number,
|
|
29
|
+
required: true
|
|
30
|
+
},
|
|
31
|
+
reason: {
|
|
32
|
+
type: String
|
|
33
|
+
},
|
|
34
|
+
status: {
|
|
35
|
+
type: String,
|
|
36
|
+
enum: ['Unpaid', 'Partially Paid', 'Paid'],
|
|
37
|
+
default: 'Unpaid'
|
|
38
|
+
},
|
|
39
|
+
paidAmount: {
|
|
40
|
+
type: Number,
|
|
41
|
+
default: 0
|
|
42
|
+
},
|
|
43
|
+
addedAt: {
|
|
44
|
+
type: Date,
|
|
45
|
+
default: Date.now
|
|
46
|
+
}
|
|
47
|
+
}],
|
|
48
|
+
// Field to track if this reservation has been included in revenue calculations
|
|
49
|
+
revenueProcessed: {
|
|
50
|
+
type: Boolean,
|
|
51
|
+
default: false
|
|
52
|
+
},
|
|
53
|
+
// Field to store the checkout date
|
|
54
|
+
checkoutDate: {
|
|
55
|
+
type: Date
|
|
56
|
+
},
|
|
57
|
+
// Flag to indicate checkout is pending finance approval
|
|
58
|
+
checkoutPending: {
|
|
59
|
+
type: Boolean,
|
|
60
|
+
default: false
|
|
61
|
+
},
|
|
62
|
+
facilityId: {
|
|
63
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
64
|
+
ref: 'Facility',
|
|
65
|
+
required: true
|
|
66
|
+
},
|
|
67
|
+
bookingPropertyId: {
|
|
68
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
69
|
+
ref: 'BookingProperty',
|
|
70
|
+
required: true
|
|
71
|
+
},
|
|
72
|
+
unitId: {
|
|
73
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
74
|
+
ref: 'Unit',
|
|
75
|
+
required: true
|
|
76
|
+
},
|
|
77
|
+
bookingReservationId: {
|
|
78
|
+
type: String,
|
|
79
|
+
required: true,
|
|
80
|
+
unique: true
|
|
81
|
+
},
|
|
82
|
+
// Which staff member created this booking - always an explicit manual
|
|
83
|
+
// selection (never auto-filled from the logged-in user), so the invoice
|
|
84
|
+
// can show "You were served by <name>".
|
|
85
|
+
servedBy: {
|
|
86
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
87
|
+
ref: 'User'
|
|
88
|
+
},
|
|
89
|
+
servedByName: {
|
|
90
|
+
type: String,
|
|
91
|
+
default: ''
|
|
92
|
+
},
|
|
93
|
+
guestInfo: {
|
|
94
|
+
name: {
|
|
95
|
+
type: String,
|
|
96
|
+
required: true
|
|
97
|
+
},
|
|
98
|
+
email: {
|
|
99
|
+
type: String,
|
|
100
|
+
required: true
|
|
101
|
+
},
|
|
102
|
+
phone: {
|
|
103
|
+
type: String,
|
|
104
|
+
required: true
|
|
105
|
+
},
|
|
106
|
+
// Not required: guests booking online (external API / widget) often
|
|
107
|
+
// don't have this to hand until check-in, and both create_reservation.js
|
|
108
|
+
// (internal) and create_booking.js (external) already treat it as
|
|
109
|
+
// optional at their own validation layer, defaulting to '' - this
|
|
110
|
+
// schema requirement was rejecting exactly those bookings.
|
|
111
|
+
idNumber: {
|
|
112
|
+
type: String,
|
|
113
|
+
default: ''
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
checkIn: {
|
|
117
|
+
type: Date,
|
|
118
|
+
required: true
|
|
119
|
+
},
|
|
120
|
+
checkOut: {
|
|
121
|
+
type: Date,
|
|
122
|
+
required: true
|
|
123
|
+
},
|
|
124
|
+
guests: {
|
|
125
|
+
adults: {
|
|
126
|
+
type: Number,
|
|
127
|
+
default: 1
|
|
128
|
+
},
|
|
129
|
+
children: {
|
|
130
|
+
type: Number,
|
|
131
|
+
default: 0
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
basePrice: {
|
|
135
|
+
type: Number,
|
|
136
|
+
required: false
|
|
137
|
+
},
|
|
138
|
+
totalAmount: {
|
|
139
|
+
type: Number,
|
|
140
|
+
required: false
|
|
141
|
+
},
|
|
142
|
+
// Running total of confirmed payments applied to this reservation's
|
|
143
|
+
// invoice - kept in sync by applyBookingInvoicePayment.js so the
|
|
144
|
+
// booking list can gate check-in eligibility (paymentTiming rules)
|
|
145
|
+
// without an extra invoice lookup per row.
|
|
146
|
+
totalPaidAmount: {
|
|
147
|
+
type: Number,
|
|
148
|
+
default: 0
|
|
149
|
+
},
|
|
150
|
+
commission: {
|
|
151
|
+
type: Number,
|
|
152
|
+
required: false
|
|
153
|
+
},
|
|
154
|
+
landlordAmount: {
|
|
155
|
+
type: Number,
|
|
156
|
+
required: false
|
|
157
|
+
},
|
|
158
|
+
currencyId: {
|
|
159
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
160
|
+
ref: 'Currency',
|
|
161
|
+
required: false
|
|
162
|
+
},
|
|
163
|
+
paymentMethod: {
|
|
164
|
+
type: String,
|
|
165
|
+
enum: ['Cash', 'Card', 'Bank Transfer', 'Mobile Money', 'Other'],
|
|
166
|
+
required: false
|
|
167
|
+
},
|
|
168
|
+
paymentTiming: {
|
|
169
|
+
type: String,
|
|
170
|
+
enum: ['Before', 'After', 'Split', 'PerNight'],
|
|
171
|
+
default: 'Before'
|
|
172
|
+
},
|
|
173
|
+
// Only used when paymentTiming is 'Split' - guest must pay at least
|
|
174
|
+
// this percentage of the total before check-in is allowed.
|
|
175
|
+
splitPaymentPercentage: {
|
|
176
|
+
type: Number,
|
|
177
|
+
min: 1,
|
|
178
|
+
max: 100,
|
|
179
|
+
default: null
|
|
180
|
+
},
|
|
181
|
+
// Only used when paymentTiming is 'PerNight' - prevents sending more
|
|
182
|
+
// than one payment reminder per business day.
|
|
183
|
+
lastPerNightReminderSentAt: {
|
|
184
|
+
type: Date,
|
|
185
|
+
default: null
|
|
186
|
+
},
|
|
187
|
+
invoiceId: {
|
|
188
|
+
type: String
|
|
189
|
+
},
|
|
190
|
+
// For additional services
|
|
191
|
+
additionalServices: [{
|
|
192
|
+
serviceId: {
|
|
193
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
194
|
+
ref: 'ValueAddedService'
|
|
195
|
+
},
|
|
196
|
+
serviceName: {
|
|
197
|
+
type: String,
|
|
198
|
+
required: true
|
|
199
|
+
},
|
|
200
|
+
quantity: {
|
|
201
|
+
type: Number,
|
|
202
|
+
default: 1
|
|
203
|
+
},
|
|
204
|
+
price: {
|
|
205
|
+
type: Number,
|
|
206
|
+
required: true
|
|
207
|
+
}
|
|
208
|
+
}],
|
|
209
|
+
specialRequests: {
|
|
210
|
+
type: String
|
|
211
|
+
},
|
|
212
|
+
// This enum is a superset shared across companies on this multitenant
|
|
213
|
+
// platform (payservedb has no per-company branch) - each company's own
|
|
214
|
+
// controller code decides how 'booked'/'reserved' are actually used, so
|
|
215
|
+
// do not change the default here without checking every consumer.
|
|
216
|
+
// Swan: booked = created, zero payment. reserved = has payment (partial
|
|
217
|
+
// or full), not yet checked in. checked-in = guest on premises.
|
|
218
|
+
// checked-out = guest left but balance outstanding (e.g. damage
|
|
219
|
+
// charges). completed = balance cleared. cancelled = terminal, reachable
|
|
220
|
+
// from booked/reserved.
|
|
221
|
+
status: {
|
|
222
|
+
type: String,
|
|
223
|
+
enum: ['reserved', 'booked', 'canceled', 'cancelled', 'checked-in', 'checked-out', 'completed'],
|
|
224
|
+
default: 'reserved'
|
|
225
|
+
},
|
|
226
|
+
statusHistory: [{
|
|
227
|
+
status: {
|
|
228
|
+
type: String,
|
|
229
|
+
enum: ['reserved', 'booked', 'canceled', 'cancelled', 'checked-in', 'checked-out', 'completed'],
|
|
230
|
+
required: true
|
|
231
|
+
},
|
|
232
|
+
timestamp: {
|
|
233
|
+
type: Date,
|
|
234
|
+
default: Date.now
|
|
235
|
+
},
|
|
236
|
+
updatedBy: mongoose.Schema.Types.ObjectId
|
|
237
|
+
}],
|
|
238
|
+
// Partial payment and reservation settings
|
|
239
|
+
partialPaymentAllowed: {
|
|
240
|
+
type: Boolean,
|
|
241
|
+
default: true
|
|
242
|
+
},
|
|
243
|
+
paymentDeadline: {
|
|
244
|
+
type: Date
|
|
245
|
+
},
|
|
246
|
+
reassignmentAllowed: {
|
|
247
|
+
type: Boolean,
|
|
248
|
+
default: true
|
|
249
|
+
},
|
|
250
|
+
// Reservation policy details
|
|
251
|
+
reservationPolicy: {
|
|
252
|
+
type: String,
|
|
253
|
+
default: 'Units can be reserved with partial payment. Full payment required before check-in. Reserved units may be reassigned if payment deadline is not met.'
|
|
254
|
+
},
|
|
255
|
+
cancellationDetails: {
|
|
256
|
+
date: Date,
|
|
257
|
+
reason: String,
|
|
258
|
+
refundAmount: Number,
|
|
259
|
+
refundStatus: {
|
|
260
|
+
type: String,
|
|
261
|
+
enum: ["Pending", "Approved", "Rejected"],
|
|
262
|
+
default: "Pending"
|
|
263
|
+
},
|
|
264
|
+
refundPaymentId: {
|
|
265
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
266
|
+
ref: "CashPayment"
|
|
267
|
+
},
|
|
268
|
+
refundReference: String,
|
|
269
|
+
refundRequestedAt: Date,
|
|
270
|
+
refundApprovedAt: Date,
|
|
271
|
+
refundRejectedAt: Date,
|
|
272
|
+
refundRejectionReason: String,
|
|
273
|
+
// Records which named CancellationPolicy (if any) determined
|
|
274
|
+
// refundAmount, for display/audit purposes
|
|
275
|
+
appliedPolicy: {
|
|
276
|
+
policyId: {
|
|
277
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
278
|
+
ref: 'CancellationPolicy'
|
|
279
|
+
},
|
|
280
|
+
policyName: String,
|
|
281
|
+
refundPercentage: Number
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
createdBy: {
|
|
285
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
286
|
+
ref: 'User',
|
|
287
|
+
},
|
|
288
|
+
updatedBy: {
|
|
289
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
290
|
+
ref: 'User'
|
|
291
|
+
}
|
|
292
|
+
}, {
|
|
293
|
+
timestamps: true
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
// Create model from schema
|
|
297
|
+
const BookingReservation = mongoose.model('BookingReservation', bookingReservationSchema);
|
|
298
|
+
|
|
299
299
|
module.exports = BookingReservation;
|