payservedb 8.4.6 → 8.4.7
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 +312 -312
- package/package.json +17 -17
- package/src/models/account.js +52 -52
- 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/bankdetails.js +47 -47
- package/src/models/billerAddress.js +124 -124
- package/src/models/booking_invoice.js +165 -165
- package/src/models/bookinganalytics.js +63 -63
- package/src/models/bookingconfig.js +45 -45
- package/src/models/bookingproperty.js +173 -173
- package/src/models/bookingreservation.js +209 -209
- 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/cashpayment.js +264 -264
- package/src/models/combinedUnits.js +62 -62
- 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 +24 -24
- 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 +210 -210
- package/src/models/customer_satisfaction_survey.js +278 -278
- package/src/models/customer_surveys.js +139 -139
- package/src/models/customer_tickets.js +239 -239
- 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_sms_queue.js +61 -61
- 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 +71 -71
- 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_payment_details.js +20 -20
- package/src/models/facilityasset.js +25 -25
- package/src/models/faq.js +14 -14
- 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 +247 -247
- package/src/models/inspection_category.js +38 -38
- package/src/models/invoice.js +480 -480
- package/src/models/invoicing_schedule.js +41 -36
- 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 +236 -236
- package/src/models/leasetemplate.js +17 -17
- package/src/models/levy.js +223 -223
- package/src/models/levy_invoice_settings.js +26 -26
- package/src/models/levycontract.js +177 -177
- 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/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 +159 -159
- package/src/models/powerMeterSingleDayReading.js +32 -32
- package/src/models/powerMeters.js +116 -116
- package/src/models/powerMetersManufacturer.js +14 -14
- 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/propertyManagerContract.js +556 -556
- package/src/models/propertyManagerRevenue.js +195 -195
- 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/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 +74 -74
- 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 +118 -118
- package/src/models/user.js +186 -186
- package/src/models/valueaddedservices.js +79 -79
- package/src/models/vas_invoices_upload.js +50 -50
- package/src/models/vas_payments.js +24 -24
- package/src/models/vasinvoice.js +192 -192
- package/src/models/vasvendor.js +57 -57
- 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_transactions.js +50 -50
- package/src/models/water_invoice.js +351 -351
- package/src/models/water_meter_Command_Queue.js +33 -33
- package/src/models/water_meter_account.js +87 -87
- package/src/models/water_meter_billing.js +58 -58
- 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 +70 -70
- 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_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 +287 -287
- 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 +133 -133
- 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/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
package/src/models/levy.js
CHANGED
|
@@ -1,224 +1,224 @@
|
|
|
1
|
-
const mongoose = require("mongoose");
|
|
2
|
-
|
|
3
|
-
// Define the schema for Levy
|
|
4
|
-
const levySchema = new mongoose.Schema(
|
|
5
|
-
{
|
|
6
|
-
levyName: {
|
|
7
|
-
type: String,
|
|
8
|
-
required: true,
|
|
9
|
-
trim: true,
|
|
10
|
-
minlength: [1, "Levy name must be at least 1 character long"],
|
|
11
|
-
},
|
|
12
|
-
levyType: {
|
|
13
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
14
|
-
ref: "LevyType",
|
|
15
|
-
required: true,
|
|
16
|
-
},
|
|
17
|
-
amount: {
|
|
18
|
-
type: Number,
|
|
19
|
-
required: true,
|
|
20
|
-
min: [0, "Amount must be a positive number"],
|
|
21
|
-
},
|
|
22
|
-
dueDate: {
|
|
23
|
-
type: String,
|
|
24
|
-
required: true,
|
|
25
|
-
},
|
|
26
|
-
levyApplicant: {
|
|
27
|
-
type: String,
|
|
28
|
-
required: true,
|
|
29
|
-
trim: true,
|
|
30
|
-
},
|
|
31
|
-
taxEnabled: {
|
|
32
|
-
type: Boolean,
|
|
33
|
-
default: false,
|
|
34
|
-
required: false
|
|
35
|
-
},
|
|
36
|
-
taxRate: {
|
|
37
|
-
type: Number,
|
|
38
|
-
default: 0,
|
|
39
|
-
required: false,
|
|
40
|
-
min: [0, 'Tax rate must be a positive number'],
|
|
41
|
-
max: [100, 'Tax rate cannot exceed 100']
|
|
42
|
-
},
|
|
43
|
-
taxType: {
|
|
44
|
-
type: String,
|
|
45
|
-
enum: ['VAT', 'Withholding', 'ServiceTax', 'Custom'],
|
|
46
|
-
default: 'VAT'
|
|
47
|
-
},
|
|
48
|
-
collectionFrequency: {
|
|
49
|
-
type: String,
|
|
50
|
-
required: true,
|
|
51
|
-
trim: true,
|
|
52
|
-
},
|
|
53
|
-
invoiceDay: {
|
|
54
|
-
type: String,
|
|
55
|
-
required: true,
|
|
56
|
-
},
|
|
57
|
-
billingType: {
|
|
58
|
-
type: String,
|
|
59
|
-
enum: ['Prepaid', 'Postpaid'],
|
|
60
|
-
required: true,
|
|
61
|
-
default: 'Postpaid'
|
|
62
|
-
},
|
|
63
|
-
currency: {
|
|
64
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
65
|
-
ref: "Currency",
|
|
66
|
-
required: true,
|
|
67
|
-
},
|
|
68
|
-
mobilePayment: {
|
|
69
|
-
type: Boolean,
|
|
70
|
-
default: false,
|
|
71
|
-
required: false,
|
|
72
|
-
},
|
|
73
|
-
paymentMethodId: {
|
|
74
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
75
|
-
ref: "FacilityPaymentDetails",
|
|
76
|
-
required: false,
|
|
77
|
-
},
|
|
78
|
-
bankPayment: {
|
|
79
|
-
type: Boolean,
|
|
80
|
-
default: false,
|
|
81
|
-
required: false,
|
|
82
|
-
},
|
|
83
|
-
// Reference to BankDetails document
|
|
84
|
-
bankAccountId: {
|
|
85
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
86
|
-
ref: "BankDetails",
|
|
87
|
-
required: false,
|
|
88
|
-
},
|
|
89
|
-
// Reference to BillerAddress document
|
|
90
|
-
billerAddressId: {
|
|
91
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
92
|
-
ref: "BillerAddress",
|
|
93
|
-
required: true,
|
|
94
|
-
},
|
|
95
|
-
// GL Account Configuration
|
|
96
|
-
glAccounts: {
|
|
97
|
-
invoice: {
|
|
98
|
-
debit: {
|
|
99
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
100
|
-
ref: "GLAccount",
|
|
101
|
-
required: true,
|
|
102
|
-
},
|
|
103
|
-
credit: {
|
|
104
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
105
|
-
ref: "GLAccount",
|
|
106
|
-
required: true,
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
payment: {
|
|
110
|
-
debit: {
|
|
111
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
112
|
-
ref: "GLAccount",
|
|
113
|
-
required: true,
|
|
114
|
-
},
|
|
115
|
-
credit: {
|
|
116
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
117
|
-
ref: "GLAccount",
|
|
118
|
-
required: true,
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
disabled: {
|
|
123
|
-
type: Boolean,
|
|
124
|
-
default: false,
|
|
125
|
-
required: false,
|
|
126
|
-
},
|
|
127
|
-
facilityId: {
|
|
128
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
129
|
-
ref: "Facility",
|
|
130
|
-
required: true,
|
|
131
|
-
},
|
|
132
|
-
// Reminder reference
|
|
133
|
-
reminderId: {
|
|
134
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
135
|
-
ref: 'Reminder',
|
|
136
|
-
required: false
|
|
137
|
-
},
|
|
138
|
-
// Penalty reference
|
|
139
|
-
penaltyId: {
|
|
140
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
141
|
-
ref: 'Penalty',
|
|
142
|
-
required: false
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
timestamps: true,
|
|
147
|
-
}
|
|
148
|
-
);
|
|
149
|
-
|
|
150
|
-
// Add virtuals for populated references
|
|
151
|
-
levySchema.virtual('bankAccount', {
|
|
152
|
-
ref: 'BankDetails',
|
|
153
|
-
localField: 'bankAccountId',
|
|
154
|
-
foreignField: '_id',
|
|
155
|
-
justOne: true
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
levySchema.virtual('billerAddress', {
|
|
159
|
-
ref: 'BillerAddress',
|
|
160
|
-
localField: 'billerAddressId',
|
|
161
|
-
foreignField: '_id',
|
|
162
|
-
justOne: true
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
levySchema.virtual('reminder', {
|
|
166
|
-
ref: 'Reminder',
|
|
167
|
-
localField: 'reminderId',
|
|
168
|
-
foreignField: '_id',
|
|
169
|
-
justOne: true
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
levySchema.virtual('penalty', {
|
|
173
|
-
ref: 'Penalty',
|
|
174
|
-
localField: 'penaltyId',
|
|
175
|
-
foreignField: '_id',
|
|
176
|
-
justOne: true
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
// Pre-save validation middleware
|
|
180
|
-
levySchema.pre('save', function (next) {
|
|
181
|
-
// Validate bank payment requirements
|
|
182
|
-
if (this.bankPayment && !this.bankAccountId) {
|
|
183
|
-
const error = new Error('Bank account is required when bank payment is enabled');
|
|
184
|
-
return next(error);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// Validate mobile payment requirements
|
|
188
|
-
if (this.mobilePayment && !this.paymentMethodId) {
|
|
189
|
-
const error = new Error('Payment method is required when mobile payment is enabled');
|
|
190
|
-
return next(error);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Validate GL accounts
|
|
194
|
-
if (!this.glAccounts?.invoice?.debit || !this.glAccounts?.invoice?.credit ||
|
|
195
|
-
!this.glAccounts?.payment?.debit || !this.glAccounts?.payment?.credit) {
|
|
196
|
-
const error = new Error('All GL accounts (invoice and payment, debit and credit) are required');
|
|
197
|
-
return next(error);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
next();
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
// Add indexes for better performance
|
|
204
|
-
levySchema.index({ facilityId: 1 });
|
|
205
|
-
levySchema.index({ levyType: 1 });
|
|
206
|
-
levySchema.index({ disabled: 1 });
|
|
207
|
-
levySchema.index({ bankAccountId: 1 });
|
|
208
|
-
levySchema.index({ billerAddressId: 1 });
|
|
209
|
-
levySchema.index({ reminderId: 1 });
|
|
210
|
-
levySchema.index({ penaltyId: 1 });
|
|
211
|
-
levySchema.index({ createdAt: -1 });
|
|
212
|
-
|
|
213
|
-
// Compound indexes
|
|
214
|
-
levySchema.index({ facilityId: 1, disabled: 1 });
|
|
215
|
-
levySchema.index({ facilityId: 1, levyType: 1 });
|
|
216
|
-
|
|
217
|
-
// Ensure virtual fields are serialized
|
|
218
|
-
levySchema.set('toJSON', { virtuals: true });
|
|
219
|
-
levySchema.set('toObject', { virtuals: true });
|
|
220
|
-
|
|
221
|
-
// Compile the model from the schema
|
|
222
|
-
const Levy = mongoose.model("Levy", levySchema);
|
|
223
|
-
|
|
1
|
+
const mongoose = require("mongoose");
|
|
2
|
+
|
|
3
|
+
// Define the schema for Levy
|
|
4
|
+
const levySchema = new mongoose.Schema(
|
|
5
|
+
{
|
|
6
|
+
levyName: {
|
|
7
|
+
type: String,
|
|
8
|
+
required: true,
|
|
9
|
+
trim: true,
|
|
10
|
+
minlength: [1, "Levy name must be at least 1 character long"],
|
|
11
|
+
},
|
|
12
|
+
levyType: {
|
|
13
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
14
|
+
ref: "LevyType",
|
|
15
|
+
required: true,
|
|
16
|
+
},
|
|
17
|
+
amount: {
|
|
18
|
+
type: Number,
|
|
19
|
+
required: true,
|
|
20
|
+
min: [0, "Amount must be a positive number"],
|
|
21
|
+
},
|
|
22
|
+
dueDate: {
|
|
23
|
+
type: String,
|
|
24
|
+
required: true,
|
|
25
|
+
},
|
|
26
|
+
levyApplicant: {
|
|
27
|
+
type: String,
|
|
28
|
+
required: true,
|
|
29
|
+
trim: true,
|
|
30
|
+
},
|
|
31
|
+
taxEnabled: {
|
|
32
|
+
type: Boolean,
|
|
33
|
+
default: false,
|
|
34
|
+
required: false
|
|
35
|
+
},
|
|
36
|
+
taxRate: {
|
|
37
|
+
type: Number,
|
|
38
|
+
default: 0,
|
|
39
|
+
required: false,
|
|
40
|
+
min: [0, 'Tax rate must be a positive number'],
|
|
41
|
+
max: [100, 'Tax rate cannot exceed 100']
|
|
42
|
+
},
|
|
43
|
+
taxType: {
|
|
44
|
+
type: String,
|
|
45
|
+
enum: ['VAT', 'Withholding', 'ServiceTax', 'Custom'],
|
|
46
|
+
default: 'VAT'
|
|
47
|
+
},
|
|
48
|
+
collectionFrequency: {
|
|
49
|
+
type: String,
|
|
50
|
+
required: true,
|
|
51
|
+
trim: true,
|
|
52
|
+
},
|
|
53
|
+
invoiceDay: {
|
|
54
|
+
type: String,
|
|
55
|
+
required: true,
|
|
56
|
+
},
|
|
57
|
+
billingType: {
|
|
58
|
+
type: String,
|
|
59
|
+
enum: ['Prepaid', 'Postpaid'],
|
|
60
|
+
required: true,
|
|
61
|
+
default: 'Postpaid'
|
|
62
|
+
},
|
|
63
|
+
currency: {
|
|
64
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
65
|
+
ref: "Currency",
|
|
66
|
+
required: true,
|
|
67
|
+
},
|
|
68
|
+
mobilePayment: {
|
|
69
|
+
type: Boolean,
|
|
70
|
+
default: false,
|
|
71
|
+
required: false,
|
|
72
|
+
},
|
|
73
|
+
paymentMethodId: {
|
|
74
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
75
|
+
ref: "FacilityPaymentDetails",
|
|
76
|
+
required: false,
|
|
77
|
+
},
|
|
78
|
+
bankPayment: {
|
|
79
|
+
type: Boolean,
|
|
80
|
+
default: false,
|
|
81
|
+
required: false,
|
|
82
|
+
},
|
|
83
|
+
// Reference to BankDetails document
|
|
84
|
+
bankAccountId: {
|
|
85
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
86
|
+
ref: "BankDetails",
|
|
87
|
+
required: false,
|
|
88
|
+
},
|
|
89
|
+
// Reference to BillerAddress document
|
|
90
|
+
billerAddressId: {
|
|
91
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
92
|
+
ref: "BillerAddress",
|
|
93
|
+
required: true,
|
|
94
|
+
},
|
|
95
|
+
// GL Account Configuration
|
|
96
|
+
glAccounts: {
|
|
97
|
+
invoice: {
|
|
98
|
+
debit: {
|
|
99
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
100
|
+
ref: "GLAccount",
|
|
101
|
+
required: true,
|
|
102
|
+
},
|
|
103
|
+
credit: {
|
|
104
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
105
|
+
ref: "GLAccount",
|
|
106
|
+
required: true,
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
payment: {
|
|
110
|
+
debit: {
|
|
111
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
112
|
+
ref: "GLAccount",
|
|
113
|
+
required: true,
|
|
114
|
+
},
|
|
115
|
+
credit: {
|
|
116
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
117
|
+
ref: "GLAccount",
|
|
118
|
+
required: true,
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
disabled: {
|
|
123
|
+
type: Boolean,
|
|
124
|
+
default: false,
|
|
125
|
+
required: false,
|
|
126
|
+
},
|
|
127
|
+
facilityId: {
|
|
128
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
129
|
+
ref: "Facility",
|
|
130
|
+
required: true,
|
|
131
|
+
},
|
|
132
|
+
// Reminder reference
|
|
133
|
+
reminderId: {
|
|
134
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
135
|
+
ref: 'Reminder',
|
|
136
|
+
required: false
|
|
137
|
+
},
|
|
138
|
+
// Penalty reference
|
|
139
|
+
penaltyId: {
|
|
140
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
141
|
+
ref: 'Penalty',
|
|
142
|
+
required: false
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
timestamps: true,
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
// Add virtuals for populated references
|
|
151
|
+
levySchema.virtual('bankAccount', {
|
|
152
|
+
ref: 'BankDetails',
|
|
153
|
+
localField: 'bankAccountId',
|
|
154
|
+
foreignField: '_id',
|
|
155
|
+
justOne: true
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
levySchema.virtual('billerAddress', {
|
|
159
|
+
ref: 'BillerAddress',
|
|
160
|
+
localField: 'billerAddressId',
|
|
161
|
+
foreignField: '_id',
|
|
162
|
+
justOne: true
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
levySchema.virtual('reminder', {
|
|
166
|
+
ref: 'Reminder',
|
|
167
|
+
localField: 'reminderId',
|
|
168
|
+
foreignField: '_id',
|
|
169
|
+
justOne: true
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
levySchema.virtual('penalty', {
|
|
173
|
+
ref: 'Penalty',
|
|
174
|
+
localField: 'penaltyId',
|
|
175
|
+
foreignField: '_id',
|
|
176
|
+
justOne: true
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// Pre-save validation middleware
|
|
180
|
+
levySchema.pre('save', function (next) {
|
|
181
|
+
// Validate bank payment requirements
|
|
182
|
+
if (this.bankPayment && !this.bankAccountId) {
|
|
183
|
+
const error = new Error('Bank account is required when bank payment is enabled');
|
|
184
|
+
return next(error);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Validate mobile payment requirements
|
|
188
|
+
if (this.mobilePayment && !this.paymentMethodId) {
|
|
189
|
+
const error = new Error('Payment method is required when mobile payment is enabled');
|
|
190
|
+
return next(error);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Validate GL accounts
|
|
194
|
+
if (!this.glAccounts?.invoice?.debit || !this.glAccounts?.invoice?.credit ||
|
|
195
|
+
!this.glAccounts?.payment?.debit || !this.glAccounts?.payment?.credit) {
|
|
196
|
+
const error = new Error('All GL accounts (invoice and payment, debit and credit) are required');
|
|
197
|
+
return next(error);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
next();
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// Add indexes for better performance
|
|
204
|
+
levySchema.index({ facilityId: 1 });
|
|
205
|
+
levySchema.index({ levyType: 1 });
|
|
206
|
+
levySchema.index({ disabled: 1 });
|
|
207
|
+
levySchema.index({ bankAccountId: 1 });
|
|
208
|
+
levySchema.index({ billerAddressId: 1 });
|
|
209
|
+
levySchema.index({ reminderId: 1 });
|
|
210
|
+
levySchema.index({ penaltyId: 1 });
|
|
211
|
+
levySchema.index({ createdAt: -1 });
|
|
212
|
+
|
|
213
|
+
// Compound indexes
|
|
214
|
+
levySchema.index({ facilityId: 1, disabled: 1 });
|
|
215
|
+
levySchema.index({ facilityId: 1, levyType: 1 });
|
|
216
|
+
|
|
217
|
+
// Ensure virtual fields are serialized
|
|
218
|
+
levySchema.set('toJSON', { virtuals: true });
|
|
219
|
+
levySchema.set('toObject', { virtuals: true });
|
|
220
|
+
|
|
221
|
+
// Compile the model from the schema
|
|
222
|
+
const Levy = mongoose.model("Levy", levySchema);
|
|
223
|
+
|
|
224
224
|
module.exports = Levy;
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
const mongoose = require('mongoose');
|
|
2
|
-
|
|
3
|
-
const InvoiceSettingsSchema = new mongoose.Schema({
|
|
4
|
-
facilityId: {
|
|
5
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
6
|
-
ref: 'Facility',
|
|
7
|
-
required: [true, 'Facility ID is required']
|
|
8
|
-
},
|
|
9
|
-
termsAndConditions: {
|
|
10
|
-
type: String,
|
|
11
|
-
default: 'Payment is due within 15 days'
|
|
12
|
-
},
|
|
13
|
-
bankName: {
|
|
14
|
-
type: String,
|
|
15
|
-
required: [true, 'Bank name is required']
|
|
16
|
-
},
|
|
17
|
-
accountNumber: {
|
|
18
|
-
type: String,
|
|
19
|
-
required: [true, 'Account number is required']
|
|
20
|
-
}
|
|
21
|
-
}, {
|
|
22
|
-
timestamps: true
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
const InvoiceSettings = mongoose.model('InvoiceSettings', InvoiceSettingsSchema);
|
|
26
|
-
|
|
1
|
+
const mongoose = require('mongoose');
|
|
2
|
+
|
|
3
|
+
const InvoiceSettingsSchema = new mongoose.Schema({
|
|
4
|
+
facilityId: {
|
|
5
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
6
|
+
ref: 'Facility',
|
|
7
|
+
required: [true, 'Facility ID is required']
|
|
8
|
+
},
|
|
9
|
+
termsAndConditions: {
|
|
10
|
+
type: String,
|
|
11
|
+
default: 'Payment is due within 15 days'
|
|
12
|
+
},
|
|
13
|
+
bankName: {
|
|
14
|
+
type: String,
|
|
15
|
+
required: [true, 'Bank name is required']
|
|
16
|
+
},
|
|
17
|
+
accountNumber: {
|
|
18
|
+
type: String,
|
|
19
|
+
required: [true, 'Account number is required']
|
|
20
|
+
}
|
|
21
|
+
}, {
|
|
22
|
+
timestamps: true
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const InvoiceSettings = mongoose.model('InvoiceSettings', InvoiceSettingsSchema);
|
|
26
|
+
|
|
27
27
|
module.exports = InvoiceSettings;
|