@getjones/test-infra 4.4.16 → 4.5.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 (27) hide show
  1. package/package.json +1 -1
  2. package/src/common/commonFlows/records/records.js +27 -10
  3. package/src/common/consts/constantsForRecordsSortingAndFilters.js +9 -1
  4. package/src/common/consts/homepage/sortOptions.js +14 -0
  5. package/src/common/consts/requirementActions.js +10 -0
  6. package/src/common/consts/userRoles.js +13 -1
  7. package/src/defaults/configs/auditConfigs.js +21 -0
  8. package/src/defaults/configs/coverage.js +102 -93
  9. package/src/factory/records/records.js +98 -30
  10. package/src/saas/internal-api/accounts/models/settings/update.settings.model.js +9 -0
  11. package/src/saas/internal-api/agreement/consts/consts.js +2 -1
  12. package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.api.js +12 -0
  13. package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.service.js +14 -0
  14. package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +7 -5
  15. package/src/saas/internal-api/compliance/api/overrideGap/override.gap.service.js +2 -1
  16. package/src/saas/internal-api/compliance/index.js +4 -1
  17. package/src/saas/internal-api/compliance/utils/coverageUtil.js +28 -13
  18. package/src/saas/internal-api/contractors/models/edit.contractor.model.js +12 -1
  19. package/src/saas/internal-api/dbEmails/consts/consts.js +3 -3
  20. package/src/saas/internal-api/policyFile/api/policy.file.service.js +2 -2
  21. package/src/saas/internal-api/requests/api/requests.api.js +6 -0
  22. package/src/saas/internal-api/requests/api/requests.service.js +8 -2
  23. package/src/saas/internal-api/uploadFiles/api/upload.file.service.js +2 -1
  24. package/src/saas/internal-api/users/api/users.service.js +1 -1
  25. package/src/saas/openapi/requests/requests.api.js +8 -2
  26. package/src/saas/openapi/requests/requests.service.js +14 -1
  27. package/src/saas/openapi/users/users.service.js +13 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getjones/test-infra",
3
- "version": "4.4.16",
3
+ "version": "4.5.1",
4
4
  "description": "Providing internal and openapi interface",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -37,23 +37,37 @@ const resendInvitationByRecordId = async (recordId, tabId, context) => {
37
37
  return resendInvitationResponse;
38
38
  };
39
39
 
40
- const editRequestAndRecordDetails = async function(request, recordConfig, context) {
40
+ const editRequestAndRecordDetails = async function(request, recordConfig, context, { isDraft, expectError } = {}) {
41
41
  const tabModel = new requests.models.TabModel(request.tab.type);
42
42
  const recordDetailsModel = contractors.services.getContractorDetailsModel(recordConfig);
43
- const record = new contractors.models.edit.ContractorModel(
44
- request.record.contractorId,
45
- request.record.recordType,
46
- recordConfig.company,
47
- recordConfig.emailAddress,
48
- recordDetailsModel
49
- );
43
+
44
+ const record = isDraft ?
45
+ new contractors.models.edit.DraftRecordModel(
46
+ request.record.contractorId,
47
+ request.record.recordType,
48
+ recordConfig.company,
49
+ recordConfig.emailAddress,
50
+ recordDetailsModel,
51
+ isDraft,
52
+ recordConfig.requirementsAction
53
+ ) :
54
+ new contractors.models.edit.ContractorModel(
55
+ request.record.contractorId,
56
+ request.record.recordType,
57
+ recordConfig.company,
58
+ recordConfig.emailAddress,
59
+ recordDetailsModel
60
+ );
61
+
50
62
  const requestEditModel = new requests.models.RequestModel(request.id, record, tabModel, {});
51
63
 
52
64
  const editRequestResponse = await requests.services.editRequestAndRecordDetails(requestEditModel, context);
53
65
 
54
- if (editRequestResponse.status !== httpResponseStatusCodes.OK) {
66
+ if (editRequestResponse.status !== httpResponseStatusCodes.OK && !expectError) {
55
67
  throw Error(`Failed to edit record \n${editRequestResponse.data.message}`);
56
68
  }
69
+
70
+ return editRequestResponse;
57
71
  };
58
72
 
59
73
  const updateInviteDate = async function(recordId, inviteDate, context) {
@@ -75,12 +89,15 @@ const updateInviteDate = async function(recordId, inviteDate, context) {
75
89
 
76
90
  const updateLastInviteActionDate = async function(recordId, offsetInDays, context) {
77
91
  await timeUtils.waitFor(1).seconds;
92
+ //In order to prevent situations where the date of the compliance audit action is equal or greater than the date of the last mail send audit,
93
+ //we move back another day!!
94
+ const complianceAuditActionOffsetInDays = offsetInDays + 1;
78
95
  /*
79
96
  To run the reminders mails successfully we must first update the compliance audit actions date,
80
97
  Since the thread scheduler will trigger the logic of the reminders mails
81
98
  only if last invite action date will be equal or after compliance audit actions date
82
99
  */
83
- const updateComplianceAuditResponse = await compliance.services.audit.updateComplianceAuditActionsDate(recordId, offsetInDays, context);
100
+ const updateComplianceAuditResponse = await compliance.services.audit.updateComplianceAuditActionsDate(recordId, complianceAuditActionOffsetInDays, context);
84
101
 
85
102
  if (updateComplianceAuditResponse.status !== httpResponseStatusCodes.NO_CONTENT) {
86
103
  throw new Error(`Failed to update compliance audit date\n${updateComplianceAuditResponse}`);
@@ -29,7 +29,15 @@ const draftCompletionStatus = {
29
29
  missingRequirements: 'missingRequirements',
30
30
  missingCoi: 'missingCoi',
31
31
  readyForCoiRequest: 'readyForCoiRequest',
32
- readyForReview: 'readyForReview'
32
+ readyForReview: 'readyForReview',
33
+ uploadLease: 'uploadLease',
34
+ uploadContract: 'uploadContract',
35
+ uploadNewLeaseCorrupted: 'uploadNewLeaseCorrupted',
36
+ uploadNewContractCorrupted: 'uploadNewContractCorrupted',
37
+ confirmRequirements: 'confirmRequirements',
38
+ jonesExtractingRequirements: 'jonesExtractingRequirements',
39
+ fixMissingInfoIncompleteDoc: 'fixMissingInfoIncompleteDoc',
40
+ assignExistingRequirements: 'assignExistingRequirements'
33
41
  };
34
42
 
35
43
  module.exports = {
@@ -0,0 +1,14 @@
1
+ const sortBy = {
2
+ companyName: 'company_name',
3
+ coi: 'coi'
4
+ };
5
+
6
+ const sortOrder = {
7
+ ASC: 'ASC',
8
+ DESC: 'DESC'
9
+ };
10
+
11
+ module.exports = {
12
+ sortBy,
13
+ sortOrder
14
+ };
@@ -0,0 +1,10 @@
1
+ module.exports = {
2
+ UPLOAD_LEASE: 'UPLOAD_LEASE',
3
+ UPLOAD_CONTRACT: 'UPLOAD_CONTRACT',
4
+ UPLOAD_NEW_LEASE_CORRUPTED: 'UPLOAD_NEW_LEASE_CORRUPTED',
5
+ UPLOAD_NEW_CONTRACT_CORRUPTED: 'UPLOAD_NEW_CONTRACT_CORRUPTED',
6
+ CONFIRM_REQUIREMENTS: 'CONFIRM_REQUIREMENTS',
7
+ JONES_EXTRACTING_REQUIREMENTS: 'JONES_EXTRACTING_REQUIREMENTS',
8
+ FIX_MISSING_INFO_INCOMPLETE_DOC: 'FIX_MISSING_INFO_INCOMPLETE_DOC',
9
+ ASSIGN_EXISTING_REQUIREMENTS: 'ASSIGN_EXISTING_REQUIREMENTS'
10
+ };
@@ -1,6 +1,18 @@
1
- module.exports = {
1
+ const internalApiUserRoles = {
2
2
  readOnly: 'Read-only User',
3
3
  inviter: 'Inviter',
4
4
  cm: 'Compliance Manager',
5
5
  admin: 'Admin'
6
6
  };
7
+
8
+ const openApiUserRoles = {
9
+ readOnly: 'Read-onlyUser',
10
+ inviter: 'Inviter',
11
+ cm: 'ComplianceManager',
12
+ admin: 'Admin'
13
+ };
14
+
15
+ module.exports = {
16
+ internalApiUserRoles,
17
+ openApiUserRoles
18
+ };
@@ -13,6 +13,7 @@ const DEFAULT_POLICY_NUMBER = 'ABC-12345-XYZ';
13
13
  const {
14
14
  certificateIssueDate,
15
15
  generalLiability
16
+ // umbrella
16
17
  } = policyNames;
17
18
 
18
19
  const {
@@ -108,6 +109,25 @@ const setAboutExpiredConfig = config =>
108
109
  const setExpiredConfig = config =>
109
110
  config[generalLiability][policyExpired] = `${getOneWeekAgoDate()}`;
110
111
 
112
+ // const getMinimumRequiredCompliantConfigForAutocomplete = () => { //maybe no need, just use regular one? which req?
113
+ // const baseAuditConfig = getCompliantAuditConfigWithoutPolicies();
114
+ // return {
115
+ // ... baseAuditConfig,
116
+ // [generalLiability]: {
117
+ // [coverageExists]: policySelections.YES,
118
+ // [policyNumber]: DEFAULT_POLICY_NUMBER,
119
+ // [policyExpired]: `${DEFAULT_POLICY_DATE}`,
120
+ // [eachOccurrence]: policySelections.YES
121
+ // },
122
+ // [umbrella]: {
123
+ // [coverageExists]: policySelections.YES,
124
+ // [policyNumber]: DEFAULT_POLICY_NUMBER,
125
+ // [policyExpired]: `${DEFAULT_POLICY_DATE}`,
126
+ // [eachOccurrence]: policySelections.YES
127
+ // }
128
+ // };
129
+ // };
130
+
111
131
  module.exports = {
112
132
  getCompliantAuditConfig,
113
133
  getCompliantAuditConfigWithoutPolicies,
@@ -117,6 +137,7 @@ module.exports = {
117
137
  getExpiredConfig,
118
138
  setExpiredConfig,
119
139
  setAboutExpiredConfig,
140
+ // getMinimumRequiredCompliantConfigForAutocomplete,
120
141
  policySelections,
121
142
  defaultPolicyDate: DEFAULT_POLICY_DATE,
122
143
  defaultExpiredPolicyDate: DEFAULT_EXPIRED_POLICY_DATE,
@@ -1,9 +1,10 @@
1
1
  const policies = require('../configs/polices');
2
+ // const { cloneObject } = require('../../common/utils/objectUtils');
2
3
 
3
4
  const defaultExpiryDate = '2030-10-10T00:00:00.000Z';
4
5
  const defaultEffectiveDate = '2020-10-10T00:00:00.000Z';
5
6
 
6
- const policiesConfig = {
7
+ const policiesCoverageConfig = { //rename - coverage policies config
7
8
  [policies.policyNames.generalLiability]: {
8
9
  key: 'generalLiability',
9
10
  policyEntities: [
@@ -17,57 +18,57 @@ const policiesConfig = {
17
18
  {
18
19
  key: 'eachOccurrence',
19
20
  value: 1000000
20
- },
21
- {
22
- key: 'productsCompletedOperationsAggregate',
23
- value: 3000000
24
- },
25
- {
26
- key: 'personalAdvertisingInjury',
27
- value: 1000000
28
- },
29
- {
30
- key: 'medicalExpenses',
31
- value: 5000
32
- },
33
- {
34
- key: 'damageToRentedPremises',
35
- value: 50000
36
- },
37
- {
38
- key: 'generalAggregate',
39
- value: 2000000
40
21
  }
22
+ // {
23
+ // key: 'productsCompletedOperationsAggregate',
24
+ // value: 3000000
25
+ // },
26
+ // {
27
+ // key: 'personalAdvertisingInjury',
28
+ // value: 1000000
29
+ // },
30
+ // {
31
+ // key: 'medicalExpenses',
32
+ // value: 5000
33
+ // },
34
+ // {
35
+ // key: 'damageToRentedPremises',
36
+ // value: 50000
37
+ // },
38
+ // {
39
+ // key: 'generalAggregate',
40
+ // value: 2000000
41
+ // }
41
42
  ],
42
43
  provisions: [
43
- {
44
- key: 'primaryNonContributoryProvision',
45
- value: true
46
- },
47
- {
48
- key: 'primaryNonContributoryForAdditionalInsured',
49
- value: true
50
- },
51
- {
52
- key: '10DaysNoticeOfCancellation',
53
- value: true
54
- },
55
- {
56
- key: 'contractualLiability',
57
- value: true
58
- },
59
- {
60
- key: 'perOccur',
61
- value: true
62
- },
63
- {
64
- key: 'perPolicy',
65
- value: true
66
- },
67
- {
68
- key: 'perProject',
69
- value: true
70
- }
44
+ // {
45
+ // key: 'primaryNonContributoryProvision',
46
+ // value: true
47
+ // },
48
+ // {
49
+ // key: 'primaryNonContributoryForAdditionalInsured',
50
+ // value: true
51
+ // },
52
+ // {
53
+ // key: '10DaysNoticeOfCancellation',
54
+ // value: true
55
+ // },
56
+ // {
57
+ // key: 'contractualLiability',
58
+ // value: true
59
+ // },
60
+ // {
61
+ // key: 'perOccur',
62
+ // value: true
63
+ // },
64
+ // {
65
+ // key: 'perPolicy',
66
+ // value: true
67
+ // },
68
+ // {
69
+ // key: 'perProject',
70
+ // value: true
71
+ // }
71
72
  ]
72
73
  },
73
74
  [policies.policyNames.automobileLiability]: {
@@ -81,23 +82,23 @@ const policiesConfig = {
81
82
  ],
82
83
  limits: [
83
84
  {
84
- key: 'combinedSingleLimit',
85
+ key: 'eachOccurrence',
85
86
  value: 1000000
86
87
  }
87
88
  ],
88
89
  provisions: [
89
- {
90
- key: 'anyAuto',
91
- value: true
92
- },
93
- {
94
- key: 'waiverOfSubrogation',
95
- value: true
96
- },
97
- {
98
- key: 'hired',
99
- value: true
100
- }
90
+ // {
91
+ // key: 'anyAuto',
92
+ // value: true
93
+ // },
94
+ // {
95
+ // key: 'waiverOfSubrogation',
96
+ // value: true
97
+ // },
98
+ // {
99
+ // key: 'hired',
100
+ // value: true
101
+ // }
101
102
  ]
102
103
  },
103
104
  [policies.policyNames.excessLiability]: {
@@ -110,16 +111,16 @@ const policiesConfig = {
110
111
  }
111
112
  ],
112
113
  limits: [
113
- {
114
- key: 'eachOccurrence',
115
- value: 1000000
116
- }
114
+ // {
115
+ // key: 'eachOccurrence',
116
+ // value: 1000000
117
+ // }
117
118
  ],
118
119
  provisions: [
119
- {
120
- key: 'occur',
121
- value: true
122
- }
120
+ // {
121
+ // key: 'occur',
122
+ // value: true
123
+ // }
123
124
  ]
124
125
  },
125
126
  [policies.policyNames.umbrella]: {
@@ -135,17 +136,17 @@ const policiesConfig = {
135
136
  {
136
137
  key: 'eachOccurrence',
137
138
  value: 5000000
138
- },
139
- {
140
- key: 'aggregate',
141
- value: 5000000
142
139
  }
140
+ // {
141
+ // key: 'aggregate',
142
+ // value: 5000000
143
+ // }
143
144
  ],
144
145
  provisions: [
145
- {
146
- key: 'occur',
147
- value: true
148
- }
146
+ // {
147
+ // key: 'occur',
148
+ // value: true
149
+ // }
149
150
  ]
150
151
  },
151
152
  [policies.policyNames.workersCompensation]: {
@@ -161,17 +162,17 @@ const policiesConfig = {
161
162
  {
162
163
  key: 'employersLiabilityEachAccident',
163
164
  value: 1000000
164
- },
165
- {
166
- key: 'employersLiabilityDiseaseEachEmployee',
167
- value: 1000000
168
165
  }
166
+ // {
167
+ // key: 'employersLiabilityDiseaseEachEmployee',
168
+ // value: 1000000
169
+ // }
169
170
  ],
170
171
  provisions: [
171
- {
172
- key: 'statutoryLimitsRequired',
173
- value: true
174
- }
172
+ // {
173
+ // key: 'statutoryLimitsRequired',
174
+ // value: true
175
+ // }
175
176
  ]
176
177
  },
177
178
  [policies.policyNames.fidelityCrime]: {
@@ -212,16 +213,24 @@ const policiesConfig = {
212
213
  }
213
214
  };
214
215
 
215
- const getAllAvailablePolicies = () => Object.keys(policiesConfig);
216
+ const getAllAvailablePolicies = () => Object.keys(policiesCoverageConfig); //getting all available policy names! change the naming ["General Liability", "Automobile Liability", "Excess Liability", "Umbrella", "Workers’ Compensation", "Fidelity / Crime", "Cyber Liability", ]
217
+
218
+ // const getRequiredPoliciesMinimumForAutocomplete = () => {
219
+ // const policies = getAllAvailablePolicies();
220
+ // policies.length = 2;
221
+ // return policies;
222
+ // };
216
223
 
217
- const getRequiredPoliciesMinimumForAutocomplete = () => {
218
- const policies = getAllAvailablePolicies();
219
- policies.length = 2;
220
- return policies;
224
+ const getMinimumPoliciesCoverageForAutocomplete = () => { //new that takes getRequiredPoliciesMinimumForAutocomplete and return the entire coverage policy config
225
+ const policiesNames = getAllAvailablePolicies();
226
+ policiesNames.length = 2;
227
+ const minimumPoliciesCoverageConfig = policiesNames.map(policyName => policiesCoverageConfig[policyName]);
228
+ return minimumPoliciesCoverageConfig;
221
229
  };
222
230
 
223
231
  module.exports = {
224
232
  getAllAvailablePolicies,
225
- getRequiredPoliciesMinimumForAutocomplete,
226
- policiesConfig
233
+ // getRequiredPoliciesMinimumForAutocomplete,
234
+ getMinimumPoliciesCoverageForAutocomplete,
235
+ policiesCoverageConfig
227
236
  };
@@ -1,23 +1,29 @@
1
1
  const path = require('path');
2
2
 
3
- const { getEnv } = require('../../env');
3
+ const env = require('../../../src/env');
4
+ const { getEnv } = env;
5
+ // const { getEnv } = require('../../env');
4
6
  const { credentials } = getEnv();
5
7
 
6
- const auth = require('../../saas/internal-api/auth');
7
- const coi = require('../../saas/internal-api/coi');
8
- const compliance = require('../../saas/internal-api/compliance');
9
- const contractors = require('../../saas/internal-api/contractors');
10
- const requests = require('../../saas/internal-api/requests');
8
+ const { internalAPI } = require('../../../src')(env);
9
+ const { auth, requests, contractors, compliance, coi, defaults } = internalAPI;
10
+
11
+ // const auth = require('../../saas/internal-api/auth');
12
+ // const coi = require('../../saas/internal-api/coi');
13
+ // const compliance = require('../../saas/internal-api/compliance');
14
+ // const contractors = require('../../saas/internal-api/contractors');
15
+ // const requests = require('../../saas/internal-api/requests');
11
16
 
12
17
  const { complianceStatuses, getAuditConfigByStatus, expiryStatuses } = require('../../common/utils/complianceUtil');
13
18
  const httpResponseStatusCodes = require('../../common/httpResponseStatusCodes.json');
14
19
  const activationStatuses = require('../../common/consts/activationStatuses');
15
20
  const timeUtils = require('../../common/utils/timeUtils');
16
21
  const recordFlows = require('../../common/commonFlows/records/records');
22
+ const auditConfigs = require('../../defaults/configs/auditConfigs');
17
23
 
18
24
  const filePath = path.join(__dirname, '../../resources/coi/coi.pdf');
19
25
 
20
- const prepareRecord = async (recordCompany, recordEmail, status, tabId, requirementId, context, { inviterEmail = credentials.superUser, expiryStatus, shouldSendNotificationToPM = false, recordConfig, glPolicyNumber } = {}) => {
26
+ const prepareRecord = async (recordCompany, recordEmail, status, tabId, requirementId, context, { inviterEmail = credentials.superUser, expiryStatus, shouldSendNotificationToPM = false, recordConfig, glPolicyNumber, policyOwnerRecordId } = {}) => {
21
27
  validateInsuranceAndExpiryStatus(status, expiryStatus);
22
28
 
23
29
  const requestData = await requests.services.getOrCreateRequest(
@@ -28,6 +34,10 @@ const prepareRecord = async (recordCompany, recordEmail, status, tabId, requirem
28
34
  inviterEmail,
29
35
  email: recordEmail,
30
36
  companyName: recordCompany
37
+ },
38
+ activationStatuses.ACTIVE,
39
+ {
40
+ policyOwnerRecordId
31
41
  }
32
42
  );
33
43
 
@@ -45,16 +55,17 @@ const prepareRecord = async (recordCompany, recordEmail, status, tabId, requirem
45
55
  return recordId;
46
56
  }
47
57
 
48
- const coiUpload = await coi.utils.uploadCoi(
49
- recordId,
50
- filePath,
51
- uploaderType = coi.consts.UPLOADER_TYPES.ICS,
52
- uploaderEmail = credentials.superUser
53
- );
58
+ await uploadCoiToRecord(recordId);
59
+ // const coiUpload = await coi.utils.uploadCoi(
60
+ // recordId,
61
+ // filePath,
62
+ // uploaderType = coi.consts.UPLOADER_TYPES.ICS,
63
+ // uploaderEmail = credentials.superUser
64
+ // );
54
65
 
55
- if (!(coiUpload && coiUpload.name)) {
56
- throw Error(`Failed to upload COI for record ${recordCompany}\n${coiUpload}`);
57
- }
66
+ // if (!(coiUpload && coiUpload.name)) {
67
+ // throw Error(`Failed to upload COI for record ${recordCompany}\n${coiUpload}`);
68
+ // }
58
69
 
59
70
  if (complianceStatuses.underReview === status) {
60
71
  return recordId;
@@ -131,8 +142,8 @@ const prepareNoCoiRequireRecord = async (recordCompany, recordEmail, tabId, cont
131
142
  return prepareRecord(recordCompany, recordEmail, complianceStatuses.noCoiRequire, tabId, null, context, { inviterEmail, recordConfig });
132
143
  };
133
144
 
134
- const prepareUnderReviewRecord = (recordCompany, recordEmail, tabId, requirementId, context, { inviterEmail, recordConfig } = {}) => {
135
- return prepareRecord(recordCompany, recordEmail, complianceStatuses.underReview, tabId, requirementId, context, { inviterEmail, recordConfig });
145
+ const prepareUnderReviewRecord = (recordCompany, recordEmail, tabId, requirementId, context, { inviterEmail, recordConfig, policyOwnerRecordId } = {}) => {
146
+ return prepareRecord(recordCompany, recordEmail, complianceStatuses.underReview, tabId, requirementId, context, { inviterEmail, recordConfig, policyOwnerRecordId });
136
147
  };
137
148
 
138
149
  const sendGaps = async (recordId, tabId, context) => {
@@ -196,24 +207,80 @@ const prepareDraftRecord = async (recordCompany, tabId, context, { recordEmail,
196
207
  throw Error(`Failed to create record ${recordCompany}\n${requestData}`);
197
208
  }
198
209
 
199
- recordConfig && await recordFlows.editRequestAndRecordDetails(requestData, recordConfig, context);
210
+ recordConfig && await recordFlows.editRequestAndRecordDetails(requestData, recordConfig, context, { isDraft: true });
200
211
 
201
212
  if (uploadCoi) {
202
213
  const recordId = requestData.record.contractorId;
214
+ await uploadCoiToRecord(recordId);
215
+
216
+ // const coiUpload = await coi.utils.uploadCoi(
217
+ // recordId,
218
+ // filePath,
219
+ // uploaderType = coi.consts.UPLOADER_TYPES.ICS,
220
+ // uploaderEmail = credentials.superUser
221
+ // );
222
+
223
+ // if (!(coiUpload && coiUpload.name)) {
224
+ // throw Error(`Failed to upload COI for record ${recordCompany}\n${coiUpload}`);
225
+ // }
226
+ }
203
227
 
204
- const coiUpload = await coi.utils.uploadCoi(
205
- recordId,
206
- filePath,
207
- uploaderType = coi.consts.UPLOADER_TYPES.ICS,
208
- uploaderEmail = credentials.superUser
209
- );
228
+ return requestData;
229
+ };
210
230
 
211
- if (!(coiUpload && coiUpload.name)) {
212
- throw Error(`Failed to upload COI for record ${recordCompany}\n${coiUpload}`);
213
- }
231
+ const prepareRecordThatFitsAutocomplete = async (accountId, projectId, tabId, requirementId, recordCompany, recordEmail, context, { policyOwnerRecordId, inviterEmail, recordConfig, glPolicyNumber } = {}) => {
232
+ //Requirements should include "General Liability"
233
+ const auditorContext = await auth.services.getAuditorCookie();
234
+
235
+ const recordId = await prepareUnderReviewRecord(recordCompany, recordEmail, tabId, requirementId, context, { policyOwnerRecordId, inviterEmail, recordConfig, glPolicyNumber });
236
+
237
+ const recordDetails = await contractors.services.getContractorById(recordId, context);
238
+
239
+ if (recordDetails.status !== httpResponseStatusCodes.OK) {
240
+ throw new Error(`Failed to get record by id: ${recordId}`);
214
241
  }
215
242
 
216
- return requestData;
243
+ const coveragePoliciesConfig = defaults.coverage.getMinimumPoliciesCoverageForAutocomplete();
244
+ const coverageResponse = await compliance.services.coverage.addCoverage(auditorContext, accountId, projectId, requirementId, recordDetails.data, coveragePoliciesConfig);
245
+
246
+ if (coverageResponse.status !== httpResponseStatusCodes.NO_CONTENT) {
247
+ throw new Error(`Failed to add coverage to record: ${recordId}`);
248
+ }
249
+
250
+ const auditConfig = auditConfigs.getCompliantAuditConfig({ glPolicyNumber });
251
+ const auditResponse = await compliance.services.audit.auditRecord(
252
+ auditorContext,
253
+ accountId,
254
+ projectId,
255
+ requirementId,
256
+ recordId,
257
+ auditConfig
258
+ );
259
+
260
+ if (auditResponse.status !== httpResponseStatusCodes.NO_CONTENT) {
261
+ throw Error(`Failed to audit record ${recordCompany}\n${JSON.stringify(auditResponse)}`);
262
+ }
263
+
264
+ const updatedRequest = await requests.services.getRequestFromTabByRecordId(recordId, tabId, context);
265
+
266
+ if (!(updatedRequest && updatedRequest.id)) {
267
+ throw Error(`Failed to create record ${recordCompany}\n${requestData}`);
268
+ }
269
+
270
+ return updatedRequest;
271
+ };
272
+
273
+ const uploadCoiToRecord = async recordId => {
274
+ const coiUpload = await coi.utils.uploadCoi(
275
+ recordId,
276
+ filePath,
277
+ uploaderType = coi.consts.UPLOADER_TYPES.ICS,
278
+ uploaderEmail = credentials.superUser
279
+ );
280
+
281
+ if (!(coiUpload && coiUpload.name)) {
282
+ throw Error(`Failed to upload COI for record ${recordId}\n${coiUpload}`);
283
+ }
217
284
  };
218
285
 
219
286
  module.exports = {
@@ -225,5 +292,6 @@ module.exports = {
225
292
  prepareUnderReviewRecord,
226
293
  prepareAwaitingCoiRecord,
227
294
  prepareNoCoiRequireRecord,
228
- prepareDraftRecord
295
+ prepareDraftRecord,
296
+ prepareRecordThatFitsAutocomplete
229
297
  };
@@ -8,10 +8,12 @@ class UpdateAccountSettingsModel {
8
8
  isEmailOnWelcomePageVA = false,
9
9
  isExcludedFromNetwork = false,
10
10
  isOcrEnabled = false,
11
+ isAuditingAiEnabled = false,
11
12
  isCoverageAudit = false,
12
13
  isAccountRequirementsEnabled = false,
13
14
  isAccountRequirementsAutoRenewalsEnabled = false,
14
15
  autoGaps = {},
16
+ integrations = {},
15
17
  auditSlaHours = 24,
16
18
  shouldReachOutVendors = true,
17
19
  isWithoutAutocompleteDistanceLimitation = false
@@ -24,10 +26,12 @@ class UpdateAccountSettingsModel {
24
26
  this.isEmailOnWelcomePageVA = isEmailOnWelcomePageVA;
25
27
  this.isExcludedFromNetwork = isExcludedFromNetwork;
26
28
  this.isOcrEnabled = isOcrEnabled;
29
+ this.isAuditingAiEnabled = isAuditingAiEnabled;
27
30
  this.isCoverageAudit = isCoverageAudit;
28
31
  this.isAccountRequirementsEnabled = isAccountRequirementsEnabled;
29
32
  this.isAccountRequirementsAutoRenewalsEnabled = isAccountRequirementsAutoRenewalsEnabled;
30
33
  this.autoGaps = { ... DEFAULT_AUTO_GAPS, ... autoGaps };
34
+ this.integrations = { ... DEFAULT_INTEGRATIONS, ... integrations };
31
35
  this.auditSlaHours = auditSlaHours;
32
36
  this.shouldReachOutVendors = shouldReachOutVendors;
33
37
  this.isWithoutAutocompleteDistanceLimitation = isWithoutAutocompleteDistanceLimitation;
@@ -39,4 +43,9 @@ const DEFAULT_AUTO_GAPS = {
39
43
  isAutoGapsEnabledForVendors: false
40
44
  };
41
45
 
46
+ const DEFAULT_INTEGRATIONS = {
47
+ isVendorIntegrationsEnabled: false,
48
+ isTenantIntegrationsEnabled: false
49
+ };
50
+
42
51
  module.exports = UpdateAccountSettingsModel;
@@ -6,5 +6,6 @@ const UPLOADER_TYPE = {
6
6
  const DEFAULT_AGREEMENT_TEMPLATE = 'tpl_C3sgbpYx7LHyRNdtM7';
7
7
  const COI_FOLDER_PATH = 'packages/test-infra/src/resources/coi/';
8
8
  const DEFAULT_COI_FILENAME = 'coi.pdf';
9
+ const AGREEMENT_PATH = 'packages/test-infra/src/resources/agreements/agreement.pdf';
9
10
 
10
- module.exports = { UPLOADER_TYPE, DEFAULT_AGREEMENT_TEMPLATE, COI_FOLDER_PATH, DEFAULT_COI_FILENAME };
11
+ module.exports = { UPLOADER_TYPE, DEFAULT_AGREEMENT_TEMPLATE, COI_FOLDER_PATH, DEFAULT_COI_FILENAME, AGREEMENT_PATH };
@@ -0,0 +1,12 @@
1
+ const internalRequests = require('../../../../../common/requests/internalAuth/requests');
2
+ const { nodeBackendUrl } = require('../../../../../env').getEnv();
3
+
4
+ const Endpoints = {
5
+ getAMBestRatingForInsurers: `${nodeBackendUrl}/compliance/am-best-rating`
6
+ };
7
+
8
+ const getAMBestRatingForInsurers = insurerList => {
9
+ return internalRequests.postRequestHandler(Endpoints.getAMBestRatingForInsurers, insurerList);
10
+ };
11
+
12
+ module.exports = { getAMBestRatingForInsurers };
@@ -0,0 +1,14 @@
1
+ const amBestRatingApi = require('./am.best.rating.api');
2
+ const httpResponseStatusCodes = require('../../../../../common/httpResponseStatusCodes.json');
3
+
4
+ const getAMBestRatingForInsurers = async insurerList => {
5
+ const response = await amBestRatingApi.getAMBestRatingForInsurers(insurerList);
6
+
7
+ if (response.status !== httpResponseStatusCodes.OK) {
8
+ throw Error(`Failed to get AM best data - Response: ${response.status}`);
9
+ }
10
+
11
+ return response.data;
12
+ };
13
+
14
+ module.exports = { getAMBestRatingForInsurers };
@@ -18,22 +18,24 @@ const deleteCoverageByCoiId = (coiId, icsContext) => {
18
18
  return coverageApi.deleteCoverageByCoiId(coiId, icsContext);
19
19
  };
20
20
 
21
- const addCoverage = async function(
21
+ const addCoverage = async function( //function that fits only automation (fits or is being used? maybe because of the coveragePolicesList which is only a list of policy names) - testFlowsInternalApi.auditRecord is using internalApi.compliance.addCoverage and passes array by default. //persistRecordStatus when passing coverage=true doesn't pass an array (for 28.10.24 i see only tests passing "true" are in setup that doesn't run again so can't see what happens here)
22
22
  auditorContext,
23
23
  accountId,
24
24
  projectId,
25
25
  requirementId,
26
26
  record,
27
- coveragePolicesList
27
+ policiesCoverageConfig //change naming, not only list now
28
28
  ) {
29
29
  const coiId = record.certificatePdf.split('contractor').shift();
30
30
  const recordId = record.contractorId;
31
31
 
32
32
  const { auditDates } = await prepareMetadataForAudit(auditorContext, accountId, projectId, requirementId, recordId);
33
33
 
34
- const coverageConfig = Array.isArray(coveragePolicesList) ?
35
- getCoverageConfig(coiId, coveragePolicesList) :
36
- getCoverageConfig(coiId, getAllAvailablePolicies());
34
+ const coverageConfig = getCoverageConfig(coiId, policiesCoverageConfig); //takes all coverage and not just 2 policies!
35
+
36
+ // const coverageConfig = Array.isArray(policiesCoverageConfig) && typeof policiesCoverageConfig[0] !== 'object' ?
37
+ // getCoverageConfig(coiId, policiesCoverageConfig) : //gets from automation only policy names, no limits and so on.. no use in integration
38
+ // getCoverageConfig(coiId, getAllAvailablePolicies()); //getAllAvailablePolicies is not located in current file and gets a format that doesn't fit the function getCoverageConfig - in automation this can happen only via persis
37
39
 
38
40
  const coverageResponse = await saveCoverageJava(auditorContext, auditDates, coverageConfig);
39
41
  return coverageResponse;
@@ -136,7 +136,7 @@ const overrideAll = async (record, reason, context, { note = 'OVERRIDDEN AUTOMAT
136
136
 
137
137
  for (const waivable of allWaivablePolicies) {
138
138
  const waiveModels = getAllWaiveModels(record, waivable.policyName, waivable.attributeName, reason, note);
139
- for (waiveModel of waiveModels) {
139
+ for (const waiveModel of waiveModels) {
140
140
  const waiveResponse = await overrideGap({ waiveRequestModel: waiveModel, context });
141
141
 
142
142
  if (waiveResponse.status !== httpResponseStatusCodes.OK) {
@@ -174,6 +174,7 @@ module.exports = {
174
174
  acceptAll,
175
175
  retract,
176
176
  getWaiveModel,
177
+ getAllWaiveModels,
177
178
  getRetractModel,
178
179
  getWaiveModelByGap,
179
180
  overrideGap,
@@ -7,6 +7,8 @@ const overrideGapServices = require('./api/overrideGap/override.gap.service');
7
7
  const convertServices = require('./api/convert/convert.service');
8
8
  const coverageServices = require('./api/coverage/coverage.service');
9
9
 
10
+ const amBestRatingServices = require('./api/amBestRating/am.best.rating.service');
11
+
10
12
  const auditConsts = require('./consts/audit');
11
13
  const auditUtils = require('./utils/auditUtil');
12
14
 
@@ -27,7 +29,8 @@ const services = {
27
29
  audit: auditServices,
28
30
  overrideGap: overrideGapServices,
29
31
  convert: convertServices,
30
- coverage: coverageServices
32
+ coverage: coverageServices,
33
+ amBestRating: amBestRatingServices
31
34
  };
32
35
 
33
36
  module.exports = { services, models, consts, utils };
@@ -1,26 +1,40 @@
1
1
  const { cloneObject } = require('../../../../common/utils/objectUtils');
2
- const { policiesConfig } = require('../../../../defaults/configs/coverage');
2
+ const { policiesCoverageConfig } = require('../../../../defaults/configs/coverage');
3
3
 
4
- const getCoverageConfig = function(coiId, policiesArr) {
5
- const config = cloneObject(configBase);
4
+ const getCoverageConfig = function(coiId, policiesForCoverage) { //rename policiesArr because it will no longer be only array
5
+ const coverageConfig = cloneObject(baseCoverageConfig); //rename to coverageConfig
6
6
 
7
- config.coiId = coiId;
8
- const coveragePolicies = config.documents[0].pages[0].policies;
7
+ coverageConfig.coiId = coiId;
9
8
 
10
- for (const policyName of policiesArr) {
11
- const policy = policiesConfig[policyName];
9
+ if (Array.isArray(policiesForCoverage) && typeof policiesForCoverage[0] !== 'object') { //when a few policies are passed as policy config and as list of names, then the object condition is necessary
10
+ const coveragePolicies = coverageConfig.documents[0].pages[0].policies;
12
11
 
13
- if (! policy) {
14
- throw Error(`There is no config for ${policyName}. Config available for policies: ${Object.keys(policiesConfig).join(', ')}`);
15
- }
12
+ for (const policyName of policiesForCoverage) {
13
+ const policy = policiesCoverageConfig[policyName];
14
+
15
+ if (! policy) {
16
+ throw Error(`There is no config for ${policyName}. Config available for policies: ${Object.keys(policiesCoverageConfig).join(', ')}`);
17
+ }
16
18
 
17
- coveragePolicies.push(cloneObject(policy));
19
+ coveragePolicies.push(cloneObject(policy));
20
+ }
21
+ } else {
22
+ coverageConfig.documents[0].pages[0].policies = policiesForCoverage;
18
23
  }
19
24
 
20
- return config;
25
+ return coverageConfig;
21
26
  };
22
27
 
23
- const configBase = {
28
+ // const getCoverageConfigByPolicies = function(coiId, policiesConfig) { //I added this?
29
+ // const config = cloneObject(configBase);
30
+
31
+ // config.coiId = coiId;
32
+ // config.documents[0].pages[0].policies = policiesConfig;
33
+
34
+ // return config;
35
+ // };
36
+
37
+ const baseCoverageConfig = {
24
38
  'coiId': 'REPLACE_WITH_REAL_VALUE',
25
39
  'documents': [
26
40
  {
@@ -37,4 +51,5 @@ const configBase = {
37
51
 
38
52
  module.exports = {
39
53
  getCoverageConfig
54
+ // getCoverageConfigByPolicies
40
55
  };
@@ -19,6 +19,16 @@ class ContractorModel {
19
19
  }
20
20
  }
21
21
 
22
+ class DraftRecordModel extends ContractorModel {
23
+ constructor(contractorId, recordType, company, emailAddress, additionalDetails, isDraft, requirementsAction, { dateModified, contractorOverrideDateModified } = {}) {
24
+ super(contractorId, recordType, company, emailAddress, additionalDetails, { dateModified, contractorOverrideDateModified });
25
+
26
+ // New properties for the draft record
27
+ this.isDraft = isDraft;
28
+ this.requirementsAction = requirementsAction;
29
+ }
30
+ }
31
+
22
32
  class ContractorDetailsModel {
23
33
  constructor({
24
34
  additionalEmails = [],
@@ -58,5 +68,6 @@ class ContractorDetailsModel {
58
68
 
59
69
  module.exports = {
60
70
  ContractorModel,
61
- ContractorDetailsModel
71
+ ContractorDetailsModel,
72
+ DraftRecordModel
62
73
  };
@@ -24,10 +24,10 @@ const EMAIL_TYPES = {
24
24
 
25
25
  const EMAIL_SUBJECT = {
26
26
  invite: 'Your Insurance Docs are needed for',
27
- compliant: ({ recordCompanyName }) => `Compliant COI - ${recordCompanyName}`,
27
+ compliant: ({ requesterName, recordCompanyName }) => `Accepted Insurance for ${requesterName} - ${recordCompanyName}`,
28
28
  sendGaps: ({ requesterName }) => `Corrected Insurance Docs Required for ${requesterName} - `, //For this email type, guest is the same as vendor
29
29
  sendGapsForTenant: ({ requesterName }) => `Corrected Insurance Docs Required for leased space at ${requesterName} - `,
30
- notCompliant: ({ recordCompanyName, requesterName }) => `Please Review COI Gaps - ${recordCompanyName} (${requesterName})`,
30
+ notCompliant: ({ recordCompanyName, requesterName }) => `Please Review Compliance Gaps - ${recordCompanyName} (${requesterName})`,
31
31
  wrongCoi: ({ recordCompanyName, requesterName }) => `Incorrect File Submission - COI Still Required for ${recordCompanyName} - ${requesterName}`,
32
32
  sendGapsVendorFullName: ({ requesterName, recordFirstName, recordLastName }) => `Corrected Insurance Docs Required for ${requesterName} - ${recordFirstName} ${recordLastName}`,
33
33
  sendGapsTenantFullName: ({ requesterName, recordFirstName, recordLastName }) => `Corrected Insurance Docs Required for leased space at ${requesterName} - ${recordFirstName} ${recordLastName}`,
@@ -47,7 +47,7 @@ const EMAIL_SUBJECT = {
47
47
  fraudAuditorReview: ({ recordCompanyName, requesterName }) => `Authentication check for ${recordCompanyName} at ${requesterName}`,
48
48
  requestNewCoi: ({ recordCompanyName, requesterName, isExpired }) => `${recordCompanyName}'s COI is ${isExpired ? 'expired' : 'about to expire'} - ${requesterName}`,
49
49
  malwareCoiFound: 'COI upload failed to pass security scan',
50
- thankYou: 'Thank you for submitting your COI',
50
+ thankYou: 'Thank you for submitting your documents',
51
51
  teamNoteMention: ({ taggingUserFullName, recordCompanyName }) => `${taggingUserFullName} mentioned you in a team note for ${recordCompanyName}`,
52
52
  reportSentSingleProject: ({ accountName, projectName }) => `Jones - Report for ${accountName}: ${projectName}`
53
53
  };
@@ -8,7 +8,7 @@ const getPolicyFilesForVendorReport = async (requestId, context, { shouldExpectE
8
8
  const getPolicyResponse = await policyFileApi.getPolicyFilesForVendorReport(requestId, context);
9
9
 
10
10
  if (getPolicyResponse.status !== httpResponseStatusCodes.OK && !shouldExpectError) {
11
- throw new Error('Failed to get policy files for PM');
11
+ throw new Error('Failed to get policy files from record report');
12
12
  }
13
13
 
14
14
  return getPolicyResponse;
@@ -81,7 +81,7 @@ const getPolicyFilesIfExist = async (recordId, context) => {
81
81
 
82
82
  while (policyFiles.length === 0 && retries > 0) {
83
83
  //Busy wait for it takes time to get policy file to review
84
- await timeUtils.waitFor(0.5).seconds;
84
+ await timeUtils.waitFor(1).seconds;
85
85
 
86
86
  policiesToReviewResponse = await policyFileApi.getPolicyFilesRequireAudit(recordId, context);
87
87
  policyFiles = policiesToReviewResponse.data;
@@ -18,6 +18,7 @@ const Endpoints = {
18
18
  getTabTenantRequestsInProject: projectId => `${backendUrl}/saas/project/${projectId}/tenants/companies`,
19
19
  innerPageRequests: `${backendUrl}/saas/requests/chart-filter`,
20
20
  homePageRequests: `${backendUrl}/saas/requests/homepage`,
21
+ homePageRequestsCount: `${backendUrl}/saas/requests/homepage/count`,
21
22
  draftFilterCounters: tabId => `${backendUrl}/saas/tab/${tabId}/requests/draft/filter/counter`,
22
23
  activityStatusCounter: tabId => `${backendUrl}/saas/tab/${tabId}/requests/activity-status/count`,
23
24
  requestsCounters: tabId => `${backendUrl}/saas/tab/${tabId}/requests/counters`
@@ -82,6 +83,10 @@ const getHomePageRequests = (requestListCriteriaModel, context) => {
82
83
  return requests.postRequestHandler(Endpoints.homePageRequests, requestListCriteriaModel, context);
83
84
  };
84
85
 
86
+ const getHomePageRequestsCount = context => {
87
+ return requests.getRequestHandler(Endpoints.homePageRequestsCount, {}, context);
88
+ };
89
+
85
90
  const getDraftRequestList = (draftRequestCriteriaModel, context) => {
86
91
  return requests.postRequestHandler(Endpoints.draftRequestList, draftRequestCriteriaModel, context);
87
92
  };
@@ -113,6 +118,7 @@ module.exports = {
113
118
  getTabTenantRequestsInProject,
114
119
  getInnerPageRequests,
115
120
  getHomePageRequests,
121
+ getHomePageRequestsCount,
116
122
  getDraftRequestList,
117
123
  getDraftFilterCountersByTabId,
118
124
  getActivityStatusCounterByTabId,
@@ -224,7 +224,7 @@ const getRequestByName = async (recordName, tabId, context) => {
224
224
  return request;
225
225
  };
226
226
 
227
- const getDraftRequestList = async (draftRequestCriteriaModel, context) => {
227
+ const getDraftRequestListByModel = async (draftRequestCriteriaModel, context) => {
228
228
  validateType(draftRequestCriteriaModel, DraftRequestCriteriaModel);
229
229
  const response = await requestsAPI.getDraftRequestList(draftRequestCriteriaModel, context);
230
230
 
@@ -235,6 +235,11 @@ const getDraftRequestList = async (draftRequestCriteriaModel, context) => {
235
235
  return response.data;
236
236
  };
237
237
 
238
+ const getDraftRequestListByTabId = async (tabId, context, { draftCompletionStatusesFilter, sortBy } = {}) => {
239
+ const draftRequestCriteriaModel = new DraftRequestCriteriaModel(tabId, { draftCompletionStatusesFilter, sortBy });
240
+ return getDraftRequestListByModel(draftRequestCriteriaModel, context);
241
+ };
242
+
238
243
  const getDraftFilterCountersByTabId = async (tabId, context) => {
239
244
  const response = await requestsAPI.getDraftFilterCountersByTabId(tabId, context);
240
245
 
@@ -288,7 +293,8 @@ module.exports = {
288
293
  getHomePageRequestsCount,
289
294
  getAllRequestsByName,
290
295
  getRequestByName,
291
- getDraftRequestList,
296
+ getDraftRequestListByModel,
297
+ getDraftRequestListByTabId,
292
298
  getDraftFilterCountersByTabId,
293
299
  getActivityStatusCounterByTabId,
294
300
  getRequestsCountersByTabId
@@ -6,6 +6,7 @@ const consts = require('../consts');
6
6
  const { DOCUMENT, TEMP_DOCUMENTS, TEMP_POLICY } = require('../../../../common/consts/s3FileTypes');
7
7
  const { CreatePolicyFileModel } = require('../../policyFile/models/create.policy.file.model');
8
8
  const { validateArray } = require('../../../../common/validations/typeValidations');
9
+ const { AGREEMENT_PATH } = require('../../agreement/consts/consts');
9
10
 
10
11
  const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
11
12
 
@@ -43,7 +44,7 @@ const uploadFileToS3 = async (preSignedUrl, filePath) => {
43
44
  return uploadFileToS3Response;
44
45
  };
45
46
 
46
- const uploadRelatedDoc = async (recordId, context, { filePath, type = RELATED_DOC_TYPES.LEASE } = {}) => {
47
+ const uploadRelatedDoc = async (recordId, context, { filePath = AGREEMENT_PATH, type = RELATED_DOC_TYPES.LEASE } = {}) => {
47
48
  const { data: { preSignedUrl, fileName: fullFilePath } } = await getRelatedDocPreSignedUrl(recordId, context, { filePath });
48
49
  await uploadFileToS3(preSignedUrl, filePath);
49
50
  const uploadResponse = await uploadFile(recordId, DOCUMENT, fullFilePath);
@@ -9,7 +9,7 @@ const { NotificationSettingsModel } = require('../models/notification.settings.m
9
9
  const CreateInnerSystemAccountModel = require('../models/create.inner.system.user.model');
10
10
 
11
11
  const userTypes = require('../../../../common/consts/userTypes');
12
- const userRoles = require('../../../../common/consts/userRoles');
12
+ const { internalApiUserRoles: userRoles } = require('../../../../common/consts/userRoles');
13
13
 
14
14
  const inviteUser = async (invitedUserModels, context, { disableSendMail } = {}) => {
15
15
  return userAPI.invite(invitedUserModels, context, { disableSendMail });
@@ -15,7 +15,8 @@ const Endpoints = {
15
15
  changeRequirement: (requestId, requirementId) =>
16
16
  `${openapiUrl}/${recordsUrl}/${requestId}/requirement/${requirementId}`,
17
17
  archive: requestId => `${openapiUrl}/${recordsUrl}/${requestId}/archive`,
18
- restore: requestId => `${openapiUrl}/${recordsUrl}/${requestId}/restore`
18
+ restore: requestId => `${openapiUrl}/${recordsUrl}/${requestId}/restore`,
19
+ activateDraftRequest: requestId => `${openapiUrl}/records/${requestId}/draft/activate`
19
20
  };
20
21
 
21
22
  const inviteRequest = (apiKey, tabId, params) => {
@@ -71,6 +72,10 @@ const deleteRequest = (apiKey, requestId) => {
71
72
  return requests.deleteRequestHandler(endpoint, apiKey);
72
73
  };
73
74
 
75
+ const activateDraftRequest = (apiKey, requestId) => {
76
+ return requests.postRequestHandler(Endpoints.activateDraftRequest(requestId), apiKey, {});
77
+ };
78
+
74
79
  module.exports = {
75
80
  inviteRequest,
76
81
  getAllRequests,
@@ -83,5 +88,6 @@ module.exports = {
83
88
  archiveRequest,
84
89
  restoreRequest,
85
90
  deleteRequest,
86
- changeRequirement
91
+ changeRequirement,
92
+ activateDraftRequest
87
93
  };
@@ -1,8 +1,10 @@
1
1
  const requestsApi = require('./requests.api');
2
2
  const { InviteRequestModel } = require('./models/invite.request.model');
3
3
  const { UpdateRequestModel } = require('./models/update.request.model');
4
+
4
5
  const { validateType } = require('../../../common/validations/typeValidations');
5
6
  const timeUtils = require('../../../common/utils/timeUtils');
7
+ const httpResponseStatusCodes = require('../../../common/httpResponseStatusCodes.json');
6
8
 
7
9
  const inviteRequest = (apiKey, tabId, inviteRequestModel = {}) => {
8
10
  validateType(inviteRequestModel, InviteRequestModel);
@@ -64,6 +66,16 @@ const deleteRequest = (apiKey, id) => {
64
66
  return requestsApi.deleteRequest(apiKey, id);
65
67
  };
66
68
 
69
+ const activateDraftRequest = async (apiKey, requestId, { expectError } = {}) => {
70
+ const activationResponse = await requestsApi.activateDraftRequest(apiKey, requestId);
71
+
72
+ if (activationResponse.status !== httpResponseStatusCodes.OK && !expectError) {
73
+ throw new Error(`Failed to activate draft request id: ${requestId}`);
74
+ }
75
+
76
+ return activationResponse;
77
+ };
78
+
67
79
  module.exports = {
68
80
  inviteRequest,
69
81
  inviteDraftRequest,
@@ -77,5 +89,6 @@ module.exports = {
77
89
  restoreRequest,
78
90
  deleteRequest,
79
91
  updateRequest,
80
- changeRequirement
92
+ changeRequirement,
93
+ activateDraftRequest
81
94
  };
@@ -3,13 +3,23 @@ const { ApiUserModel } = require('./user.model');
3
3
  const usersApi = require('./users.api');
4
4
  const httpResponseStatusCodes = require('../../../common/httpResponseStatusCodes.json');
5
5
 
6
- const createUser = async (apiKey, user) => {
6
+ const createUserByModel = async (apiKey, user, { expectError } = {}) => {
7
7
  validateType(user, ApiUserModel);
8
8
  const response = await usersApi.createUser(apiKey, user);
9
+
10
+ if (expectError) {
11
+ return response;
12
+ }
13
+
9
14
  validateResponse(response, httpResponseStatusCodes.OK, 'Create user has failed');
10
15
  return response.data;
11
16
  };
12
17
 
18
+ const createUser = async (apiKey, user, { expectError } = {}) => {
19
+ const userModel = new ApiUserModel(user);
20
+ return createUserByModel(apiKey, userModel, { expectError });
21
+ };
22
+
13
23
  const updateUser = async (apiKey, user, userId) => {
14
24
  const response = await usersApi.updateUser(apiKey, user, userId);
15
25
  validateResponse(response, httpResponseStatusCodes.OK, 'Update user has failed');
@@ -22,7 +32,7 @@ const deleteUser = async (apiKey, userId) => {
22
32
  return response.data;
23
33
  };
24
34
 
25
- const getUserByEmailId = async (apiKey, email) => {
35
+ const getUserByEmail = async (apiKey, email) => {
26
36
  const response = await usersApi.getUser(apiKey, { email });
27
37
  return response;
28
38
  };
@@ -38,4 +48,4 @@ const validateResponse = (response, expectedStatus, errorMessage) => {
38
48
  }
39
49
  };
40
50
 
41
- module.exports = { createUser, updateUser, deleteUser, getUserByEmailId, getAllUsers };
51
+ module.exports = { createUserByModel, createUser, updateUser, deleteUser, getUserByEmail, getAllUsers };