@getjones/test-infra 2.6.8 → 2.7.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 +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/index.js +3 -1
- package/src/factory/records/records.js +2 -2
- package/src/factory/users/users.js +79 -0
- package/src/index.js +3 -0
- 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/compliance/api/audit/audit.api.js +7 -1
- package/src/saas/internal-api/compliance/api/audit/audit.service.js +23 -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/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 +35 -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 +8 -2
- package/src/saas/internal-api/requests/api/requests.service.js +13 -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 +8 -2
- package/src/saas/internal-api/requestsTable/api/requests.table.service.js +6 -1
- package/src/saas/internal-api/requirements/api/requirements.service.js +20 -13
- package/src/saas/internal-api/requirements/models/update.requirement.model.js +1 -2
- package/src/saas/internal-api/users/index.js +2 -1
- package/src/saas/internal-api/users/utils/util.js +6 -0
|
@@ -1,17 +1,22 @@
|
|
|
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);
|
|
10
11
|
return auditApi.audit(auditRequestModel.auditData.contractorId, auditRequestModel, context);
|
|
11
12
|
};
|
|
12
13
|
|
|
14
|
+
const revertCoi = (contractorId, dateModified, context) => {
|
|
15
|
+
return auditApi.revertCoi(contractorId, dateModified, context);
|
|
16
|
+
};
|
|
17
|
+
|
|
13
18
|
const isReaudit = (contractorId, context) => {
|
|
14
|
-
return
|
|
19
|
+
return complianceUtil.isReaudit(contractorId, context);
|
|
15
20
|
};
|
|
16
21
|
|
|
17
22
|
const getAuditorContractorList = (auditListParametersModel, context) => {
|
|
@@ -34,36 +39,21 @@ const getAuditMetadata = async (
|
|
|
34
39
|
requirementId,
|
|
35
40
|
recordId,
|
|
36
41
|
{
|
|
37
|
-
isProjectOnboarding
|
|
38
|
-
shouldSendNotificationToPM
|
|
39
|
-
} = {}
|
|
40
|
-
|
|
42
|
+
isProjectOnboarding,
|
|
43
|
+
shouldSendNotificationToPM
|
|
44
|
+
} = {}
|
|
45
|
+
) => {
|
|
46
|
+
return complianceUtil.getAuditMetadata(
|
|
47
|
+
auditorContext,
|
|
41
48
|
accountId,
|
|
42
49
|
projectId,
|
|
43
50
|
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;
|
|
51
|
+
recordId,
|
|
52
|
+
{
|
|
53
|
+
isProjectOnboarding,
|
|
54
|
+
shouldSendNotificationToPM
|
|
55
|
+
}
|
|
56
|
+
);
|
|
67
57
|
};
|
|
68
58
|
|
|
69
59
|
const getAuditEntities = async (recordId, auditData, auditorContext) => {
|
|
@@ -72,7 +62,7 @@ const getAuditEntities = async (recordId, auditData, auditorContext) => {
|
|
|
72
62
|
|
|
73
63
|
const auditEntities = [];
|
|
74
64
|
auditData.forEach(auditEntity => auditEntities.push(
|
|
75
|
-
|
|
65
|
+
auditUtil.createAuditEntity(requirement, { ... auditEntity }))
|
|
76
66
|
);
|
|
77
67
|
return auditEntities;
|
|
78
68
|
};
|
|
@@ -129,7 +119,7 @@ const auditRecord = async function(
|
|
|
129
119
|
const auditMetadata = await getAuditMetadata(auditorContext, accountId, projectId, requirementId, recordId);
|
|
130
120
|
|
|
131
121
|
const auditApiConfig = dataTypeUtils.isObject(auditConfig) ?
|
|
132
|
-
|
|
122
|
+
auditUtil.parseAuditConfig(cloneObject(auditConfig)) :
|
|
133
123
|
auditConfig;
|
|
134
124
|
|
|
135
125
|
const auditEntities = await getAuditEntities(recordId, auditApiConfig, auditorContext);
|
|
@@ -141,12 +131,13 @@ const auditRecord = async function(
|
|
|
141
131
|
|
|
142
132
|
module.exports = {
|
|
143
133
|
audit,
|
|
134
|
+
revertCoi,
|
|
144
135
|
isReaudit,
|
|
145
136
|
getAuditorContractorList,
|
|
146
137
|
getContractorDetailsForAudit,
|
|
147
138
|
getRequirementDetailsForAudit,
|
|
148
|
-
getAuditMetadata,
|
|
149
139
|
getAuditEntities,
|
|
140
|
+
getAuditMetadata,
|
|
150
141
|
getAuditRequestModel,
|
|
151
142
|
auditRecord
|
|
152
143
|
};
|
|
@@ -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,37 @@
|
|
|
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_PM: 'aboutToExpirePM',
|
|
11
|
+
ABOUT_TO_EXPIRE_MONTH_AUTO_RENEWAL: 'aboutToExpireMonthAutoRenewal',
|
|
12
|
+
ABOUT_TO_EXPIRE_TWO_WEEKS_AUTO_RENEWAL: 'aboutToExpireTwoWeeksAutoRenewal',
|
|
13
|
+
ABOUT_TO_EXPIRE_WEEK_AUTO_RENEWAL: 'aboutToExpireWeekAutoRenewal',
|
|
14
|
+
SAME_DAY_EXPIRATION_RECORD_AUTO_RENEWAL: 'sameDayExpirationRecordAutoRenewal',
|
|
15
|
+
SAME_DAY_EXPIRATION_PM_AUTO_RENEWAL: 'sameDayExpirationPMAutoRenewal',
|
|
16
|
+
REQUIREMENTS_UPDATED_NOTIFICATION: 'requirementsUpdatedNotification',
|
|
17
|
+
UPDATE_REQUIREMENTS_PREFIX: 'updatedRequirementsSubjectPrefix'
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const EMAIL_SUBJECT = {
|
|
21
|
+
compliant: ({ recordCompanyName }) => `Compliant COI - ${recordCompanyName}`,
|
|
22
|
+
sendGaps: ({ requesterName }) => `New Insurance Docs Required for ${requesterName}`, //doesn't includes text for guest or tenant
|
|
23
|
+
requestNewCoiExpired: ({ recordCompanyName }) => `${recordCompanyName}'s COI is`,
|
|
24
|
+
firstReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
25
|
+
secondReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
26
|
+
finalReminder: ({ recordCompanyName, requesterName }) => `Missing ${recordCompanyName}'s Insurance Docs for ${requesterName}`,
|
|
27
|
+
aboutToExpirePM: ({ recordCompanyName }) => `Insurance Policy of ${recordCompanyName} expires Soon`,
|
|
28
|
+
aboutToExpireMonthAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires in 30 days`,
|
|
29
|
+
aboutToExpireTwoWeeksAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires in 14 days`,
|
|
30
|
+
aboutToExpireWeekAutoRenewal: ({ requesterName }) => `Only 7 days! Your COI for ${requesterName} expires`,
|
|
31
|
+
sameDayExpirationRecordAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires TODAY`,
|
|
32
|
+
sameDayExpirationPMAutoRenewal: ({ recordCompanyName }) => `COI expired for ${recordCompanyName} at`,
|
|
33
|
+
requirementsUpdatedNotification: ({ requesterName }) => `Updated Requirements - Your Insurance Docs are needed for ${requesterName}`,
|
|
34
|
+
updatedRequirementsSubjectPrefix: () => 'Updated Requirements - '
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
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
|
};
|
|
@@ -11,7 +11,8 @@ const Endpoints = {
|
|
|
11
11
|
getByTabId: `${backendUrl}/saas/requests`,
|
|
12
12
|
requestsGlobalSearch: (projectId, searchWord) =>
|
|
13
13
|
`${backendUrl}/saas/requests/search?&projectId=${projectId}&searchWord=${searchWord}`,
|
|
14
|
-
getAutocompleteAutoSelect: `${backendUrl}/saas/request/auto/selection
|
|
14
|
+
getAutocompleteAutoSelect: `${backendUrl}/saas/request/auto/selection`,
|
|
15
|
+
getTabTenantRequestsInProject: projectId => `${backendUrl}/saas/project/${projectId}/tenants/companies`
|
|
15
16
|
};
|
|
16
17
|
|
|
17
18
|
const createRequest = (createRequestModel, context) => {
|
|
@@ -53,6 +54,10 @@ const requestsGlobalSearch = (projectId, searchWord, context) => {
|
|
|
53
54
|
return requests.getRequestHandler(Endpoints.requestsGlobalSearch(projectId, searchWord), {}, context);
|
|
54
55
|
};
|
|
55
56
|
|
|
57
|
+
const getTabTenantRequestsInProject = (projectId, context) => {
|
|
58
|
+
return requests.getRequestHandler(Endpoints.getTabTenantRequestsInProject(projectId), {}, context);
|
|
59
|
+
};
|
|
60
|
+
|
|
56
61
|
module.exports = {
|
|
57
62
|
createRequest,
|
|
58
63
|
addRequestToRecord,
|
|
@@ -62,5 +67,6 @@ module.exports = {
|
|
|
62
67
|
getRequestsByAccountId,
|
|
63
68
|
getRequestsByTabId,
|
|
64
69
|
requestsGlobalSearch,
|
|
65
|
-
getAutocompleteAutoSelect
|
|
70
|
+
getAutocompleteAutoSelect,
|
|
71
|
+
getTabTenantRequestsInProject
|
|
66
72
|
};
|
|
@@ -79,6 +79,7 @@ const getOrCreateRequest = async (context, tabId, requirementId, contractor, act
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
const createContractorModel = getCreateRequestModel(requirementId, contractor, { tabId, sendMail });
|
|
82
|
+
//JON-8788: add optional parameter dateModified otherwise doesn't work for updated req
|
|
82
83
|
const createContractorResponse = await createRequest(createContractorModel, context);
|
|
83
84
|
return createContractorResponse.data;
|
|
84
85
|
};
|
|
@@ -87,6 +88,16 @@ const requestsGlobalSearch = (projectId, searchWord, context) => {
|
|
|
87
88
|
return requestsAPI.requestsGlobalSearch(projectId, searchWord, context);
|
|
88
89
|
};
|
|
89
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
|
+
|
|
90
101
|
module.exports = {
|
|
91
102
|
createRequest,
|
|
92
103
|
getAutocompleteAutoSelect,
|
|
@@ -98,5 +109,6 @@ module.exports = {
|
|
|
98
109
|
getRequestsByAccountId,
|
|
99
110
|
getOrCreateRequest,
|
|
100
111
|
getCreateRequestModel,
|
|
101
|
-
requestsGlobalSearch
|
|
112
|
+
requestsGlobalSearch,
|
|
113
|
+
getTabTenantRequestsInProject
|
|
102
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;
|
|
@@ -2,13 +2,19 @@ const { backendUrl } = require('../../../../env').getEnv();
|
|
|
2
2
|
const requests = require('../../../../common/requests/cookieAuth/requests');
|
|
3
3
|
|
|
4
4
|
const Endpoints = {
|
|
5
|
-
getRequestsByEmail: email => `${backendUrl}/saas/records/email/${email}
|
|
5
|
+
getRequestsByEmail: email => `${backendUrl}/saas/records/email/${email}`,
|
|
6
|
+
getGapsPageDataByRecordId: recordId => `${backendUrl}/saas/gaps/recordId/${recordId}`
|
|
6
7
|
};
|
|
7
8
|
|
|
8
9
|
const getRequestsByEmail = (email, context) => {
|
|
9
10
|
return requests.getRequestHandler(Endpoints.getRequestsByEmail(email), {}, context);
|
|
10
11
|
};
|
|
11
12
|
|
|
13
|
+
const getGapsPageDataByRecordId = (recordId, context) => {
|
|
14
|
+
return requests.getRequestHandler(Endpoints.getGapsPageDataByRecordId(recordId), {}, context);
|
|
15
|
+
};
|
|
16
|
+
|
|
12
17
|
module.exports = {
|
|
13
|
-
getRequestsByEmail
|
|
18
|
+
getRequestsByEmail,
|
|
19
|
+
getGapsPageDataByRecordId
|
|
14
20
|
};
|
|
@@ -4,6 +4,11 @@ const getRequestsByEmail = (email, context) => {
|
|
|
4
4
|
return requestsTableAPI.getRequestsByEmail(email, context);
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
+
const getGapsPageDataByRecordId = (recordId, context) => {
|
|
8
|
+
return requestsTableAPI.getGapsPageDataByRecordId(recordId, context);
|
|
9
|
+
};
|
|
10
|
+
|
|
7
11
|
module.exports = {
|
|
8
|
-
getRequestsByEmail
|
|
12
|
+
getRequestsByEmail,
|
|
13
|
+
getGapsPageDataByRecordId
|
|
9
14
|
};
|
|
@@ -65,25 +65,19 @@ const deleteByRequirementId = (requirementId, context) => {
|
|
|
65
65
|
|
|
66
66
|
const deleteRequirementByName = async (requirementName, tabId, context) => {
|
|
67
67
|
const requirementToDelete = await getRequirementByName(tabId, requirementName, context);
|
|
68
|
-
return deleteByRequirementId(requirementToDelete.id, context);
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const getCreateRequirementModel = requirement => {
|
|
72
|
-
return requirementUtils.getCreateRequirementModel(requirement);
|
|
73
|
-
};
|
|
74
68
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
updatedRequirement.dateModified = existingRequirement.dateModified;
|
|
69
|
+
if (!requirementToDelete) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
79
72
|
|
|
80
|
-
return
|
|
73
|
+
return deleteByRequirementId(requirementToDelete.id, context);
|
|
81
74
|
};
|
|
82
75
|
|
|
83
76
|
const deleteAllRequirementsInTabs = async (tabIds, context) => {
|
|
84
77
|
const failedToDeleteRequirements = [];
|
|
85
78
|
for (const tabId of tabIds) {
|
|
86
79
|
const { data: existingRequirements } = await getRequirementsByTabId(tabId, context);
|
|
80
|
+
|
|
87
81
|
for (const requirement of existingRequirements) {
|
|
88
82
|
const response = await deleteByRequirementId(requirement.id, context);
|
|
89
83
|
|
|
@@ -99,6 +93,19 @@ const deleteAllRequirementsInTabs = async (tabIds, context) => {
|
|
|
99
93
|
}
|
|
100
94
|
};
|
|
101
95
|
|
|
96
|
+
const getCreateRequirementModel = requirement => {
|
|
97
|
+
return requirementUtils.getCreateRequirementModel(requirement);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const getUpdatedRequirementModel = async (updatedRequirement, tabId, context, { originalRequirementName } = {}) => {
|
|
101
|
+
const requirementName = originalRequirementName || updatedRequirement.name;
|
|
102
|
+
const existingRequirement = await getRequirementByName(tabId, requirementName, context);
|
|
103
|
+
updatedRequirement.id = existingRequirement.id;
|
|
104
|
+
updatedRequirement.dateModified = existingRequirement.dateModified;
|
|
105
|
+
|
|
106
|
+
return requirementUtils.getUpdateRequirementModel(updatedRequirement);
|
|
107
|
+
};
|
|
108
|
+
|
|
102
109
|
module.exports = {
|
|
103
110
|
createRequirement,
|
|
104
111
|
getRequirementById,
|
|
@@ -110,7 +117,7 @@ module.exports = {
|
|
|
110
117
|
updateRequirementWithNotification,
|
|
111
118
|
deleteByRequirementId,
|
|
112
119
|
deleteRequirementByName,
|
|
120
|
+
deleteAllRequirementsInTabs,
|
|
113
121
|
getCreateRequirementModel,
|
|
114
|
-
getUpdatedRequirementModel
|
|
115
|
-
deleteAllRequirementsInTabs
|
|
122
|
+
getUpdatedRequirementModel
|
|
116
123
|
};
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
const { VENDORS } = require('../../../../common/consts/recordTypes');
|
|
2
1
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
3
2
|
const { REQUIREMENT_SHARING_LEVELS } = require('../consts/consts');
|
|
4
3
|
const { PolicyModel } = require('./policy.model');
|
|
5
|
-
|
|
4
|
+
const { VENDORS } = require('../../../../common/consts/recordTypes');
|
|
6
5
|
class UpdateRequirementModel {
|
|
7
6
|
constructor({ id, name, policies, dateModified, sharingLevel = REQUIREMENT_SHARING_LEVELS.TAB, recordType = VENDORS }) {
|
|
8
7
|
this.id = id;
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
const { SignupUserModel } = require('../models/users.model');
|
|
2
2
|
const usersApi = require('../api/users.api');
|
|
3
|
+
const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
|
|
3
4
|
|
|
4
5
|
const getUserEncryptedData = async (email, role, context) => {
|
|
5
6
|
const response = await usersApi.getUserEncryptedData(email, role, context);
|
|
7
|
+
|
|
8
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
9
|
+
throw new Error(`Failed to retrieve user: ${email} encrypted data\n${response}`);
|
|
10
|
+
}
|
|
11
|
+
|
|
6
12
|
return response.data;
|
|
7
13
|
};
|
|
8
14
|
|