payservedb 5.7.6 → 5.7.8

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 (116) hide show
  1. package/.env +2 -2
  2. package/index.js +198 -196
  3. package/package.json +17 -17
  4. package/src/models/account.js +35 -35
  5. package/src/models/apilog.js +18 -18
  6. package/src/models/approvalsWorkflows.js +49 -49
  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/assetsAssignment.js +64 -64
  11. package/src/models/auditlog.js +83 -83
  12. package/src/models/bankdetails.js +40 -40
  13. package/src/models/billerAddress.js +119 -119
  14. package/src/models/booking_invoice.js +151 -151
  15. package/src/models/bookinganalytics.js +63 -63
  16. package/src/models/bookingconfig.js +45 -45
  17. package/src/models/bookingproperty.js +112 -112
  18. package/src/models/bookingreservation.js +192 -192
  19. package/src/models/bookingrevenuerecord.js +84 -84
  20. package/src/models/budget.js +91 -91
  21. package/src/models/budgetCategory.js +19 -19
  22. package/src/models/campaigns.js +72 -72
  23. package/src/models/cashpayment.js +262 -262
  24. package/src/models/combinedUnits.js +62 -62
  25. package/src/models/common_area_electricity.js +38 -38
  26. package/src/models/common_area_generator.js +41 -41
  27. package/src/models/common_area_utility_alert.js +37 -37
  28. package/src/models/common_area_water.js +39 -39
  29. package/src/models/company.js +53 -53
  30. package/src/models/country_tax.js +42 -42
  31. package/src/models/currency_settings.js +39 -39
  32. package/src/models/customer.js +200 -200
  33. package/src/models/default_payment_details.js +17 -17
  34. package/src/models/dutyroster.js +107 -107
  35. package/src/models/email.js +37 -37
  36. package/src/models/entry_exit.js +53 -53
  37. package/src/models/expense.js +99 -99
  38. package/src/models/expense_category.js +45 -45
  39. package/src/models/facility.js +61 -61
  40. package/src/models/facility_payment_details.js +20 -20
  41. package/src/models/facilityasset.js +25 -25
  42. package/src/models/faq.js +18 -18
  43. package/src/models/gl_account_double_entries.js +25 -25
  44. package/src/models/gl_accounts.js +56 -56
  45. package/src/models/gl_entries.js +49 -49
  46. package/src/models/guard.js +47 -47
  47. package/src/models/handover.js +246 -246
  48. package/src/models/invoice.js +336 -336
  49. package/src/models/item_inspection.js +67 -67
  50. package/src/models/leaseagreement.js +221 -221
  51. package/src/models/leasetemplate.js +17 -17
  52. package/src/models/levy.js +206 -206
  53. package/src/models/levy_invoice_settings.js +26 -26
  54. package/src/models/levycontract.js +117 -117
  55. package/src/models/levytype.js +23 -23
  56. package/src/models/maintenance_service_vendor.js +38 -38
  57. package/src/models/maintenance_services.js +17 -17
  58. package/src/models/maintenancerequisition.js +31 -31
  59. package/src/models/message.js +38 -38
  60. package/src/models/module.js +21 -21
  61. package/src/models/notification.js +44 -44
  62. package/src/models/penalty.js +76 -76
  63. package/src/models/pendingCredentials.js +32 -32
  64. package/src/models/propertyManagerContract.js +171 -171
  65. package/src/models/propertyManagerRevenue.js +100 -100
  66. package/src/models/purchase_order.js +202 -202
  67. package/src/models/purchase_request.js +110 -110
  68. package/src/models/refresh_token.js +23 -23
  69. package/src/models/reminder.js +197 -197
  70. package/src/models/report.js +13 -13
  71. package/src/models/resident.js +121 -121
  72. package/src/models/rfq_details.js +131 -131
  73. package/src/models/rfq_response.js +110 -110
  74. package/src/models/service_charge_invoice_upload.js +42 -42
  75. package/src/models/service_charge_payments.js +27 -27
  76. package/src/models/servicerequest.js +55 -55
  77. package/src/models/settings.js +62 -62
  78. package/src/models/smart_meter_daily_consumption.js +44 -44
  79. package/src/models/sms_africastalking.js +20 -20
  80. package/src/models/sms_meliora.js +20 -20
  81. package/src/models/staff.js +36 -36
  82. package/src/models/stocksandspare.js +34 -34
  83. package/src/models/suppliers.js +74 -74
  84. package/src/models/tickets.js +121 -121
  85. package/src/models/unitManagementTemplate.js +44 -44
  86. package/src/models/unitasset.js +25 -25
  87. package/src/models/units.js +112 -112
  88. package/src/models/user.js +187 -187
  89. package/src/models/valueaddedservices.js +79 -79
  90. package/src/models/vas_invoices_upload.js +50 -50
  91. package/src/models/vas_payments.js +24 -24
  92. package/src/models/vasinvoice.js +192 -192
  93. package/src/models/vasvendor.js +57 -57
  94. package/src/models/visitLog.js +86 -86
  95. package/src/models/visitor.js +67 -67
  96. package/src/models/waitlist.js +45 -45
  97. package/src/models/wallet.js +35 -0
  98. package/src/models/wallet_transactions.js +50 -0
  99. package/src/models/water_invoice.js +193 -193
  100. package/src/models/water_meter_account.js +78 -78
  101. package/src/models/water_meter_billing.js +58 -58
  102. package/src/models/water_meter_communication.js +17 -17
  103. package/src/models/water_meter_communication_logs.js +30 -30
  104. package/src/models/water_meter_concentrator.js +63 -63
  105. package/src/models/water_meter_daily_history.js +32 -32
  106. package/src/models/water_meter_iot_cards.js +34 -34
  107. package/src/models/water_meter_manufacturer.js +35 -35
  108. package/src/models/water_meter_monthly_history.js +36 -36
  109. package/src/models/water_meter_settings.js +114 -114
  110. package/src/models/water_meter_single_day_history.js +34 -34
  111. package/src/models/water_meter_size.js +15 -15
  112. package/src/models/water_meters.js +117 -117
  113. package/src/models/water_meters_delivery.js +76 -76
  114. package/src/models/water_prepaid_credit.js +43 -43
  115. package/src/models/water_prepaid_debit.js +50 -50
  116. package/src/models/workorder.js +49 -49
@@ -1,111 +1,111 @@
1
- const mongoose = require('mongoose');
2
-
3
- const purchaseRequestSchema = new mongoose.Schema({
4
- facilityId: {
5
- type: mongoose.Schema.Types.ObjectId,
6
- ref: 'Facility',
7
- required: true,
8
- index: true
9
- },
10
- items: [{
11
- itemDescription: {
12
- type: String,
13
- required: true,
14
- trim: true
15
- },
16
- quantity: {
17
- type: Number,
18
- required: true
19
- },
20
- unitOfMeasure: {
21
- type: String,
22
- required: true,
23
- trim: true
24
- },
25
- remarksSpecification: {
26
- type: String,
27
- trim: true
28
- }
29
- }],
30
- from: {
31
- type: String,
32
- trim: true
33
- },
34
- date: {
35
- type: Date,
36
- required: true,
37
- default: Date.now
38
- },
39
- irfNumber: {
40
- type: String,
41
- required: true,
42
- trim: true,
43
- index: true
44
- },
45
- department: {
46
- type: String,
47
- trim: true
48
- },
49
- status: {
50
- type: String,
51
- default: 'pending',
52
- index: true
53
- },
54
- poStatus: {
55
- type: String,
56
- enum: ['PO Raised', 'pending'],
57
- default: 'pending',
58
- index: true
59
- },
60
- approvalWorkflowId: {
61
- type: mongoose.Schema.Types.ObjectId,
62
- ref: 'ApprovalWorkflow',
63
- required: true
64
- },
65
- approvalStatus: {
66
- type: String,
67
- enum: ['pending', 'in_progress', 'approved', 'rejected'],
68
- default: 'pending',
69
- index: true
70
- },
71
- currentStep: {
72
- type: Number,
73
- default: 1,
74
- min: 1
75
- },
76
- approvals: [{
77
- stepNumber: {
78
- type: Number,
79
- required: true
80
- },
81
- stepName: {
82
- type: String,
83
- required: true
84
- },
85
- approvers: [{
86
- userId: {
87
- type: mongoose.Schema.Types.ObjectId,
88
- ref: 'User',
89
- required: true
90
- },
91
- status: {
92
- type: String,
93
- enum: ['pending', 'approved', 'rejected'],
94
- default: 'pending'
95
- },
96
- actionDate: {
97
- type: Date
98
- },
99
- comments: {
100
- type: String,
101
- trim: true
102
- }
103
- }]
104
- }]
105
- }, {
106
- timestamps: true
107
- });
108
-
109
- const PurchaseRequest = mongoose.model('PurchaseRequest', purchaseRequestSchema);
110
-
1
+ const mongoose = require('mongoose');
2
+
3
+ const purchaseRequestSchema = new mongoose.Schema({
4
+ facilityId: {
5
+ type: mongoose.Schema.Types.ObjectId,
6
+ ref: 'Facility',
7
+ required: true,
8
+ index: true
9
+ },
10
+ items: [{
11
+ itemDescription: {
12
+ type: String,
13
+ required: true,
14
+ trim: true
15
+ },
16
+ quantity: {
17
+ type: Number,
18
+ required: true
19
+ },
20
+ unitOfMeasure: {
21
+ type: String,
22
+ required: true,
23
+ trim: true
24
+ },
25
+ remarksSpecification: {
26
+ type: String,
27
+ trim: true
28
+ }
29
+ }],
30
+ from: {
31
+ type: String,
32
+ trim: true
33
+ },
34
+ date: {
35
+ type: Date,
36
+ required: true,
37
+ default: Date.now
38
+ },
39
+ irfNumber: {
40
+ type: String,
41
+ required: true,
42
+ trim: true,
43
+ index: true
44
+ },
45
+ department: {
46
+ type: String,
47
+ trim: true
48
+ },
49
+ status: {
50
+ type: String,
51
+ default: 'pending',
52
+ index: true
53
+ },
54
+ poStatus: {
55
+ type: String,
56
+ enum: ['PO Raised', 'pending'],
57
+ default: 'pending',
58
+ index: true
59
+ },
60
+ approvalWorkflowId: {
61
+ type: mongoose.Schema.Types.ObjectId,
62
+ ref: 'ApprovalWorkflow',
63
+ required: true
64
+ },
65
+ approvalStatus: {
66
+ type: String,
67
+ enum: ['pending', 'in_progress', 'approved', 'rejected'],
68
+ default: 'pending',
69
+ index: true
70
+ },
71
+ currentStep: {
72
+ type: Number,
73
+ default: 1,
74
+ min: 1
75
+ },
76
+ approvals: [{
77
+ stepNumber: {
78
+ type: Number,
79
+ required: true
80
+ },
81
+ stepName: {
82
+ type: String,
83
+ required: true
84
+ },
85
+ approvers: [{
86
+ userId: {
87
+ type: mongoose.Schema.Types.ObjectId,
88
+ ref: 'User',
89
+ required: true
90
+ },
91
+ status: {
92
+ type: String,
93
+ enum: ['pending', 'approved', 'rejected'],
94
+ default: 'pending'
95
+ },
96
+ actionDate: {
97
+ type: Date
98
+ },
99
+ comments: {
100
+ type: String,
101
+ trim: true
102
+ }
103
+ }]
104
+ }]
105
+ }, {
106
+ timestamps: true
107
+ });
108
+
109
+ const PurchaseRequest = mongoose.model('PurchaseRequest', purchaseRequestSchema);
110
+
111
111
  module.exports = PurchaseRequest;
@@ -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,198 +1,198 @@
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
- daily: {
43
- type: Boolean,
44
- default: false,
45
- },
46
- days: {
47
- type: [Number],
48
- validate: {
49
- validator: function (value) {
50
- // If daily reminders are enabled, no need to validate days
51
- if (this.remindOn?.afterOverdue?.daily === true) return true;
52
-
53
- // If overdue reminders are disabled, no validation needed
54
- if (!this.remindOn?.afterOverdue?.enabled) return true;
55
-
56
- // If overdue is enabled but daily is false, then validate days array
57
- return Array.isArray(value) &&
58
- value.length > 0 &&
59
- value.every(day => [1, 3, 7].includes(day));
60
- },
61
- message: 'When overdue reminders are enabled (and daily is false), days must include only values of 1, 3, or 7'
62
- }
63
- }
64
- }
65
- },
66
- time: {
67
- type: String,
68
- required: true,
69
- default: "09:00",
70
- validate: {
71
- validator: function (value) {
72
- return /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(value);
73
- },
74
- message: 'Time must be in HH:mm format'
75
- }
76
- },
77
- isActive: {
78
- type: Boolean,
79
- required: true,
80
- default: true,
81
- },
82
- processed: {
83
- type: Boolean,
84
- required: true,
85
- default: false,
86
- },
87
- lastProcessed: {
88
- type: Date,
89
- },
90
- notificationTypes: {
91
- type: [String],
92
- required: true,
93
- validate: {
94
- validator: function (value) {
95
- return value.length > 0 &&
96
- value.every(type => ['SMS', 'EMAIL'].includes(type.toUpperCase()));
97
- },
98
- message: 'At least one valid notification type is required'
99
- }
100
- },
101
- message: {
102
- type: String,
103
- maxLength: [500, 'Message cannot exceed 500 characters']
104
- },
105
- facilityId: {
106
- type: mongoose.Schema.Types.ObjectId,
107
- ref: "Facility",
108
- required: true,
109
- index: true
110
- },
111
- timezone: {
112
- type: String,
113
- required: true,
114
- default: 'UTC',
115
- validate: {
116
- validator: function (value) {
117
- return moment.tz.names().includes(value);
118
- },
119
- message: 'Invalid timezone'
120
- }
121
- }
122
- },
123
- {
124
- timestamps: true,
125
- indexes: [
126
- { facilityId: 1, isActive: 1 },
127
- { facilityId: 1, isActive: 1, 'remindOn.invoiceDate': 1 },
128
- { facilityId: 1, isActive: 1, 'remindOn.dueDate': 1 },
129
- { facilityId: 1, isActive: 1, 'remindOn.afterOverdue.enabled': 1 },
130
- { facilityId: 1, isActive: 1, 'remindOn.afterOverdue.daily': 1 },
131
- { moduleId: 1, isActive: 1 },
132
- { facilityId: 1, lastProcessed: 1 }
133
- ]
134
- }
135
- );
136
-
137
- // Helper method to check if reminder should be processed
138
- reminderSchema.methods.shouldProcess = function (currentTime, invoice) {
139
- if (!this.isActive || !invoice) return false;
140
-
141
- const now = moment(currentTime);
142
- const invoiceDate = moment(invoice.createdAt);
143
- const dueDate = moment(invoice.dueDate);
144
- const today = moment().startOf('day');
145
-
146
- // Check if current time matches reminder time
147
- if (!this.isTimeToProcess(now)) return false;
148
-
149
- // Check for invoice date reminder
150
- if (this.remindOn.invoiceDate && invoiceDate.isSame(today, 'day')) {
151
- return true;
152
- }
153
-
154
- // Check for due date reminder
155
- if (this.remindOn.dueDate && dueDate.isSame(today, 'day')) {
156
- return true;
157
- }
158
-
159
- // Check for overdue reminder
160
- if (this.remindOn.afterOverdue.enabled && dueDate.isBefore(today, 'day')) {
161
- // If daily reminders are enabled, send reminder every day after due date
162
- if (this.remindOn.afterOverdue.daily) {
163
- return true;
164
- }
165
-
166
- // Otherwise, check if today is one of the specific days after due date
167
- const daysOverdue = today.diff(dueDate, 'days');
168
- return this.remindOn.afterOverdue.days.includes(daysOverdue);
169
- }
170
-
171
- return false;
172
- };
173
-
174
- // Helper to check if current time is close to scheduled reminder time
175
- reminderSchema.methods.isTimeToProcess = function (currentTime) {
176
- const reminderTime = moment(this.time, 'HH:mm');
177
- const currentMoment = moment(currentTime).format('HH:mm');
178
- const diffMinutes = Math.abs(
179
- moment(currentMoment, 'HH:mm').diff(reminderTime, 'minutes')
180
- );
181
-
182
- // Allow processing within 5 minutes of scheduled time
183
- return diffMinutes <= 5;
184
- };
185
-
186
- // Method to check if reminder has been processed today
187
- reminderSchema.methods.hasBeenProcessedToday = function () {
188
- if (!this.lastProcessed) return false;
189
-
190
- const today = moment().startOf('day');
191
- const processedDate = moment(this.lastProcessed).startOf('day');
192
-
193
- return processedDate.isSame(today, 'day');
194
- };
195
-
196
- const Reminder = mongoose.model("Reminder", reminderSchema);
197
-
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
+ daily: {
43
+ type: Boolean,
44
+ default: false,
45
+ },
46
+ days: {
47
+ type: [Number],
48
+ validate: {
49
+ validator: function (value) {
50
+ // If daily reminders are enabled, no need to validate days
51
+ if (this.remindOn?.afterOverdue?.daily === true) return true;
52
+
53
+ // If overdue reminders are disabled, no validation needed
54
+ if (!this.remindOn?.afterOverdue?.enabled) return true;
55
+
56
+ // If overdue is enabled but daily is false, then validate days array
57
+ return Array.isArray(value) &&
58
+ value.length > 0 &&
59
+ value.every(day => [1, 3, 7].includes(day));
60
+ },
61
+ message: 'When overdue reminders are enabled (and daily is false), days must include only values of 1, 3, or 7'
62
+ }
63
+ }
64
+ }
65
+ },
66
+ time: {
67
+ type: String,
68
+ required: true,
69
+ default: "09:00",
70
+ validate: {
71
+ validator: function (value) {
72
+ return /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(value);
73
+ },
74
+ message: 'Time must be in HH:mm format'
75
+ }
76
+ },
77
+ isActive: {
78
+ type: Boolean,
79
+ required: true,
80
+ default: true,
81
+ },
82
+ processed: {
83
+ type: Boolean,
84
+ required: true,
85
+ default: false,
86
+ },
87
+ lastProcessed: {
88
+ type: Date,
89
+ },
90
+ notificationTypes: {
91
+ type: [String],
92
+ required: true,
93
+ validate: {
94
+ validator: function (value) {
95
+ return value.length > 0 &&
96
+ value.every(type => ['SMS', 'EMAIL'].includes(type.toUpperCase()));
97
+ },
98
+ message: 'At least one valid notification type is required'
99
+ }
100
+ },
101
+ message: {
102
+ type: String,
103
+ maxLength: [500, 'Message cannot exceed 500 characters']
104
+ },
105
+ facilityId: {
106
+ type: mongoose.Schema.Types.ObjectId,
107
+ ref: "Facility",
108
+ required: true,
109
+ index: true
110
+ },
111
+ timezone: {
112
+ type: String,
113
+ required: true,
114
+ default: 'UTC',
115
+ validate: {
116
+ validator: function (value) {
117
+ return moment.tz.names().includes(value);
118
+ },
119
+ message: 'Invalid timezone'
120
+ }
121
+ }
122
+ },
123
+ {
124
+ timestamps: true,
125
+ indexes: [
126
+ { facilityId: 1, isActive: 1 },
127
+ { facilityId: 1, isActive: 1, 'remindOn.invoiceDate': 1 },
128
+ { facilityId: 1, isActive: 1, 'remindOn.dueDate': 1 },
129
+ { facilityId: 1, isActive: 1, 'remindOn.afterOverdue.enabled': 1 },
130
+ { facilityId: 1, isActive: 1, 'remindOn.afterOverdue.daily': 1 },
131
+ { moduleId: 1, isActive: 1 },
132
+ { facilityId: 1, lastProcessed: 1 }
133
+ ]
134
+ }
135
+ );
136
+
137
+ // Helper method to check if reminder should be processed
138
+ reminderSchema.methods.shouldProcess = function (currentTime, invoice) {
139
+ if (!this.isActive || !invoice) return false;
140
+
141
+ const now = moment(currentTime);
142
+ const invoiceDate = moment(invoice.createdAt);
143
+ const dueDate = moment(invoice.dueDate);
144
+ const today = moment().startOf('day');
145
+
146
+ // Check if current time matches reminder time
147
+ if (!this.isTimeToProcess(now)) return false;
148
+
149
+ // Check for invoice date reminder
150
+ if (this.remindOn.invoiceDate && invoiceDate.isSame(today, 'day')) {
151
+ return true;
152
+ }
153
+
154
+ // Check for due date reminder
155
+ if (this.remindOn.dueDate && dueDate.isSame(today, 'day')) {
156
+ return true;
157
+ }
158
+
159
+ // Check for overdue reminder
160
+ if (this.remindOn.afterOverdue.enabled && dueDate.isBefore(today, 'day')) {
161
+ // If daily reminders are enabled, send reminder every day after due date
162
+ if (this.remindOn.afterOverdue.daily) {
163
+ return true;
164
+ }
165
+
166
+ // Otherwise, check if today is one of the specific days after due date
167
+ const daysOverdue = today.diff(dueDate, 'days');
168
+ return this.remindOn.afterOverdue.days.includes(daysOverdue);
169
+ }
170
+
171
+ return false;
172
+ };
173
+
174
+ // Helper to check if current time is close to scheduled reminder time
175
+ reminderSchema.methods.isTimeToProcess = function (currentTime) {
176
+ const reminderTime = moment(this.time, 'HH:mm');
177
+ const currentMoment = moment(currentTime).format('HH:mm');
178
+ const diffMinutes = Math.abs(
179
+ moment(currentMoment, 'HH:mm').diff(reminderTime, 'minutes')
180
+ );
181
+
182
+ // Allow processing within 5 minutes of scheduled time
183
+ return diffMinutes <= 5;
184
+ };
185
+
186
+ // Method to check if reminder has been processed today
187
+ reminderSchema.methods.hasBeenProcessedToday = function () {
188
+ if (!this.lastProcessed) return false;
189
+
190
+ const today = moment().startOf('day');
191
+ const processedDate = moment(this.lastProcessed).startOf('day');
192
+
193
+ return processedDate.isSame(today, 'day');
194
+ };
195
+
196
+ const Reminder = mongoose.model("Reminder", reminderSchema);
197
+
198
198
  module.exports = Reminder;