payservedb 9.5.9 → 9.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/.env +2 -2
  2. package/ZOHO_INTEGRATION_SCHEMA.md +644 -644
  3. package/index.js +418 -418
  4. package/package.json +17 -17
  5. package/src/models/InvoiceWithholdingTax.js +67 -67
  6. package/src/models/account.js +59 -59
  7. package/src/models/agent_departments.js +59 -59
  8. package/src/models/agent_notifications.js +53 -53
  9. package/src/models/agent_performance.js +127 -127
  10. package/src/models/agent_roles.js +77 -77
  11. package/src/models/agents.js +154 -154
  12. package/src/models/apilog.js +18 -18
  13. package/src/models/approvalsWorkflows.js +49 -49
  14. package/src/models/archivedapilog.js +18 -18
  15. package/src/models/asset.js +92 -92
  16. package/src/models/assetsAssignment.js +64 -64
  17. package/src/models/auditTrail.js +346 -346
  18. package/src/models/auto_reply_rule.js +68 -68
  19. package/src/models/bankdetails.js +47 -47
  20. package/src/models/billerAddress.js +124 -124
  21. package/src/models/booking_invoice.js +187 -187
  22. package/src/models/bookinganalytics.js +63 -63
  23. package/src/models/bookingconfig.js +74 -74
  24. package/src/models/bookingproperty.js +211 -211
  25. package/src/models/bookingreservation.js +298 -298
  26. package/src/models/bookingrevenuerecord.js +84 -84
  27. package/src/models/budget.js +95 -95
  28. package/src/models/budgetCategory.js +19 -19
  29. package/src/models/campaigns.js +108 -108
  30. package/src/models/cancellation_policy.js +56 -56
  31. package/src/models/cashpayment.js +289 -289
  32. package/src/models/combinedUnits.js +62 -62
  33. package/src/models/combined_invoice.js +424 -424
  34. package/src/models/common_area_electricity.js +38 -38
  35. package/src/models/common_area_generator.js +41 -41
  36. package/src/models/common_area_utility_alert.js +37 -37
  37. package/src/models/common_area_water.js +39 -39
  38. package/src/models/communication_status.js +33 -33
  39. package/src/models/communication_user_opt.js +32 -32
  40. package/src/models/community_guidelines.js +35 -35
  41. package/src/models/company.js +53 -53
  42. package/src/models/coreBaseSettings.js +16 -16
  43. package/src/models/coreInvoiceSettings.js +100 -100
  44. package/src/models/counter_schema.js +21 -21
  45. package/src/models/country_tax.js +42 -42
  46. package/src/models/currency_settings.js +39 -39
  47. package/src/models/customer.js +251 -251
  48. package/src/models/customer_preference.js +52 -52
  49. package/src/models/customer_satisfaction_survey.js +297 -297
  50. package/src/models/customer_surveys.js +139 -139
  51. package/src/models/customer_tickets.js +237 -237
  52. package/src/models/dailyChecklist.js +312 -312
  53. package/src/models/default_payment_details.js +17 -17
  54. package/src/models/deliveryTimeMarks.js +18 -18
  55. package/src/models/document_type.js +19 -19
  56. package/src/models/dutyRosterChecklist.js +250 -250
  57. package/src/models/dutyroster.js +136 -136
  58. package/src/models/email.js +37 -37
  59. package/src/models/email_cc_config.js +48 -48
  60. package/src/models/email_sms_queue.js +61 -61
  61. package/src/models/email_thread.js +35 -35
  62. package/src/models/entry_exit.js +53 -53
  63. package/src/models/expense.js +99 -99
  64. package/src/models/expense_category.js +45 -45
  65. package/src/models/facility.js +100 -100
  66. package/src/models/facilityBillingPrices.js +29 -29
  67. package/src/models/facilityInvoice.js +240 -240
  68. package/src/models/facilityInvoicePayment.js +52 -52
  69. package/src/models/facilityInvoiceRecipient.js +32 -32
  70. package/src/models/facilityWalletTransactionsMetadata.js +236 -236
  71. package/src/models/facility_departements.js +20 -20
  72. package/src/models/facility_etims_config.js +116 -116
  73. package/src/models/facility_payment_details.js +20 -20
  74. package/src/models/facility_rating.js +78 -78
  75. package/src/models/facilityasset.js +25 -25
  76. package/src/models/faq.js +15 -15
  77. package/src/models/gl_account_double_entries.js +25 -25
  78. package/src/models/gl_accounts.js +56 -56
  79. package/src/models/gl_entries.js +49 -49
  80. package/src/models/goodsReceivedNotes.js +115 -115
  81. package/src/models/guard.js +47 -47
  82. package/src/models/handover.js +258 -258
  83. package/src/models/inspection_category.js +38 -38
  84. package/src/models/invoice.js +586 -569
  85. package/src/models/invoiceCreditAdjustment.js +45 -45
  86. package/src/models/invoice_edit_log.js +81 -81
  87. package/src/models/invoice_generation_approval.js +86 -86
  88. package/src/models/invoicing_schedule.js +40 -40
  89. package/src/models/item_inspection.js +96 -96
  90. package/src/models/knowledge_base.js +109 -109
  91. package/src/models/knowledge_base_rating.js +44 -44
  92. package/src/models/leaseagreement.js +266 -266
  93. package/src/models/leasetemplate.js +17 -17
  94. package/src/models/levy.js +231 -231
  95. package/src/models/levy_deposits.js +114 -114
  96. package/src/models/levy_invoice_settings.js +26 -26
  97. package/src/models/levy_payment_receipt.js +156 -156
  98. package/src/models/levycontract.js +213 -213
  99. package/src/models/levytype.js +23 -23
  100. package/src/models/maintenance_service_vendor.js +38 -38
  101. package/src/models/maintenance_services.js +17 -17
  102. package/src/models/maintenancerequisition.js +31 -31
  103. package/src/models/master_workplan.js +32 -32
  104. package/src/models/master_workplan_child.js +34 -34
  105. package/src/models/message.js +38 -38
  106. package/src/models/module.js +21 -21
  107. package/src/models/movein_amenity.js +13 -13
  108. package/src/models/movein_application.js +28 -28
  109. package/src/models/movein_audit_log.js +21 -21
  110. package/src/models/movein_booking.js +33 -33
  111. package/src/models/movein_commission.js +46 -46
  112. package/src/models/movein_conversation.js +25 -25
  113. package/src/models/movein_deal.js +79 -79
  114. package/src/models/movein_disbursement.js +36 -36
  115. package/src/models/movein_email_thread.js +19 -19
  116. package/src/models/movein_enquiry.js +16 -16
  117. package/src/models/movein_featured_package.js +16 -16
  118. package/src/models/movein_handoff_token.js +16 -16
  119. package/src/models/movein_invoice.js +24 -24
  120. package/src/models/movein_landlord.js +18 -18
  121. package/src/models/movein_landlord_user.js +20 -20
  122. package/src/models/movein_lease.js +37 -37
  123. package/src/models/movein_message.js +27 -27
  124. package/src/models/movein_notification.js +27 -27
  125. package/src/models/movein_otp.js +14 -14
  126. package/src/models/movein_payment.js +46 -46
  127. package/src/models/movein_reminder.js +77 -77
  128. package/src/models/movein_reservation.js +31 -31
  129. package/src/models/movein_settings.js +25 -25
  130. package/src/models/movein_tenancy.js +55 -55
  131. package/src/models/movein_unit.js +59 -59
  132. package/src/models/movein_user.js +15 -15
  133. package/src/models/movein_viewing_slot.js +21 -21
  134. package/src/models/movein_want_unit.js +20 -20
  135. package/src/models/notification.js +44 -44
  136. package/src/models/paymentTermsMarks.js +19 -19
  137. package/src/models/penalty.js +76 -76
  138. package/src/models/pendingCredentials.js +32 -32
  139. package/src/models/powerMeterCommunicationProtocol.js +17 -17
  140. package/src/models/powerMeterCustomerAccount.js +78 -78
  141. package/src/models/powerMeterCustomerBand.js +14 -14
  142. package/src/models/powerMeterDailyReading.js +30 -30
  143. package/src/models/powerMeterGateways.js +40 -40
  144. package/src/models/powerMeterMonthlyReading.js +34 -34
  145. package/src/models/powerMeterPowerCharges.js +85 -85
  146. package/src/models/powerMeterSettings.js +211 -211
  147. package/src/models/powerMeterSingleDayReading.js +32 -32
  148. package/src/models/powerMeters.js +149 -149
  149. package/src/models/powerMetersManufacturer.js +14 -14
  150. package/src/models/power_invoice.js +371 -371
  151. package/src/models/power_meter_account.js +81 -81
  152. package/src/models/power_meter_command_logs.js +30 -30
  153. package/src/models/power_meter_command_queue.js +33 -33
  154. package/src/models/power_meter_negative_balance.js +44 -44
  155. package/src/models/power_prepaid_credits.js +47 -47
  156. package/src/models/power_prepaid_debits.js +53 -53
  157. package/src/models/power_prepaid_orders.js +78 -78
  158. package/src/models/power_sms_notification.js +26 -26
  159. package/src/models/privacy_policy.js +19 -19
  160. package/src/models/propertyManagementSettings.js +55 -55
  161. package/src/models/propertyManagerContract.js +611 -611
  162. package/src/models/propertyManagerRevenue.js +195 -195
  163. package/src/models/propertyManagerRevenueEntry.js +118 -118
  164. package/src/models/purchaseOrderInvoice.js +74 -74
  165. package/src/models/purchase_order.js +213 -213
  166. package/src/models/purchase_request.js +110 -110
  167. package/src/models/quickbooks_config.js +52 -52
  168. package/src/models/recipient_group.js +61 -61
  169. package/src/models/recipient_group_member.js +62 -62
  170. package/src/models/refresh_token.js +23 -23
  171. package/src/models/reminder.js +197 -197
  172. package/src/models/report.js +13 -13
  173. package/src/models/resident.js +121 -121
  174. package/src/models/rfq_details.js +131 -131
  175. package/src/models/rfq_response.js +153 -153
  176. package/src/models/service_charge_invoice_upload.js +42 -42
  177. package/src/models/service_charge_payments.js +27 -27
  178. package/src/models/servicerequest.js +55 -55
  179. package/src/models/settings.js +62 -62
  180. package/src/models/short_urls.js +21 -21
  181. package/src/models/smart_meter_daily_consumption.js +44 -44
  182. package/src/models/sms_africastalking.js +20 -20
  183. package/src/models/sms_balance_notification.js +26 -26
  184. package/src/models/sms_meliora.js +20 -20
  185. package/src/models/staff.js +36 -36
  186. package/src/models/stocksandspare.js +161 -161
  187. package/src/models/suppliers.js +79 -79
  188. package/src/models/terms_and_conditions.js +19 -19
  189. package/src/models/tickets.js +186 -186
  190. package/src/models/tickets_category.js +72 -72
  191. package/src/models/unitManagementTemplate.js +44 -44
  192. package/src/models/unitasset.js +25 -25
  193. package/src/models/units.js +148 -148
  194. package/src/models/user.js +186 -186
  195. package/src/models/valueaddedservices.js +50 -50
  196. package/src/models/vas_invoices_upload.js +50 -50
  197. package/src/models/vas_payments.js +24 -24
  198. package/src/models/vasinvoice.js +196 -196
  199. package/src/models/vasvendor.js +52 -52
  200. package/src/models/visitLog.js +108 -108
  201. package/src/models/visitor.js +67 -67
  202. package/src/models/waitlist.js +45 -45
  203. package/src/models/wallet.js +44 -44
  204. package/src/models/wallet_transaction.js +67 -67
  205. package/src/models/wallet_transactions.js +72 -72
  206. package/src/models/water_invoice.js +362 -362
  207. package/src/models/water_meter_Command_Queue.js +33 -33
  208. package/src/models/water_meter_account.js +86 -86
  209. package/src/models/water_meter_billing.js +58 -58
  210. package/src/models/water_meter_combined_accounts.js +92 -92
  211. package/src/models/water_meter_communication.js +17 -17
  212. package/src/models/water_meter_communication_logs.js +39 -39
  213. package/src/models/water_meter_concentrator.js +77 -77
  214. package/src/models/water_meter_daily_history.js +32 -32
  215. package/src/models/water_meter_high_risk.js +36 -36
  216. package/src/models/water_meter_iot_cards.js +34 -34
  217. package/src/models/water_meter_loan_deduction.js +134 -134
  218. package/src/models/water_meter_manufacturer.js +35 -35
  219. package/src/models/water_meter_monthly_history.js +36 -36
  220. package/src/models/water_meter_negative_amounts.js +44 -44
  221. package/src/models/water_meter_settings.js +303 -296
  222. package/src/models/water_meter_single_day_history.js +34 -34
  223. package/src/models/water_meter_size.js +15 -15
  224. package/src/models/water_meters.js +176 -176
  225. package/src/models/water_meters_delivery.js +76 -76
  226. package/src/models/water_prepaid_credit.js +47 -47
  227. package/src/models/water_prepaid_debit.js +50 -50
  228. package/src/models/whatsapp_conversation.js +23 -23
  229. package/src/models/workorder.js +49 -49
  230. package/src/models/zohoAccount.js +453 -453
  231. package/src/models/zohoIntegration.js +262 -262
  232. package/src/models/zohoItem.js +504 -504
@@ -1,266 +1,266 @@
1
- const mongoose = require('mongoose');
2
-
3
- const leaseAgreementSchema = new mongoose.Schema({
4
- facilityId: {
5
- type: mongoose.Schema.Types.ObjectId,
6
- ref: 'Facility',
7
- required: true
8
- },
9
- currency: {
10
- type: mongoose.Schema.Types.ObjectId,
11
- ref: 'Currency',
12
- required: true
13
- },
14
- unitNumber: {
15
- type: mongoose.Schema.Types.ObjectId,
16
- ref: 'Unit',
17
- required: true
18
- },
19
- tenant: {
20
- type: mongoose.Schema.Types.ObjectId,
21
- ref: 'Customer',
22
- required: true
23
- },
24
- landlord: {
25
- type: mongoose.Schema.Types.ObjectId,
26
- ref: 'Customer',
27
- required: true
28
- },
29
- billerAddressId: {
30
- type: mongoose.Schema.Types.ObjectId,
31
- ref: 'BillerAddress'
32
- },
33
- // Reference to BankDetails instead of storing bank info directly
34
- bankDetails: {
35
- type: mongoose.Schema.Types.ObjectId,
36
- ref: 'BankDetails'
37
- },
38
- // GL Account configurations
39
- invoiceDoubleEntryAccount: {
40
- type: mongoose.Schema.Types.ObjectId,
41
- ref: 'GLAccountDoubleEntries'
42
- },
43
- paymentDoubleEntryAccount: {
44
- type: mongoose.Schema.Types.ObjectId,
45
- ref: 'GLAccountDoubleEntries'
46
- },
47
- // GL Account direct configurations (used when creating double entry records)
48
- glAccounts: {
49
- invoice: {
50
- debit: {
51
- type: mongoose.Schema.Types.ObjectId,
52
- ref: 'GLAccount'
53
- },
54
- credit: {
55
- type: mongoose.Schema.Types.ObjectId,
56
- ref: 'GLAccount'
57
- }
58
- },
59
- payment: {
60
- debit: {
61
- type: mongoose.Schema.Types.ObjectId,
62
- ref: 'GLAccount'
63
- },
64
- credit: {
65
- type: mongoose.Schema.Types.ObjectId,
66
- ref: 'GLAccount'
67
- }
68
- }
69
- },
70
- leaseTerms: {
71
- startDate: { type: Date, required: true },
72
- endDate: { type: Date, required: true },
73
- duration: { type: Number, required: true },
74
- autoRenewal: { type: Boolean, default: false }
75
- },
76
- isNewTenant: { type: Boolean, default: false },
77
- financialTerms: {
78
- monthlyRent: { type: Number, required: true },
79
- paymentDueDate: { type: Number, required: true },
80
- paymentMethods: [{
81
- type: {
82
- type: String,
83
- required: true,
84
- enum: ['Bank Transfer', 'Cash', 'Cheque', 'Mobile Money']
85
- },
86
- // Reference bank details ID instead of storing bank info
87
- bankDetailsId: {
88
- type: mongoose.Schema.Types.ObjectId,
89
- ref: 'BankDetails'
90
- },
91
- // Keep other payment method details for non-bank methods
92
- details: {
93
- // For non-bank payment methods
94
- bankToDraft: String,
95
- chequeAccountNumber: String,
96
- preferredCashLocation: String,
97
- // For mobile money
98
- provider: String,
99
- businessNumber: String,
100
- phoneNumber: String,
101
- accountName: String
102
- },
103
- isPrimary: { type: Boolean, default: false }
104
- }],
105
- securityDeposit: { type: Number, required: true },
106
- balanceBroughtForward: { type: Number, required: true, default: 0 },
107
- taxEnabled: { type: Boolean, default: false },
108
- enabledTaxes: [
109
- {
110
- type: mongoose.Schema.Types.ObjectId,
111
- ref: 'CountryTaxRate'
112
- }
113
- ],
114
- digitax: {
115
- enabled: {
116
- type: Boolean,
117
- default: false
118
- },
119
-
120
- itemId: String,
121
-
122
- itemName: String,
123
-
124
- taxTypeCode: String,
125
-
126
- synced: {
127
- type: Boolean,
128
- default: false
129
- },
130
-
131
- syncedAt: Date,
132
-
133
- lastAttemptAt: Date,
134
-
135
- lastError: String
136
- },
137
- penaltyId: {
138
- type: mongoose.Schema.Types.ObjectId,
139
- ref: 'Penalty'
140
- },
141
- escalations: [{
142
- _id: { type: mongoose.Schema.Types.ObjectId, auto: true },
143
- effectiveDate: { type: Date, required: true },
144
- type: {
145
- type: String,
146
- enum: ['percentage', 'fixed'],
147
- required: true
148
- },
149
- value: { type: Number, required: true },
150
- status: {
151
- type: String,
152
- enum: ['scheduled', 'applied', 'cancelled'],
153
- default: 'scheduled'
154
- }
155
- }]
156
- },
157
- // ... rest of the schema remains the same
158
- billingCycle: {
159
- frequency: {
160
- type: String,
161
- enum: ['Monthly', 'Quarterly', 'Annually'],
162
- required: true
163
- },
164
- nextInvoiceDate: { type: Date },
165
- autoSend: { type: Boolean, default: false },
166
- lastInvoiceDate: { type: Date }
167
- },
168
- invoices: [
169
- { type: mongoose.Schema.Types.ObjectId, ref: 'Invoice' }
170
- ],
171
- leaseTemplate: {
172
- type: mongoose.Schema.Types.ObjectId,
173
- ref: 'LeaseTemplate',
174
- required: true
175
- },
176
- leaseDocuments: [
177
- {
178
- fileName: { type: String },
179
- fileUrl: { type: String },
180
- uploadedAt: { type: Date, default: Date.now }
181
- }
182
- ],
183
- reminders: [
184
- {
185
- reminderId: {
186
- type: mongoose.Schema.Types.ObjectId,
187
- ref: 'Reminder'
188
- },
189
- status: {
190
- type: String,
191
- enum: ['Pending', 'Sent'],
192
- default: 'Pending'
193
- }
194
- }
195
- ],
196
- status: {
197
- type: String,
198
- enum: ['Active', 'Pending', 'Expired', 'Terminated'],
199
- default: 'Active'
200
- },
201
- requireLandlordApproval: {
202
- type: Boolean,
203
- default: false
204
- },
205
- payments: [
206
- {
207
- invoiceId: {
208
- type: mongoose.Schema.Types.ObjectId,
209
- ref: 'Invoice',
210
- required: true
211
- },
212
- method: {
213
- type: {
214
- type: String,
215
- enum: ['Bank Transfer', 'Cash', 'Cheque', 'MPESA'],
216
- required: true
217
- },
218
- details: {
219
- bankName: String,
220
- accountNumber: String,
221
- transactionId: String,
222
- chequeNumber: String,
223
- mpesaTransactionId: String,
224
- mpesaPhoneNumber: String
225
- }
226
- },
227
- amount: { type: Number, required: true },
228
- receivedBy: {
229
- type: mongoose.Schema.Types.ObjectId,
230
- ref: 'User',
231
- required: true
232
- },
233
- receivedAt: { type: Date, default: Date.now }
234
- }
235
- ],
236
- // New field to track lease edit history
237
- editHistory: [
238
- {
239
- editedBy: {
240
- type: mongoose.Schema.Types.Mixed,
241
- ref: 'User'
242
- },
243
- editedAt: { type: Date, default: Date.now },
244
- reason: { type: String, required: true },
245
- changes: { type: Object }
246
- }
247
- ],
248
- createdBy: {
249
- type: mongoose.Schema.Types.ObjectId,
250
- ref: 'User'
251
- },
252
- lastInvoiceYearMonth: {
253
- type: String,
254
- default: null
255
- // Format: "2025-09", "2025-10", etc.
256
- }
257
- }, {
258
- timestamps: true
259
- });
260
-
261
- leaseAgreementSchema.index({ facilityId: 1 });
262
- leaseAgreementSchema.index({ lastInvoiceYearMonth: 1 });
263
-
264
- const LeaseAgreement = mongoose.model('LeaseAgreement', leaseAgreementSchema);
265
-
266
- module.exports = LeaseAgreement;
1
+ const mongoose = require('mongoose');
2
+
3
+ const leaseAgreementSchema = new mongoose.Schema({
4
+ facilityId: {
5
+ type: mongoose.Schema.Types.ObjectId,
6
+ ref: 'Facility',
7
+ required: true
8
+ },
9
+ currency: {
10
+ type: mongoose.Schema.Types.ObjectId,
11
+ ref: 'Currency',
12
+ required: true
13
+ },
14
+ unitNumber: {
15
+ type: mongoose.Schema.Types.ObjectId,
16
+ ref: 'Unit',
17
+ required: true
18
+ },
19
+ tenant: {
20
+ type: mongoose.Schema.Types.ObjectId,
21
+ ref: 'Customer',
22
+ required: true
23
+ },
24
+ landlord: {
25
+ type: mongoose.Schema.Types.ObjectId,
26
+ ref: 'Customer',
27
+ required: true
28
+ },
29
+ billerAddressId: {
30
+ type: mongoose.Schema.Types.ObjectId,
31
+ ref: 'BillerAddress'
32
+ },
33
+ // Reference to BankDetails instead of storing bank info directly
34
+ bankDetails: {
35
+ type: mongoose.Schema.Types.ObjectId,
36
+ ref: 'BankDetails'
37
+ },
38
+ // GL Account configurations
39
+ invoiceDoubleEntryAccount: {
40
+ type: mongoose.Schema.Types.ObjectId,
41
+ ref: 'GLAccountDoubleEntries'
42
+ },
43
+ paymentDoubleEntryAccount: {
44
+ type: mongoose.Schema.Types.ObjectId,
45
+ ref: 'GLAccountDoubleEntries'
46
+ },
47
+ // GL Account direct configurations (used when creating double entry records)
48
+ glAccounts: {
49
+ invoice: {
50
+ debit: {
51
+ type: mongoose.Schema.Types.ObjectId,
52
+ ref: 'GLAccount'
53
+ },
54
+ credit: {
55
+ type: mongoose.Schema.Types.ObjectId,
56
+ ref: 'GLAccount'
57
+ }
58
+ },
59
+ payment: {
60
+ debit: {
61
+ type: mongoose.Schema.Types.ObjectId,
62
+ ref: 'GLAccount'
63
+ },
64
+ credit: {
65
+ type: mongoose.Schema.Types.ObjectId,
66
+ ref: 'GLAccount'
67
+ }
68
+ }
69
+ },
70
+ leaseTerms: {
71
+ startDate: { type: Date, required: true },
72
+ endDate: { type: Date, required: true },
73
+ duration: { type: Number, required: true },
74
+ autoRenewal: { type: Boolean, default: false }
75
+ },
76
+ isNewTenant: { type: Boolean, default: false },
77
+ financialTerms: {
78
+ monthlyRent: { type: Number, required: true },
79
+ paymentDueDate: { type: Number, required: true },
80
+ paymentMethods: [{
81
+ type: {
82
+ type: String,
83
+ required: true,
84
+ enum: ['Bank Transfer', 'Cash', 'Cheque', 'Mobile Money']
85
+ },
86
+ // Reference bank details ID instead of storing bank info
87
+ bankDetailsId: {
88
+ type: mongoose.Schema.Types.ObjectId,
89
+ ref: 'BankDetails'
90
+ },
91
+ // Keep other payment method details for non-bank methods
92
+ details: {
93
+ // For non-bank payment methods
94
+ bankToDraft: String,
95
+ chequeAccountNumber: String,
96
+ preferredCashLocation: String,
97
+ // For mobile money
98
+ provider: String,
99
+ businessNumber: String,
100
+ phoneNumber: String,
101
+ accountName: String
102
+ },
103
+ isPrimary: { type: Boolean, default: false }
104
+ }],
105
+ securityDeposit: { type: Number, required: true },
106
+ balanceBroughtForward: { type: Number, required: true, default: 0 },
107
+ taxEnabled: { type: Boolean, default: false },
108
+ enabledTaxes: [
109
+ {
110
+ type: mongoose.Schema.Types.ObjectId,
111
+ ref: 'CountryTaxRate'
112
+ }
113
+ ],
114
+ digitax: {
115
+ enabled: {
116
+ type: Boolean,
117
+ default: false
118
+ },
119
+
120
+ itemId: String,
121
+
122
+ itemName: String,
123
+
124
+ taxTypeCode: String,
125
+
126
+ synced: {
127
+ type: Boolean,
128
+ default: false
129
+ },
130
+
131
+ syncedAt: Date,
132
+
133
+ lastAttemptAt: Date,
134
+
135
+ lastError: String
136
+ },
137
+ penaltyId: {
138
+ type: mongoose.Schema.Types.ObjectId,
139
+ ref: 'Penalty'
140
+ },
141
+ escalations: [{
142
+ _id: { type: mongoose.Schema.Types.ObjectId, auto: true },
143
+ effectiveDate: { type: Date, required: true },
144
+ type: {
145
+ type: String,
146
+ enum: ['percentage', 'fixed'],
147
+ required: true
148
+ },
149
+ value: { type: Number, required: true },
150
+ status: {
151
+ type: String,
152
+ enum: ['scheduled', 'applied', 'cancelled'],
153
+ default: 'scheduled'
154
+ }
155
+ }]
156
+ },
157
+ // ... rest of the schema remains the same
158
+ billingCycle: {
159
+ frequency: {
160
+ type: String,
161
+ enum: ['Monthly', 'Quarterly', 'Annually'],
162
+ required: true
163
+ },
164
+ nextInvoiceDate: { type: Date },
165
+ autoSend: { type: Boolean, default: false },
166
+ lastInvoiceDate: { type: Date }
167
+ },
168
+ invoices: [
169
+ { type: mongoose.Schema.Types.ObjectId, ref: 'Invoice' }
170
+ ],
171
+ leaseTemplate: {
172
+ type: mongoose.Schema.Types.ObjectId,
173
+ ref: 'LeaseTemplate',
174
+ required: true
175
+ },
176
+ leaseDocuments: [
177
+ {
178
+ fileName: { type: String },
179
+ fileUrl: { type: String },
180
+ uploadedAt: { type: Date, default: Date.now }
181
+ }
182
+ ],
183
+ reminders: [
184
+ {
185
+ reminderId: {
186
+ type: mongoose.Schema.Types.ObjectId,
187
+ ref: 'Reminder'
188
+ },
189
+ status: {
190
+ type: String,
191
+ enum: ['Pending', 'Sent'],
192
+ default: 'Pending'
193
+ }
194
+ }
195
+ ],
196
+ status: {
197
+ type: String,
198
+ enum: ['Active', 'Pending', 'Expired', 'Terminated'],
199
+ default: 'Active'
200
+ },
201
+ requireLandlordApproval: {
202
+ type: Boolean,
203
+ default: false
204
+ },
205
+ payments: [
206
+ {
207
+ invoiceId: {
208
+ type: mongoose.Schema.Types.ObjectId,
209
+ ref: 'Invoice',
210
+ required: true
211
+ },
212
+ method: {
213
+ type: {
214
+ type: String,
215
+ enum: ['Bank Transfer', 'Cash', 'Cheque', 'MPESA'],
216
+ required: true
217
+ },
218
+ details: {
219
+ bankName: String,
220
+ accountNumber: String,
221
+ transactionId: String,
222
+ chequeNumber: String,
223
+ mpesaTransactionId: String,
224
+ mpesaPhoneNumber: String
225
+ }
226
+ },
227
+ amount: { type: Number, required: true },
228
+ receivedBy: {
229
+ type: mongoose.Schema.Types.ObjectId,
230
+ ref: 'User',
231
+ required: true
232
+ },
233
+ receivedAt: { type: Date, default: Date.now }
234
+ }
235
+ ],
236
+ // New field to track lease edit history
237
+ editHistory: [
238
+ {
239
+ editedBy: {
240
+ type: mongoose.Schema.Types.Mixed,
241
+ ref: 'User'
242
+ },
243
+ editedAt: { type: Date, default: Date.now },
244
+ reason: { type: String, required: true },
245
+ changes: { type: Object }
246
+ }
247
+ ],
248
+ createdBy: {
249
+ type: mongoose.Schema.Types.ObjectId,
250
+ ref: 'User'
251
+ },
252
+ lastInvoiceYearMonth: {
253
+ type: String,
254
+ default: null
255
+ // Format: "2025-09", "2025-10", etc.
256
+ }
257
+ }, {
258
+ timestamps: true
259
+ });
260
+
261
+ leaseAgreementSchema.index({ facilityId: 1 });
262
+ leaseAgreementSchema.index({ lastInvoiceYearMonth: 1 });
263
+
264
+ const LeaseAgreement = mongoose.model('LeaseAgreement', leaseAgreementSchema);
265
+
266
+ module.exports = LeaseAgreement;
@@ -1,18 +1,18 @@
1
- const mongoose = require("mongoose");
2
-
3
- const LeaseTemplateSchema = new mongoose.Schema({
4
- name: { type: String, required: true },
5
- description: { type: String, required: true },
6
- templateContent: { type: String, required: true },
7
- leaseAgreementId: {
8
- type: mongoose.Schema.Types.ObjectId,
9
- ref: 'LeaseAgreement',
10
- required: false
11
- },
12
- createdBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
13
- createdAt: { type: Date, default: Date.now },
14
- });
15
-
16
- module.exports = mongoose.model('LeaseTemplate', LeaseTemplateSchema);
17
-
1
+ const mongoose = require("mongoose");
2
+
3
+ const LeaseTemplateSchema = new mongoose.Schema({
4
+ name: { type: String, required: true },
5
+ description: { type: String, required: true },
6
+ templateContent: { type: String, required: true },
7
+ leaseAgreementId: {
8
+ type: mongoose.Schema.Types.ObjectId,
9
+ ref: 'LeaseAgreement',
10
+ required: false
11
+ },
12
+ createdBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
13
+ createdAt: { type: Date, default: Date.now },
14
+ });
15
+
16
+ module.exports = mongoose.model('LeaseTemplate', LeaseTemplateSchema);
17
+
18
18