payservedb 8.3.5 → 8.3.7

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/.idea/material_theme_project_new.xml +12 -0
  3. package/.idea/modules.xml +8 -0
  4. package/.idea/psdb.iml +12 -0
  5. package/.idea/vcs.xml +6 -0
  6. package/index.js +306 -306
  7. package/package.json +17 -17
  8. package/src/models/account.js +52 -52
  9. package/src/models/agent_departments.js +59 -59
  10. package/src/models/agent_notifications.js +53 -53
  11. package/src/models/agent_performance.js +127 -127
  12. package/src/models/agent_roles.js +77 -77
  13. package/src/models/agents.js +154 -154
  14. package/src/models/apilog.js +18 -18
  15. package/src/models/approvalsWorkflows.js +49 -49
  16. package/src/models/archivedapilog.js +18 -18
  17. package/src/models/asset.js +92 -92
  18. package/src/models/assetsAssignment.js +64 -64
  19. package/src/models/auditTrail.js +346 -346
  20. package/src/models/bankdetails.js +47 -43
  21. package/src/models/billerAddress.js +124 -124
  22. package/src/models/booking_invoice.js +151 -151
  23. package/src/models/bookinganalytics.js +63 -63
  24. package/src/models/bookingconfig.js +45 -45
  25. package/src/models/bookingproperty.js +122 -122
  26. package/src/models/bookingreservation.js +192 -192
  27. package/src/models/bookingrevenuerecord.js +84 -84
  28. package/src/models/budget.js +95 -95
  29. package/src/models/budgetCategory.js +19 -19
  30. package/src/models/campaigns.js +108 -108
  31. package/src/models/cashpayment.js +264 -264
  32. package/src/models/combinedUnits.js +62 -62
  33. package/src/models/common_area_electricity.js +38 -38
  34. package/src/models/common_area_generator.js +41 -41
  35. package/src/models/common_area_utility_alert.js +37 -37
  36. package/src/models/common_area_water.js +39 -39
  37. package/src/models/communication_status.js +33 -33
  38. package/src/models/communication_user_opt.js +32 -32
  39. package/src/models/company.js +53 -53
  40. package/src/models/coreBaseSettings.js +16 -16
  41. package/src/models/coreInvoiceSettings.js +100 -100
  42. package/src/models/counter_schema.js +21 -21
  43. package/src/models/country_tax.js +42 -42
  44. package/src/models/currency_settings.js +39 -39
  45. package/src/models/customer.js +210 -210
  46. package/src/models/customer_satisfaction_survey.js +278 -278
  47. package/src/models/customer_surveys.js +139 -139
  48. package/src/models/customer_tickets.js +239 -239
  49. package/src/models/dailyChecklist.js +312 -312
  50. package/src/models/default_payment_details.js +17 -17
  51. package/src/models/deliveryTimeMarks.js +18 -18
  52. package/src/models/document_type.js +19 -19
  53. package/src/models/dutyRosterChecklist.js +250 -250
  54. package/src/models/dutyroster.js +136 -136
  55. package/src/models/email.js +37 -37
  56. package/src/models/email_sms_queue.js +61 -61
  57. package/src/models/entry_exit.js +53 -53
  58. package/src/models/expense.js +99 -99
  59. package/src/models/expense_category.js +45 -45
  60. package/src/models/facility.js +62 -62
  61. package/src/models/facilityBillingPrices.js +29 -29
  62. package/src/models/facilityInvoice.js +223 -240
  63. package/src/models/facilityInvoicePayment.js +47 -52
  64. package/src/models/facilityInvoiceRecipient.js +32 -32
  65. package/src/models/facilityWalletTransactionsMetadata.js +236 -236
  66. package/src/models/facility_departements.js +20 -20
  67. package/src/models/facility_payment_details.js +20 -20
  68. package/src/models/facilityasset.js +25 -25
  69. package/src/models/faq.js +14 -18
  70. package/src/models/gl_account_double_entries.js +25 -25
  71. package/src/models/gl_accounts.js +56 -56
  72. package/src/models/gl_entries.js +49 -49
  73. package/src/models/goodsReceivedNotes.js +115 -115
  74. package/src/models/guard.js +47 -47
  75. package/src/models/handover.js +247 -247
  76. package/src/models/inspection_category.js +38 -38
  77. package/src/models/invoice.js +387 -387
  78. package/src/models/invoicing_schedule.js +36 -36
  79. package/src/models/item_inspection.js +96 -96
  80. package/src/models/knowledge_base.js +109 -109
  81. package/src/models/knowledge_base_rating.js +44 -44
  82. package/src/models/leaseagreement.js +236 -243
  83. package/src/models/leasetemplate.js +17 -17
  84. package/src/models/levy.js +223 -223
  85. package/src/models/levy_invoice_settings.js +26 -26
  86. package/src/models/levycontract.js +177 -173
  87. package/src/models/levytype.js +23 -23
  88. package/src/models/maintenance_service_vendor.js +38 -38
  89. package/src/models/maintenance_services.js +17 -17
  90. package/src/models/maintenancerequisition.js +31 -31
  91. package/src/models/master_workplan.js +32 -32
  92. package/src/models/master_workplan_child.js +34 -34
  93. package/src/models/message.js +38 -38
  94. package/src/models/module.js +21 -21
  95. package/src/models/notification.js +44 -44
  96. package/src/models/paymentTermsMarks.js +19 -19
  97. package/src/models/penalty.js +76 -76
  98. package/src/models/pendingCredentials.js +32 -32
  99. package/src/models/powerMeterCommunicationProtocol.js +17 -17
  100. package/src/models/powerMeterCustomerAccount.js +78 -78
  101. package/src/models/powerMeterCustomerBand.js +14 -14
  102. package/src/models/powerMeterDailyReading.js +30 -30
  103. package/src/models/powerMeterGateways.js +40 -40
  104. package/src/models/powerMeterMonthlyReading.js +34 -34
  105. package/src/models/powerMeterPowerCharges.js +85 -85
  106. package/src/models/powerMeterSettings.js +159 -159
  107. package/src/models/powerMeterSingleDayReading.js +32 -32
  108. package/src/models/powerMeters.js +116 -116
  109. package/src/models/powerMetersManufacturer.js +14 -14
  110. package/src/models/power_meter_account.js +81 -81
  111. package/src/models/power_meter_command_logs.js +30 -30
  112. package/src/models/power_meter_command_queue.js +33 -33
  113. package/src/models/power_meter_negative_balance.js +44 -44
  114. package/src/models/power_prepaid_credits.js +47 -47
  115. package/src/models/power_prepaid_debits.js +53 -53
  116. package/src/models/power_prepaid_orders.js +78 -78
  117. package/src/models/power_sms_notification.js +26 -26
  118. package/src/models/propertyManagerContract.js +556 -556
  119. package/src/models/propertyManagerRevenue.js +195 -195
  120. package/src/models/purchaseOrderInvoice.js +74 -74
  121. package/src/models/purchase_order.js +213 -213
  122. package/src/models/purchase_request.js +110 -110
  123. package/src/models/refresh_token.js +23 -23
  124. package/src/models/reminder.js +197 -197
  125. package/src/models/report.js +13 -13
  126. package/src/models/resident.js +121 -121
  127. package/src/models/rfq_details.js +131 -131
  128. package/src/models/rfq_response.js +153 -153
  129. package/src/models/service_charge_invoice_upload.js +42 -42
  130. package/src/models/service_charge_payments.js +27 -27
  131. package/src/models/servicerequest.js +55 -55
  132. package/src/models/settings.js +62 -62
  133. package/src/models/short_urls.js +21 -21
  134. package/src/models/smart_meter_daily_consumption.js +44 -44
  135. package/src/models/sms_africastalking.js +20 -20
  136. package/src/models/sms_balance_notification.js +26 -26
  137. package/src/models/sms_meliora.js +20 -20
  138. package/src/models/staff.js +36 -36
  139. package/src/models/stocksandspare.js +161 -161
  140. package/src/models/suppliers.js +74 -74
  141. package/src/models/tickets.js +173 -173
  142. package/src/models/tickets_category.js +72 -72
  143. package/src/models/unitManagementTemplate.js +44 -44
  144. package/src/models/unitasset.js +25 -25
  145. package/src/models/units.js +118 -118
  146. package/src/models/user.js +186 -186
  147. package/src/models/valueaddedservices.js +79 -79
  148. package/src/models/vas_invoices_upload.js +50 -50
  149. package/src/models/vas_payments.js +24 -24
  150. package/src/models/vasinvoice.js +192 -192
  151. package/src/models/vasvendor.js +57 -57
  152. package/src/models/visitLog.js +95 -95
  153. package/src/models/visitor.js +67 -67
  154. package/src/models/waitlist.js +45 -45
  155. package/src/models/wallet.js +44 -44
  156. package/src/models/wallet_transactions.js +50 -50
  157. package/src/models/water_invoice.js +351 -351
  158. package/src/models/water_meter_Command_Queue.js +33 -33
  159. package/src/models/water_meter_account.js +82 -82
  160. package/src/models/water_meter_billing.js +58 -58
  161. package/src/models/water_meter_communication.js +17 -17
  162. package/src/models/water_meter_communication_logs.js +39 -39
  163. package/src/models/water_meter_concentrator.js +70 -70
  164. package/src/models/water_meter_daily_history.js +32 -32
  165. package/src/models/water_meter_high_risk.js +36 -36
  166. package/src/models/water_meter_iot_cards.js +34 -34
  167. package/src/models/water_meter_manufacturer.js +35 -35
  168. package/src/models/water_meter_monthly_history.js +36 -36
  169. package/src/models/water_meter_negative_amounts.js +44 -44
  170. package/src/models/water_meter_settings.js +283 -276
  171. package/src/models/water_meter_single_day_history.js +34 -34
  172. package/src/models/water_meter_size.js +15 -15
  173. package/src/models/water_meters.js +133 -133
  174. package/src/models/water_meters_delivery.js +76 -76
  175. package/src/models/water_prepaid_credit.js +47 -47
  176. package/src/models/water_prepaid_debit.js +50 -50
  177. package/src/models/workorder.js +49 -49
@@ -1,36 +1,36 @@
1
- const mongoose = require('mongoose');
2
-
3
- const InvoicingScheduleSchema = new mongoose.Schema({
4
- facilityId: {
5
- type: mongoose.Schema.Types.ObjectId,
6
- ref: 'Facility',
7
- },
8
- nextInvoiceDate: {
9
- type: Date,
10
- required: true
11
- },
12
- invoiceType: {
13
- type: String,
14
- required: true,
15
- unique: true,
16
- trim: true,
17
- index: true
18
- },
19
- createdAt: {
20
- type: Date,
21
- default: Date.now
22
- },
23
- updatedAt: {
24
- type: Date,
25
- default: Date.now
26
- }
27
- });
28
-
29
- InvoicingScheduleSchema.pre('save', function(next) {
30
- this.updatedAt = Date.now();
31
- next();
32
- });
33
-
34
- const InvoicingSchedule = mongoose.model('InvoicingSchedule', InvoicingScheduleSchema);
35
-
36
- module.exports = InvoicingSchedule;
1
+ const mongoose = require('mongoose');
2
+
3
+ const InvoicingScheduleSchema = new mongoose.Schema({
4
+ facilityId: {
5
+ type: mongoose.Schema.Types.ObjectId,
6
+ ref: 'Facility',
7
+ },
8
+ nextInvoiceDate: {
9
+ type: Date,
10
+ required: true
11
+ },
12
+ invoiceType: {
13
+ type: String,
14
+ required: true,
15
+ unique: true,
16
+ trim: true,
17
+ index: true
18
+ },
19
+ createdAt: {
20
+ type: Date,
21
+ default: Date.now
22
+ },
23
+ updatedAt: {
24
+ type: Date,
25
+ default: Date.now
26
+ }
27
+ });
28
+
29
+ InvoicingScheduleSchema.pre('save', function(next) {
30
+ this.updatedAt = Date.now();
31
+ next();
32
+ });
33
+
34
+ const InvoicingSchedule = mongoose.model('InvoicingSchedule', InvoicingScheduleSchema);
35
+
36
+ module.exports = InvoicingSchedule;
@@ -1,97 +1,97 @@
1
- const mongoose = require('mongoose');
2
-
3
- // Define the schema for inspection items
4
- const inspectionItemSchema = new mongoose.Schema({
5
- name: {
6
- type: String,
7
- required: [true, 'Item name is required'],
8
- trim: true
9
- },
10
- category: {
11
- type: String,
12
- required: [true, 'Category is required'],
13
- trim: true
14
- },
15
- subcategory: {
16
- type: String,
17
- trim: true,
18
- default: null
19
- },
20
- description: {
21
- type: String,
22
- trim: true
23
- },
24
- possibleConditions: {
25
- type: [String],
26
- default: ['Excellent', 'Good', 'Fair', 'Poor', 'Damaged', 'Non-functional'],
27
- validate: {
28
- validator: function(v) {
29
- return v.length > 0;
30
- },
31
- message: 'At least one possible condition is required'
32
- }
33
- },
34
- defaultCondition: {
35
- type: String,
36
- default: 'Good'
37
- },
38
- isRequired: {
39
- type: Boolean,
40
- default: true
41
- },
42
- defaultQuantity: {
43
- type: Number,
44
- default: 1,
45
- min: [1, 'Default quantity must be at least 1']
46
- },
47
- serialNumber: {
48
- type: String,
49
- trim: true,
50
- default: null
51
- },
52
- cost: {
53
- type: Number,
54
- default: 0,
55
- min: [0, 'Cost cannot be negative']
56
- },
57
- currencyId: {
58
- type: mongoose.Schema.Types.ObjectId,
59
- ref: 'Currency',
60
- required: false,
61
- default: null
62
- },
63
- images: [{
64
- type: String,
65
- trim: true
66
- }],
67
- active: {
68
- type: Boolean,
69
- default: true
70
- },
71
- facilityId: {
72
- type: mongoose.Schema.Types.ObjectId,
73
- ref: 'Facility',
74
- required: true
75
- },
76
- unitId: {
77
- type: mongoose.Schema.Types.ObjectId,
78
- ref: 'Unit',
79
- required: false,
80
- default: null
81
- }
82
- }, {
83
- timestamps: true
84
- });
85
-
86
- // Add indexes for common queries
87
- inspectionItemSchema.index({ facilityId: 1 });
88
- inspectionItemSchema.index({ facilityId: 1, category: 1 });
89
- inspectionItemSchema.index({ facilityId: 1, active: 1 });
90
- inspectionItemSchema.index({ facilityId: 1, unitId: 1 });
91
- inspectionItemSchema.index({ unitId: 1, active: 1 });
92
- inspectionItemSchema.index({ currencyId: 1 });
93
-
94
- // Create InspectionItem model
95
- const InspectionItem = mongoose.model('InspectionItem', inspectionItemSchema);
96
-
1
+ const mongoose = require('mongoose');
2
+
3
+ // Define the schema for inspection items
4
+ const inspectionItemSchema = new mongoose.Schema({
5
+ name: {
6
+ type: String,
7
+ required: [true, 'Item name is required'],
8
+ trim: true
9
+ },
10
+ category: {
11
+ type: String,
12
+ required: [true, 'Category is required'],
13
+ trim: true
14
+ },
15
+ subcategory: {
16
+ type: String,
17
+ trim: true,
18
+ default: null
19
+ },
20
+ description: {
21
+ type: String,
22
+ trim: true
23
+ },
24
+ possibleConditions: {
25
+ type: [String],
26
+ default: ['Excellent', 'Good', 'Fair', 'Poor', 'Damaged', 'Non-functional'],
27
+ validate: {
28
+ validator: function(v) {
29
+ return v.length > 0;
30
+ },
31
+ message: 'At least one possible condition is required'
32
+ }
33
+ },
34
+ defaultCondition: {
35
+ type: String,
36
+ default: 'Good'
37
+ },
38
+ isRequired: {
39
+ type: Boolean,
40
+ default: true
41
+ },
42
+ defaultQuantity: {
43
+ type: Number,
44
+ default: 1,
45
+ min: [1, 'Default quantity must be at least 1']
46
+ },
47
+ serialNumber: {
48
+ type: String,
49
+ trim: true,
50
+ default: null
51
+ },
52
+ cost: {
53
+ type: Number,
54
+ default: 0,
55
+ min: [0, 'Cost cannot be negative']
56
+ },
57
+ currencyId: {
58
+ type: mongoose.Schema.Types.ObjectId,
59
+ ref: 'Currency',
60
+ required: false,
61
+ default: null
62
+ },
63
+ images: [{
64
+ type: String,
65
+ trim: true
66
+ }],
67
+ active: {
68
+ type: Boolean,
69
+ default: true
70
+ },
71
+ facilityId: {
72
+ type: mongoose.Schema.Types.ObjectId,
73
+ ref: 'Facility',
74
+ required: true
75
+ },
76
+ unitId: {
77
+ type: mongoose.Schema.Types.ObjectId,
78
+ ref: 'Unit',
79
+ required: false,
80
+ default: null
81
+ }
82
+ }, {
83
+ timestamps: true
84
+ });
85
+
86
+ // Add indexes for common queries
87
+ inspectionItemSchema.index({ facilityId: 1 });
88
+ inspectionItemSchema.index({ facilityId: 1, category: 1 });
89
+ inspectionItemSchema.index({ facilityId: 1, active: 1 });
90
+ inspectionItemSchema.index({ facilityId: 1, unitId: 1 });
91
+ inspectionItemSchema.index({ unitId: 1, active: 1 });
92
+ inspectionItemSchema.index({ currencyId: 1 });
93
+
94
+ // Create InspectionItem model
95
+ const InspectionItem = mongoose.model('InspectionItem', inspectionItemSchema);
96
+
97
97
  module.exports = InspectionItem;
@@ -1,109 +1,109 @@
1
- const mongoose = require('mongoose');
2
-
3
- const knowledgeBaseSchema = new mongoose.Schema({
4
- title: {
5
- type: String,
6
- required: true,
7
- trim: true,
8
- maxlength: 255
9
- },
10
- content: {
11
- type: String,
12
- required: true
13
- },
14
- summary: {
15
- type: String,
16
- trim: true,
17
- maxlength: 500
18
- },
19
- category_id: {
20
- type: mongoose.Schema.Types.ObjectId,
21
- ref: 'TicketCategory',
22
- required: true
23
- },
24
- tags: [{
25
- type: String,
26
- trim: true
27
- }],
28
- status: {
29
- type: String,
30
- enum: ['draft', 'published', 'archived'],
31
- default: 'draft'
32
- },
33
- visibility: {
34
- type: String,
35
- enum: ['internal', 'public'],
36
- default: 'internal'
37
- },
38
- is_featured: {
39
- type: Boolean,
40
- default: false
41
- },
42
- author_id: {
43
- type: mongoose.Schema.Types.ObjectId,
44
- ref: 'User',
45
- required: true
46
- },
47
- created_by: {
48
- type: mongoose.Schema.Types.ObjectId,
49
- ref: 'User',
50
- required: true
51
- },
52
- updated_by: {
53
- type: mongoose.Schema.Types.ObjectId,
54
- ref: 'User'
55
- },
56
- views_count: {
57
- type: Number,
58
- default: 0,
59
- min: 0
60
- },
61
- helpful_count: {
62
- type: Number,
63
- default: 0,
64
- min: 0
65
- },
66
- not_helpful_count: {
67
- type: Number,
68
- default: 0,
69
- min: 0
70
- },
71
- attachments: [{
72
- filename: String,
73
- file_path: String,
74
- file_size: Number,
75
- mime_type: String,
76
- uploaded_at: {
77
- type: Date,
78
- default: Date.now
79
- }
80
- }],
81
- related_articles: [{
82
- type: mongoose.Schema.Types.ObjectId,
83
- ref: 'KnowledgeBase'
84
- }],
85
- created_at: {
86
- type: Date,
87
- default: Date.now
88
- },
89
- updated_at: {
90
- type: Date,
91
- default: Date.now
92
- },
93
- published_at: {
94
- type: Date
95
- },
96
- archived_at: {
97
- type: Date
98
- }
99
- }, {
100
- timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
101
- });
102
-
103
- knowledgeBaseSchema.index({ title: 'text', content: 'text', summary: 'text', tags: 'text' });
104
- knowledgeBaseSchema.index({ category_id: 1, status: 1 });
105
- knowledgeBaseSchema.index({ status: 1, is_featured: 1 });
106
- knowledgeBaseSchema.index({ author_id: 1, created_at: -1 });
107
- knowledgeBaseSchema.index({ views_count: -1 });
108
-
109
- module.exports = mongoose.model('KnowledgeBase', knowledgeBaseSchema);
1
+ const mongoose = require('mongoose');
2
+
3
+ const knowledgeBaseSchema = new mongoose.Schema({
4
+ title: {
5
+ type: String,
6
+ required: true,
7
+ trim: true,
8
+ maxlength: 255
9
+ },
10
+ content: {
11
+ type: String,
12
+ required: true
13
+ },
14
+ summary: {
15
+ type: String,
16
+ trim: true,
17
+ maxlength: 500
18
+ },
19
+ category_id: {
20
+ type: mongoose.Schema.Types.ObjectId,
21
+ ref: 'TicketCategory',
22
+ required: true
23
+ },
24
+ tags: [{
25
+ type: String,
26
+ trim: true
27
+ }],
28
+ status: {
29
+ type: String,
30
+ enum: ['draft', 'published', 'archived'],
31
+ default: 'draft'
32
+ },
33
+ visibility: {
34
+ type: String,
35
+ enum: ['internal', 'public'],
36
+ default: 'internal'
37
+ },
38
+ is_featured: {
39
+ type: Boolean,
40
+ default: false
41
+ },
42
+ author_id: {
43
+ type: mongoose.Schema.Types.ObjectId,
44
+ ref: 'User',
45
+ required: true
46
+ },
47
+ created_by: {
48
+ type: mongoose.Schema.Types.ObjectId,
49
+ ref: 'User',
50
+ required: true
51
+ },
52
+ updated_by: {
53
+ type: mongoose.Schema.Types.ObjectId,
54
+ ref: 'User'
55
+ },
56
+ views_count: {
57
+ type: Number,
58
+ default: 0,
59
+ min: 0
60
+ },
61
+ helpful_count: {
62
+ type: Number,
63
+ default: 0,
64
+ min: 0
65
+ },
66
+ not_helpful_count: {
67
+ type: Number,
68
+ default: 0,
69
+ min: 0
70
+ },
71
+ attachments: [{
72
+ filename: String,
73
+ file_path: String,
74
+ file_size: Number,
75
+ mime_type: String,
76
+ uploaded_at: {
77
+ type: Date,
78
+ default: Date.now
79
+ }
80
+ }],
81
+ related_articles: [{
82
+ type: mongoose.Schema.Types.ObjectId,
83
+ ref: 'KnowledgeBase'
84
+ }],
85
+ created_at: {
86
+ type: Date,
87
+ default: Date.now
88
+ },
89
+ updated_at: {
90
+ type: Date,
91
+ default: Date.now
92
+ },
93
+ published_at: {
94
+ type: Date
95
+ },
96
+ archived_at: {
97
+ type: Date
98
+ }
99
+ }, {
100
+ timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
101
+ });
102
+
103
+ knowledgeBaseSchema.index({ title: 'text', content: 'text', summary: 'text', tags: 'text' });
104
+ knowledgeBaseSchema.index({ category_id: 1, status: 1 });
105
+ knowledgeBaseSchema.index({ status: 1, is_featured: 1 });
106
+ knowledgeBaseSchema.index({ author_id: 1, created_at: -1 });
107
+ knowledgeBaseSchema.index({ views_count: -1 });
108
+
109
+ module.exports = mongoose.model('KnowledgeBase', knowledgeBaseSchema);
@@ -1,44 +1,44 @@
1
- const mongoose = require('mongoose');
2
-
3
- const knowledgeBaseRatingSchema = new mongoose.Schema({
4
- article_id: {
5
- type: mongoose.Schema.Types.ObjectId,
6
- ref: 'KnowledgeBase',
7
- required: true
8
- },
9
- agent_id: {
10
- type: mongoose.Schema.Types.ObjectId,
11
- ref: 'User',
12
- required: true
13
- },
14
- helpful: {
15
- type: Boolean,
16
- required: true
17
- },
18
- feedback: {
19
- type: String,
20
- trim: true,
21
- maxlength: 1000
22
- },
23
- ticket_id: {
24
- type: mongoose.Schema.Types.ObjectId,
25
- ref: 'CustomerTicket',
26
- comment: 'Optional reference to ticket where this article was used'
27
- },
28
- created_at: {
29
- type: Date,
30
- default: Date.now
31
- },
32
- updated_at: {
33
- type: Date,
34
- default: Date.now
35
- }
36
- }, {
37
- timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
38
- });
39
-
40
- knowledgeBaseRatingSchema.index({ article_id: 1, agent_id: 1 }, { unique: true });
41
- knowledgeBaseRatingSchema.index({ article_id: 1, helpful: 1 });
42
- knowledgeBaseRatingSchema.index({ agent_id: 1, created_at: -1 });
43
-
44
- module.exports = mongoose.model('KnowledgeBaseRating', knowledgeBaseRatingSchema);
1
+ const mongoose = require('mongoose');
2
+
3
+ const knowledgeBaseRatingSchema = new mongoose.Schema({
4
+ article_id: {
5
+ type: mongoose.Schema.Types.ObjectId,
6
+ ref: 'KnowledgeBase',
7
+ required: true
8
+ },
9
+ agent_id: {
10
+ type: mongoose.Schema.Types.ObjectId,
11
+ ref: 'User',
12
+ required: true
13
+ },
14
+ helpful: {
15
+ type: Boolean,
16
+ required: true
17
+ },
18
+ feedback: {
19
+ type: String,
20
+ trim: true,
21
+ maxlength: 1000
22
+ },
23
+ ticket_id: {
24
+ type: mongoose.Schema.Types.ObjectId,
25
+ ref: 'CustomerTicket',
26
+ comment: 'Optional reference to ticket where this article was used'
27
+ },
28
+ created_at: {
29
+ type: Date,
30
+ default: Date.now
31
+ },
32
+ updated_at: {
33
+ type: Date,
34
+ default: Date.now
35
+ }
36
+ }, {
37
+ timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
38
+ });
39
+
40
+ knowledgeBaseRatingSchema.index({ article_id: 1, agent_id: 1 }, { unique: true });
41
+ knowledgeBaseRatingSchema.index({ article_id: 1, helpful: 1 });
42
+ knowledgeBaseRatingSchema.index({ agent_id: 1, created_at: -1 });
43
+
44
+ module.exports = mongoose.model('KnowledgeBaseRating', knowledgeBaseRatingSchema);