payservedb 5.6.3 → 5.6.5

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 (113) hide show
  1. package/.env +2 -2
  2. package/index.js +190 -191
  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/auditlog.js +83 -83
  11. package/src/models/bankdetails.js +40 -40
  12. package/src/models/booking_invoice.js +151 -151
  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 +91 -91
  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 +41 -41
  25. package/src/models/common_area_utility_alert.js +37 -37
  26. package/src/models/common_area_water.js +39 -39
  27. package/src/models/company.js +53 -53
  28. package/src/models/country_tax.js +42 -42
  29. package/src/models/currency_settings.js +39 -39
  30. package/src/models/customer.js +200 -200
  31. package/src/models/default_payment_details.js +17 -17
  32. package/src/models/dutyroster.js +107 -107
  33. package/src/models/email.js +37 -37
  34. package/src/models/entry_exit.js +53 -53
  35. package/src/models/expense.js +99 -99
  36. package/src/models/expense_category.js +19 -19
  37. package/src/models/facility.js +61 -61
  38. package/src/models/facility_payment_details.js +20 -20
  39. package/src/models/facilityasset.js +25 -25
  40. package/src/models/faq.js +18 -18
  41. package/src/models/gl_account_double_entries.js +25 -25
  42. package/src/models/gl_accounts.js +56 -56
  43. package/src/models/gl_entries.js +49 -49
  44. package/src/models/guard.js +47 -47
  45. package/src/models/handover.js +246 -246
  46. package/src/models/invoice.js +336 -336
  47. package/src/models/item_inspection.js +67 -67
  48. package/src/models/leaseagreement.js +221 -221
  49. package/src/models/leasetemplate.js +17 -17
  50. package/src/models/levy.js +152 -152
  51. package/src/models/levy_invoice_settings.js +26 -26
  52. package/src/models/levycontract.js +117 -117
  53. package/src/models/levytype.js +23 -23
  54. package/src/models/maintenance_service_vendor.js +38 -38
  55. package/src/models/maintenance_services.js +17 -17
  56. package/src/models/maintenancerequisition.js +31 -31
  57. package/src/models/message.js +38 -38
  58. package/src/models/module.js +21 -21
  59. package/src/models/notification.js +36 -24
  60. package/src/models/penalty.js +76 -76
  61. package/src/models/pendingCredentials.js +32 -32
  62. package/src/models/propertyManagerContract.js +358 -358
  63. package/src/models/propertyManagerRevenue.js +100 -100
  64. package/src/models/purchase_order.js +194 -194
  65. package/src/models/purchase_request.js +110 -110
  66. package/src/models/refresh_token.js +23 -23
  67. package/src/models/reminder.js +197 -197
  68. package/src/models/report.js +13 -13
  69. package/src/models/resident.js +121 -121
  70. package/src/models/rfq_details.js +131 -131
  71. package/src/models/rfq_response.js +105 -105
  72. package/src/models/service_charge_invoice_upload.js +42 -42
  73. package/src/models/service_charge_payments.js +27 -27
  74. package/src/models/servicerequest.js +55 -55
  75. package/src/models/settings.js +62 -62
  76. package/src/models/smart_meter_daily_consumption.js +44 -44
  77. package/src/models/sms_africastalking.js +20 -20
  78. package/src/models/sms_meliora.js +20 -20
  79. package/src/models/staff.js +36 -36
  80. package/src/models/stocksandspare.js +34 -34
  81. package/src/models/suppliers.js +74 -74
  82. package/src/models/tickets.js +109 -109
  83. package/src/models/unitManagementTemplate.js +44 -44
  84. package/src/models/unitasset.js +25 -25
  85. package/src/models/units.js +112 -112
  86. package/src/models/user.js +187 -187
  87. package/src/models/valueaddedservices.js +79 -79
  88. package/src/models/vas_invoices_upload.js +50 -50
  89. package/src/models/vas_payments.js +24 -24
  90. package/src/models/vasinvoice.js +192 -192
  91. package/src/models/vasvendor.js +57 -57
  92. package/src/models/visitLog.js +86 -86
  93. package/src/models/visitor.js +67 -67
  94. package/src/models/waitlist.js +45 -45
  95. package/src/models/water_invoice.js +193 -193
  96. package/src/models/water_meter_account.js +78 -78
  97. package/src/models/water_meter_billing.js +58 -58
  98. package/src/models/water_meter_communication.js +17 -17
  99. package/src/models/water_meter_communication_logs.js +30 -30
  100. package/src/models/water_meter_concentrator.js +59 -59
  101. package/src/models/water_meter_daily_history.js +32 -32
  102. package/src/models/water_meter_iot_cards.js +34 -34
  103. package/src/models/water_meter_manufacturer.js +35 -35
  104. package/src/models/water_meter_monthly_history.js +36 -36
  105. package/src/models/water_meter_settings.js +88 -88
  106. package/src/models/water_meter_single_day_history.js +34 -34
  107. package/src/models/water_meter_size.js +15 -15
  108. package/src/models/water_meters.js +117 -117
  109. package/src/models/water_meters_delivery.js +76 -76
  110. package/src/models/water_prepaid_credit.js +43 -43
  111. package/src/models/water_prepaid_debit.js +50 -50
  112. package/src/models/workorder.js +49 -49
  113. package/src/models/billerAddress.js +0 -117
@@ -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;