payservedb 8.9.2 → 8.9.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.
Files changed (193) hide show
  1. package/.env +2 -2
  2. package/ZOHO_INTEGRATION_SCHEMA.md +644 -644
  3. package/index.js +326 -327
  4. package/package.json +17 -17
  5. package/src/models/account.js +52 -52
  6. package/src/models/agent_departments.js +59 -59
  7. package/src/models/agent_notifications.js +53 -53
  8. package/src/models/agent_performance.js +127 -127
  9. package/src/models/agent_roles.js +77 -77
  10. package/src/models/agents.js +154 -154
  11. package/src/models/apilog.js +18 -18
  12. package/src/models/approvalsWorkflows.js +49 -49
  13. package/src/models/archivedapilog.js +18 -18
  14. package/src/models/asset.js +92 -92
  15. package/src/models/assetsAssignment.js +64 -64
  16. package/src/models/auditTrail.js +346 -346
  17. package/src/models/bankdetails.js +47 -47
  18. package/src/models/billerAddress.js +124 -124
  19. package/src/models/booking_invoice.js +165 -165
  20. package/src/models/bookinganalytics.js +63 -63
  21. package/src/models/bookingconfig.js +45 -45
  22. package/src/models/bookingproperty.js +179 -179
  23. package/src/models/bookingreservation.js +239 -239
  24. package/src/models/bookingrevenuerecord.js +84 -84
  25. package/src/models/budget.js +95 -95
  26. package/src/models/budgetCategory.js +19 -19
  27. package/src/models/campaigns.js +108 -108
  28. package/src/models/cashpayment.js +290 -290
  29. package/src/models/combinedUnits.js +62 -62
  30. package/src/models/combined_invoice.js +424 -424
  31. package/src/models/common_area_electricity.js +38 -38
  32. package/src/models/common_area_generator.js +41 -41
  33. package/src/models/common_area_utility_alert.js +37 -37
  34. package/src/models/common_area_water.js +39 -39
  35. package/src/models/communication_status.js +33 -33
  36. package/src/models/communication_user_opt.js +32 -32
  37. package/src/models/community_guidelines.js +35 -35
  38. package/src/models/company.js +53 -53
  39. package/src/models/coreBaseSettings.js +16 -16
  40. package/src/models/coreInvoiceSettings.js +100 -100
  41. package/src/models/counter_schema.js +21 -21
  42. package/src/models/country_tax.js +42 -42
  43. package/src/models/currency_settings.js +39 -39
  44. package/src/models/customer.js +214 -214
  45. package/src/models/customer_preference.js +52 -52
  46. package/src/models/customer_satisfaction_survey.js +297 -297
  47. package/src/models/customer_surveys.js +139 -139
  48. package/src/models/customer_tickets.js +237 -237
  49. package/src/models/dailyChecklist.js +312 -312
  50. package/src/models/default_payment_details.js +17 -17
  51. package/src/models/deliveryTimeMarks.js +18 -18
  52. package/src/models/document_type.js +19 -19
  53. package/src/models/dutyRosterChecklist.js +250 -250
  54. package/src/models/dutyroster.js +136 -136
  55. package/src/models/email.js +37 -37
  56. package/src/models/email_sms_queue.js +61 -61
  57. package/src/models/email_thread.js +35 -35
  58. package/src/models/entry_exit.js +53 -53
  59. package/src/models/expense.js +99 -99
  60. package/src/models/expense_category.js +45 -45
  61. package/src/models/facility.js +76 -76
  62. package/src/models/facilityBillingPrices.js +29 -29
  63. package/src/models/facilityInvoice.js +240 -240
  64. package/src/models/facilityInvoicePayment.js +52 -52
  65. package/src/models/facilityInvoiceRecipient.js +32 -32
  66. package/src/models/facilityWalletTransactionsMetadata.js +236 -236
  67. package/src/models/facility_departements.js +20 -20
  68. package/src/models/facility_payment_details.js +20 -20
  69. package/src/models/facility_rating.js +78 -78
  70. package/src/models/facilityasset.js +25 -25
  71. package/src/models/faq.js +14 -14
  72. package/src/models/gl_account_double_entries.js +25 -25
  73. package/src/models/gl_accounts.js +56 -56
  74. package/src/models/gl_entries.js +49 -49
  75. package/src/models/goodsReceivedNotes.js +115 -115
  76. package/src/models/guard.js +47 -47
  77. package/src/models/handover.js +258 -258
  78. package/src/models/inspection_category.js +38 -38
  79. package/src/models/invoice.js +480 -484
  80. package/src/models/invoice_generation_approval.js +86 -86
  81. package/src/models/invoicing_schedule.js +40 -40
  82. package/src/models/item_inspection.js +96 -96
  83. package/src/models/knowledge_base.js +109 -109
  84. package/src/models/knowledge_base_rating.js +44 -44
  85. package/src/models/leaseagreement.js +243 -243
  86. package/src/models/leasetemplate.js +17 -17
  87. package/src/models/levy.js +212 -223
  88. package/src/models/levy_invoice_settings.js +26 -26
  89. package/src/models/levycontract.js +216 -216
  90. package/src/models/levytype.js +23 -23
  91. package/src/models/maintenance_service_vendor.js +38 -38
  92. package/src/models/maintenance_services.js +17 -17
  93. package/src/models/maintenancerequisition.js +31 -31
  94. package/src/models/master_workplan.js +32 -32
  95. package/src/models/master_workplan_child.js +34 -34
  96. package/src/models/message.js +38 -38
  97. package/src/models/module.js +21 -21
  98. package/src/models/movein_application.js +29 -29
  99. package/src/models/movein_landlord.js +18 -18
  100. package/src/models/movein_user.js +15 -15
  101. package/src/models/notification.js +44 -44
  102. package/src/models/paymentTermsMarks.js +19 -19
  103. package/src/models/penalty.js +76 -76
  104. package/src/models/pendingCredentials.js +32 -32
  105. package/src/models/powerMeterCommunicationProtocol.js +17 -17
  106. package/src/models/powerMeterCustomerAccount.js +78 -78
  107. package/src/models/powerMeterCustomerBand.js +14 -14
  108. package/src/models/powerMeterDailyReading.js +30 -30
  109. package/src/models/powerMeterGateways.js +40 -40
  110. package/src/models/powerMeterMonthlyReading.js +34 -34
  111. package/src/models/powerMeterPowerCharges.js +85 -85
  112. package/src/models/powerMeterSettings.js +159 -159
  113. package/src/models/powerMeterSingleDayReading.js +32 -32
  114. package/src/models/powerMeters.js +116 -116
  115. package/src/models/powerMetersManufacturer.js +14 -14
  116. package/src/models/power_meter_account.js +81 -81
  117. package/src/models/power_meter_command_logs.js +30 -30
  118. package/src/models/power_meter_command_queue.js +33 -33
  119. package/src/models/power_meter_negative_balance.js +44 -44
  120. package/src/models/power_prepaid_credits.js +47 -47
  121. package/src/models/power_prepaid_debits.js +53 -53
  122. package/src/models/power_prepaid_orders.js +78 -78
  123. package/src/models/power_sms_notification.js +26 -26
  124. package/src/models/privacy_policy.js +19 -19
  125. package/src/models/propertyManagerContract.js +556 -556
  126. package/src/models/propertyManagerRevenue.js +195 -195
  127. package/src/models/purchaseOrderInvoice.js +74 -74
  128. package/src/models/purchase_order.js +213 -213
  129. package/src/models/purchase_request.js +110 -110
  130. package/src/models/quickbooks_config.js +52 -52
  131. package/src/models/refresh_token.js +23 -23
  132. package/src/models/reminder.js +197 -197
  133. package/src/models/report.js +13 -13
  134. package/src/models/resident.js +121 -121
  135. package/src/models/rfq_details.js +131 -131
  136. package/src/models/rfq_response.js +153 -153
  137. package/src/models/service_charge_invoice_upload.js +42 -42
  138. package/src/models/service_charge_payments.js +27 -27
  139. package/src/models/servicerequest.js +55 -55
  140. package/src/models/settings.js +62 -62
  141. package/src/models/short_urls.js +21 -21
  142. package/src/models/smart_meter_daily_consumption.js +44 -44
  143. package/src/models/sms_africastalking.js +20 -20
  144. package/src/models/sms_balance_notification.js +26 -26
  145. package/src/models/sms_meliora.js +20 -20
  146. package/src/models/staff.js +36 -36
  147. package/src/models/stocksandspare.js +161 -161
  148. package/src/models/suppliers.js +74 -74
  149. package/src/models/terms_and_conditions.js +19 -19
  150. package/src/models/tickets.js +186 -186
  151. package/src/models/tickets_category.js +72 -72
  152. package/src/models/unitManagementTemplate.js +44 -44
  153. package/src/models/unitasset.js +25 -25
  154. package/src/models/units.js +130 -130
  155. package/src/models/user.js +186 -186
  156. package/src/models/valueaddedservices.js +21 -21
  157. package/src/models/vas_invoices_upload.js +50 -50
  158. package/src/models/vas_payments.js +24 -24
  159. package/src/models/vasinvoice.js +192 -192
  160. package/src/models/vasvendor.js +52 -52
  161. package/src/models/visitLog.js +95 -95
  162. package/src/models/visitor.js +67 -67
  163. package/src/models/waitlist.js +45 -45
  164. package/src/models/wallet.js +44 -44
  165. package/src/models/wallet_transactions.js +50 -50
  166. package/src/models/water_invoice.js +351 -351
  167. package/src/models/water_meter_Command_Queue.js +33 -33
  168. package/src/models/water_meter_account.js +86 -86
  169. package/src/models/water_meter_billing.js +58 -58
  170. package/src/models/water_meter_combined_accounts.js +92 -92
  171. package/src/models/water_meter_communication.js +17 -17
  172. package/src/models/water_meter_communication_logs.js +39 -39
  173. package/src/models/water_meter_concentrator.js +70 -70
  174. package/src/models/water_meter_daily_history.js +32 -32
  175. package/src/models/water_meter_high_risk.js +36 -36
  176. package/src/models/water_meter_iot_cards.js +34 -34
  177. package/src/models/water_meter_loan_deduction.js +134 -134
  178. package/src/models/water_meter_manufacturer.js +35 -35
  179. package/src/models/water_meter_monthly_history.js +36 -36
  180. package/src/models/water_meter_negative_amounts.js +44 -44
  181. package/src/models/water_meter_settings.js +290 -290
  182. package/src/models/water_meter_single_day_history.js +34 -34
  183. package/src/models/water_meter_size.js +15 -15
  184. package/src/models/water_meters.js +176 -176
  185. package/src/models/water_meters_delivery.js +76 -76
  186. package/src/models/water_prepaid_credit.js +47 -47
  187. package/src/models/water_prepaid_debit.js +50 -50
  188. package/src/models/whatsapp_conversation.js +23 -23
  189. package/src/models/workorder.js +49 -49
  190. package/src/models/zohoAccount.js +453 -453
  191. package/src/models/zohoIntegration.js +262 -262
  192. package/src/models/zohoItem.js +504 -504
  193. package/src/models/power_invoice.js +0 -471
@@ -1,44 +1,44 @@
1
- const mongoose = require('mongoose');
2
-
3
- const knowledgeBaseRatingSchema = new mongoose.Schema({
4
- article_id: {
5
- type: mongoose.Schema.Types.ObjectId,
6
- ref: 'KnowledgeBase',
7
- required: true
8
- },
9
- agent_id: {
10
- type: mongoose.Schema.Types.ObjectId,
11
- ref: 'User',
12
- required: true
13
- },
14
- helpful: {
15
- type: Boolean,
16
- required: true
17
- },
18
- feedback: {
19
- type: String,
20
- trim: true,
21
- maxlength: 1000
22
- },
23
- ticket_id: {
24
- type: mongoose.Schema.Types.ObjectId,
25
- ref: 'CustomerTicket',
26
- comment: 'Optional reference to ticket where this article was used'
27
- },
28
- created_at: {
29
- type: Date,
30
- default: Date.now
31
- },
32
- updated_at: {
33
- type: Date,
34
- default: Date.now
35
- }
36
- }, {
37
- timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
38
- });
39
-
40
- knowledgeBaseRatingSchema.index({ article_id: 1, agent_id: 1 }, { unique: true });
41
- knowledgeBaseRatingSchema.index({ article_id: 1, helpful: 1 });
42
- knowledgeBaseRatingSchema.index({ agent_id: 1, created_at: -1 });
43
-
44
- module.exports = mongoose.model('KnowledgeBaseRating', knowledgeBaseRatingSchema);
1
+ const mongoose = require('mongoose');
2
+
3
+ const knowledgeBaseRatingSchema = new mongoose.Schema({
4
+ article_id: {
5
+ type: mongoose.Schema.Types.ObjectId,
6
+ ref: 'KnowledgeBase',
7
+ required: true
8
+ },
9
+ agent_id: {
10
+ type: mongoose.Schema.Types.ObjectId,
11
+ ref: 'User',
12
+ required: true
13
+ },
14
+ helpful: {
15
+ type: Boolean,
16
+ required: true
17
+ },
18
+ feedback: {
19
+ type: String,
20
+ trim: true,
21
+ maxlength: 1000
22
+ },
23
+ ticket_id: {
24
+ type: mongoose.Schema.Types.ObjectId,
25
+ ref: 'CustomerTicket',
26
+ comment: 'Optional reference to ticket where this article was used'
27
+ },
28
+ created_at: {
29
+ type: Date,
30
+ default: Date.now
31
+ },
32
+ updated_at: {
33
+ type: Date,
34
+ default: Date.now
35
+ }
36
+ }, {
37
+ timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
38
+ });
39
+
40
+ knowledgeBaseRatingSchema.index({ article_id: 1, agent_id: 1 }, { unique: true });
41
+ knowledgeBaseRatingSchema.index({ article_id: 1, helpful: 1 });
42
+ knowledgeBaseRatingSchema.index({ agent_id: 1, created_at: -1 });
43
+
44
+ module.exports = mongoose.model('KnowledgeBaseRating', knowledgeBaseRatingSchema);
@@ -1,243 +1,243 @@
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
- penaltyId: {
115
- type: mongoose.Schema.Types.ObjectId,
116
- ref: 'Penalty'
117
- },
118
- escalations: [{
119
- _id: { type: mongoose.Schema.Types.ObjectId, auto: true },
120
- effectiveDate: { type: Date, required: true },
121
- type: {
122
- type: String,
123
- enum: ['percentage', 'fixed'],
124
- required: true
125
- },
126
- value: { type: Number, required: true },
127
- status: {
128
- type: String,
129
- enum: ['scheduled', 'applied', 'cancelled'],
130
- default: 'scheduled'
131
- }
132
- }]
133
- },
134
- // ... rest of the schema remains the same
135
- billingCycle: {
136
- frequency: {
137
- type: String,
138
- enum: ['Monthly', 'Quarterly', 'Annually'],
139
- required: true
140
- },
141
- nextInvoiceDate: { type: Date },
142
- autoSend: { type: Boolean, default: false },
143
- lastInvoiceDate: { type: Date }
144
- },
145
- invoices: [
146
- { type: mongoose.Schema.Types.ObjectId, ref: 'Invoice' }
147
- ],
148
- leaseTemplate: {
149
- type: mongoose.Schema.Types.ObjectId,
150
- ref: 'LeaseTemplate',
151
- required: true
152
- },
153
- leaseDocuments: [
154
- {
155
- fileName: { type: String },
156
- fileUrl: { type: String },
157
- uploadedAt: { type: Date, default: Date.now }
158
- }
159
- ],
160
- reminders: [
161
- {
162
- reminderId: {
163
- type: mongoose.Schema.Types.ObjectId,
164
- ref: 'Reminder'
165
- },
166
- status: {
167
- type: String,
168
- enum: ['Pending', 'Sent'],
169
- default: 'Pending'
170
- }
171
- }
172
- ],
173
- status: {
174
- type: String,
175
- enum: ['Active', 'Pending', 'Expired', 'Terminated'],
176
- default: 'Active'
177
- },
178
- requireLandlordApproval: {
179
- type: Boolean,
180
- default: false
181
- },
182
- payments: [
183
- {
184
- invoiceId: {
185
- type: mongoose.Schema.Types.ObjectId,
186
- ref: 'Invoice',
187
- required: true
188
- },
189
- method: {
190
- type: {
191
- type: String,
192
- enum: ['Bank Transfer', 'Cash', 'Cheque', 'MPESA'],
193
- required: true
194
- },
195
- details: {
196
- bankName: String,
197
- accountNumber: String,
198
- transactionId: String,
199
- chequeNumber: String,
200
- mpesaTransactionId: String,
201
- mpesaPhoneNumber: String
202
- }
203
- },
204
- amount: { type: Number, required: true },
205
- receivedBy: {
206
- type: mongoose.Schema.Types.ObjectId,
207
- ref: 'User',
208
- required: true
209
- },
210
- receivedAt: { type: Date, default: Date.now }
211
- }
212
- ],
213
- // New field to track lease edit history
214
- editHistory: [
215
- {
216
- editedBy: {
217
- type: mongoose.Schema.Types.Mixed,
218
- ref: 'User'
219
- },
220
- editedAt: { type: Date, default: Date.now },
221
- reason: { type: String, required: true },
222
- changes: { type: Object }
223
- }
224
- ],
225
- createdBy: {
226
- type: mongoose.Schema.Types.ObjectId,
227
- ref: 'User'
228
- },
229
- lastInvoiceYearMonth: {
230
- type: String,
231
- default: null
232
- // Format: "2025-09", "2025-10", etc.
233
- }
234
- }, {
235
- timestamps: true
236
- });
237
-
238
- leaseAgreementSchema.index({ facilityId: 1 });
239
- leaseAgreementSchema.index({ lastInvoiceYearMonth: 1 });
240
-
241
- const LeaseAgreement = mongoose.model('LeaseAgreement', leaseAgreementSchema);
242
-
243
- 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
+ penaltyId: {
115
+ type: mongoose.Schema.Types.ObjectId,
116
+ ref: 'Penalty'
117
+ },
118
+ escalations: [{
119
+ _id: { type: mongoose.Schema.Types.ObjectId, auto: true },
120
+ effectiveDate: { type: Date, required: true },
121
+ type: {
122
+ type: String,
123
+ enum: ['percentage', 'fixed'],
124
+ required: true
125
+ },
126
+ value: { type: Number, required: true },
127
+ status: {
128
+ type: String,
129
+ enum: ['scheduled', 'applied', 'cancelled'],
130
+ default: 'scheduled'
131
+ }
132
+ }]
133
+ },
134
+ // ... rest of the schema remains the same
135
+ billingCycle: {
136
+ frequency: {
137
+ type: String,
138
+ enum: ['Monthly', 'Quarterly', 'Annually'],
139
+ required: true
140
+ },
141
+ nextInvoiceDate: { type: Date },
142
+ autoSend: { type: Boolean, default: false },
143
+ lastInvoiceDate: { type: Date }
144
+ },
145
+ invoices: [
146
+ { type: mongoose.Schema.Types.ObjectId, ref: 'Invoice' }
147
+ ],
148
+ leaseTemplate: {
149
+ type: mongoose.Schema.Types.ObjectId,
150
+ ref: 'LeaseTemplate',
151
+ required: true
152
+ },
153
+ leaseDocuments: [
154
+ {
155
+ fileName: { type: String },
156
+ fileUrl: { type: String },
157
+ uploadedAt: { type: Date, default: Date.now }
158
+ }
159
+ ],
160
+ reminders: [
161
+ {
162
+ reminderId: {
163
+ type: mongoose.Schema.Types.ObjectId,
164
+ ref: 'Reminder'
165
+ },
166
+ status: {
167
+ type: String,
168
+ enum: ['Pending', 'Sent'],
169
+ default: 'Pending'
170
+ }
171
+ }
172
+ ],
173
+ status: {
174
+ type: String,
175
+ enum: ['Active', 'Pending', 'Expired', 'Terminated'],
176
+ default: 'Active'
177
+ },
178
+ requireLandlordApproval: {
179
+ type: Boolean,
180
+ default: false
181
+ },
182
+ payments: [
183
+ {
184
+ invoiceId: {
185
+ type: mongoose.Schema.Types.ObjectId,
186
+ ref: 'Invoice',
187
+ required: true
188
+ },
189
+ method: {
190
+ type: {
191
+ type: String,
192
+ enum: ['Bank Transfer', 'Cash', 'Cheque', 'MPESA'],
193
+ required: true
194
+ },
195
+ details: {
196
+ bankName: String,
197
+ accountNumber: String,
198
+ transactionId: String,
199
+ chequeNumber: String,
200
+ mpesaTransactionId: String,
201
+ mpesaPhoneNumber: String
202
+ }
203
+ },
204
+ amount: { type: Number, required: true },
205
+ receivedBy: {
206
+ type: mongoose.Schema.Types.ObjectId,
207
+ ref: 'User',
208
+ required: true
209
+ },
210
+ receivedAt: { type: Date, default: Date.now }
211
+ }
212
+ ],
213
+ // New field to track lease edit history
214
+ editHistory: [
215
+ {
216
+ editedBy: {
217
+ type: mongoose.Schema.Types.Mixed,
218
+ ref: 'User'
219
+ },
220
+ editedAt: { type: Date, default: Date.now },
221
+ reason: { type: String, required: true },
222
+ changes: { type: Object }
223
+ }
224
+ ],
225
+ createdBy: {
226
+ type: mongoose.Schema.Types.ObjectId,
227
+ ref: 'User'
228
+ },
229
+ lastInvoiceYearMonth: {
230
+ type: String,
231
+ default: null
232
+ // Format: "2025-09", "2025-10", etc.
233
+ }
234
+ }, {
235
+ timestamps: true
236
+ });
237
+
238
+ leaseAgreementSchema.index({ facilityId: 1 });
239
+ leaseAgreementSchema.index({ lastInvoiceYearMonth: 1 });
240
+
241
+ const LeaseAgreement = mongoose.model('LeaseAgreement', leaseAgreementSchema);
242
+
243
+ 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