payservedb 8.3.9 → 8.4.1

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 (177) hide show
  1. package/.env +2 -2
  2. package/ZOHO_INTEGRATION_SCHEMA.md +644 -644
  3. package/index.js +309 -307
  4. package/package.json +17 -17
  5. package/src/models/account.js +52 -52
  6. package/src/models/agent_departments.js +59 -59
  7. package/src/models/agent_notifications.js +53 -53
  8. package/src/models/agent_performance.js +127 -127
  9. package/src/models/agent_roles.js +77 -77
  10. package/src/models/agents.js +154 -154
  11. package/src/models/apilog.js +18 -18
  12. package/src/models/approvalsWorkflows.js +49 -49
  13. package/src/models/archivedapilog.js +18 -18
  14. package/src/models/asset.js +92 -92
  15. package/src/models/assetsAssignment.js +64 -64
  16. package/src/models/auditTrail.js +346 -346
  17. package/src/models/bankdetails.js +47 -47
  18. package/src/models/billerAddress.js +124 -124
  19. package/src/models/booking_invoice.js +151 -151
  20. package/src/models/bookinganalytics.js +63 -63
  21. package/src/models/bookingconfig.js +45 -45
  22. package/src/models/bookingproperty.js +122 -122
  23. package/src/models/bookingreservation.js +192 -192
  24. package/src/models/bookingrevenuerecord.js +84 -84
  25. package/src/models/budget.js +95 -95
  26. package/src/models/budgetCategory.js +19 -19
  27. package/src/models/campaigns.js +108 -108
  28. package/src/models/cashpayment.js +264 -264
  29. package/src/models/combinedUnits.js +62 -62
  30. package/src/models/common_area_electricity.js +38 -38
  31. package/src/models/common_area_generator.js +41 -41
  32. package/src/models/common_area_utility_alert.js +37 -37
  33. package/src/models/common_area_water.js +39 -39
  34. package/src/models/communication_status.js +33 -33
  35. package/src/models/communication_user_opt.js +32 -32
  36. package/src/models/company.js +53 -53
  37. package/src/models/coreBaseSettings.js +16 -16
  38. package/src/models/coreInvoiceSettings.js +100 -100
  39. package/src/models/counter_schema.js +21 -21
  40. package/src/models/country_tax.js +42 -42
  41. package/src/models/currency_settings.js +39 -39
  42. package/src/models/customer.js +210 -210
  43. package/src/models/customer_satisfaction_survey.js +278 -278
  44. package/src/models/customer_surveys.js +139 -139
  45. package/src/models/customer_tickets.js +239 -239
  46. package/src/models/dailyChecklist.js +312 -312
  47. package/src/models/default_payment_details.js +17 -17
  48. package/src/models/deliveryTimeMarks.js +18 -18
  49. package/src/models/document_type.js +19 -19
  50. package/src/models/dutyRosterChecklist.js +250 -250
  51. package/src/models/dutyroster.js +136 -136
  52. package/src/models/email.js +37 -37
  53. package/src/models/email_sms_queue.js +61 -61
  54. package/src/models/entry_exit.js +53 -53
  55. package/src/models/expense.js +99 -99
  56. package/src/models/expense_category.js +45 -45
  57. package/src/models/facility.js +62 -62
  58. package/src/models/facilityBillingPrices.js +29 -29
  59. package/src/models/facilityInvoice.js +240 -240
  60. package/src/models/facilityInvoicePayment.js +52 -52
  61. package/src/models/facilityInvoiceRecipient.js +32 -32
  62. package/src/models/facilityWalletTransactionsMetadata.js +236 -236
  63. package/src/models/facility_departements.js +20 -20
  64. package/src/models/facility_payment_details.js +20 -20
  65. package/src/models/facilityasset.js +25 -25
  66. package/src/models/faq.js +14 -14
  67. package/src/models/gl_account_double_entries.js +25 -25
  68. package/src/models/gl_accounts.js +56 -56
  69. package/src/models/gl_entries.js +49 -49
  70. package/src/models/goodsReceivedNotes.js +115 -115
  71. package/src/models/guard.js +47 -47
  72. package/src/models/handover.js +247 -247
  73. package/src/models/inspection_category.js +38 -38
  74. package/src/models/invoice.js +387 -387
  75. package/src/models/invoicing_schedule.js +36 -36
  76. package/src/models/item_inspection.js +96 -96
  77. package/src/models/knowledge_base.js +109 -109
  78. package/src/models/knowledge_base_rating.js +44 -44
  79. package/src/models/leaseagreement.js +236 -236
  80. package/src/models/leasetemplate.js +17 -17
  81. package/src/models/levy.js +223 -223
  82. package/src/models/levy_invoice_settings.js +26 -26
  83. package/src/models/levycontract.js +177 -177
  84. package/src/models/levytype.js +23 -23
  85. package/src/models/maintenance_service_vendor.js +38 -38
  86. package/src/models/maintenance_services.js +17 -17
  87. package/src/models/maintenancerequisition.js +31 -31
  88. package/src/models/master_workplan.js +32 -32
  89. package/src/models/master_workplan_child.js +34 -34
  90. package/src/models/message.js +38 -38
  91. package/src/models/module.js +21 -21
  92. package/src/models/notification.js +44 -44
  93. package/src/models/paymentTermsMarks.js +19 -19
  94. package/src/models/penalty.js +76 -76
  95. package/src/models/pendingCredentials.js +32 -32
  96. package/src/models/powerMeterCommunicationProtocol.js +17 -17
  97. package/src/models/powerMeterCustomerAccount.js +78 -78
  98. package/src/models/powerMeterCustomerBand.js +14 -14
  99. package/src/models/powerMeterDailyReading.js +30 -30
  100. package/src/models/powerMeterGateways.js +40 -40
  101. package/src/models/powerMeterMonthlyReading.js +34 -34
  102. package/src/models/powerMeterPowerCharges.js +85 -85
  103. package/src/models/powerMeterSettings.js +159 -159
  104. package/src/models/powerMeterSingleDayReading.js +32 -32
  105. package/src/models/powerMeters.js +116 -116
  106. package/src/models/powerMetersManufacturer.js +14 -14
  107. package/src/models/power_meter_account.js +81 -81
  108. package/src/models/power_meter_command_logs.js +30 -30
  109. package/src/models/power_meter_command_queue.js +33 -33
  110. package/src/models/power_meter_negative_balance.js +44 -44
  111. package/src/models/power_prepaid_credits.js +47 -47
  112. package/src/models/power_prepaid_debits.js +53 -53
  113. package/src/models/power_prepaid_orders.js +78 -78
  114. package/src/models/power_sms_notification.js +26 -26
  115. package/src/models/privacy_policy.js +20 -0
  116. package/src/models/propertyManagerContract.js +556 -556
  117. package/src/models/propertyManagerRevenue.js +195 -195
  118. package/src/models/purchaseOrderInvoice.js +74 -74
  119. package/src/models/purchase_order.js +213 -213
  120. package/src/models/purchase_request.js +110 -110
  121. package/src/models/refresh_token.js +23 -23
  122. package/src/models/reminder.js +197 -197
  123. package/src/models/report.js +13 -13
  124. package/src/models/resident.js +121 -121
  125. package/src/models/rfq_details.js +131 -131
  126. package/src/models/rfq_response.js +153 -153
  127. package/src/models/service_charge_invoice_upload.js +42 -42
  128. package/src/models/service_charge_payments.js +27 -27
  129. package/src/models/servicerequest.js +55 -55
  130. package/src/models/settings.js +62 -62
  131. package/src/models/short_urls.js +21 -21
  132. package/src/models/smart_meter_daily_consumption.js +44 -44
  133. package/src/models/sms_africastalking.js +20 -20
  134. package/src/models/sms_balance_notification.js +26 -26
  135. package/src/models/sms_meliora.js +20 -20
  136. package/src/models/staff.js +36 -36
  137. package/src/models/stocksandspare.js +161 -161
  138. package/src/models/suppliers.js +74 -74
  139. package/src/models/terms_and_conditions.js +20 -0
  140. package/src/models/tickets.js +186 -173
  141. package/src/models/tickets_category.js +72 -72
  142. package/src/models/unitManagementTemplate.js +44 -44
  143. package/src/models/unitasset.js +25 -25
  144. package/src/models/units.js +118 -118
  145. package/src/models/user.js +186 -186
  146. package/src/models/valueaddedservices.js +79 -79
  147. package/src/models/vas_invoices_upload.js +50 -50
  148. package/src/models/vas_payments.js +24 -24
  149. package/src/models/vasinvoice.js +192 -192
  150. package/src/models/vasvendor.js +57 -57
  151. package/src/models/visitLog.js +95 -95
  152. package/src/models/visitor.js +67 -67
  153. package/src/models/waitlist.js +45 -45
  154. package/src/models/wallet.js +44 -44
  155. package/src/models/wallet_transactions.js +50 -50
  156. package/src/models/water_invoice.js +351 -351
  157. package/src/models/water_meter_Command_Queue.js +33 -33
  158. package/src/models/water_meter_account.js +88 -82
  159. package/src/models/water_meter_billing.js +58 -58
  160. package/src/models/water_meter_communication.js +17 -17
  161. package/src/models/water_meter_communication_logs.js +39 -39
  162. package/src/models/water_meter_concentrator.js +70 -70
  163. package/src/models/water_meter_daily_history.js +32 -32
  164. package/src/models/water_meter_high_risk.js +36 -36
  165. package/src/models/water_meter_iot_cards.js +34 -34
  166. package/src/models/water_meter_manufacturer.js +35 -35
  167. package/src/models/water_meter_monthly_history.js +36 -36
  168. package/src/models/water_meter_negative_amounts.js +44 -44
  169. package/src/models/water_meter_settings.js +287 -283
  170. package/src/models/water_meter_single_day_history.js +34 -34
  171. package/src/models/water_meter_size.js +15 -15
  172. package/src/models/water_meters.js +133 -133
  173. package/src/models/water_meters_delivery.js +76 -76
  174. package/src/models/water_prepaid_credit.js +47 -47
  175. package/src/models/water_prepaid_debit.js +50 -50
  176. package/src/models/workorder.js +49 -49
  177. package/src/models/zohoIntegration.js +262 -262
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
- {
2
- "name": "payservedb",
3
- "version": "8.3.9",
4
- "main": "index.js",
5
- "scripts": {
6
- "test": "echo \"Error: no test specified\" && exit 1"
7
- },
8
- "keywords": [],
9
- "author": "",
10
- "license": "ISC",
11
- "description": "",
12
- "dependencies": {
13
- "dotenv": "^16.4.5",
14
- "moment-timezone": "^0.5.47",
15
- "mongoose": "^8.3.5"
16
- }
17
- }
1
+ {
2
+ "name": "payservedb",
3
+ "version": "8.4.1",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\" && exit 1"
7
+ },
8
+ "keywords": [],
9
+ "author": "",
10
+ "license": "ISC",
11
+ "description": "",
12
+ "dependencies": {
13
+ "dotenv": "^16.4.5",
14
+ "moment-timezone": "^0.5.47",
15
+ "mongoose": "^8.3.5"
16
+ }
17
+ }
@@ -1,53 +1,53 @@
1
- const mongoose = require("mongoose");
2
-
3
- const accountSchema = new mongoose.Schema({
4
- accountNumber: {
5
- type: String,
6
- required: true,
7
- unique: true,
8
- trim: true,
9
- },
10
- facilityId: {
11
- type: mongoose.Schema.Types.ObjectId,
12
- default: null,
13
- },
14
- contractId: {
15
- type: mongoose.Schema.Types.ObjectId,
16
- unique: true,
17
- default: null,
18
- },
19
- customerId: {
20
- type: mongoose.Schema.Types.ObjectId,
21
- default: null,
22
- },
23
- unitId: {
24
- type: mongoose.Schema.Types.ObjectId,
25
- default: null,
26
- },
27
- isActive: {
28
- type: Boolean,
29
- default: true,
30
- },
31
- accountType: {
32
- type: String,
33
- },
34
- amount: {
35
- type: Number,
36
- },
37
- payServeSync: {
38
- type: Boolean,
39
- default: false,
40
- },
41
- createdAt: {
42
- type: Date,
43
- default: Date.now,
44
- },
45
- updatedAt: {
46
- type: Date,
47
- default: Date.now,
48
- },
49
- });
50
-
51
- const Account = mongoose.model('Account', accountSchema);
52
-
1
+ const mongoose = require("mongoose");
2
+
3
+ const accountSchema = new mongoose.Schema({
4
+ accountNumber: {
5
+ type: String,
6
+ required: true,
7
+ unique: true,
8
+ trim: true,
9
+ },
10
+ facilityId: {
11
+ type: mongoose.Schema.Types.ObjectId,
12
+ default: null,
13
+ },
14
+ contractId: {
15
+ type: mongoose.Schema.Types.ObjectId,
16
+ unique: true,
17
+ default: null,
18
+ },
19
+ customerId: {
20
+ type: mongoose.Schema.Types.ObjectId,
21
+ default: null,
22
+ },
23
+ unitId: {
24
+ type: mongoose.Schema.Types.ObjectId,
25
+ default: null,
26
+ },
27
+ isActive: {
28
+ type: Boolean,
29
+ default: true,
30
+ },
31
+ accountType: {
32
+ type: String,
33
+ },
34
+ amount: {
35
+ type: Number,
36
+ },
37
+ payServeSync: {
38
+ type: Boolean,
39
+ default: false,
40
+ },
41
+ createdAt: {
42
+ type: Date,
43
+ default: Date.now,
44
+ },
45
+ updatedAt: {
46
+ type: Date,
47
+ default: Date.now,
48
+ },
49
+ });
50
+
51
+ const Account = mongoose.model('Account', accountSchema);
52
+
53
53
  module.exports = Account;
@@ -1,59 +1,59 @@
1
- const mongoose = require('mongoose');
2
-
3
- const agentDepartmentSchema = new mongoose.Schema({
4
- name: {
5
- type: String,
6
- required: [true, 'Department name is required'],
7
- trim: true,
8
- maxlength: 100
9
- },
10
- code: {
11
- type: String,
12
- required: [true, 'Department code is required'],
13
- trim: true,
14
- uppercase: true,
15
- maxlength: 20
16
- },
17
- description: {
18
- type: String,
19
- trim: true,
20
- maxlength: 500
21
- },
22
- active: {
23
- type: Boolean,
24
- default: true
25
- },
26
- archived_at: {
27
- type: Date
28
- },
29
- archived_by: {
30
- type: mongoose.Schema.Types.ObjectId,
31
- ref: 'User'
32
- },
33
- created_by: {
34
- type: mongoose.Schema.Types.ObjectId,
35
- ref: 'User',
36
- required: true
37
- },
38
- updated_by: {
39
- type: mongoose.Schema.Types.ObjectId,
40
- ref: 'User'
41
- },
42
- created_at: {
43
- type: Date,
44
- default: Date.now
45
- },
46
- updated_at: {
47
- type: Date,
48
- default: Date.now
49
- }
50
- }, {
51
- timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
52
- });
53
-
54
- // Compound index for unique department code per tenant (if needed)
55
- agentDepartmentSchema.index({ code: 1 }, { unique: true });
56
- agentDepartmentSchema.index({ name: 1 });
57
- agentDepartmentSchema.index({ active: 1 });
58
-
59
- module.exports = mongoose.model('AgentDepartment', agentDepartmentSchema);
1
+ const mongoose = require('mongoose');
2
+
3
+ const agentDepartmentSchema = new mongoose.Schema({
4
+ name: {
5
+ type: String,
6
+ required: [true, 'Department name is required'],
7
+ trim: true,
8
+ maxlength: 100
9
+ },
10
+ code: {
11
+ type: String,
12
+ required: [true, 'Department code is required'],
13
+ trim: true,
14
+ uppercase: true,
15
+ maxlength: 20
16
+ },
17
+ description: {
18
+ type: String,
19
+ trim: true,
20
+ maxlength: 500
21
+ },
22
+ active: {
23
+ type: Boolean,
24
+ default: true
25
+ },
26
+ archived_at: {
27
+ type: Date
28
+ },
29
+ archived_by: {
30
+ type: mongoose.Schema.Types.ObjectId,
31
+ ref: 'User'
32
+ },
33
+ created_by: {
34
+ type: mongoose.Schema.Types.ObjectId,
35
+ ref: 'User',
36
+ required: true
37
+ },
38
+ updated_by: {
39
+ type: mongoose.Schema.Types.ObjectId,
40
+ ref: 'User'
41
+ },
42
+ created_at: {
43
+ type: Date,
44
+ default: Date.now
45
+ },
46
+ updated_at: {
47
+ type: Date,
48
+ default: Date.now
49
+ }
50
+ }, {
51
+ timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
52
+ });
53
+
54
+ // Compound index for unique department code per tenant (if needed)
55
+ agentDepartmentSchema.index({ code: 1 }, { unique: true });
56
+ agentDepartmentSchema.index({ name: 1 });
57
+ agentDepartmentSchema.index({ active: 1 });
58
+
59
+ module.exports = mongoose.model('AgentDepartment', agentDepartmentSchema);
@@ -1,53 +1,53 @@
1
- const mongoose = require('mongoose');
2
-
3
- const notificationSchema = new mongoose.Schema({
4
- user_id: {
5
- type: mongoose.Schema.Types.ObjectId,
6
- ref: 'User',
7
- required: true,
8
- index: true
9
- },
10
- type: {
11
- type: String,
12
- enum: ['ticket_escalated', 'agent_tagged', 'ticket_overdue', 'ticket_assigned', 'ticket_resolved'],
13
- required: true
14
- },
15
- title: {
16
- type: String,
17
- required: true
18
- },
19
- message: {
20
- type: String,
21
- required: true
22
- },
23
- ticket_id: {
24
- type: mongoose.Schema.Types.ObjectId,
25
- ref: 'CustomerTicket'
26
- },
27
- ticket_number: {
28
- type: String
29
- },
30
- link: {
31
- type: String,
32
- required: true
33
- },
34
- is_read: {
35
- type: Boolean,
36
- default: false
37
- },
38
- created_at: {
39
- type: Date,
40
- default: Date.now,
41
- index: true
42
- },
43
- read_at: {
44
- type: Date
45
- },
46
- metadata: {
47
- type: mongoose.Schema.Types.Mixed
48
- }
49
- });
50
-
51
- notificationSchema.index({ user_id: 1, is_read: 1, created_at: -1 });
52
-
53
- module.exports = mongoose.models.AgentNotification || mongoose.model('AgentNotification', notificationSchema);
1
+ const mongoose = require('mongoose');
2
+
3
+ const notificationSchema = new mongoose.Schema({
4
+ user_id: {
5
+ type: mongoose.Schema.Types.ObjectId,
6
+ ref: 'User',
7
+ required: true,
8
+ index: true
9
+ },
10
+ type: {
11
+ type: String,
12
+ enum: ['ticket_escalated', 'agent_tagged', 'ticket_overdue', 'ticket_assigned', 'ticket_resolved'],
13
+ required: true
14
+ },
15
+ title: {
16
+ type: String,
17
+ required: true
18
+ },
19
+ message: {
20
+ type: String,
21
+ required: true
22
+ },
23
+ ticket_id: {
24
+ type: mongoose.Schema.Types.ObjectId,
25
+ ref: 'CustomerTicket'
26
+ },
27
+ ticket_number: {
28
+ type: String
29
+ },
30
+ link: {
31
+ type: String,
32
+ required: true
33
+ },
34
+ is_read: {
35
+ type: Boolean,
36
+ default: false
37
+ },
38
+ created_at: {
39
+ type: Date,
40
+ default: Date.now,
41
+ index: true
42
+ },
43
+ read_at: {
44
+ type: Date
45
+ },
46
+ metadata: {
47
+ type: mongoose.Schema.Types.Mixed
48
+ }
49
+ });
50
+
51
+ notificationSchema.index({ user_id: 1, is_read: 1, created_at: -1 });
52
+
53
+ module.exports = mongoose.models.AgentNotification || mongoose.model('AgentNotification', notificationSchema);
@@ -1,127 +1,127 @@
1
- const mongoose = require('mongoose');
2
-
3
- const agentPerformanceSchema = new mongoose.Schema({
4
- agent_id: {
5
- type: mongoose.Schema.Types.ObjectId,
6
- ref: 'Agent',
7
- required: true
8
- },
9
- period_start: {
10
- type: Date,
11
- required: true
12
- },
13
- period_end: {
14
- type: Date,
15
- required: true
16
- },
17
- period_type: {
18
- type: String,
19
- enum: ['daily', 'weekly', 'monthly', 'quarterly', 'yearly'],
20
- default: 'daily'
21
- },
22
- tickets_handled: {
23
- type: Number,
24
- default: 0,
25
- min: 0
26
- },
27
- tickets_resolved: {
28
- type: Number,
29
- default: 0,
30
- min: 0
31
- },
32
- tickets_closed: {
33
- type: Number,
34
- default: 0,
35
- min: 0
36
- },
37
- avg_response_time: {
38
- type: Number,
39
- default: 0,
40
- min: 0,
41
- comment: 'Average response time in minutes'
42
- },
43
- avg_resolution_time: {
44
- type: Number,
45
- default: 0,
46
- min: 0,
47
- comment: 'Average resolution time in minutes'
48
- },
49
- avg_first_response_time: {
50
- type: Number,
51
- default: 0,
52
- min: 0,
53
- comment: 'Average first response time in minutes'
54
- },
55
- sla_compliance_rate: {
56
- type: Number,
57
- default: 0,
58
- min: 0,
59
- max: 100,
60
- comment: 'SLA compliance percentage'
61
- },
62
- sla_breaches: {
63
- type: Number,
64
- default: 0,
65
- min: 0
66
- },
67
- average_rating: {
68
- type: Number,
69
- default: 0,
70
- min: 0,
71
- max: 5
72
- },
73
- total_ratings: {
74
- type: Number,
75
- default: 0,
76
- min: 0
77
- },
78
- positive_ratings: {
79
- type: Number,
80
- default: 0,
81
- min: 0
82
- },
83
- negative_ratings: {
84
- type: Number,
85
- default: 0,
86
- min: 0
87
- },
88
- customer_satisfaction_score: {
89
- type: Number,
90
- default: 0,
91
- min: 0,
92
- max: 100
93
- },
94
- total_handle_time: {
95
- type: Number,
96
- default: 0,
97
- min: 0,
98
- comment: 'Total handle time in minutes'
99
- },
100
- active_time: {
101
- type: Number,
102
- default: 0,
103
- min: 0,
104
- comment: 'Total active time in minutes'
105
- },
106
- idle_time: {
107
- type: Number,
108
- default: 0,
109
- min: 0,
110
- comment: 'Total idle time in minutes'
111
- },
112
- created_at: {
113
- type: Date,
114
- default: Date.now
115
- },
116
- updated_at: {
117
- type: Date,
118
- default: Date.now
119
- }
120
- }, {
121
- timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
122
- });
123
-
124
- agentPerformanceSchema.index({ agent_id: 1, period_start: 1, period_end: 1 });
125
- agentPerformanceSchema.index({ period_type: 1, period_start: -1 });
126
-
127
- module.exports = mongoose.model('AgentPerformance', agentPerformanceSchema);
1
+ const mongoose = require('mongoose');
2
+
3
+ const agentPerformanceSchema = new mongoose.Schema({
4
+ agent_id: {
5
+ type: mongoose.Schema.Types.ObjectId,
6
+ ref: 'Agent',
7
+ required: true
8
+ },
9
+ period_start: {
10
+ type: Date,
11
+ required: true
12
+ },
13
+ period_end: {
14
+ type: Date,
15
+ required: true
16
+ },
17
+ period_type: {
18
+ type: String,
19
+ enum: ['daily', 'weekly', 'monthly', 'quarterly', 'yearly'],
20
+ default: 'daily'
21
+ },
22
+ tickets_handled: {
23
+ type: Number,
24
+ default: 0,
25
+ min: 0
26
+ },
27
+ tickets_resolved: {
28
+ type: Number,
29
+ default: 0,
30
+ min: 0
31
+ },
32
+ tickets_closed: {
33
+ type: Number,
34
+ default: 0,
35
+ min: 0
36
+ },
37
+ avg_response_time: {
38
+ type: Number,
39
+ default: 0,
40
+ min: 0,
41
+ comment: 'Average response time in minutes'
42
+ },
43
+ avg_resolution_time: {
44
+ type: Number,
45
+ default: 0,
46
+ min: 0,
47
+ comment: 'Average resolution time in minutes'
48
+ },
49
+ avg_first_response_time: {
50
+ type: Number,
51
+ default: 0,
52
+ min: 0,
53
+ comment: 'Average first response time in minutes'
54
+ },
55
+ sla_compliance_rate: {
56
+ type: Number,
57
+ default: 0,
58
+ min: 0,
59
+ max: 100,
60
+ comment: 'SLA compliance percentage'
61
+ },
62
+ sla_breaches: {
63
+ type: Number,
64
+ default: 0,
65
+ min: 0
66
+ },
67
+ average_rating: {
68
+ type: Number,
69
+ default: 0,
70
+ min: 0,
71
+ max: 5
72
+ },
73
+ total_ratings: {
74
+ type: Number,
75
+ default: 0,
76
+ min: 0
77
+ },
78
+ positive_ratings: {
79
+ type: Number,
80
+ default: 0,
81
+ min: 0
82
+ },
83
+ negative_ratings: {
84
+ type: Number,
85
+ default: 0,
86
+ min: 0
87
+ },
88
+ customer_satisfaction_score: {
89
+ type: Number,
90
+ default: 0,
91
+ min: 0,
92
+ max: 100
93
+ },
94
+ total_handle_time: {
95
+ type: Number,
96
+ default: 0,
97
+ min: 0,
98
+ comment: 'Total handle time in minutes'
99
+ },
100
+ active_time: {
101
+ type: Number,
102
+ default: 0,
103
+ min: 0,
104
+ comment: 'Total active time in minutes'
105
+ },
106
+ idle_time: {
107
+ type: Number,
108
+ default: 0,
109
+ min: 0,
110
+ comment: 'Total idle time in minutes'
111
+ },
112
+ created_at: {
113
+ type: Date,
114
+ default: Date.now
115
+ },
116
+ updated_at: {
117
+ type: Date,
118
+ default: Date.now
119
+ }
120
+ }, {
121
+ timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
122
+ });
123
+
124
+ agentPerformanceSchema.index({ agent_id: 1, period_start: 1, period_end: 1 });
125
+ agentPerformanceSchema.index({ period_type: 1, period_start: -1 });
126
+
127
+ module.exports = mongoose.model('AgentPerformance', agentPerformanceSchema);