@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.
- package/package.json +1 -1
- package/src/common/commonFlows/records/records.js +27 -10
- package/src/common/consts/constantsForRecordsSortingAndFilters.js +9 -1
- package/src/common/consts/homepage/sortOptions.js +14 -0
- package/src/common/consts/requirementActions.js +10 -0
- package/src/common/consts/userRoles.js +13 -1
- package/src/defaults/configs/auditConfigs.js +21 -0
- package/src/defaults/configs/coverage.js +102 -93
- package/src/factory/records/records.js +98 -30
- package/src/saas/internal-api/accounts/models/settings/update.settings.model.js +9 -0
- package/src/saas/internal-api/agreement/consts/consts.js +2 -1
- package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.api.js +12 -0
- package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.service.js +14 -0
- package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +7 -5
- package/src/saas/internal-api/compliance/api/overrideGap/override.gap.service.js +2 -1
- package/src/saas/internal-api/compliance/index.js +4 -1
- package/src/saas/internal-api/compliance/utils/coverageUtil.js +28 -13
- package/src/saas/internal-api/contractors/models/edit.contractor.model.js +12 -1
- package/src/saas/internal-api/dbEmails/consts/consts.js +3 -3
- package/src/saas/internal-api/policyFile/api/policy.file.service.js +2 -2
- package/src/saas/internal-api/requests/api/requests.api.js +6 -0
- package/src/saas/internal-api/requests/api/requests.service.js +8 -2
- package/src/saas/internal-api/uploadFiles/api/upload.file.service.js +2 -1
- package/src/saas/internal-api/users/api/users.service.js +1 -1
- package/src/saas/openapi/requests/requests.api.js +8 -2
- package/src/saas/openapi/requests/requests.service.js +14 -1
- package/src/saas/openapi/users/users.service.js +13 -3
package/package.json
CHANGED
|
@@ -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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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,
|
|
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,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
|
-
|
|
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
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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: '
|
|
85
|
+
key: 'eachOccurrence',
|
|
85
86
|
value: 1000000
|
|
86
87
|
}
|
|
87
88
|
],
|
|
88
89
|
provisions: [
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
// {
|
|
115
|
+
// key: 'eachOccurrence',
|
|
116
|
+
// value: 1000000
|
|
117
|
+
// }
|
|
117
118
|
],
|
|
118
119
|
provisions: [
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
147
|
-
|
|
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
|
-
|
|
173
|
-
|
|
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(
|
|
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
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
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
|
-
|
|
233
|
+
// getRequiredPoliciesMinimumForAutocomplete,
|
|
234
|
+
getMinimumPoliciesCoverageForAutocomplete,
|
|
235
|
+
policiesCoverageConfig
|
|
227
236
|
};
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const env = require('../../../src/env');
|
|
4
|
+
const { getEnv } = env;
|
|
5
|
+
// const { getEnv } = require('../../env');
|
|
4
6
|
const { credentials } = getEnv();
|
|
5
7
|
|
|
6
|
-
const
|
|
7
|
-
const coi =
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
const
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
filePath,
|
|
207
|
-
uploaderType = coi.consts.UPLOADER_TYPES.ICS,
|
|
208
|
-
uploaderEmail = credentials.superUser
|
|
209
|
-
);
|
|
228
|
+
return requestData;
|
|
229
|
+
};
|
|
210
230
|
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
35
|
-
|
|
36
|
-
|
|
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 {
|
|
2
|
+
const { policiesCoverageConfig } = require('../../../../defaults/configs/coverage');
|
|
3
3
|
|
|
4
|
-
const getCoverageConfig = function(coiId,
|
|
5
|
-
const
|
|
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
|
-
|
|
8
|
-
const coveragePolicies = config.documents[0].pages[0].policies;
|
|
7
|
+
coverageConfig.coiId = coiId;
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
const
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
19
|
+
coveragePolicies.push(cloneObject(policy));
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
coverageConfig.documents[0].pages[0].policies = policiesForCoverage;
|
|
18
23
|
}
|
|
19
24
|
|
|
20
|
-
return
|
|
25
|
+
return coverageConfig;
|
|
21
26
|
};
|
|
22
27
|
|
|
23
|
-
const
|
|
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 }) => `
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|
|
51
|
+
module.exports = { createUserByModel, createUser, updateUser, deleteUser, getUserByEmail, getAllUsers };
|