payservedb 9.5.3 → 9.5.5
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 -67
- package/src/models/bookingproperty.js +212 -187
- package/src/models/bookingreservation.js +299 -266
- 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 +569 -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 +139 -139
- 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 +95 -95
- 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 +296 -296
- 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,188 +1,188 @@
|
|
|
1
|
-
const mongoose = require('mongoose');
|
|
2
|
-
|
|
3
|
-
// Define the schema for Booking Invoices
|
|
4
|
-
const bookingInvoiceSchema = new mongoose.Schema({
|
|
5
|
-
invoiceNumber: {
|
|
6
|
-
type: String,
|
|
7
|
-
required: true,
|
|
8
|
-
unique: true,
|
|
9
|
-
},
|
|
10
|
-
facilityId: {
|
|
11
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
12
|
-
ref: 'Facility',
|
|
13
|
-
required: true
|
|
14
|
-
},
|
|
15
|
-
invoiceId: {
|
|
16
|
-
type: String,
|
|
17
|
-
required: true,
|
|
18
|
-
unique: true
|
|
19
|
-
},
|
|
20
|
-
accountNumber: {
|
|
21
|
-
type: String,
|
|
22
|
-
unique: true,
|
|
23
|
-
sparse: true // Allow null/undefined values while maintaining uniqueness for non-null values
|
|
24
|
-
},
|
|
25
|
-
// Reservation-billed invoices (the default/original use of this model)
|
|
26
|
-
// always set bookingReservationId. Recurring landlord listing-fee
|
|
27
|
-
// invoices (invoiceType: 'ListingFee') are not tied to a reservation,
|
|
28
|
-
// so this is intentionally not required at the schema level.
|
|
29
|
-
bookingReservationId: {
|
|
30
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
31
|
-
ref: 'BookingReservation'
|
|
32
|
-
},
|
|
33
|
-
// Distinguishes a guest-facing reservation invoice from a recurring
|
|
34
|
-
// landlord listing-fee invoice billed for hosting a unit on the
|
|
35
|
-
// booking platform (Managed by Landlord units).
|
|
36
|
-
invoiceType: {
|
|
37
|
-
type: String,
|
|
38
|
-
enum: ['Reservation', 'ListingFee'],
|
|
39
|
-
default: 'Reservation'
|
|
40
|
-
},
|
|
41
|
-
// Landlord being billed - only set for invoiceType: 'ListingFee'
|
|
42
|
-
landlordId: {
|
|
43
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
44
|
-
ref: 'Customer'
|
|
45
|
-
},
|
|
46
|
-
// "YYYY-MM" of the billing period - only set for invoiceType: 'ListingFee',
|
|
47
|
-
// used to prevent generating more than one listing-fee invoice per unit
|
|
48
|
-
// per month
|
|
49
|
-
billingYearMonth: {
|
|
50
|
-
type: String
|
|
51
|
-
},
|
|
52
|
-
unitId: {
|
|
53
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
54
|
-
ref: 'Unit',
|
|
55
|
-
required: true
|
|
56
|
-
},
|
|
57
|
-
guestInfo: {
|
|
58
|
-
name: {
|
|
59
|
-
type: String,
|
|
60
|
-
required: true
|
|
61
|
-
},
|
|
62
|
-
email: {
|
|
63
|
-
type: String,
|
|
64
|
-
required: true
|
|
65
|
-
},
|
|
66
|
-
phone: {
|
|
67
|
-
type: String,
|
|
68
|
-
required: true
|
|
69
|
-
},
|
|
70
|
-
idNumber: {
|
|
71
|
-
type: String
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
issueDate: {
|
|
75
|
-
type: Date,
|
|
76
|
-
default: Date.now,
|
|
77
|
-
required: true
|
|
78
|
-
},
|
|
79
|
-
dueDate: {
|
|
80
|
-
type: Date,
|
|
81
|
-
required: true
|
|
82
|
-
},
|
|
83
|
-
checkIn: {
|
|
84
|
-
type: Date,
|
|
85
|
-
required: true
|
|
86
|
-
},
|
|
87
|
-
checkOut: {
|
|
88
|
-
type: Date,
|
|
89
|
-
required: true
|
|
90
|
-
},
|
|
91
|
-
basePrice: {
|
|
92
|
-
type: Number,
|
|
93
|
-
required: true
|
|
94
|
-
},
|
|
95
|
-
totalAmount: {
|
|
96
|
-
type: Number,
|
|
97
|
-
required: true
|
|
98
|
-
},
|
|
99
|
-
additionalServices: [{
|
|
100
|
-
serviceId: {
|
|
101
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
102
|
-
ref: 'ValueAddedService'
|
|
103
|
-
},
|
|
104
|
-
serviceName: {
|
|
105
|
-
type: String,
|
|
106
|
-
required: true
|
|
107
|
-
},
|
|
108
|
-
quantity: {
|
|
109
|
-
type: Number,
|
|
110
|
-
default: 1
|
|
111
|
-
},
|
|
112
|
-
price: {
|
|
113
|
-
type: Number,
|
|
114
|
-
required: true
|
|
115
|
-
}
|
|
116
|
-
}],
|
|
117
|
-
discountAmount: {
|
|
118
|
-
type: Number,
|
|
119
|
-
default: 0
|
|
120
|
-
},
|
|
121
|
-
taxAmount: {
|
|
122
|
-
type: Number,
|
|
123
|
-
default: 0
|
|
124
|
-
},
|
|
125
|
-
paymentMethod: {
|
|
126
|
-
type: String,
|
|
127
|
-
enum: ['Cash', 'Card', 'Bank Transfer', 'Mobile Money', 'Other'],
|
|
128
|
-
required: true
|
|
129
|
-
},
|
|
130
|
-
paymentStatus: {
|
|
131
|
-
type: String,
|
|
132
|
-
enum: ['Pending', 'Paid', 'Partially Paid', 'Refunded', 'Cancelled'],
|
|
133
|
-
default: 'Pending'
|
|
134
|
-
},
|
|
135
|
-
paymentHistory: [{
|
|
136
|
-
amount: {
|
|
137
|
-
type: Number,
|
|
138
|
-
required: true
|
|
139
|
-
},
|
|
140
|
-
paymentMethod: {
|
|
141
|
-
type: String,
|
|
142
|
-
enum: ['Cash', 'Card', 'Bank Transfer', 'Mobile Money', 'Other'],
|
|
143
|
-
required: true
|
|
144
|
-
},
|
|
145
|
-
transactionId: String,
|
|
146
|
-
date: {
|
|
147
|
-
type: Date,
|
|
148
|
-
default: Date.now
|
|
149
|
-
},
|
|
150
|
-
notes: String
|
|
151
|
-
}],
|
|
152
|
-
currencyId: {
|
|
153
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
154
|
-
ref: 'Currency',
|
|
155
|
-
required: true
|
|
156
|
-
},
|
|
157
|
-
// Payment details for M-Pesa STK push
|
|
158
|
-
paymentDetails: {
|
|
159
|
-
paybillNumber: String,
|
|
160
|
-
paybillAccountName: String,
|
|
161
|
-
facilityPaymentDetailsId: {
|
|
162
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
163
|
-
ref: 'FacilityPaymentDetails'
|
|
164
|
-
}
|
|
165
|
-
},
|
|
166
|
-
status: {
|
|
167
|
-
type: String,
|
|
168
|
-
enum: ['active', 'cancelled', 'void'],
|
|
169
|
-
default: 'active'
|
|
170
|
-
},
|
|
171
|
-
notes: {
|
|
172
|
-
type: String
|
|
173
|
-
},
|
|
174
|
-
createdBy: {
|
|
175
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
176
|
-
ref: 'User'
|
|
177
|
-
},
|
|
178
|
-
updatedBy: {
|
|
179
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
180
|
-
ref: 'User'
|
|
181
|
-
}
|
|
182
|
-
}, {
|
|
183
|
-
timestamps: true
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
const BookingInvoice = mongoose.model('BookingInvoice', bookingInvoiceSchema);
|
|
187
|
-
|
|
1
|
+
const mongoose = require('mongoose');
|
|
2
|
+
|
|
3
|
+
// Define the schema for Booking Invoices
|
|
4
|
+
const bookingInvoiceSchema = new mongoose.Schema({
|
|
5
|
+
invoiceNumber: {
|
|
6
|
+
type: String,
|
|
7
|
+
required: true,
|
|
8
|
+
unique: true,
|
|
9
|
+
},
|
|
10
|
+
facilityId: {
|
|
11
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
12
|
+
ref: 'Facility',
|
|
13
|
+
required: true
|
|
14
|
+
},
|
|
15
|
+
invoiceId: {
|
|
16
|
+
type: String,
|
|
17
|
+
required: true,
|
|
18
|
+
unique: true
|
|
19
|
+
},
|
|
20
|
+
accountNumber: {
|
|
21
|
+
type: String,
|
|
22
|
+
unique: true,
|
|
23
|
+
sparse: true // Allow null/undefined values while maintaining uniqueness for non-null values
|
|
24
|
+
},
|
|
25
|
+
// Reservation-billed invoices (the default/original use of this model)
|
|
26
|
+
// always set bookingReservationId. Recurring landlord listing-fee
|
|
27
|
+
// invoices (invoiceType: 'ListingFee') are not tied to a reservation,
|
|
28
|
+
// so this is intentionally not required at the schema level.
|
|
29
|
+
bookingReservationId: {
|
|
30
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
31
|
+
ref: 'BookingReservation'
|
|
32
|
+
},
|
|
33
|
+
// Distinguishes a guest-facing reservation invoice from a recurring
|
|
34
|
+
// landlord listing-fee invoice billed for hosting a unit on the
|
|
35
|
+
// booking platform (Managed by Landlord units).
|
|
36
|
+
invoiceType: {
|
|
37
|
+
type: String,
|
|
38
|
+
enum: ['Reservation', 'ListingFee'],
|
|
39
|
+
default: 'Reservation'
|
|
40
|
+
},
|
|
41
|
+
// Landlord being billed - only set for invoiceType: 'ListingFee'
|
|
42
|
+
landlordId: {
|
|
43
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
44
|
+
ref: 'Customer'
|
|
45
|
+
},
|
|
46
|
+
// "YYYY-MM" of the billing period - only set for invoiceType: 'ListingFee',
|
|
47
|
+
// used to prevent generating more than one listing-fee invoice per unit
|
|
48
|
+
// per month
|
|
49
|
+
billingYearMonth: {
|
|
50
|
+
type: String
|
|
51
|
+
},
|
|
52
|
+
unitId: {
|
|
53
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
54
|
+
ref: 'Unit',
|
|
55
|
+
required: true
|
|
56
|
+
},
|
|
57
|
+
guestInfo: {
|
|
58
|
+
name: {
|
|
59
|
+
type: String,
|
|
60
|
+
required: true
|
|
61
|
+
},
|
|
62
|
+
email: {
|
|
63
|
+
type: String,
|
|
64
|
+
required: true
|
|
65
|
+
},
|
|
66
|
+
phone: {
|
|
67
|
+
type: String,
|
|
68
|
+
required: true
|
|
69
|
+
},
|
|
70
|
+
idNumber: {
|
|
71
|
+
type: String
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
issueDate: {
|
|
75
|
+
type: Date,
|
|
76
|
+
default: Date.now,
|
|
77
|
+
required: true
|
|
78
|
+
},
|
|
79
|
+
dueDate: {
|
|
80
|
+
type: Date,
|
|
81
|
+
required: true
|
|
82
|
+
},
|
|
83
|
+
checkIn: {
|
|
84
|
+
type: Date,
|
|
85
|
+
required: true
|
|
86
|
+
},
|
|
87
|
+
checkOut: {
|
|
88
|
+
type: Date,
|
|
89
|
+
required: true
|
|
90
|
+
},
|
|
91
|
+
basePrice: {
|
|
92
|
+
type: Number,
|
|
93
|
+
required: true
|
|
94
|
+
},
|
|
95
|
+
totalAmount: {
|
|
96
|
+
type: Number,
|
|
97
|
+
required: true
|
|
98
|
+
},
|
|
99
|
+
additionalServices: [{
|
|
100
|
+
serviceId: {
|
|
101
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
102
|
+
ref: 'ValueAddedService'
|
|
103
|
+
},
|
|
104
|
+
serviceName: {
|
|
105
|
+
type: String,
|
|
106
|
+
required: true
|
|
107
|
+
},
|
|
108
|
+
quantity: {
|
|
109
|
+
type: Number,
|
|
110
|
+
default: 1
|
|
111
|
+
},
|
|
112
|
+
price: {
|
|
113
|
+
type: Number,
|
|
114
|
+
required: true
|
|
115
|
+
}
|
|
116
|
+
}],
|
|
117
|
+
discountAmount: {
|
|
118
|
+
type: Number,
|
|
119
|
+
default: 0
|
|
120
|
+
},
|
|
121
|
+
taxAmount: {
|
|
122
|
+
type: Number,
|
|
123
|
+
default: 0
|
|
124
|
+
},
|
|
125
|
+
paymentMethod: {
|
|
126
|
+
type: String,
|
|
127
|
+
enum: ['Cash', 'Card', 'Bank Transfer', 'Mobile Money', 'Other'],
|
|
128
|
+
required: true
|
|
129
|
+
},
|
|
130
|
+
paymentStatus: {
|
|
131
|
+
type: String,
|
|
132
|
+
enum: ['Pending', 'Paid', 'Partially Paid', 'Refunded', 'Cancelled'],
|
|
133
|
+
default: 'Pending'
|
|
134
|
+
},
|
|
135
|
+
paymentHistory: [{
|
|
136
|
+
amount: {
|
|
137
|
+
type: Number,
|
|
138
|
+
required: true
|
|
139
|
+
},
|
|
140
|
+
paymentMethod: {
|
|
141
|
+
type: String,
|
|
142
|
+
enum: ['Cash', 'Card', 'Bank Transfer', 'Mobile Money', 'Other'],
|
|
143
|
+
required: true
|
|
144
|
+
},
|
|
145
|
+
transactionId: String,
|
|
146
|
+
date: {
|
|
147
|
+
type: Date,
|
|
148
|
+
default: Date.now
|
|
149
|
+
},
|
|
150
|
+
notes: String
|
|
151
|
+
}],
|
|
152
|
+
currencyId: {
|
|
153
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
154
|
+
ref: 'Currency',
|
|
155
|
+
required: true
|
|
156
|
+
},
|
|
157
|
+
// Payment details for M-Pesa STK push
|
|
158
|
+
paymentDetails: {
|
|
159
|
+
paybillNumber: String,
|
|
160
|
+
paybillAccountName: String,
|
|
161
|
+
facilityPaymentDetailsId: {
|
|
162
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
163
|
+
ref: 'FacilityPaymentDetails'
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
status: {
|
|
167
|
+
type: String,
|
|
168
|
+
enum: ['active', 'cancelled', 'void'],
|
|
169
|
+
default: 'active'
|
|
170
|
+
},
|
|
171
|
+
notes: {
|
|
172
|
+
type: String
|
|
173
|
+
},
|
|
174
|
+
createdBy: {
|
|
175
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
176
|
+
ref: 'User'
|
|
177
|
+
},
|
|
178
|
+
updatedBy: {
|
|
179
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
180
|
+
ref: 'User'
|
|
181
|
+
}
|
|
182
|
+
}, {
|
|
183
|
+
timestamps: true
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const BookingInvoice = mongoose.model('BookingInvoice', bookingInvoiceSchema);
|
|
187
|
+
|
|
188
188
|
module.exports = BookingInvoice;
|
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
const mongoose = require('mongoose');
|
|
2
|
-
|
|
3
|
-
// Define schema for Booking Analytics
|
|
4
|
-
const bookingAnalyticsSchema = new mongoose.Schema({
|
|
5
|
-
facilityId: {
|
|
6
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
7
|
-
ref: 'Facility',
|
|
8
|
-
required: true
|
|
9
|
-
},
|
|
10
|
-
date: {
|
|
11
|
-
type: Date,
|
|
12
|
-
required: true
|
|
13
|
-
},
|
|
14
|
-
metrics: {
|
|
15
|
-
totalBookings: {
|
|
16
|
-
type: Number,
|
|
17
|
-
default: 0
|
|
18
|
-
},
|
|
19
|
-
totalRevenue: {
|
|
20
|
-
type: Number,
|
|
21
|
-
default: 0
|
|
22
|
-
},
|
|
23
|
-
pmCommission: {
|
|
24
|
-
type: Number,
|
|
25
|
-
default: 0
|
|
26
|
-
},
|
|
27
|
-
landlordRevenue: {
|
|
28
|
-
type: Number,
|
|
29
|
-
default: 0
|
|
30
|
-
},
|
|
31
|
-
occupancyRate: {
|
|
32
|
-
type: Number,
|
|
33
|
-
default: 0
|
|
34
|
-
},
|
|
35
|
-
averageDailyRate: {
|
|
36
|
-
type: Number,
|
|
37
|
-
default: 0
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
bookingsByStatus: {
|
|
41
|
-
new: {
|
|
42
|
-
type: Number,
|
|
43
|
-
default: 0
|
|
44
|
-
},
|
|
45
|
-
confirmed: {
|
|
46
|
-
type: Number,
|
|
47
|
-
default: 0
|
|
48
|
-
},
|
|
49
|
-
cancelled: {
|
|
50
|
-
type: Number,
|
|
51
|
-
default: 0
|
|
52
|
-
},
|
|
53
|
-
completed: {
|
|
54
|
-
type: Number,
|
|
55
|
-
default: 0
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}, {
|
|
59
|
-
timestamps: true
|
|
60
|
-
});
|
|
61
|
-
// Create model from schema
|
|
62
|
-
const BookingAnalytics = mongoose.model('BookingAnalytics', bookingAnalyticsSchema);
|
|
63
|
-
|
|
1
|
+
const mongoose = require('mongoose');
|
|
2
|
+
|
|
3
|
+
// Define schema for Booking Analytics
|
|
4
|
+
const bookingAnalyticsSchema = new mongoose.Schema({
|
|
5
|
+
facilityId: {
|
|
6
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
7
|
+
ref: 'Facility',
|
|
8
|
+
required: true
|
|
9
|
+
},
|
|
10
|
+
date: {
|
|
11
|
+
type: Date,
|
|
12
|
+
required: true
|
|
13
|
+
},
|
|
14
|
+
metrics: {
|
|
15
|
+
totalBookings: {
|
|
16
|
+
type: Number,
|
|
17
|
+
default: 0
|
|
18
|
+
},
|
|
19
|
+
totalRevenue: {
|
|
20
|
+
type: Number,
|
|
21
|
+
default: 0
|
|
22
|
+
},
|
|
23
|
+
pmCommission: {
|
|
24
|
+
type: Number,
|
|
25
|
+
default: 0
|
|
26
|
+
},
|
|
27
|
+
landlordRevenue: {
|
|
28
|
+
type: Number,
|
|
29
|
+
default: 0
|
|
30
|
+
},
|
|
31
|
+
occupancyRate: {
|
|
32
|
+
type: Number,
|
|
33
|
+
default: 0
|
|
34
|
+
},
|
|
35
|
+
averageDailyRate: {
|
|
36
|
+
type: Number,
|
|
37
|
+
default: 0
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
bookingsByStatus: {
|
|
41
|
+
new: {
|
|
42
|
+
type: Number,
|
|
43
|
+
default: 0
|
|
44
|
+
},
|
|
45
|
+
confirmed: {
|
|
46
|
+
type: Number,
|
|
47
|
+
default: 0
|
|
48
|
+
},
|
|
49
|
+
cancelled: {
|
|
50
|
+
type: Number,
|
|
51
|
+
default: 0
|
|
52
|
+
},
|
|
53
|
+
completed: {
|
|
54
|
+
type: Number,
|
|
55
|
+
default: 0
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}, {
|
|
59
|
+
timestamps: true
|
|
60
|
+
});
|
|
61
|
+
// Create model from schema
|
|
62
|
+
const BookingAnalytics = mongoose.model('BookingAnalytics', bookingAnalyticsSchema);
|
|
63
|
+
|
|
64
64
|
module.exports = BookingAnalytics;
|
|
@@ -1,68 +1,75 @@
|
|
|
1
|
-
const mongoose = require('mongoose');
|
|
2
|
-
|
|
3
|
-
// Define schema for API Configuration (for Booking.com integration if needed)
|
|
4
|
-
const bookingConfigSchema = new mongoose.Schema({
|
|
5
|
-
facilityId: {
|
|
6
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
7
|
-
ref: 'Facility',
|
|
8
|
-
required: true
|
|
9
|
-
},
|
|
10
|
-
apiKey: {
|
|
11
|
-
type: String,
|
|
12
|
-
required: false
|
|
13
|
-
},
|
|
14
|
-
apiSecret: {
|
|
15
|
-
type: String,
|
|
16
|
-
required: false
|
|
17
|
-
},
|
|
18
|
-
isEnabled: {
|
|
19
|
-
type: Boolean,
|
|
20
|
-
default: false
|
|
21
|
-
},
|
|
22
|
-
lastConnected: {
|
|
23
|
-
type: Date
|
|
24
|
-
},
|
|
25
|
-
settings: {
|
|
26
|
-
autoAcceptBookings: {
|
|
27
|
-
type: Boolean,
|
|
28
|
-
default: false
|
|
29
|
-
},
|
|
30
|
-
syncCalendar: {
|
|
31
|
-
type: Boolean,
|
|
32
|
-
default: true
|
|
33
|
-
},
|
|
34
|
-
defaultCommission: {
|
|
35
|
-
type: Number,
|
|
36
|
-
default: 10
|
|
37
|
-
},
|
|
38
|
-
// Business-day cutoff, "HH:mm" 24h format. A checkout/checkin
|
|
39
|
-
// timestamp before this time counts as belonging to the previous
|
|
40
|
-
// calendar day (see src/utils/resolveBusinessDay.js).
|
|
41
|
-
dayEndTime: {
|
|
42
|
-
type: String,
|
|
43
|
-
default: '00:00',
|
|
44
|
-
validate: {
|
|
45
|
-
validator: (value) => /^([01]\d|2[0-3]):([0-5]\d)$/.test(value),
|
|
46
|
-
message: 'dayEndTime must be in HH:mm 24-hour format'
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
// Recurring fee (per Phase 3b) charged to landlords whose unit is
|
|
50
|
-
// listed via the facility's booking platform (managedByLandlord=true).
|
|
51
|
-
listingFeeAmount: {
|
|
52
|
-
type: Number,
|
|
53
|
-
default: 0,
|
|
54
|
-
min: 0
|
|
55
|
-
},
|
|
56
|
-
listingFeeCurrencyId: {
|
|
57
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
58
|
-
ref: 'Currency'
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
1
|
+
const mongoose = require('mongoose');
|
|
2
|
+
|
|
3
|
+
// Define schema for API Configuration (for Booking.com integration if needed)
|
|
4
|
+
const bookingConfigSchema = new mongoose.Schema({
|
|
5
|
+
facilityId: {
|
|
6
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
7
|
+
ref: 'Facility',
|
|
8
|
+
required: true
|
|
9
|
+
},
|
|
10
|
+
apiKey: {
|
|
11
|
+
type: String,
|
|
12
|
+
required: false
|
|
13
|
+
},
|
|
14
|
+
apiSecret: {
|
|
15
|
+
type: String,
|
|
16
|
+
required: false
|
|
17
|
+
},
|
|
18
|
+
isEnabled: {
|
|
19
|
+
type: Boolean,
|
|
20
|
+
default: false
|
|
21
|
+
},
|
|
22
|
+
lastConnected: {
|
|
23
|
+
type: Date
|
|
24
|
+
},
|
|
25
|
+
settings: {
|
|
26
|
+
autoAcceptBookings: {
|
|
27
|
+
type: Boolean,
|
|
28
|
+
default: false
|
|
29
|
+
},
|
|
30
|
+
syncCalendar: {
|
|
31
|
+
type: Boolean,
|
|
32
|
+
default: true
|
|
33
|
+
},
|
|
34
|
+
defaultCommission: {
|
|
35
|
+
type: Number,
|
|
36
|
+
default: 10
|
|
37
|
+
},
|
|
38
|
+
// Business-day cutoff, "HH:mm" 24h format. A checkout/checkin
|
|
39
|
+
// timestamp before this time counts as belonging to the previous
|
|
40
|
+
// calendar day (see src/utils/resolveBusinessDay.js).
|
|
41
|
+
dayEndTime: {
|
|
42
|
+
type: String,
|
|
43
|
+
default: '00:00',
|
|
44
|
+
validate: {
|
|
45
|
+
validator: (value) => /^([01]\d|2[0-3]):([0-5]\d)$/.test(value),
|
|
46
|
+
message: 'dayEndTime must be in HH:mm 24-hour format'
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
// Recurring fee (per Phase 3b) charged to landlords whose unit is
|
|
50
|
+
// listed via the facility's booking platform (managedByLandlord=true).
|
|
51
|
+
listingFeeAmount: {
|
|
52
|
+
type: Number,
|
|
53
|
+
default: 0,
|
|
54
|
+
min: 0
|
|
55
|
+
},
|
|
56
|
+
listingFeeCurrencyId: {
|
|
57
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
58
|
+
ref: 'Currency'
|
|
59
|
+
},
|
|
60
|
+
// How many minutes before dayEndTime a "Per Night" guest gets
|
|
61
|
+
// reminded to pay for the current night's stay.
|
|
62
|
+
reminderMinutesBeforeDayEnd: {
|
|
63
|
+
type: Number,
|
|
64
|
+
default: 60,
|
|
65
|
+
min: 0
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}, {
|
|
69
|
+
timestamps: true
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Create model from schema
|
|
73
|
+
const BookingConfig = mongoose.model('BookingConfig', bookingConfigSchema);
|
|
74
|
+
|
|
68
75
|
module.exports = BookingConfig;
|