payservedb 4.7.5 → 4.7.6

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 (98) hide show
  1. package/.env +2 -2
  2. package/index.js +167 -167
  3. package/package.json +17 -17
  4. package/src/models/account.js +36 -36
  5. package/src/models/analog_water_billing.js +58 -58
  6. package/src/models/apilog.js +18 -18
  7. package/src/models/approvalsWorkflows.js +49 -49
  8. package/src/models/archivedapilog.js +18 -18
  9. package/src/models/archivedauditlog.js +83 -83
  10. package/src/models/asset.js +34 -34
  11. package/src/models/auditlog.js +83 -83
  12. package/src/models/bankdetails.js +40 -40
  13. package/src/models/bookinganalytics.js +63 -63
  14. package/src/models/bookingconfig.js +45 -45
  15. package/src/models/bookingproperty.js +112 -112
  16. package/src/models/bookingreservation.js +192 -192
  17. package/src/models/bookingrevenuerecord.js +84 -84
  18. package/src/models/budget.js +33 -33
  19. package/src/models/budgetCategory.js +19 -19
  20. package/src/models/campaigns.js +72 -72
  21. package/src/models/cashpayment.js +262 -262
  22. package/src/models/combinedUnits.js +62 -62
  23. package/src/models/common_area_electricity.js +38 -38
  24. package/src/models/common_area_generator.js +38 -38
  25. package/src/models/common_area_water.js +39 -39
  26. package/src/models/company.js +53 -53
  27. package/src/models/country_tax.js +42 -42
  28. package/src/models/currency_settings.js +39 -39
  29. package/src/models/customer.js +200 -200
  30. package/src/models/default_payment_details.js +17 -17
  31. package/src/models/dutyroster.js +129 -51
  32. package/src/models/email.js +24 -24
  33. package/src/models/entry_exit.js +53 -53
  34. package/src/models/expense.js +55 -55
  35. package/src/models/facility.js +60 -60
  36. package/src/models/facility_payment_details.js +20 -20
  37. package/src/models/facilityasset.js +25 -25
  38. package/src/models/faq.js +18 -18
  39. package/src/models/guard.js +47 -47
  40. package/src/models/handover.js +241 -241
  41. package/src/models/invoice.js +276 -276
  42. package/src/models/item_inspection.js +67 -67
  43. package/src/models/leaseagreement.js +168 -168
  44. package/src/models/leasetemplate.js +17 -17
  45. package/src/models/levy.js +84 -84
  46. package/src/models/levy_invoice_settings.js +26 -26
  47. package/src/models/levycontract.js +77 -77
  48. package/src/models/levytype.js +23 -23
  49. package/src/models/maintenance_service_vendor.js +38 -38
  50. package/src/models/maintenance_services.js +17 -17
  51. package/src/models/maintenancerequisition.js +31 -31
  52. package/src/models/message.js +38 -38
  53. package/src/models/module.js +21 -21
  54. package/src/models/notification.js +24 -24
  55. package/src/models/penalty.js +76 -76
  56. package/src/models/purchase_order.js +191 -191
  57. package/src/models/purchase_request.js +65 -65
  58. package/src/models/quotation.js +267 -267
  59. package/src/models/refresh_token.js +23 -23
  60. package/src/models/reminder.js +161 -161
  61. package/src/models/report.js +13 -13
  62. package/src/models/resident.js +121 -121
  63. package/src/models/service_charge_invoice_upload.js +42 -42
  64. package/src/models/service_charge_payments.js +27 -27
  65. package/src/models/servicerequest.js +55 -55
  66. package/src/models/settings.js +62 -62
  67. package/src/models/smart_meter_daily_consumption.js +44 -44
  68. package/src/models/sms_africastalking.js +20 -20
  69. package/src/models/sms_meliora.js +16 -16
  70. package/src/models/staff.js +36 -36
  71. package/src/models/stocksandspare.js +34 -34
  72. package/src/models/suppliers.js +68 -68
  73. package/src/models/tickets.js +109 -109
  74. package/src/models/unitasset.js +25 -25
  75. package/src/models/units.js +86 -86
  76. package/src/models/user.js +94 -94
  77. package/src/models/valueaddedservices.js +36 -36
  78. package/src/models/vas_invoices_upload.js +50 -50
  79. package/src/models/vas_payments.js +24 -24
  80. package/src/models/vasinvoice.js +159 -159
  81. package/src/models/vasvendor.js +57 -57
  82. package/src/models/visitLog.js +86 -86
  83. package/src/models/visitor.js +63 -63
  84. package/src/models/waitlist.js +45 -45
  85. package/src/models/water_invoice.js +192 -192
  86. package/src/models/water_meter_account.js +74 -74
  87. package/src/models/water_meter_communication.js +17 -17
  88. package/src/models/water_meter_concentrator.js +59 -59
  89. package/src/models/water_meter_daily_history.js +31 -31
  90. package/src/models/water_meter_iot_cards.js +34 -34
  91. package/src/models/water_meter_manufacturer.js +35 -35
  92. package/src/models/water_meter_monthly_history.js +37 -37
  93. package/src/models/water_meter_settings.js +88 -88
  94. package/src/models/water_meter_single_day_history.js +31 -31
  95. package/src/models/water_meter_size.js +15 -15
  96. package/src/models/water_meters.js +103 -103
  97. package/src/models/water_meters_delivery.js +76 -76
  98. package/src/models/workorder.js +49 -49
@@ -1,268 +1,268 @@
1
- const mongoose = require('mongoose');
2
-
3
- const rfqSchema = new mongoose.Schema({
4
- facilityId: {
5
- type: mongoose.Schema.Types.ObjectId,
6
- ref: 'Facility',
7
- required: true,
8
- index: true
9
- },
10
- name: {
11
- type: String,
12
- required: true,
13
- trim: true,
14
- index: true
15
- },
16
- rfqNumber: {
17
- type: String,
18
- required: true,
19
- unique: true,
20
- trim: true,
21
- index: true
22
- },
23
- startDate: {
24
- type: Date,
25
- required: true
26
- },
27
- closingDate: {
28
- type: Date,
29
- required: true
30
- },
31
- currency: {
32
- type: String,
33
- required: true,
34
- default: 'KES',
35
- trim: true
36
- },
37
- rfqType: {
38
- type: String,
39
- required: true,
40
- enum: ['open', 'closed'],
41
- default: 'closed'
42
- },
43
- rfqFee: {
44
- type: Number,
45
- default: 0
46
- },
47
- rfqEvaluationType: {
48
- type: String,
49
- required: true,
50
- enum: ['automatic', 'approvers'],
51
- default: 'approvers'
52
- },
53
- notes: {
54
- type: String,
55
- trim: true
56
- },
57
- status: {
58
- type: String,
59
- enum: ['open','closed', 'awarded', 'canceled'],
60
- default: 'open',
61
- index: true
62
- },
63
- // RFQ Categories (Products or Services)
64
- categories: [{
65
- name: {
66
- type: String,
67
- required: true,
68
- trim: true
69
- },
70
- // For Product type
71
- products: [{
72
- productName: {
73
- type: String,
74
- trim: true,
75
- required: function() {
76
- return this.parent().categoryType === 'product';
77
- }
78
- },
79
- sku: {
80
- type: String,
81
- trim: true
82
- },
83
- quantity: {
84
- type: Number,
85
- required: function() {
86
- return this.parent().categoryType === 'product';
87
- }
88
- },
89
- unitOfMeasure: {
90
- type: String,
91
- trim: true
92
- },
93
- estimatedUnitPrice: {
94
- type: Number
95
- }
96
- }],
97
- // For Service type
98
- services: [{
99
- serviceDescription: {
100
- type: String,
101
- trim: true,
102
- required: function() {
103
- return this.parent().categoryType === 'service';
104
- }
105
- },
106
- quantity: {
107
- type: Number,
108
- required: function() {
109
- return this.parent().categoryType === 'service';
110
- }
111
- },
112
- unitOfMeasure: {
113
- type: String,
114
- trim: true
115
- },
116
- estimatedUnitPrice: {
117
- type: Number
118
- }
119
- }]
120
- }],
121
-
122
- // Suppliers invited to respond to the RFQ
123
- suppliers: [{
124
- supplierId: {
125
- type: mongoose.Schema.Types.ObjectId,
126
- ref: 'Supplier',
127
- required: true
128
- },
129
- supplierName: {
130
- type: String,
131
- required: true,
132
- trim: true
133
- },
134
- invitationStatus: {
135
- type: String,
136
- enum: ['pending', 'accepted', 'declined', 'no-response'],
137
- default: 'pending'
138
- },
139
- invitationDate: {
140
- type: Date,
141
- default: Date.now
142
- },
143
- responseDate: {
144
- type: Date
145
- },
146
- quotationSubmitted: {
147
- type: Boolean,
148
- default: false
149
- },
150
- quotationDetails: {
151
- submissionDate: {
152
- type: Date
153
- },
154
- totalAmount: {
155
- type: Number
156
- },
157
- items: [{
158
- categoryId: {
159
- type: mongoose.Schema.Types.ObjectId,
160
- required: true
161
- },
162
- itemId: {
163
- type: mongoose.Schema.Types.ObjectId,
164
- required: true
165
- },
166
- unitPrice: {
167
- type: Number,
168
- required: true
169
- },
170
- quantity: {
171
- type: Number,
172
- required: true
173
- },
174
- totalPrice: {
175
- type: Number,
176
- required: true
177
- },
178
- notes: {
179
- type: String,
180
- trim: true
181
- }
182
- }],
183
- attachments: [{
184
- name: {
185
- type: String,
186
- required: true
187
- },
188
- fileType: {
189
- type: String,
190
- required: true
191
- },
192
- filePath: {
193
- type: String,
194
- required: true
195
- },
196
- uploadDate: {
197
- type: Date,
198
- default: Date.now
199
- }
200
- }],
201
- notes: {
202
- type: String,
203
- trim: true
204
- }
205
- },
206
- evaluationScore: {
207
- type: Number,
208
- min: 0,
209
- max: 100
210
- },
211
- evaluationNotes: {
212
- type: String,
213
- trim: true
214
- }
215
- }],
216
-
217
-
218
- // Award details after RFQ is closed
219
- awardDetails: {
220
- awarded: {
221
- type: Boolean,
222
- default: false
223
- },
224
- awardedSupplierId: {
225
- type: mongoose.Schema.Types.ObjectId,
226
- ref: 'Supplier'
227
- },
228
- awardedSupplierName: {
229
- type: String,
230
- trim: true
231
- },
232
- awardDate: {
233
- type: Date
234
- },
235
- awardNotes: {
236
- type: String,
237
- trim: true
238
- },
239
- purchaseOrderCreated: {
240
- type: Boolean,
241
- default: false
242
- },
243
- purchaseOrderId: {
244
- type: mongoose.Schema.Types.ObjectId,
245
- ref: 'PurchaseOrder'
246
- }
247
- }
248
- }, {
249
- timestamps: true
250
- });
251
-
252
- // Virtual for tracking participation rate
253
- rfqSchema.virtual('participationRate').get(function() {
254
- if (!this.suppliers || this.suppliers.length === 0) return 0;
255
-
256
- const respondedCount = this.suppliers.filter(
257
- supplier => supplier.quotationSubmitted === true
258
- ).length;
259
-
260
- return (respondedCount / this.suppliers.length) * 100;
261
- });
262
-
263
- // Index for efficient querying by date ranges
264
- rfqSchema.index({ startDate: 1, closingDate: 1 });
265
-
266
- const RFQ = mongoose.model('RFQ', rfqSchema);
267
-
1
+ const mongoose = require('mongoose');
2
+
3
+ const rfqSchema = new mongoose.Schema({
4
+ facilityId: {
5
+ type: mongoose.Schema.Types.ObjectId,
6
+ ref: 'Facility',
7
+ required: true,
8
+ index: true
9
+ },
10
+ name: {
11
+ type: String,
12
+ required: true,
13
+ trim: true,
14
+ index: true
15
+ },
16
+ rfqNumber: {
17
+ type: String,
18
+ required: true,
19
+ unique: true,
20
+ trim: true,
21
+ index: true
22
+ },
23
+ startDate: {
24
+ type: Date,
25
+ required: true
26
+ },
27
+ closingDate: {
28
+ type: Date,
29
+ required: true
30
+ },
31
+ currency: {
32
+ type: String,
33
+ required: true,
34
+ default: 'KES',
35
+ trim: true
36
+ },
37
+ rfqType: {
38
+ type: String,
39
+ required: true,
40
+ enum: ['open', 'closed'],
41
+ default: 'closed'
42
+ },
43
+ rfqFee: {
44
+ type: Number,
45
+ default: 0
46
+ },
47
+ rfqEvaluationType: {
48
+ type: String,
49
+ required: true,
50
+ enum: ['automatic', 'approvers'],
51
+ default: 'approvers'
52
+ },
53
+ notes: {
54
+ type: String,
55
+ trim: true
56
+ },
57
+ status: {
58
+ type: String,
59
+ enum: ['open','closed', 'awarded', 'canceled'],
60
+ default: 'open',
61
+ index: true
62
+ },
63
+ // RFQ Categories (Products or Services)
64
+ categories: [{
65
+ name: {
66
+ type: String,
67
+ required: true,
68
+ trim: true
69
+ },
70
+ // For Product type
71
+ products: [{
72
+ productName: {
73
+ type: String,
74
+ trim: true,
75
+ required: function() {
76
+ return this.parent().categoryType === 'product';
77
+ }
78
+ },
79
+ sku: {
80
+ type: String,
81
+ trim: true
82
+ },
83
+ quantity: {
84
+ type: Number,
85
+ required: function() {
86
+ return this.parent().categoryType === 'product';
87
+ }
88
+ },
89
+ unitOfMeasure: {
90
+ type: String,
91
+ trim: true
92
+ },
93
+ estimatedUnitPrice: {
94
+ type: Number
95
+ }
96
+ }],
97
+ // For Service type
98
+ services: [{
99
+ serviceDescription: {
100
+ type: String,
101
+ trim: true,
102
+ required: function() {
103
+ return this.parent().categoryType === 'service';
104
+ }
105
+ },
106
+ quantity: {
107
+ type: Number,
108
+ required: function() {
109
+ return this.parent().categoryType === 'service';
110
+ }
111
+ },
112
+ unitOfMeasure: {
113
+ type: String,
114
+ trim: true
115
+ },
116
+ estimatedUnitPrice: {
117
+ type: Number
118
+ }
119
+ }]
120
+ }],
121
+
122
+ // Suppliers invited to respond to the RFQ
123
+ suppliers: [{
124
+ supplierId: {
125
+ type: mongoose.Schema.Types.ObjectId,
126
+ ref: 'Supplier',
127
+ required: true
128
+ },
129
+ supplierName: {
130
+ type: String,
131
+ required: true,
132
+ trim: true
133
+ },
134
+ invitationStatus: {
135
+ type: String,
136
+ enum: ['pending', 'accepted', 'declined', 'no-response'],
137
+ default: 'pending'
138
+ },
139
+ invitationDate: {
140
+ type: Date,
141
+ default: Date.now
142
+ },
143
+ responseDate: {
144
+ type: Date
145
+ },
146
+ quotationSubmitted: {
147
+ type: Boolean,
148
+ default: false
149
+ },
150
+ quotationDetails: {
151
+ submissionDate: {
152
+ type: Date
153
+ },
154
+ totalAmount: {
155
+ type: Number
156
+ },
157
+ items: [{
158
+ categoryId: {
159
+ type: mongoose.Schema.Types.ObjectId,
160
+ required: true
161
+ },
162
+ itemId: {
163
+ type: mongoose.Schema.Types.ObjectId,
164
+ required: true
165
+ },
166
+ unitPrice: {
167
+ type: Number,
168
+ required: true
169
+ },
170
+ quantity: {
171
+ type: Number,
172
+ required: true
173
+ },
174
+ totalPrice: {
175
+ type: Number,
176
+ required: true
177
+ },
178
+ notes: {
179
+ type: String,
180
+ trim: true
181
+ }
182
+ }],
183
+ attachments: [{
184
+ name: {
185
+ type: String,
186
+ required: true
187
+ },
188
+ fileType: {
189
+ type: String,
190
+ required: true
191
+ },
192
+ filePath: {
193
+ type: String,
194
+ required: true
195
+ },
196
+ uploadDate: {
197
+ type: Date,
198
+ default: Date.now
199
+ }
200
+ }],
201
+ notes: {
202
+ type: String,
203
+ trim: true
204
+ }
205
+ },
206
+ evaluationScore: {
207
+ type: Number,
208
+ min: 0,
209
+ max: 100
210
+ },
211
+ evaluationNotes: {
212
+ type: String,
213
+ trim: true
214
+ }
215
+ }],
216
+
217
+
218
+ // Award details after RFQ is closed
219
+ awardDetails: {
220
+ awarded: {
221
+ type: Boolean,
222
+ default: false
223
+ },
224
+ awardedSupplierId: {
225
+ type: mongoose.Schema.Types.ObjectId,
226
+ ref: 'Supplier'
227
+ },
228
+ awardedSupplierName: {
229
+ type: String,
230
+ trim: true
231
+ },
232
+ awardDate: {
233
+ type: Date
234
+ },
235
+ awardNotes: {
236
+ type: String,
237
+ trim: true
238
+ },
239
+ purchaseOrderCreated: {
240
+ type: Boolean,
241
+ default: false
242
+ },
243
+ purchaseOrderId: {
244
+ type: mongoose.Schema.Types.ObjectId,
245
+ ref: 'PurchaseOrder'
246
+ }
247
+ }
248
+ }, {
249
+ timestamps: true
250
+ });
251
+
252
+ // Virtual for tracking participation rate
253
+ rfqSchema.virtual('participationRate').get(function() {
254
+ if (!this.suppliers || this.suppliers.length === 0) return 0;
255
+
256
+ const respondedCount = this.suppliers.filter(
257
+ supplier => supplier.quotationSubmitted === true
258
+ ).length;
259
+
260
+ return (respondedCount / this.suppliers.length) * 100;
261
+ });
262
+
263
+ // Index for efficient querying by date ranges
264
+ rfqSchema.index({ startDate: 1, closingDate: 1 });
265
+
266
+ const RFQ = mongoose.model('RFQ', rfqSchema);
267
+
268
268
  module.exports = RFQ;
@@ -1,23 +1,23 @@
1
- const mongoose = require('mongoose');
2
-
3
- const refreshTokenSchema = new mongoose.Schema({
4
- userId: {
5
- type: String,
6
- required: true,
7
- index: true, // Index for faster lookup by userId
8
- },
9
- token: {
10
- type: String,
11
- required: true,
12
- },
13
- createdAt: {
14
- type: Date,
15
- required: true,
16
- default: Date.now,
17
- expires: '30d', // Example: Token expires after 30 days
18
- },
19
- },{timestamps: true});
20
-
21
- const RefreshToken = mongoose.model('RefreshToken', refreshTokenSchema);
22
-
23
- module.exports = RefreshToken;
1
+ const mongoose = require('mongoose');
2
+
3
+ const refreshTokenSchema = new mongoose.Schema({
4
+ userId: {
5
+ type: String,
6
+ required: true,
7
+ index: true, // Index for faster lookup by userId
8
+ },
9
+ token: {
10
+ type: String,
11
+ required: true,
12
+ },
13
+ createdAt: {
14
+ type: Date,
15
+ required: true,
16
+ default: Date.now,
17
+ expires: '30d', // Example: Token expires after 30 days
18
+ },
19
+ },{timestamps: true});
20
+
21
+ const RefreshToken = mongoose.model('RefreshToken', refreshTokenSchema);
22
+
23
+ module.exports = RefreshToken;