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.
- package/.env +2 -2
- package/index.js +152 -152
- package/package.json +17 -17
- package/src/models/account.js +36 -36
- package/src/models/analog_water_billing.js +58 -58
- package/src/models/apilog.js +18 -18
- package/src/models/archivedapilog.js +18 -18
- package/src/models/archivedauditlog.js +83 -83
- package/src/models/asset.js +34 -34
- package/src/models/auditlog.js +83 -83
- package/src/models/bankdetails.js +40 -40
- package/src/models/budget.js +33 -33
- package/src/models/budgetCategory.js +19 -19
- package/src/models/campaigns.js +72 -72
- package/src/models/cashpayment.js +262 -262
- package/src/models/combinedUnits.js +62 -62
- package/src/models/company.js +53 -53
- package/src/models/country_tax.js +42 -42
- package/src/models/currency_settings.js +39 -39
- package/src/models/customer.js +194 -194
- package/src/models/default_payment_details.js +17 -17
- package/src/models/dutyroster.js +39 -39
- package/src/models/email.js +24 -24
- package/src/models/entry_exit.js +53 -53
- package/src/models/expense.js +55 -55
- package/src/models/facility.js +60 -60
- package/src/models/facility_payment_details.js +20 -20
- package/src/models/facilityasset.js +25 -25
- package/src/models/faq.js +18 -18
- package/src/models/guard.js +47 -47
- package/src/models/handover.js +241 -241
- package/src/models/invoice.js +251 -251
- package/src/models/item_inspection.js +67 -67
- package/src/models/leaseagreement.js +168 -156
- package/src/models/leasetemplate.js +17 -17
- package/src/models/levy.js +72 -72
- package/src/models/levy_invoice_settings.js +26 -26
- package/src/models/levycontract.js +77 -65
- 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/message.js +38 -38
- package/src/models/module.js +21 -21
- package/src/models/notification.js +24 -24
- package/src/models/penalty.js +76 -76
- package/src/models/purchase_orders.js +0 -0
- package/src/models/purchase_requests.js +0 -0
- package/src/models/quotations.js +0 -0
- package/src/models/refresh_token.js +23 -23
- package/src/models/reminder.js +161 -161
- package/src/models/report.js +13 -13
- package/src/models/resident.js +121 -121
- 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/smart_meter_daily_consumption.js +44 -44
- package/src/models/sms_africastalking.js +20 -20
- package/src/models/sms_meliora.js +16 -16
- package/src/models/staff.js +36 -36
- package/src/models/stocksandspare.js +34 -34
- package/src/models/suppliers.js +110 -0
- package/src/models/tickets.js +109 -109
- package/src/models/unitasset.js +25 -25
- package/src/models/units.js +70 -70
- package/src/models/user.js +94 -94
- package/src/models/valueaddedservices.js +36 -36
- package/src/models/vas_invoices_upload.js +50 -50
- package/src/models/vas_payments.js +24 -24
- package/src/models/vasinvoice.js +159 -159
- package/src/models/vasvendor.js +57 -57
- package/src/models/visitLog.js +86 -86
- package/src/models/visitor.js +63 -63
- package/src/models/waitlist.js +45 -45
- package/src/models/water_invoice.js +192 -192
- package/src/models/water_meter_account.js +74 -74
- package/src/models/water_meter_communication.js +17 -17
- package/src/models/water_meter_concentrator.js +59 -59
- package/src/models/water_meter_iot_cards.js +34 -34
- package/src/models/water_meter_manufacturer.js +35 -35
- package/src/models/water_meter_settings.js +88 -88
- package/src/models/water_meter_size.js +15 -15
- package/src/models/water_meters.js +110 -110
- package/src/models/water_meters_delivery.js +76 -76
- package/src/models/workorder.js +49 -49
package/src/models/penalty.js
CHANGED
|
@@ -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;
|
package/src/models/reminder.js
CHANGED
|
@@ -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;
|
package/src/models/report.js
CHANGED
|
@@ -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
|
|