@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.
Files changed (42) hide show
  1. package/package.json +1 -1
  2. package/src/common/commonFlows/auth/auth.js +40 -0
  3. package/src/common/commonFlows/index.js +2 -1
  4. package/src/common/commonFlows/records/records.js +1 -0
  5. package/src/common/consts/dashboardCharts.js +17 -0
  6. package/src/common/utils/complianceUtil.js +56 -0
  7. package/src/common/utils/timeUtils.js +2 -1
  8. package/src/defaults/configs/coverage.js +227 -0
  9. package/src/defaults/configs/polices.js +2 -1
  10. package/src/defaults/index.js +2 -1
  11. package/src/factory/records/records.js +2 -2
  12. package/src/index.js +6 -0
  13. package/src/saas/internal-api/accounts/models/settings/update.settings.model.js +10 -1
  14. package/src/saas/internal-api/auditNotes/api/audit.notes.api.js +40 -0
  15. package/src/saas/internal-api/auditNotes/api/audit.notes.service.js +115 -0
  16. package/src/saas/internal-api/auditNotes/index.js +4 -0
  17. package/src/saas/internal-api/auditNotes/models/audit.note.model.js +30 -0
  18. package/src/saas/internal-api/auth/api/auth.api.js +14 -5
  19. package/src/saas/internal-api/auth/api/auth.service.js +21 -5
  20. package/src/saas/internal-api/compliance/api/audit/audit.service.js +18 -32
  21. package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +25 -1
  22. package/src/saas/internal-api/compliance/api/waive/waive.service.js +5 -5
  23. package/src/saas/internal-api/compliance/utils/{util.js → auditUtil.js} +0 -9
  24. package/src/saas/internal-api/compliance/utils/coverageUtil.js +40 -0
  25. package/src/saas/internal-api/contractors/api/contractors.api.js +7 -1
  26. package/src/saas/internal-api/contractors/api/contractors.service.js +12 -1
  27. package/src/saas/internal-api/contractors/consts/consts.js +6 -0
  28. package/src/saas/internal-api/contractors/index.js +2 -1
  29. package/src/saas/internal-api/contractors/models/assign.requirement.model.js +10 -0
  30. package/src/saas/internal-api/dbEmails/consts/consts.js +33 -1
  31. package/src/saas/internal-api/dbEmails/index.js +2 -1
  32. package/src/saas/internal-api/dbEmails/utils/util.js +10 -1
  33. package/src/saas/internal-api/projects/utils/utils.js +1 -1
  34. package/src/saas/internal-api/requests/api/requests.api.js +14 -2
  35. package/src/saas/internal-api/requests/api/requests.service.js +26 -1
  36. package/src/saas/internal-api/requests/models/create.request.model.js +5 -1
  37. package/src/saas/internal-api/requestsTable/api/requests.table.api.js +20 -0
  38. package/src/saas/internal-api/requestsTable/api/requests.table.service.js +14 -0
  39. package/src/saas/internal-api/requestsTable/index.js +3 -0
  40. package/src/saas/internal-api/requirements/api/requirements.service.js +16 -14
  41. package/src/saas/internal-api/requirements/models/update.requirement.model.js +3 -2
  42. 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
- isHubUser: email => `${backendUrl}/vendor-app/is-hub-user?email=${email}`
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 vendorHubLogin = email => {
15
- return requests.postRequestHandler(Endpoints.isHubUser(email), { email });
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, vendorHubLogin };
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 getVendorHubAuthCookie = async email => {
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.vendorHubLogin(email);
34
- const authCookie = response.headers['set-cookie'].find(item => item.startsWith('JonesToken2='));
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
- getVendorHubAuthCookie,
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 util = require('../../utils/util');
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 auditApi.isReaudit(contractorId, context);
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 = false,
38
- shouldSendNotificationToPM = false
39
- } = {}) => {
40
- const metadata = {
38
+ isProjectOnboarding,
39
+ shouldSendNotificationToPM
40
+ } = {}
41
+ ) => {
42
+ return complianceUtil.getAuditMetadata(
43
+ auditorContext,
41
44
  accountId,
42
45
  projectId,
43
46
  requirementId,
44
- contractorId: recordId,
45
- isProjectOnboarding,
46
- shouldSendNotificationToPM
47
- };
48
-
49
- const isReauditResponse = await isReaudit(recordId, auditorContext);
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
- util.createAuditEntity(requirement, { ... auditEntity }))
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
- util.parseAuditConfig(cloneObject(auditConfig)) :
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 util = require('../../utils/util');
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, util.getAttributeKey(attributeName));
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 = util.getAttributeNameByGap(record, policyName, gap);
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, util.getAttributeKey(attributeName));
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 = util.getAllWaivablePolicies(record, context);
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
  };
@@ -0,0 +1,6 @@
1
+ const RECORD_SHARING_LEVEL = {
2
+ account: 'Account',
3
+ tab: 'Tab'
4
+ };
5
+
6
+ module.exports = { RECORD_SHARING_LEVEL };
@@ -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
- module.exports = { DEFAULT_EMAIL_SENDER };
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,4 +1,5 @@
1
1
  const services = require('./api/db.emails.service');
2
2
  const consts = require('./consts/consts');
3
+ const utils = require('./utils/util');
3
4
 
4
- module.exports = { services, consts };
5
+ module.exports = { services, consts, utils };
@@ -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
+ };
@@ -0,0 +1,3 @@
1
+ const services = require('./api/requests.table.service');
2
+
3
+ module.exports = { services };