@getjones/test-infra 2.6.7 → 2.7.0
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/auth/auth.js +40 -0
- package/src/common/commonFlows/index.js +2 -1
- package/src/common/commonFlows/records/records.js +1 -0
- package/src/common/consts/dashboardCharts.js +17 -0
- package/src/common/utils/complianceUtil.js +56 -0
- package/src/common/utils/timeUtils.js +2 -1
- package/src/defaults/configs/coverage.js +227 -0
- package/src/defaults/configs/polices.js +2 -1
- package/src/defaults/index.js +2 -1
- package/src/factory/records/records.js +2 -2
- package/src/index.js +6 -0
- package/src/saas/internal-api/accounts/models/settings/update.settings.model.js +10 -1
- package/src/saas/internal-api/auditNotes/api/audit.notes.api.js +40 -0
- package/src/saas/internal-api/auditNotes/api/audit.notes.service.js +115 -0
- package/src/saas/internal-api/auditNotes/index.js +4 -0
- package/src/saas/internal-api/auditNotes/models/audit.note.model.js +30 -0
- package/src/saas/internal-api/auth/api/auth.api.js +14 -5
- package/src/saas/internal-api/auth/api/auth.service.js +21 -5
- package/src/saas/internal-api/compliance/api/audit/audit.service.js +18 -32
- package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +25 -1
- package/src/saas/internal-api/compliance/api/waive/waive.service.js +5 -5
- package/src/saas/internal-api/compliance/utils/{util.js → auditUtil.js} +0 -9
- package/src/saas/internal-api/compliance/utils/coverageUtil.js +40 -0
- package/src/saas/internal-api/contractors/api/contractors.api.js +7 -1
- package/src/saas/internal-api/contractors/api/contractors.service.js +12 -1
- package/src/saas/internal-api/contractors/consts/consts.js +6 -0
- package/src/saas/internal-api/contractors/index.js +2 -1
- package/src/saas/internal-api/contractors/models/assign.requirement.model.js +10 -0
- package/src/saas/internal-api/dbEmails/consts/consts.js +33 -1
- package/src/saas/internal-api/dbEmails/index.js +2 -1
- package/src/saas/internal-api/dbEmails/utils/util.js +10 -1
- package/src/saas/internal-api/projects/utils/utils.js +1 -1
- package/src/saas/internal-api/requests/api/requests.api.js +14 -2
- package/src/saas/internal-api/requests/api/requests.service.js +26 -1
- package/src/saas/internal-api/requests/models/create.request.model.js +5 -1
- package/src/saas/internal-api/requestsTable/api/requests.table.api.js +20 -0
- package/src/saas/internal-api/requestsTable/api/requests.table.service.js +14 -0
- package/src/saas/internal-api/requestsTable/index.js +3 -0
- package/src/saas/internal-api/requirements/api/requirements.service.js +16 -14
- package/src/saas/internal-api/requirements/models/update.requirement.model.js +3 -2
- package/src/saas/internal-api/requirements/utils/utils.js +2 -2
|
@@ -3,16 +3,25 @@ const { backendUrl } = require('../../../../env').getEnv();
|
|
|
3
3
|
|
|
4
4
|
const Endpoints = {
|
|
5
5
|
login: `${backendUrl}/logincontroller`,
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
verifyEmail: `${backendUrl}/verify/email`,
|
|
7
|
+
createOneTimeSession: `${backendUrl}/vendor-app/one-time-session/create`,
|
|
8
|
+
verifyRecord: `${backendUrl}/vendor-app/one-time-session/verify/record/undefined`// Due to unused variable "recordId"
|
|
8
9
|
};
|
|
9
10
|
|
|
10
11
|
const login = (email, password) => {
|
|
11
12
|
return requests.postRequestHandler(Endpoints.login, { email, password });
|
|
12
13
|
};
|
|
13
14
|
|
|
14
|
-
const
|
|
15
|
-
return requests.postRequestHandler(Endpoints.
|
|
15
|
+
const verifyEmail = email => {
|
|
16
|
+
return requests.postRequestHandler(Endpoints.verifyEmail, { email });
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const createOneTimeSession = email => {
|
|
20
|
+
return requests.postRequestHandler(Endpoints.createOneTimeSession, { email });
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const verifyRecord = (email, oneTimeCode) => {
|
|
24
|
+
return requests.getRequestHandler(Endpoints.verifyRecord, { email, oneTimeCode });
|
|
16
25
|
};
|
|
17
26
|
|
|
18
|
-
module.exports = { login,
|
|
27
|
+
module.exports = { login, verifyEmail, createOneTimeSession, verifyRecord };
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
const { getEnv, requiredValidation, getSystemUserIdentity, addUserIdentity } = require('../../../../env');
|
|
2
|
+
const { credentials } = getEnv();
|
|
3
|
+
|
|
2
4
|
const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
|
|
3
5
|
|
|
4
|
-
const { credentials } = getEnv();
|
|
5
6
|
const authApi = require('./auth.api');
|
|
6
7
|
|
|
7
8
|
const getAuthCookie = async (email, password) => {
|
|
@@ -28,10 +29,23 @@ const getAuthCookie = async (email, password) => {
|
|
|
28
29
|
}
|
|
29
30
|
};
|
|
30
31
|
|
|
31
|
-
const
|
|
32
|
+
const verifyEmail = email => {
|
|
33
|
+
return authApi.verifyEmail(email);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const createOneTimeSession = email => {
|
|
37
|
+
return authApi.createOneTimeSession(email);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const getHubUserCookie = async (email, oneTimeCode) => {
|
|
32
41
|
try {
|
|
33
|
-
const response = await authApi.
|
|
34
|
-
|
|
42
|
+
const response = await authApi.verifyRecord(email, oneTimeCode);
|
|
43
|
+
|
|
44
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
45
|
+
throw Error(`Error: ${JSON.stringify(response.data)}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const authCookie = response.headers['set-cookie'].find(item => item.startsWith('JonesToken='));
|
|
35
49
|
|
|
36
50
|
return authCookie;
|
|
37
51
|
} catch (error) {
|
|
@@ -67,7 +81,9 @@ const getOperatorCookie = () => {
|
|
|
67
81
|
|
|
68
82
|
module.exports = {
|
|
69
83
|
getAuthCookie,
|
|
70
|
-
|
|
84
|
+
verifyEmail,
|
|
85
|
+
createOneTimeSession,
|
|
86
|
+
getHubUserCookie,
|
|
71
87
|
getIcsCookie,
|
|
72
88
|
getAuditorCookie,
|
|
73
89
|
getOperatorCookie
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
const auditApi = require('./audit.api');
|
|
2
2
|
const { AuditRequestModel, AuditListParametersModel, AuditDatesModel } = require('../../models/audit/audit.model');
|
|
3
3
|
const { validateType } = require('../../../../../common/validations/typeValidations');
|
|
4
|
-
const
|
|
4
|
+
const auditUtil = require('../../utils/auditUtil');
|
|
5
5
|
const dataTypeUtils = require('../../../../../common/utils/dataTypeUtils');
|
|
6
6
|
const { cloneObject } = require('../../../../../common/utils/objectUtils');
|
|
7
|
+
const complianceUtil = require('../../../../../common/utils/complianceUtil');
|
|
7
8
|
|
|
8
9
|
const audit = (auditRequestModel, context) => {
|
|
9
10
|
validateType(auditRequestModel, AuditRequestModel);
|
|
@@ -11,7 +12,7 @@ const audit = (auditRequestModel, context) => {
|
|
|
11
12
|
};
|
|
12
13
|
|
|
13
14
|
const isReaudit = (contractorId, context) => {
|
|
14
|
-
return
|
|
15
|
+
return complianceUtil.isReaudit(contractorId, context);
|
|
15
16
|
};
|
|
16
17
|
|
|
17
18
|
const getAuditorContractorList = (auditListParametersModel, context) => {
|
|
@@ -34,36 +35,21 @@ const getAuditMetadata = async (
|
|
|
34
35
|
requirementId,
|
|
35
36
|
recordId,
|
|
36
37
|
{
|
|
37
|
-
isProjectOnboarding
|
|
38
|
-
shouldSendNotificationToPM
|
|
39
|
-
} = {}
|
|
40
|
-
|
|
38
|
+
isProjectOnboarding,
|
|
39
|
+
shouldSendNotificationToPM
|
|
40
|
+
} = {}
|
|
41
|
+
) => {
|
|
42
|
+
return complianceUtil.getAuditMetadata(
|
|
43
|
+
auditorContext,
|
|
41
44
|
accountId,
|
|
42
45
|
projectId,
|
|
43
46
|
requirementId,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
metadata.isReaudit = isReauditResponse.data.isReaudit;
|
|
51
|
-
|
|
52
|
-
const recordDetailsResponse = await getContractorDetailsForAudit(recordId, auditorContext);
|
|
53
|
-
const { vendorDetails } = recordDetailsResponse.data;
|
|
54
|
-
|
|
55
|
-
metadata.certificateId = vendorDetails.certificateDetails.certificateuploadId;
|
|
56
|
-
metadata.auditDates = {
|
|
57
|
-
contractorId: recordId,
|
|
58
|
-
contractorDateModified: vendorDetails.dateModified,
|
|
59
|
-
dateStartedAudit: recordDetailsResponse.dateStartedAudit,
|
|
60
|
-
contractorOverrideDateModified: vendorDetails.contractorOverrideDateModified,
|
|
61
|
-
contractCreateDate: vendorDetails.contractCreateDate
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
metadata.auditorId = await util.getAuditorId();
|
|
65
|
-
|
|
66
|
-
return metadata;
|
|
47
|
+
recordId,
|
|
48
|
+
{
|
|
49
|
+
isProjectOnboarding,
|
|
50
|
+
shouldSendNotificationToPM
|
|
51
|
+
}
|
|
52
|
+
);
|
|
67
53
|
};
|
|
68
54
|
|
|
69
55
|
const getAuditEntities = async (recordId, auditData, auditorContext) => {
|
|
@@ -72,7 +58,7 @@ const getAuditEntities = async (recordId, auditData, auditorContext) => {
|
|
|
72
58
|
|
|
73
59
|
const auditEntities = [];
|
|
74
60
|
auditData.forEach(auditEntity => auditEntities.push(
|
|
75
|
-
|
|
61
|
+
auditUtil.createAuditEntity(requirement, { ... auditEntity }))
|
|
76
62
|
);
|
|
77
63
|
return auditEntities;
|
|
78
64
|
};
|
|
@@ -129,7 +115,7 @@ const auditRecord = async function(
|
|
|
129
115
|
const auditMetadata = await getAuditMetadata(auditorContext, accountId, projectId, requirementId, recordId);
|
|
130
116
|
|
|
131
117
|
const auditApiConfig = dataTypeUtils.isObject(auditConfig) ?
|
|
132
|
-
|
|
118
|
+
auditUtil.parseAuditConfig(cloneObject(auditConfig)) :
|
|
133
119
|
auditConfig;
|
|
134
120
|
|
|
135
121
|
const auditEntities = await getAuditEntities(recordId, auditApiConfig, auditorContext);
|
|
@@ -145,8 +131,8 @@ module.exports = {
|
|
|
145
131
|
getAuditorContractorList,
|
|
146
132
|
getContractorDetailsForAudit,
|
|
147
133
|
getRequirementDetailsForAudit,
|
|
148
|
-
getAuditMetadata,
|
|
149
134
|
getAuditEntities,
|
|
135
|
+
getAuditMetadata,
|
|
150
136
|
getAuditRequestModel,
|
|
151
137
|
auditRecord
|
|
152
138
|
};
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
const { getEnv, getSystemUserIdentity } = require('../../../../../env');
|
|
2
|
+
const { credentials } = getEnv();
|
|
3
|
+
|
|
1
4
|
const coverageApi = require('./coverage.api');
|
|
5
|
+
const { getAuditMetadata } = require('../../../../../common/utils/complianceUtil');
|
|
6
|
+
const { getCoverageConfig } = require('../../utils/coverageUtil');
|
|
2
7
|
|
|
3
8
|
const saveCoverageNode = (coverage, nodeBackendSecret) => {
|
|
4
9
|
return coverageApi.saveCoverageNode(coverage, nodeBackendSecret);
|
|
@@ -16,9 +21,28 @@ const deleteCoverageByCoiId = (coiId, icsContext) => {
|
|
|
16
21
|
return coverageApi.deleteCoverageByCoiId(coiId, icsContext);
|
|
17
22
|
};
|
|
18
23
|
|
|
24
|
+
const addCoverage = async function(
|
|
25
|
+
accountId,
|
|
26
|
+
projectId,
|
|
27
|
+
requirementId,
|
|
28
|
+
recordId,
|
|
29
|
+
coverageConfig
|
|
30
|
+
) {
|
|
31
|
+
const { cookie: auditorContext } = getSystemUserIdentity(credentials.auditorUser);
|
|
32
|
+
const { auditDates } = await getAuditMetadata(accountId, projectId, requirementId, recordId, auditorContext);
|
|
33
|
+
|
|
34
|
+
const coverageApiConfig = dataTypeUtils.isObject(coverageConfig) ?
|
|
35
|
+
getCoverageConfig(cloneObject(coverageConfig)) :
|
|
36
|
+
coverageConfig;
|
|
37
|
+
|
|
38
|
+
const coverageResponse = await saveCoverageJava(auditorContext, auditDates, coverageApiConfig);
|
|
39
|
+
return coverageResponse;
|
|
40
|
+
};
|
|
41
|
+
|
|
19
42
|
module.exports = {
|
|
20
43
|
saveCoverageNode,
|
|
21
44
|
saveCoverageJava,
|
|
22
45
|
getCoverageByCoiId,
|
|
23
|
-
deleteCoverageByCoiId
|
|
46
|
+
deleteCoverageByCoiId,
|
|
47
|
+
addCoverage
|
|
24
48
|
};
|
|
@@ -3,7 +3,7 @@ const env = require('../../../../../env');
|
|
|
3
3
|
const waiveApi = require('./waive.api');
|
|
4
4
|
const { WaiveRequestModel, RetractRequestModel, WAIVER_REASONS } = require('../../models/waive/waive.model');
|
|
5
5
|
const { validateType } = require('../../../../../common/validations/typeValidations');
|
|
6
|
-
const
|
|
6
|
+
const auditUtil = require('../../utils/auditUtil');
|
|
7
7
|
const httpResponseStatusCodes = require('../../../../../common/httpResponseStatusCodes.json');
|
|
8
8
|
|
|
9
9
|
const { credentials } = env.getEnv();
|
|
@@ -29,7 +29,7 @@ const getWaiveModel = (
|
|
|
29
29
|
userId,
|
|
30
30
|
userRole
|
|
31
31
|
} = {}) => {
|
|
32
|
-
const auditId = getPolicyAuditIdFromRecord(record, policyName,
|
|
32
|
+
const auditId = getPolicyAuditIdFromRecord(record, policyName, auditUtil.getAttributeKey(attributeName));
|
|
33
33
|
userId = userId || env.getSystemUserIdentity(credentials.superUser).id;
|
|
34
34
|
userRole = userRole || userTypes.ICS;
|
|
35
35
|
|
|
@@ -55,13 +55,13 @@ const getWaiveModelByGap = (
|
|
|
55
55
|
userId,
|
|
56
56
|
userRole
|
|
57
57
|
} = {}) => {
|
|
58
|
-
const attributeName =
|
|
58
|
+
const attributeName = auditUtil.getAttributeNameByGap(record, policyName, gap);
|
|
59
59
|
|
|
60
60
|
return getWaiveModel(record, policyName, attributeName, reason, note, { userId, userRole });
|
|
61
61
|
};
|
|
62
62
|
|
|
63
63
|
const getRetractModel = (record, policyName, attributeName) => {
|
|
64
|
-
const auditId = getPolicyAuditIdFromRecord(record, policyName,
|
|
64
|
+
const auditId = getPolicyAuditIdFromRecord(record, policyName, auditUtil.getAttributeKey(attributeName));
|
|
65
65
|
const userId = env.getSystemUserIdentity(credentials.superUser).id;
|
|
66
66
|
const userRole = userTypes.ICS;
|
|
67
67
|
|
|
@@ -93,7 +93,7 @@ const getPolicyAuditIdFromRecord = (record, policyName, attributeName) => {
|
|
|
93
93
|
};
|
|
94
94
|
|
|
95
95
|
const waiveAll = async (record, context, { reason = WAIVER_REASONS.BUSINESS_DECISION, note = 'WAIVED AUTOMATICALLY' } = {}) => {
|
|
96
|
-
const allWaivablePolicies =
|
|
96
|
+
const allWaivablePolicies = auditUtil.getAllWaivablePolicies(record, context);
|
|
97
97
|
|
|
98
98
|
for (const waivable of allWaivablePolicies) {
|
|
99
99
|
const waiveModel = getWaiveModel(record, waivable.policyName, waivable.attributeName, reason, note);
|
|
@@ -4,9 +4,6 @@ const timeUtils = require('../../../../common/utils/timeUtils');
|
|
|
4
4
|
const auditModels = require('../models/audit/audit.model');
|
|
5
5
|
const waiveModels = require('../models/waive/waive.model');
|
|
6
6
|
|
|
7
|
-
const { getEnv, getSystemUserIdentity } = require('../../../../env');
|
|
8
|
-
const { credentials } = getEnv();
|
|
9
|
-
|
|
10
7
|
const emptyValue = '';
|
|
11
8
|
|
|
12
9
|
const getValueBySelection = selection => {
|
|
@@ -173,16 +170,10 @@ const createAuditEntity = (
|
|
|
173
170
|
return auditEntityModel;
|
|
174
171
|
};
|
|
175
172
|
|
|
176
|
-
const getAuditorId = () => {
|
|
177
|
-
const auditorIdentity = getSystemUserIdentity(credentials.auditorUser);
|
|
178
|
-
return auditorIdentity.id;
|
|
179
|
-
};
|
|
180
|
-
|
|
181
173
|
module.exports = {
|
|
182
174
|
parseAuditConfig,
|
|
183
175
|
getPolicyId,
|
|
184
176
|
createAuditEntity,
|
|
185
|
-
getAuditorId,
|
|
186
177
|
getAttributeKey,
|
|
187
178
|
getAttributeNameByGap,
|
|
188
179
|
getWaiveReason,
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const { cloneObject } = require('../../../../common/utils/objectUtils');
|
|
2
|
+
const { policiesConfig } = require('../../../../defaults/configs/coverage');
|
|
3
|
+
|
|
4
|
+
const getCoverageConfig = function(coiId, policiesArr) {
|
|
5
|
+
const config = cloneObject(configBase);
|
|
6
|
+
|
|
7
|
+
config.coiId = coiId;
|
|
8
|
+
const coveragePolicies = config.documents[0].pages[0].policies;
|
|
9
|
+
|
|
10
|
+
for (const policyName of policiesArr) {
|
|
11
|
+
const policy = policiesConfig[policyName];
|
|
12
|
+
|
|
13
|
+
if (! policy) {
|
|
14
|
+
throw Error(`There is no config for ${policyName}. Config available for policies: ${Object.keys(policiesConfig).join(', ')}`);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
coveragePolicies.push(cloneObject(policy));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return config;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const configBase = {
|
|
24
|
+
'coiId': 'REPLACE_WITH_REAL_VALUE',
|
|
25
|
+
'documents': [
|
|
26
|
+
{
|
|
27
|
+
'documentType': 'accord25',
|
|
28
|
+
'pages': [
|
|
29
|
+
{
|
|
30
|
+
'pageNumber': 1,
|
|
31
|
+
'policies': []
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
module.exports = {
|
|
39
|
+
getCoverageConfig
|
|
40
|
+
};
|
|
@@ -21,7 +21,8 @@ const Endpoints = {
|
|
|
21
21
|
updateContractorInviteDate: contractorId => `${backendUrl}/_saas/automation/contractor/${contractorId}/invite-date`,
|
|
22
22
|
searchInAutocomplete: ({ tabId, searchWord }) =>
|
|
23
23
|
`${backendUrl}/saas/requests/search/audited?&tabId=${tabId}&searchWord=${searchWord}`,
|
|
24
|
-
automationUpdateContractorUploadDate: contractorId => `${backendUrl}/saas/automation/contractor/${contractorId}/upload-date
|
|
24
|
+
automationUpdateContractorUploadDate: contractorId => `${backendUrl}/saas/automation/contractor/${contractorId}/upload-date`,
|
|
25
|
+
assignRequirement: recordId => `${backendUrl}/saas/contractor/${recordId}/assign-requirement`
|
|
25
26
|
};
|
|
26
27
|
|
|
27
28
|
const createContractor = (createContractorModel, context) => {
|
|
@@ -70,6 +71,10 @@ const changeRequirement = (recordModifyDateVerificationModel, context) => {
|
|
|
70
71
|
return requests.putRequestHandler(Endpoints.changeRequirement, recordModifyDateVerificationModel, context);
|
|
71
72
|
};
|
|
72
73
|
|
|
74
|
+
const assignRequirement = (recordId, assignRequirementModel, context) => {
|
|
75
|
+
return requests.putRequestHandler(Endpoints.assignRequirement(recordId), assignRequirementModel, context);
|
|
76
|
+
};
|
|
77
|
+
|
|
73
78
|
const sendGaps = (recordModifyDateVerificationModel, context) => {
|
|
74
79
|
return requests.postRequestHandler(Endpoints.sendGaps, recordModifyDateVerificationModel, context);
|
|
75
80
|
};
|
|
@@ -120,6 +125,7 @@ const updateContractorUploadDate = (contractorId, uploadDate, context) => {
|
|
|
120
125
|
module.exports = {
|
|
121
126
|
createContractor,
|
|
122
127
|
changeRequirement,
|
|
128
|
+
assignRequirement,
|
|
123
129
|
getContractorsByAccountId,
|
|
124
130
|
getContractorById,
|
|
125
131
|
getRecordHistory,
|
|
@@ -3,6 +3,7 @@ const { CreateContractorModel } = require('../models/create.contractor.model');
|
|
|
3
3
|
const { RequestModel } = require('../../requests/models/edit.request.model');
|
|
4
4
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
5
5
|
const { RecordModifyDateVerificationModel } = require('../models/verification.contractor.model');
|
|
6
|
+
const { AssignRequirementModel } = require('../models/assign.requirement.model');
|
|
6
7
|
const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
|
|
7
8
|
|
|
8
9
|
const createContractor = async (createContractorModel, context) => {
|
|
@@ -44,6 +45,10 @@ const updateExpiryDate = (contractorId, expiryDate, policyName) => {
|
|
|
44
45
|
return contractorsAPI.updateExpiryDate(contractorId, expiryDate, policyName);
|
|
45
46
|
};
|
|
46
47
|
|
|
48
|
+
const assignRequirement = (recordId, assignRequirementModel, context) => {
|
|
49
|
+
return contractorsAPI.assignRequirement(recordId, assignRequirementModel, context);
|
|
50
|
+
};
|
|
51
|
+
|
|
47
52
|
const updateInviteDate = (contractorId, inviteDate, context) => {
|
|
48
53
|
return contractorsAPI.updateInviteDate(contractorId, inviteDate, context);
|
|
49
54
|
};
|
|
@@ -127,6 +132,10 @@ const getRecordVerificationModel = async (recordId, context) => {
|
|
|
127
132
|
return new RecordModifyDateVerificationModel(recordData.id, { contractorDateModified: recordData.dateModified });
|
|
128
133
|
};
|
|
129
134
|
|
|
135
|
+
const getAssignRequirementModel = (requirementId, companyName, emailAddress) => {
|
|
136
|
+
return new AssignRequirementModel(requirementId, companyName, emailAddress);
|
|
137
|
+
};
|
|
138
|
+
|
|
130
139
|
module.exports = {
|
|
131
140
|
createContractor,
|
|
132
141
|
changeRequirement,
|
|
@@ -149,5 +158,7 @@ module.exports = {
|
|
|
149
158
|
unmuteNotifications,
|
|
150
159
|
deleteByContractorId,
|
|
151
160
|
deleteAllRecordsInAccount,
|
|
152
|
-
getRecordVerificationModel
|
|
161
|
+
getRecordVerificationModel,
|
|
162
|
+
assignRequirement,
|
|
163
|
+
getAssignRequirementModel
|
|
153
164
|
};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
const createModel = require('./models/create.contractor.model');
|
|
2
2
|
const editModel = require('./models/edit.contractor.model');
|
|
3
3
|
const verificationModel = require('./models/verification.contractor.model');
|
|
4
|
+
const assignRequirementModel = require('./models/assign.requirement.model');
|
|
4
5
|
const services = require('./api/contractors.service');
|
|
5
6
|
|
|
6
|
-
const models = { create: createModel, edit: editModel, verification: verificationModel };
|
|
7
|
+
const models = { create: createModel, edit: editModel, verification: verificationModel, assignRequirementModel };
|
|
7
8
|
|
|
8
9
|
module.exports = { services, models };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class AssignRequirementModel {
|
|
2
|
+
constructor(requirementId, companyName, emailAddress, { fileName = null, disableMail = false } = {}) {
|
|
3
|
+
this.requirementId = requirementId;
|
|
4
|
+
this.companyName = companyName;
|
|
5
|
+
this.emailAddress = emailAddress;
|
|
6
|
+
this.fileName = fileName;
|
|
7
|
+
this.disableMail = disableMail;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
module.exports = { AssignRequirementModel };
|
|
@@ -1,3 +1,35 @@
|
|
|
1
1
|
const DEFAULT_EMAIL_SENDER = 'hellogetjonestest@gmail.com';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const EMAIL_TYPES = {
|
|
4
|
+
COMPLIANT: 'compliant',
|
|
5
|
+
SEND_GAPS: 'sendGaps',
|
|
6
|
+
REQUEST_NEW_COI_EXPIRED: 'requestNewCoiExpired',
|
|
7
|
+
FIRST_REMINDER: 'firstReminder',
|
|
8
|
+
SECOND_REMINDER: 'secondReminder',
|
|
9
|
+
FINAL_REMINDER: 'finalReminder',
|
|
10
|
+
ABOUT_TO_EXPIRE_MONTH: 'aboutToExpireMonth',
|
|
11
|
+
ABOUT_TO_EXPIRE_TWO_WEEKS: 'aboutToExpireTwoWeeks',
|
|
12
|
+
ABOUT_TO_EXPIRE_WEEK: 'aboutToExpireWeek',
|
|
13
|
+
SAME_DAY_EXPIRATION_RECORD: 'sameDayExpirationRecord',
|
|
14
|
+
SAME_DAY_EXPIRATION_PM: 'sameDayExpirationPM',
|
|
15
|
+
REQUIREMENTS_UPDATED_NOTIFICATION: 'requirementsUpdatedNotification',
|
|
16
|
+
UPDATE_REQUIREMENTS_PREFIX: 'updatedRequirementsSubjectPrefix'
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const EMAIL_SUBJECT = {
|
|
20
|
+
compliant: ({ recordCompanyName }) => `Compliant COI - ${recordCompanyName}`,
|
|
21
|
+
sendGaps: ({ requesterName }) => `New Insurance Docs Required for ${requesterName}`, //doesn't includes text for guest or tenant
|
|
22
|
+
requestNewCoiExpired: ({ recordCompanyName }) => `${recordCompanyName}'s COI is`,
|
|
23
|
+
firstReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
24
|
+
secondReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
25
|
+
finalReminder: ({ recordCompanyName, requesterName }) => `Missing ${recordCompanyName}'s Insurance Docs for ${requesterName}`,
|
|
26
|
+
aboutToExpireMonth: ({ requesterName }) => `Your COI for ${requesterName} expires in 30 days`,
|
|
27
|
+
aboutToExpireTwoWeeks: ({ requesterName }) => `Your COI for ${requesterName} expires in 14 days`,
|
|
28
|
+
aboutToExpireWeek: ({ requesterName }) => `Only 7 days! Your COI for ${requesterName} expires`,
|
|
29
|
+
sameDayExpirationRecord: ({ requesterName }) => `Your COI for ${requesterName} expires TODAY`,
|
|
30
|
+
sameDayExpirationPM: ({ recordCompanyName }) => `COI expired for ${recordCompanyName} at`,
|
|
31
|
+
requirementsUpdatedNotification: ({ requesterName }) => `Updated Requirements - Your Insurance Docs are needed for ${requesterName}`,
|
|
32
|
+
updatedRequirementsSubjectPrefix: () => 'Updated Requirements - '
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
module.exports = { DEFAULT_EMAIL_SENDER, EMAIL_TYPES, EMAIL_SUBJECT };
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const { EMAIL_SUBJECT } = require('../consts/consts');
|
|
2
|
+
|
|
1
3
|
const compareUnorderedArrays = (arr, other, { caseSensitive = true } = {}) => {
|
|
2
4
|
const isEachElementEqual = arr.sort().every((mail, i) => {
|
|
3
5
|
if (caseSensitive) {
|
|
@@ -51,9 +53,16 @@ const logRetrievedEmailInfo = (to, subject, { cc } = {}) => {
|
|
|
51
53
|
log += `\n| Subject: ${subject}`;
|
|
52
54
|
};
|
|
53
55
|
|
|
56
|
+
const getEmailTextInSubject = (recordCompanyName, emailType, isAfterUpdateRequirements = false, { requesterName = 'Default' } = {}) => {
|
|
57
|
+
const subject = EMAIL_SUBJECT[emailType]({ recordCompanyName, requesterName });
|
|
58
|
+
|
|
59
|
+
return isAfterUpdateRequirements ? `Updated Requirements - ${subject}` : subject;
|
|
60
|
+
};
|
|
61
|
+
|
|
54
62
|
module.exports = {
|
|
55
63
|
recipientsMatchVerification,
|
|
56
64
|
regexVerification,
|
|
57
65
|
extractEmailFromNameAndEmailFormat,
|
|
58
|
-
logRetrievedEmailInfo
|
|
66
|
+
logRetrievedEmailInfo,
|
|
67
|
+
getEmailTextInSubject
|
|
59
68
|
};
|
|
@@ -29,7 +29,7 @@ const getCreateProjectModel = (accountId, projectData) => {
|
|
|
29
29
|
projectData.city || projectData['City'] || 'N/A',
|
|
30
30
|
projectData.state || projectData['State'] || 'Alabama',
|
|
31
31
|
projectData.zipCode || projectData['Zip Code'] || '11111',
|
|
32
|
-
projectData.companyNameForProject || projectData['Company Name (for external communications)']
|
|
32
|
+
projectData.companyNameForProject || projectData['Company Name (for external communications)'] || projectData.name
|
|
33
33
|
);
|
|
34
34
|
return createProjectModel;
|
|
35
35
|
};
|
|
@@ -10,7 +10,9 @@ const Endpoints = {
|
|
|
10
10
|
getAccountRequests: accountId => `${backendUrl}/saas/requests/${accountId}`,
|
|
11
11
|
getByTabId: `${backendUrl}/saas/requests`,
|
|
12
12
|
requestsGlobalSearch: (projectId, searchWord) =>
|
|
13
|
-
`${backendUrl}/saas/requests/search?&projectId=${projectId}&searchWord=${searchWord}
|
|
13
|
+
`${backendUrl}/saas/requests/search?&projectId=${projectId}&searchWord=${searchWord}`,
|
|
14
|
+
getAutocompleteAutoSelect: `${backendUrl}/saas/request/auto/selection`,
|
|
15
|
+
getTabTenantRequestsInProject: projectId => `${backendUrl}/saas/project/${projectId}/tenants/companies`
|
|
14
16
|
};
|
|
15
17
|
|
|
16
18
|
const createRequest = (createRequestModel, context) => {
|
|
@@ -35,6 +37,10 @@ const getRequestById = (requestId, context) => {
|
|
|
35
37
|
return requests.getRequestHandler(Endpoints.getById(requestId), {}, context);
|
|
36
38
|
};
|
|
37
39
|
|
|
40
|
+
const getAutocompleteAutoSelect = (params, context) => {
|
|
41
|
+
return requests.getRequestHandler(Endpoints.getAutocompleteAutoSelect, params, context);
|
|
42
|
+
};
|
|
43
|
+
|
|
38
44
|
const getRequestsByAccountId = (accountId, context, params) => {
|
|
39
45
|
return requests.getRequestHandler(Endpoints.getAccountRequests(accountId), params, context);
|
|
40
46
|
};
|
|
@@ -48,6 +54,10 @@ const requestsGlobalSearch = (projectId, searchWord, context) => {
|
|
|
48
54
|
return requests.getRequestHandler(Endpoints.requestsGlobalSearch(projectId, searchWord), {}, context);
|
|
49
55
|
};
|
|
50
56
|
|
|
57
|
+
const getTabTenantRequestsInProject = (projectId, context) => {
|
|
58
|
+
return requests.getRequestHandler(Endpoints.getTabTenantRequestsInProject(projectId), {}, context);
|
|
59
|
+
};
|
|
60
|
+
|
|
51
61
|
module.exports = {
|
|
52
62
|
createRequest,
|
|
53
63
|
addRequestToRecord,
|
|
@@ -56,5 +66,7 @@ module.exports = {
|
|
|
56
66
|
getRequestById,
|
|
57
67
|
getRequestsByAccountId,
|
|
58
68
|
getRequestsByTabId,
|
|
59
|
-
requestsGlobalSearch
|
|
69
|
+
requestsGlobalSearch,
|
|
70
|
+
getAutocompleteAutoSelect,
|
|
71
|
+
getTabTenantRequestsInProject
|
|
60
72
|
};
|
|
@@ -2,6 +2,7 @@ const requestsAPI = require('./requests.api');
|
|
|
2
2
|
const { CreateRequestModel, ContractorInfo } = require('../models/create.request.model');
|
|
3
3
|
const { RequestModel } = require('../models/edit.request.model');
|
|
4
4
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
5
|
+
const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
|
|
5
6
|
|
|
6
7
|
const createRequest = async (createRequestModel, context) => {
|
|
7
8
|
validateType(createRequestModel, CreateRequestModel);
|
|
@@ -22,6 +23,17 @@ const editRequestAndRecordDetails = (editRequestModel, context) => {
|
|
|
22
23
|
return requestsAPI.editRequestAndRecordDetails(editRequestModel, context);
|
|
23
24
|
};
|
|
24
25
|
|
|
26
|
+
const getAutocompleteAutoSelect = async (params, context) => {
|
|
27
|
+
const { companyOrDba, tabId, requirementsId } = params;
|
|
28
|
+
const autoSelectedRequest = await requestsAPI.getAutocompleteAutoSelect({ companyOrDba, tabId, requirementsId }, context);
|
|
29
|
+
|
|
30
|
+
if (autoSelectedRequest.status != httpResponseStatusCodes.OK) {
|
|
31
|
+
throw Error('Failed to get the auto select request', autoSelectedRequest.data);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return autoSelectedRequest.data;
|
|
35
|
+
};
|
|
36
|
+
|
|
25
37
|
const getRequestsByTabId = (tabId, context, activityStatus = 'Active') => {
|
|
26
38
|
return requestsAPI.getRequestsByTabId(tabId, context, activityStatus);
|
|
27
39
|
};
|
|
@@ -67,6 +79,7 @@ const getOrCreateRequest = async (context, tabId, requirementId, contractor, act
|
|
|
67
79
|
}
|
|
68
80
|
|
|
69
81
|
const createContractorModel = getCreateRequestModel(requirementId, contractor, { tabId, sendMail });
|
|
82
|
+
//JON-8788: add optional parameter dateModified otherwise doesn't work for updated req
|
|
70
83
|
const createContractorResponse = await createRequest(createContractorModel, context);
|
|
71
84
|
return createContractorResponse.data;
|
|
72
85
|
};
|
|
@@ -75,8 +88,19 @@ const requestsGlobalSearch = (projectId, searchWord, context) => {
|
|
|
75
88
|
return requestsAPI.requestsGlobalSearch(projectId, searchWord, context);
|
|
76
89
|
};
|
|
77
90
|
|
|
91
|
+
const getTabTenantRequestsInProject = async (projectId, context) => {
|
|
92
|
+
const response = await requestsAPI.getTabTenantRequestsInProject(projectId, context);
|
|
93
|
+
|
|
94
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
95
|
+
throw Error(`Failed to get the tab tenants in project, status - ${response.status}`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return response.data;
|
|
99
|
+
};
|
|
100
|
+
|
|
78
101
|
module.exports = {
|
|
79
102
|
createRequest,
|
|
103
|
+
getAutocompleteAutoSelect,
|
|
80
104
|
addRequestToRecord,
|
|
81
105
|
inviteRequestViaPublicLink,
|
|
82
106
|
editRequestAndRecordDetails,
|
|
@@ -85,5 +109,6 @@ module.exports = {
|
|
|
85
109
|
getRequestsByAccountId,
|
|
86
110
|
getOrCreateRequest,
|
|
87
111
|
getCreateRequestModel,
|
|
88
|
-
requestsGlobalSearch
|
|
112
|
+
requestsGlobalSearch,
|
|
113
|
+
getTabTenantRequestsInProject
|
|
89
114
|
};
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
const env = require('../../../../../../../src/env');
|
|
2
|
+
|
|
1
3
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
2
4
|
|
|
5
|
+
const superUserEmail = env.credentials.superUser;
|
|
6
|
+
|
|
3
7
|
function CreateRequestModel(requirementId, inviterEmail, vendorInfo, { tabId = null, sendMail = false, publicLink } = {}) {
|
|
4
8
|
this.reqId = requirementId;
|
|
5
|
-
this.inviterEmail = inviterEmail;
|
|
9
|
+
this.inviterEmail = inviterEmail || superUserEmail;
|
|
6
10
|
this.vendorInfo = vendorInfo;
|
|
7
11
|
this.disableMail = !sendMail;
|
|
8
12
|
this.tabId = tabId;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const { backendUrl } = require('../../../../env').getEnv();
|
|
2
|
+
const requests = require('../../../../common/requests/cookieAuth/requests');
|
|
3
|
+
|
|
4
|
+
const Endpoints = {
|
|
5
|
+
getRequestsByEmail: email => `${backendUrl}/saas/records/email/${email}`,
|
|
6
|
+
getGapsPageDataByRecordId: recordId => `${backendUrl}/saas/gaps/recordId/${recordId}`
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const getRequestsByEmail = (email, context) => {
|
|
10
|
+
return requests.getRequestHandler(Endpoints.getRequestsByEmail(email), {}, context);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const getGapsPageDataByRecordId = (recordId, context) => {
|
|
14
|
+
return requests.getRequestHandler(Endpoints.getGapsPageDataByRecordId(recordId), {}, context);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
module.exports = {
|
|
18
|
+
getRequestsByEmail,
|
|
19
|
+
getGapsPageDataByRecordId
|
|
20
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const requestsTableAPI = require('./requests.table.api');
|
|
2
|
+
|
|
3
|
+
const getRequestsByEmail = (email, context) => {
|
|
4
|
+
return requestsTableAPI.getRequestsByEmail(email, context);
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const getGapsPageDataByRecordId = (recordId, context) => {
|
|
8
|
+
return requestsTableAPI.getGapsPageDataByRecordId(recordId, context);
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
getRequestsByEmail,
|
|
13
|
+
getGapsPageDataByRecordId
|
|
14
|
+
};
|