payservedb 4.5.0 → 4.5.2

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 (86) hide show
  1. package/.env +2 -2
  2. package/index.js +152 -152
  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/archivedapilog.js +18 -18
  8. package/src/models/archivedauditlog.js +83 -83
  9. package/src/models/asset.js +34 -34
  10. package/src/models/auditlog.js +83 -83
  11. package/src/models/bankdetails.js +40 -40
  12. package/src/models/budget.js +33 -33
  13. package/src/models/budgetCategory.js +19 -19
  14. package/src/models/campaigns.js +72 -72
  15. package/src/models/cashpayment.js +262 -262
  16. package/src/models/combinedUnits.js +62 -62
  17. package/src/models/company.js +53 -53
  18. package/src/models/country_tax.js +42 -42
  19. package/src/models/currency_settings.js +39 -39
  20. package/src/models/customer.js +194 -194
  21. package/src/models/default_payment_details.js +17 -17
  22. package/src/models/dutyroster.js +39 -39
  23. package/src/models/email.js +24 -24
  24. package/src/models/entry_exit.js +53 -53
  25. package/src/models/expense.js +55 -55
  26. package/src/models/facility.js +60 -60
  27. package/src/models/facility_payment_details.js +20 -20
  28. package/src/models/facilityasset.js +25 -25
  29. package/src/models/faq.js +18 -18
  30. package/src/models/guard.js +47 -47
  31. package/src/models/handover.js +241 -241
  32. package/src/models/invoice.js +251 -251
  33. package/src/models/item_inspection.js +67 -67
  34. package/src/models/leaseagreement.js +168 -156
  35. package/src/models/leasetemplate.js +17 -17
  36. package/src/models/levy.js +72 -72
  37. package/src/models/levy_invoice_settings.js +26 -26
  38. package/src/models/levycontract.js +77 -65
  39. package/src/models/levytype.js +23 -23
  40. package/src/models/maintenance_service_vendor.js +38 -38
  41. package/src/models/maintenance_services.js +17 -17
  42. package/src/models/maintenancerequisition.js +31 -31
  43. package/src/models/message.js +38 -38
  44. package/src/models/module.js +21 -21
  45. package/src/models/notification.js +24 -24
  46. package/src/models/penalty.js +76 -76
  47. package/src/models/purchase_orders.js +0 -0
  48. package/src/models/purchase_requests.js +0 -0
  49. package/src/models/quotations.js +0 -0
  50. package/src/models/refresh_token.js +23 -23
  51. package/src/models/reminder.js +161 -161
  52. package/src/models/report.js +13 -13
  53. package/src/models/resident.js +121 -121
  54. package/src/models/service_charge_invoice_upload.js +42 -42
  55. package/src/models/service_charge_payments.js +27 -27
  56. package/src/models/servicerequest.js +55 -55
  57. package/src/models/settings.js +62 -62
  58. package/src/models/smart_meter_daily_consumption.js +44 -44
  59. package/src/models/sms_africastalking.js +20 -20
  60. package/src/models/sms_meliora.js +16 -16
  61. package/src/models/staff.js +36 -36
  62. package/src/models/stocksandspare.js +34 -34
  63. package/src/models/suppliers.js +110 -0
  64. package/src/models/tickets.js +109 -109
  65. package/src/models/unitasset.js +25 -25
  66. package/src/models/units.js +70 -70
  67. package/src/models/user.js +94 -94
  68. package/src/models/valueaddedservices.js +36 -36
  69. package/src/models/vas_invoices_upload.js +50 -50
  70. package/src/models/vas_payments.js +24 -24
  71. package/src/models/vasinvoice.js +159 -159
  72. package/src/models/vasvendor.js +57 -57
  73. package/src/models/visitLog.js +86 -86
  74. package/src/models/visitor.js +63 -63
  75. package/src/models/waitlist.js +45 -45
  76. package/src/models/water_invoice.js +192 -192
  77. package/src/models/water_meter_account.js +74 -74
  78. package/src/models/water_meter_communication.js +17 -17
  79. package/src/models/water_meter_concentrator.js +59 -59
  80. package/src/models/water_meter_iot_cards.js +34 -34
  81. package/src/models/water_meter_manufacturer.js +35 -35
  82. package/src/models/water_meter_settings.js +88 -88
  83. package/src/models/water_meter_size.js +15 -15
  84. package/src/models/water_meters.js +110 -110
  85. package/src/models/water_meters_delivery.js +76 -76
  86. package/src/models/workorder.js +49 -49
@@ -1,77 +1,77 @@
1
- const mongoose = require("mongoose");
2
-
3
- const penaltySchema = new mongoose.Schema(
4
- {
5
- name: {
6
- type: String,
7
- required: true,
8
- },
9
- type: {
10
- type: String,
11
- required: true,
12
- enum: ['percentage', 'fixed']
13
- },
14
- effectDays: {
15
- type: Number,
16
- required: true,
17
- min: [1, "Effect days must be at least 1"]
18
- },
19
- percentage: {
20
- type: Number,
21
- required: function () {
22
- return this.type === 'percentage';
23
- },
24
- min: [0, "Percentage must be at least 0"]
25
- },
26
- amount: {
27
- type: Number,
28
- required: function () {
29
- return this.type === 'fixed';
30
- },
31
- min: [0, "Amount must be a positive number"]
32
- },
33
- module: {
34
- type: String,
35
- required: true,
36
- enum: ['levy', 'lease', 'utility']
37
- },
38
- moduleId: {
39
- type: mongoose.Schema.Types.ObjectId,
40
- required: true,
41
- refPath: 'module'
42
- },
43
- isActive: {
44
- type: Boolean,
45
- default: true,
46
- },
47
- facilityId: {
48
- type: mongoose.Schema.Types.ObjectId,
49
- ref: "Facility",
50
- required: true,
51
- index: true
52
- }
53
- },
54
- {
55
- timestamps: true,
56
- indexes: [
57
- { facilityId: 1, isActive: 1 },
58
- { moduleId: 1, module: 1 },
59
- { name: 1, facilityId: 1 }
60
- ]
61
- }
62
- );
63
-
64
- // Add any custom methods or middleware here if needed
65
- penaltySchema.pre('save', function (next) {
66
- // Clear the irrelevant field based on penalty type
67
- if (this.type === 'percentage') {
68
- this.amount = null;
69
- } else if (this.type === 'fixed') {
70
- this.percentage = null;
71
- }
72
- next();
73
- });
74
-
75
- const Penalty = mongoose.model("Penalty", penaltySchema);
76
-
1
+ const mongoose = require("mongoose");
2
+
3
+ const penaltySchema = new mongoose.Schema(
4
+ {
5
+ name: {
6
+ type: String,
7
+ required: true,
8
+ },
9
+ type: {
10
+ type: String,
11
+ required: true,
12
+ enum: ['percentage', 'fixed']
13
+ },
14
+ effectDays: {
15
+ type: Number,
16
+ required: true,
17
+ min: [1, "Effect days must be at least 1"]
18
+ },
19
+ percentage: {
20
+ type: Number,
21
+ required: function () {
22
+ return this.type === 'percentage';
23
+ },
24
+ min: [0, "Percentage must be at least 0"]
25
+ },
26
+ amount: {
27
+ type: Number,
28
+ required: function () {
29
+ return this.type === 'fixed';
30
+ },
31
+ min: [0, "Amount must be a positive number"]
32
+ },
33
+ module: {
34
+ type: String,
35
+ required: true,
36
+ enum: ['levy', 'lease', 'utility']
37
+ },
38
+ moduleId: {
39
+ type: mongoose.Schema.Types.ObjectId,
40
+ required: true,
41
+ refPath: 'module'
42
+ },
43
+ isActive: {
44
+ type: Boolean,
45
+ default: true,
46
+ },
47
+ facilityId: {
48
+ type: mongoose.Schema.Types.ObjectId,
49
+ ref: "Facility",
50
+ required: true,
51
+ index: true
52
+ }
53
+ },
54
+ {
55
+ timestamps: true,
56
+ indexes: [
57
+ { facilityId: 1, isActive: 1 },
58
+ { moduleId: 1, module: 1 },
59
+ { name: 1, facilityId: 1 }
60
+ ]
61
+ }
62
+ );
63
+
64
+ // Add any custom methods or middleware here if needed
65
+ penaltySchema.pre('save', function (next) {
66
+ // Clear the irrelevant field based on penalty type
67
+ if (this.type === 'percentage') {
68
+ this.amount = null;
69
+ } else if (this.type === 'fixed') {
70
+ this.percentage = null;
71
+ }
72
+ next();
73
+ });
74
+
75
+ const Penalty = mongoose.model("Penalty", penaltySchema);
76
+
77
77
  module.exports = Penalty;
File without changes
File without changes
File without changes
@@ -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;
@@ -1,162 +1,162 @@
1
- const mongoose = require("mongoose");
2
- const moment = require("moment-timezone");
3
-
4
- const reminderSchema = new mongoose.Schema(
5
- {
6
- name: {
7
- type: String,
8
- required: true,
9
- trim: true,
10
- },
11
- type: {
12
- type: String,
13
- required: true,
14
- enum: ['standard', 'custom'],
15
- default: 'standard'
16
- },
17
- module: {
18
- type: String,
19
- required: true,
20
- enum: ['levy', 'lease', 'utility'],
21
- default: 'levy'
22
- },
23
- moduleId: {
24
- type: mongoose.Schema.Types.ObjectId,
25
- required: true,
26
- refPath: 'module'
27
- },
28
- remindOn: {
29
- invoiceDate: {
30
- type: Boolean,
31
- default: true,
32
- },
33
- dueDate: {
34
- type: Boolean,
35
- default: false,
36
- },
37
- afterOverdue: {
38
- enabled: {
39
- type: Boolean,
40
- default: false,
41
- },
42
- days: {
43
- type: [Number],
44
- validate: {
45
- validator: function (value) {
46
- if (!this.remindOn.afterOverdue.enabled) return true;
47
- return Array.isArray(value) &&
48
- value.length > 0 &&
49
- value.every(day => [1, 3, 7].includes(day));
50
- },
51
- message: 'When overdue reminders are enabled, days can only be 1, 3, or 7'
52
- }
53
- }
54
- }
55
- },
56
- time: {
57
- type: String,
58
- required: true,
59
- default: "09:00",
60
- validate: {
61
- validator: function (value) {
62
- return /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(value);
63
- },
64
- message: 'Time must be in HH:mm format'
65
- }
66
- },
67
- isActive: {
68
- type: Boolean,
69
- required: true,
70
- default: true,
71
- },
72
- processed: {
73
- type: Boolean,
74
- required: true,
75
- default: false,
76
- },
77
- lastProcessed: {
78
- type: Date,
79
- },
80
- notificationTypes: {
81
- type: [String],
82
- required: true,
83
- validate: {
84
- validator: function (value) {
85
- return value.length > 0 &&
86
- value.every(type => ['SMS', 'EMAIL'].includes(type.toUpperCase()));
87
- },
88
- message: 'At least one valid notification type is required'
89
- }
90
- },
91
- message: {
92
- type: String,
93
- maxLength: [500, 'Message cannot exceed 500 characters']
94
- },
95
- facilityId: {
96
- type: mongoose.Schema.Types.ObjectId,
97
- ref: "Facility",
98
- required: true,
99
- index: true
100
- },
101
- timezone: {
102
- type: String,
103
- required: true,
104
- default: 'UTC',
105
- validate: {
106
- validator: function (value) {
107
- return moment.tz.names().includes(value);
108
- },
109
- message: 'Invalid timezone'
110
- }
111
- }
112
- },
113
- {
114
- timestamps: true,
115
- indexes: [
116
- { facilityId: 1, isActive: 1 },
117
- { facilityId: 1, isActive: 1, 'remindOn.invoiceDate': 1 },
118
- { facilityId: 1, isActive: 1, 'remindOn.dueDate': 1 },
119
- { facilityId: 1, isActive: 1, 'remindOn.afterOverdue.enabled': 1 },
120
- { moduleId: 1, isActive: 1 },
121
- { facilityId: 1, lastProcessed: 1 }
122
- ]
123
- }
124
- );
125
-
126
- // Add methods to reminder schema
127
- reminderSchema.methods.shouldProcess = function (currentTime, invoice) {
128
- if (!this.isActive || !invoice) return false;
129
-
130
- const now = moment(currentTime);
131
- const invoiceDate = moment(invoice.createdAt);
132
- const dueDate = moment(invoice.dueDate);
133
- const today = moment().startOf('day');
134
-
135
- if (!this.isTimeToProcess(now)) return false;
136
-
137
- if (this.remindOn.invoiceDate && invoiceDate.isSame(today, 'day')) {
138
- return true;
139
- }
140
-
141
- if (this.remindOn.dueDate && dueDate.isSame(today, 'day')) {
142
- return true;
143
- }
144
-
145
- if (this.remindOn.afterOverdue.enabled && dueDate.isBefore(today, 'day')) {
146
- const daysOverdue = today.diff(dueDate, 'days');
147
- return this.remindOn.afterOverdue.days.includes(daysOverdue);
148
- }
149
-
150
- return false;
151
- };
152
-
153
- reminderSchema.methods.isTimeToProcess = function (currentTime) {
154
- const reminderMoment = moment(this.time, 'HH:mm');
155
- const currentMoment = moment(currentTime).format('HH:mm');
156
- const diffMinutes = moment(currentMoment, 'HH:mm').diff(reminderMoment, 'minutes');
157
- return Math.abs(diffMinutes) <= 5;
158
- };
159
-
160
- const Reminder = mongoose.model("Reminder", reminderSchema);
161
-
1
+ const mongoose = require("mongoose");
2
+ const moment = require("moment-timezone");
3
+
4
+ const reminderSchema = new mongoose.Schema(
5
+ {
6
+ name: {
7
+ type: String,
8
+ required: true,
9
+ trim: true,
10
+ },
11
+ type: {
12
+ type: String,
13
+ required: true,
14
+ enum: ['standard', 'custom'],
15
+ default: 'standard'
16
+ },
17
+ module: {
18
+ type: String,
19
+ required: true,
20
+ enum: ['levy', 'lease', 'utility'],
21
+ default: 'levy'
22
+ },
23
+ moduleId: {
24
+ type: mongoose.Schema.Types.ObjectId,
25
+ required: true,
26
+ refPath: 'module'
27
+ },
28
+ remindOn: {
29
+ invoiceDate: {
30
+ type: Boolean,
31
+ default: true,
32
+ },
33
+ dueDate: {
34
+ type: Boolean,
35
+ default: false,
36
+ },
37
+ afterOverdue: {
38
+ enabled: {
39
+ type: Boolean,
40
+ default: false,
41
+ },
42
+ days: {
43
+ type: [Number],
44
+ validate: {
45
+ validator: function (value) {
46
+ if (!this.remindOn.afterOverdue.enabled) return true;
47
+ return Array.isArray(value) &&
48
+ value.length > 0 &&
49
+ value.every(day => [1, 3, 7].includes(day));
50
+ },
51
+ message: 'When overdue reminders are enabled, days can only be 1, 3, or 7'
52
+ }
53
+ }
54
+ }
55
+ },
56
+ time: {
57
+ type: String,
58
+ required: true,
59
+ default: "09:00",
60
+ validate: {
61
+ validator: function (value) {
62
+ return /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(value);
63
+ },
64
+ message: 'Time must be in HH:mm format'
65
+ }
66
+ },
67
+ isActive: {
68
+ type: Boolean,
69
+ required: true,
70
+ default: true,
71
+ },
72
+ processed: {
73
+ type: Boolean,
74
+ required: true,
75
+ default: false,
76
+ },
77
+ lastProcessed: {
78
+ type: Date,
79
+ },
80
+ notificationTypes: {
81
+ type: [String],
82
+ required: true,
83
+ validate: {
84
+ validator: function (value) {
85
+ return value.length > 0 &&
86
+ value.every(type => ['SMS', 'EMAIL'].includes(type.toUpperCase()));
87
+ },
88
+ message: 'At least one valid notification type is required'
89
+ }
90
+ },
91
+ message: {
92
+ type: String,
93
+ maxLength: [500, 'Message cannot exceed 500 characters']
94
+ },
95
+ facilityId: {
96
+ type: mongoose.Schema.Types.ObjectId,
97
+ ref: "Facility",
98
+ required: true,
99
+ index: true
100
+ },
101
+ timezone: {
102
+ type: String,
103
+ required: true,
104
+ default: 'UTC',
105
+ validate: {
106
+ validator: function (value) {
107
+ return moment.tz.names().includes(value);
108
+ },
109
+ message: 'Invalid timezone'
110
+ }
111
+ }
112
+ },
113
+ {
114
+ timestamps: true,
115
+ indexes: [
116
+ { facilityId: 1, isActive: 1 },
117
+ { facilityId: 1, isActive: 1, 'remindOn.invoiceDate': 1 },
118
+ { facilityId: 1, isActive: 1, 'remindOn.dueDate': 1 },
119
+ { facilityId: 1, isActive: 1, 'remindOn.afterOverdue.enabled': 1 },
120
+ { moduleId: 1, isActive: 1 },
121
+ { facilityId: 1, lastProcessed: 1 }
122
+ ]
123
+ }
124
+ );
125
+
126
+ // Add methods to reminder schema
127
+ reminderSchema.methods.shouldProcess = function (currentTime, invoice) {
128
+ if (!this.isActive || !invoice) return false;
129
+
130
+ const now = moment(currentTime);
131
+ const invoiceDate = moment(invoice.createdAt);
132
+ const dueDate = moment(invoice.dueDate);
133
+ const today = moment().startOf('day');
134
+
135
+ if (!this.isTimeToProcess(now)) return false;
136
+
137
+ if (this.remindOn.invoiceDate && invoiceDate.isSame(today, 'day')) {
138
+ return true;
139
+ }
140
+
141
+ if (this.remindOn.dueDate && dueDate.isSame(today, 'day')) {
142
+ return true;
143
+ }
144
+
145
+ if (this.remindOn.afterOverdue.enabled && dueDate.isBefore(today, 'day')) {
146
+ const daysOverdue = today.diff(dueDate, 'days');
147
+ return this.remindOn.afterOverdue.days.includes(daysOverdue);
148
+ }
149
+
150
+ return false;
151
+ };
152
+
153
+ reminderSchema.methods.isTimeToProcess = function (currentTime) {
154
+ const reminderMoment = moment(this.time, 'HH:mm');
155
+ const currentMoment = moment(currentTime).format('HH:mm');
156
+ const diffMinutes = moment(currentMoment, 'HH:mm').diff(reminderMoment, 'minutes');
157
+ return Math.abs(diffMinutes) <= 5;
158
+ };
159
+
160
+ const Reminder = mongoose.model("Reminder", reminderSchema);
161
+
162
162
  module.exports = Reminder;
@@ -1,14 +1,14 @@
1
- const mongoose = require("mongoose");
2
-
3
- const ReportSchema = new mongoose.Schema({
4
- type: {
5
- type: String,
6
- enum: ['revenue', 'leasePerformance', 'expiredLeases'],
7
- required: true
8
- },
9
- data: { type: mongoose.Schema.Types.Mixed, required: true },
10
- generatedAt: { type: Date, default: Date.now },
11
- });
12
-
13
- module.exports = mongoose.model('Report', ReportSchema);
1
+ const mongoose = require("mongoose");
2
+
3
+ const ReportSchema = new mongoose.Schema({
4
+ type: {
5
+ type: String,
6
+ enum: ['revenue', 'leasePerformance', 'expiredLeases'],
7
+ required: true
8
+ },
9
+ data: { type: mongoose.Schema.Types.Mixed, required: true },
10
+ generatedAt: { type: Date, default: Date.now },
11
+ });
12
+
13
+ module.exports = mongoose.model('Report', ReportSchema);
14
14