@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.
Files changed (39) hide show
  1. package/package.json +1 -1
  2. package/src/common/commonFlows/records/records.js +1 -0
  3. package/src/common/consts/dashboardCharts.js +17 -0
  4. package/src/common/utils/complianceUtil.js +56 -0
  5. package/src/common/utils/timeUtils.js +2 -1
  6. package/src/defaults/configs/coverage.js +227 -0
  7. package/src/defaults/configs/polices.js +2 -1
  8. package/src/defaults/index.js +2 -1
  9. package/src/factory/index.js +3 -1
  10. package/src/factory/records/records.js +2 -2
  11. package/src/factory/users/users.js +79 -0
  12. package/src/index.js +3 -0
  13. package/src/saas/internal-api/auditNotes/api/audit.notes.api.js +40 -0
  14. package/src/saas/internal-api/auditNotes/api/audit.notes.service.js +115 -0
  15. package/src/saas/internal-api/auditNotes/index.js +4 -0
  16. package/src/saas/internal-api/auditNotes/models/audit.note.model.js +30 -0
  17. package/src/saas/internal-api/compliance/api/audit/audit.api.js +7 -1
  18. package/src/saas/internal-api/compliance/api/audit/audit.service.js +23 -32
  19. package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +25 -1
  20. package/src/saas/internal-api/compliance/api/waive/waive.service.js +5 -5
  21. package/src/saas/internal-api/compliance/utils/{util.js → auditUtil.js} +0 -9
  22. package/src/saas/internal-api/compliance/utils/coverageUtil.js +40 -0
  23. package/src/saas/internal-api/contractors/api/contractors.api.js +7 -1
  24. package/src/saas/internal-api/contractors/api/contractors.service.js +12 -1
  25. package/src/saas/internal-api/contractors/index.js +2 -1
  26. package/src/saas/internal-api/contractors/models/assign.requirement.model.js +10 -0
  27. package/src/saas/internal-api/dbEmails/consts/consts.js +35 -1
  28. package/src/saas/internal-api/dbEmails/index.js +2 -1
  29. package/src/saas/internal-api/dbEmails/utils/util.js +10 -1
  30. package/src/saas/internal-api/projects/utils/utils.js +1 -1
  31. package/src/saas/internal-api/requests/api/requests.api.js +8 -2
  32. package/src/saas/internal-api/requests/api/requests.service.js +13 -1
  33. package/src/saas/internal-api/requests/models/create.request.model.js +5 -1
  34. package/src/saas/internal-api/requestsTable/api/requests.table.api.js +8 -2
  35. package/src/saas/internal-api/requestsTable/api/requests.table.service.js +6 -1
  36. package/src/saas/internal-api/requirements/api/requirements.service.js +20 -13
  37. package/src/saas/internal-api/requirements/models/update.requirement.model.js +1 -2
  38. package/src/saas/internal-api/users/index.js +2 -1
  39. 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 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);
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 auditApi.isReaudit(contractorId, context);
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 = false,
38
- shouldSendNotificationToPM = false
39
- } = {}) => {
40
- const metadata = {
42
+ isProjectOnboarding,
43
+ shouldSendNotificationToPM
44
+ } = {}
45
+ ) => {
46
+ return complianceUtil.getAuditMetadata(
47
+ auditorContext,
41
48
  accountId,
42
49
  projectId,
43
50
  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;
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
- util.createAuditEntity(requirement, { ... auditEntity }))
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
- util.parseAuditConfig(cloneObject(auditConfig)) :
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 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
  };
@@ -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
- 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_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,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
  };
@@ -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
- const getUpdatedRequirementModel = async (updatedRequirement, tabId, context) => {
76
- const { name: requirementName } = updatedRequirement;
77
- const existingRequirement = await getRequirementByName(tabId, requirementName, context);
78
- updatedRequirement.dateModified = existingRequirement.dateModified;
69
+ if (!requirementToDelete) {
70
+ return;
71
+ }
79
72
 
80
- return requirementUtils.getUpdateRequirementModel(updatedRequirement);
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,4 +1,5 @@
1
1
  const models = require('./models/users.model');
2
2
  const services = require('./api/users.service');
3
+ const util = require('./utils/util');
3
4
 
4
- module.exports = { services, models };
5
+ module.exports = { services, models, util };
@@ -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