@getjones/test-infra 3.0.1 → 3.0.3
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 +45 -1
- package/src/common/consts/accountSettings.js +10 -0
- package/src/common/consts/constantsForRecordsSortingAndFilters.js +40 -0
- package/src/common/consts/ocrStatuses.js +6 -0
- package/src/defaults/configs/polices.js +8 -5
- package/src/factory/records/records.js +5 -19
- package/src/saas/internal-api/coi/consts/hashes.js +4 -0
- package/src/saas/internal-api/coi/index.js +2 -1
- package/src/saas/internal-api/coi/models/submit.coi.model.js +16 -6
- package/src/saas/internal-api/coi/utils/utils.js +29 -7
- package/src/saas/internal-api/compliance/api/audit/audit.service.js +13 -1
- package/src/saas/internal-api/contractors/api/contractors.api.js +28 -4
- package/src/saas/internal-api/contractors/api/contractors.service.js +73 -2
- package/src/saas/internal-api/contractors/models/edit.contractor.model.js +3 -1
- package/src/saas/internal-api/contractors/models/link.request.model.js +10 -0
- package/src/saas/internal-api/contractors/models/subscription.contractor.model.js +13 -0
- package/src/saas/internal-api/dbEmails/api/db.emails.service.js +9 -0
- package/src/saas/internal-api/dbEmails/utils/util.js +7 -2
- package/src/saas/internal-api/reports/consts/consts.js +2 -1
- package/src/saas/internal-api/requests/api/requests.api.js +28 -4
- package/src/saas/internal-api/requests/api/requests.service.js +61 -9
- package/src/saas/internal-api/requests/index.js +2 -0
- package/src/saas/internal-api/requests/models/create.request.model.js +1 -2
- package/src/saas/internal-api/requests/models/draft.request.criteria.model.js +18 -0
- package/.npmrc.bak +0 -2
- package/package.json.bak +0 -30
package/package.json
CHANGED
|
@@ -3,8 +3,11 @@ const { expect } = require('chai');
|
|
|
3
3
|
const threadScheduler = require('../../../saas/internal-api/thread-scheduler/runner');
|
|
4
4
|
const timeUtils = require('../../utils/timeUtils');
|
|
5
5
|
const httpResponseStatusCodes = require('../../../common/httpResponseStatusCodes.json');
|
|
6
|
+
const ocrStatuses = require('../../consts/ocrStatuses');
|
|
6
7
|
const contractors = require('../../../saas/internal-api/contractors');
|
|
7
8
|
const compliance = require('../../../saas/internal-api/compliance');
|
|
9
|
+
const requests = require('../../../saas/internal-api/requests');
|
|
10
|
+
const dbEmails = require('../../../saas/internal-api/dbEmails');
|
|
8
11
|
|
|
9
12
|
const makeRecordNotResponsive = async function(recordId, context, { isTenant } = {}) {
|
|
10
13
|
const offsetInDaysList = isTenant ?
|
|
@@ -16,6 +19,25 @@ const makeRecordNotResponsive = async function(recordId, context, { isTenant } =
|
|
|
16
19
|
}
|
|
17
20
|
};
|
|
18
21
|
|
|
22
|
+
const editRequestAndRecordDetails = async function(request, recordConfig, context) {
|
|
23
|
+
const tabModel = new requests.models.TabModel(request.tab.type);
|
|
24
|
+
const recordDetailsModel = contractors.services.getContractorDetailsModel(recordConfig);
|
|
25
|
+
const record = new contractors.models.edit.ContractorModel(
|
|
26
|
+
request.record.contractorId,
|
|
27
|
+
request.record.recordType,
|
|
28
|
+
recordConfig.company,
|
|
29
|
+
recordConfig.emailAddress,
|
|
30
|
+
recordDetailsModel
|
|
31
|
+
);
|
|
32
|
+
const requestEditModel = new requests.models.RequestModel(request.id, record, tabModel, {});
|
|
33
|
+
|
|
34
|
+
const editRequestResponse = await requests.services.editRequestAndRecordDetails(requestEditModel, context);
|
|
35
|
+
|
|
36
|
+
if (editRequestResponse.status !== httpResponseStatusCodes.OK) {
|
|
37
|
+
throw Error(`Failed to edit record ${recordCompany}\n${editRequestResponse.data.message}`);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
19
41
|
const updateInviteDate = async function(recordId, inviteDate, context) {
|
|
20
42
|
await timeUtils.waitFor(1).seconds;
|
|
21
43
|
const updateResponse = await contractors.services.updateInviteDate(recordId, inviteDate, context);
|
|
@@ -92,11 +114,33 @@ const getHistoryEvents = async function(recordId, context) {
|
|
|
92
114
|
return recordHistory.data.map(item => item.itemTitle).reverse();
|
|
93
115
|
};
|
|
94
116
|
|
|
117
|
+
const waitForOcrStatus = async function(recordId, context, { expectedStatus = ocrStatuses.SUCCESS } = {}) {
|
|
118
|
+
let { data: recordOcrStatus } = await contractors.services.getRecordOcrStatus(recordId, context);
|
|
119
|
+
let maxRetries = 25;
|
|
120
|
+
while (recordOcrStatus !== expectedStatus && recordOcrStatus !== ocrStatuses.FAILED && maxRetries > 0) {
|
|
121
|
+
await timeUtils.waitFor(5).seconds;
|
|
122
|
+
recordOcrStatus = (await contractors.services.getRecordOcrStatus(recordId, context)).data;
|
|
123
|
+
maxRetries--;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (recordOcrStatus !== expectedStatus) {
|
|
127
|
+
throw new Error(`Record OCR status not is as expected. Expected: ${expectedStatus}, Actual: ${recordOcrStatus}`);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const generateSubscriptionModelFromMail = async function(recipients) {
|
|
132
|
+
const data = await dbEmails.services.getSubscriptionData(recipients);
|
|
133
|
+
return contractors.services.getSubscriptionModel(data);
|
|
134
|
+
};
|
|
135
|
+
|
|
95
136
|
module.exports = {
|
|
96
137
|
makeRecordNotResponsive,
|
|
97
138
|
runOverAllRenewalDatesForRecord,
|
|
139
|
+
editRequestAndRecordDetails,
|
|
98
140
|
updateInviteDate,
|
|
99
141
|
updatePolicyExpiryDateForRecord,
|
|
100
142
|
getHistoryEvents,
|
|
101
|
-
updateLastInviteActionDate
|
|
143
|
+
updateLastInviteActionDate,
|
|
144
|
+
waitForOcrStatus,
|
|
145
|
+
generateSubscriptionModelFromMail
|
|
102
146
|
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const activeRecordSortBy = {
|
|
2
|
+
companyName: 'SORT_BY_COMPANYNAME',
|
|
3
|
+
recordId: 'SORT_BY_RECORD_ID',
|
|
4
|
+
vendorStatus: 'SORT_BY_VENDOR_STATUS',
|
|
5
|
+
minPolicyExpired: 'SORT_BY_MIN_POLICY_EXP',
|
|
6
|
+
insuranceStatus: 'SORT_BY_INSURANCE_STATUS'
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const recordComplianceStatuses = {
|
|
10
|
+
compliant: 'COMPLIANT_STATUS',
|
|
11
|
+
notCompliant: 'NOT_COMPLIANT_STATUS',
|
|
12
|
+
noCOIRequired: 'NO_COI_REQUIRED',
|
|
13
|
+
awaitingNewCOI: 'WAITING_NEW_COI_STATUS',
|
|
14
|
+
waived: 'WAIVED_STATUS',
|
|
15
|
+
underReview: 'UNDER_REVIEW',
|
|
16
|
+
expired: 'Expired',
|
|
17
|
+
notResponsive: 'NotResponsive'
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const draftRecordSortBy = {
|
|
21
|
+
companyName: 'SORT_BY_COMPANY_NAME',
|
|
22
|
+
recordId: 'SORT_BY_RECORD_ID',
|
|
23
|
+
missingData: 'SORT_BY_MISSING_DATA',
|
|
24
|
+
coi: 'SORT_BY_COI'
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const draftCompletionStatus = {
|
|
28
|
+
missingContact: 'missingContact',
|
|
29
|
+
missingRequirements: 'missingRequirements',
|
|
30
|
+
missingCoi: 'missingCoi',
|
|
31
|
+
readyForCoiRequest: 'readyForCoiRequest',
|
|
32
|
+
readyForReview: 'readyForReview'
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
module.exports = {
|
|
36
|
+
recordComplianceStatuses,
|
|
37
|
+
activeRecordSortBy,
|
|
38
|
+
draftRecordSortBy,
|
|
39
|
+
draftCompletionStatus
|
|
40
|
+
};
|
|
@@ -48,14 +48,17 @@ const attributeNames = {
|
|
|
48
48
|
occur: 'Occur',
|
|
49
49
|
text: 'text',
|
|
50
50
|
limit: 'limit',
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
additionalInsuredEndorsement: 'Additional Insured Endorsement',
|
|
52
|
+
primaryNonContributoryProvision: 'Primary Non-Contributory Provision',
|
|
53
|
+
primaryNonContributoryEndorsement: 'Primary Non-Contributory Endorsement',
|
|
54
54
|
indemnityPeriod: 'Indemnity Period',
|
|
55
55
|
actualLossSustained: 'Actual Loss Sustained',
|
|
56
56
|
extraExpense: 'Extra Expense',
|
|
57
|
-
combinedSingleLimit: 'Combined Single Limit'
|
|
58
|
-
|
|
57
|
+
combinedSingleLimit: 'Combined Single Limit',
|
|
58
|
+
followsForm: 'Follows Form',
|
|
59
|
+
followFormEndorsement: 'Follow-Form Endorsement',
|
|
60
|
+
waiverOfSubrogation: 'Waiver of Subrogation',
|
|
61
|
+
waiverOfSubrogationEndorsement: 'Waiver of Subrogation Endorsement'
|
|
59
62
|
};
|
|
60
63
|
|
|
61
64
|
module.exports = {
|
|
@@ -13,6 +13,7 @@ const { complianceStatuses, getAuditConfigByStatus } = require('../../common/uti
|
|
|
13
13
|
const httpResponseStatusCodes = require('../../common/httpResponseStatusCodes.json');
|
|
14
14
|
const activationStatuses = require('../../common/consts/activationStatuses');
|
|
15
15
|
const timeUtils = require('../../common/utils/timeUtils');
|
|
16
|
+
const recordFlows = require('../../common/commonFlows/records/records');
|
|
16
17
|
|
|
17
18
|
const filePath = path.join(__dirname, '../../resources/coi/coi.pdf');
|
|
18
19
|
|
|
@@ -36,24 +37,7 @@ const prepareRecord = async (recordCompany, recordEmail, status, tabId, requirem
|
|
|
36
37
|
const projectId = requestData.projectInfo.projectId;
|
|
37
38
|
const recordId = requestData.record.contractorId;
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
const tabModel = new requests.models.TabModel(requestData.tab.type);
|
|
41
|
-
const recordDetailsModel = contractors.services.getContractorDetailsModel(recordConfig);
|
|
42
|
-
const record = new contractors.models.edit.ContractorModel(
|
|
43
|
-
recordId,
|
|
44
|
-
requestData.record.recordType,
|
|
45
|
-
recordConfig.company,
|
|
46
|
-
recordConfig.emailAddress,
|
|
47
|
-
recordDetailsModel
|
|
48
|
-
);
|
|
49
|
-
const requestEditModel = new requests.models.RequestModel(requestData.id, record, tabModel, {});
|
|
50
|
-
|
|
51
|
-
const editRequestResponse = await requests.services.editRequestAndRecordDetails(requestEditModel, context);
|
|
52
|
-
|
|
53
|
-
if (editRequestResponse.status !== httpResponseStatusCodes.OK) {
|
|
54
|
-
throw Error(`Failed to edit record ${recordCompany}\n${editRequestResponse.data.message}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
40
|
+
recordConfig && await recordFlows.editRequestAndRecordDetails(requestData, recordConfig, context);
|
|
57
41
|
|
|
58
42
|
const coiUpload = await coi.utils.uploadCoi(
|
|
59
43
|
recordId,
|
|
@@ -136,7 +120,7 @@ const prepareAwaitingNewCoiRecord = async (recordCompany, recordEmail, tabId, re
|
|
|
136
120
|
const prepareUnderReviewRecord = (recordCompany, recordEmail, tabId, requirementId, context, { recordConfig } = {}) => {
|
|
137
121
|
return prepareRecord(recordCompany, recordEmail, complianceStatuses.underReview, tabId, requirementId, context, { recordConfig });
|
|
138
122
|
};
|
|
139
|
-
const prepareDraftRecord = async (recordCompany, tabId, context, { recordEmail, requirementId, uploadCoi } = {}) => {
|
|
123
|
+
const prepareDraftRecord = async (recordCompany, tabId, context, { recordEmail, requirementId, uploadCoi, recordConfig } = {}) => {
|
|
140
124
|
const requestData = await requests.services.getOrCreateRequest(
|
|
141
125
|
context,
|
|
142
126
|
tabId,
|
|
@@ -153,6 +137,8 @@ const prepareDraftRecord = async (recordCompany, tabId, context, { recordEmail,
|
|
|
153
137
|
throw Error(`Failed to create record ${recordCompany}\n${requestData}`);
|
|
154
138
|
}
|
|
155
139
|
|
|
140
|
+
recordConfig && await recordFlows.editRequestAndRecordDetails(requestData, recordConfig, context);
|
|
141
|
+
|
|
156
142
|
if (uploadCoi) {
|
|
157
143
|
const recordId = requestData.record.contractorId;
|
|
158
144
|
|
|
@@ -7,7 +7,8 @@ const models = {
|
|
|
7
7
|
const utils = require('./utils/utils');
|
|
8
8
|
|
|
9
9
|
const consts = {
|
|
10
|
-
UPLOADER_TYPES: require('./consts/uploaderTypes')
|
|
10
|
+
UPLOADER_TYPES: require('./consts/uploaderTypes'),
|
|
11
|
+
HASHES: require('./consts/hashes')
|
|
11
12
|
};
|
|
12
13
|
|
|
13
14
|
module.exports = { services, models, utils, consts };
|
|
@@ -1,9 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
class SubmitCoiModel {
|
|
2
|
+
constructor({
|
|
3
|
+
recordId: contractorId,
|
|
4
|
+
fileIds,
|
|
5
|
+
uploadedBy,
|
|
6
|
+
uploaderEmail,
|
|
7
|
+
recordDateModified: contractorDateModified,
|
|
8
|
+
isContractorExist = true
|
|
9
|
+
}) {
|
|
10
|
+
this.contractorId = contractorId;
|
|
11
|
+
this.chosenIds = fileIds;
|
|
12
|
+
this.uploadedBy = uploadedBy;
|
|
13
|
+
this.uploaderEmail = uploaderEmail;
|
|
14
|
+
this.isContractorExist = isContractorExist;
|
|
15
|
+
this.contractorDateModified = contractorDateModified;
|
|
16
|
+
}
|
|
7
17
|
}
|
|
8
18
|
|
|
9
19
|
module.exports = { SubmitCoiModel };
|
|
@@ -2,36 +2,58 @@ const fs = require('fs');
|
|
|
2
2
|
|
|
3
3
|
const services = require('../api/coi.service');
|
|
4
4
|
const { SubmitCoiModel } = require('../models/submit.coi.model');
|
|
5
|
+
const { getContractorById } = require('../../contractors/api/contractors.service');
|
|
6
|
+
const { getIcsCookie } = require('../../auth/api/auth.service');
|
|
5
7
|
|
|
6
8
|
const uploadFileToStorage = (recordId, filePath) => {
|
|
7
9
|
const fileData = fs.createReadStream(filePath);
|
|
8
10
|
return services.uploadToS3(recordId, fileData);
|
|
9
11
|
};
|
|
10
12
|
|
|
11
|
-
const submitCoiFilesUpload = (
|
|
12
|
-
|
|
13
|
+
const submitCoiFilesUpload = ({
|
|
14
|
+
recordId,
|
|
15
|
+
fileIds,
|
|
16
|
+
uploadedBy,
|
|
17
|
+
uploaderEmail,
|
|
18
|
+
recordDateModified
|
|
19
|
+
}) => {
|
|
20
|
+
const submitCoiModel = new SubmitCoiModel({
|
|
13
21
|
recordId,
|
|
14
22
|
fileIds,
|
|
15
|
-
|
|
16
|
-
uploaderEmail
|
|
17
|
-
|
|
23
|
+
uploadedBy,
|
|
24
|
+
uploaderEmail,
|
|
25
|
+
recordDateModified
|
|
26
|
+
});
|
|
18
27
|
return services.submitCoi(submitCoiModel);
|
|
19
28
|
};
|
|
20
29
|
|
|
21
30
|
const uploadCoi = async (
|
|
22
31
|
recordId,
|
|
23
32
|
filePath,
|
|
24
|
-
|
|
33
|
+
uploadedBy,
|
|
25
34
|
uploaderEmail,
|
|
26
35
|
{
|
|
27
36
|
markAsScaned, // Should be passed with context
|
|
28
37
|
context
|
|
29
38
|
} = {}
|
|
30
39
|
) => {
|
|
40
|
+
if (!context) {
|
|
41
|
+
context = await getIcsCookie();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const recordResponse = await getContractorById(recordId, context);
|
|
45
|
+
const recordDateModified = recordResponse.data.dateModified;
|
|
31
46
|
const uploadResponse = await uploadFileToStorage(recordId, filePath);
|
|
32
47
|
const fileId = uploadResponse.data.fileId;
|
|
33
48
|
|
|
34
|
-
const submitResponse = fileId && await submitCoiFilesUpload(
|
|
49
|
+
const submitResponse = fileId && await submitCoiFilesUpload({
|
|
50
|
+
recordId,
|
|
51
|
+
fileIds: [fileId],
|
|
52
|
+
uploadedBy,
|
|
53
|
+
uploaderEmail,
|
|
54
|
+
recordDateModified
|
|
55
|
+
});
|
|
56
|
+
|
|
35
57
|
const uploadedCoi = !!submitResponse.data.fileName && { id: fileId, name: submitResponse.data.fileName };
|
|
36
58
|
|
|
37
59
|
if (uploadedCoi.name && markAsScaned && context) {
|
|
@@ -207,6 +207,17 @@ const getComplianceJson = async function(recordId, context) {
|
|
|
207
207
|
return getComplianceJsonResponse.data;
|
|
208
208
|
};
|
|
209
209
|
|
|
210
|
+
const getCurrentAuditUniqueCoiId = async function(recordId, auditorContext) {
|
|
211
|
+
const recordDetailsResponse = await getAuditRecordModel(recordId, auditorContext);
|
|
212
|
+
|
|
213
|
+
if (recordDetailsResponse.status !== httpResponseStatusCodes.OK) {
|
|
214
|
+
throw Error(`Failed to get audit record\n${recordDetailsResponse}`);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const { uniqueId: uniqueCoiId } = recordDetailsResponse.data.certificateDetails;
|
|
218
|
+
return uniqueCoiId;
|
|
219
|
+
};
|
|
220
|
+
|
|
210
221
|
module.exports = {
|
|
211
222
|
audit,
|
|
212
223
|
submitAudit,
|
|
@@ -226,5 +237,6 @@ module.exports = {
|
|
|
226
237
|
putAuditOnHold,
|
|
227
238
|
resumeAudit,
|
|
228
239
|
getAuditIfIsOnHold,
|
|
229
|
-
updateComplianceAuditActionsDate
|
|
240
|
+
updateComplianceAuditActionsDate,
|
|
241
|
+
getCurrentAuditUniqueCoiId
|
|
230
242
|
};
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
const { backendUrl } = require('../../../../env').getEnv();
|
|
2
|
+
|
|
1
3
|
const requests = require('../../../../common/requests/cookieAuth/requests');
|
|
2
4
|
const internalRequests = require('../../../../common/requests/internalAuth/requests');
|
|
3
5
|
|
|
4
|
-
const { backendUrl } = require('../../../../env').getEnv();
|
|
5
|
-
|
|
6
6
|
const Endpoints = {
|
|
7
7
|
get: `${backendUrl}/saas/contractors`,
|
|
8
8
|
getContractorById: contractorId => `${backendUrl}/saas/contractor/${contractorId}`,
|
|
9
9
|
getRecordHistory: contractorId => `${backendUrl}/saas/record/${contractorId}/history`,
|
|
10
|
+
getRecordOcrStatus: contractorId => `${backendUrl}/saas/contractor/${contractorId}/ocr/status`,
|
|
10
11
|
delete: contractorId => `${backendUrl}/saas/contractor/${contractorId}`,
|
|
11
12
|
archive: contractorId => `${backendUrl}/saas/contractor/${contractorId}/archive`,
|
|
12
13
|
restore: contractorId => `${backendUrl}/saas/contractor/${contractorId}/restore`,
|
|
@@ -17,6 +18,8 @@ const Endpoints = {
|
|
|
17
18
|
requestNewCoiExpired: requestId => `${backendUrl}/saas/coi/${requestId}/expired`,
|
|
18
19
|
muteNotifications: `${backendUrl}/saas/record/notifications/mute`,
|
|
19
20
|
unmuteNotifications: `${backendUrl}/saas/record/notifications/unmute`,
|
|
21
|
+
unsubscribe: `${backendUrl}/record/email/unsubscribe`,
|
|
22
|
+
subscribe: `${backendUrl}/record/email/subscribe`,
|
|
20
23
|
changeRequirement: `${backendUrl}/saas/contractor/requirement`,
|
|
21
24
|
updateVendorExpiryDate: contractorId => `${backendUrl}/_saas/automation/contractor/${contractorId}/expiry-date`,
|
|
22
25
|
updateContractorInviteDate: contractorId => `${backendUrl}/_saas/automation/contractor/${contractorId}/invite-date`,
|
|
@@ -28,7 +31,8 @@ const Endpoints = {
|
|
|
28
31
|
linkedProjectsCount: recordId => `${backendUrl}/saas/record/count/${recordId}/linked-projects`,
|
|
29
32
|
verifyInviteLink: encryptedData => `${backendUrl}/vendor-app/verify-link?data=${encryptedData}`,
|
|
30
33
|
getBasicDetailsById: recordId => `${backendUrl}/jcsc/record/${recordId}`,
|
|
31
|
-
getRecordsFromInsuredName: (insuredName, accountIds) => `${backendUrl}/jcsc/record/insured-name/${insuredName}?accountIds=${accountIds}
|
|
34
|
+
getRecordsFromInsuredName: (insuredName, accountIds) => `${backendUrl}/jcsc/record/insured-name/${insuredName}?accountIds=${accountIds}`,
|
|
35
|
+
linkDraftRequest: `${backendUrl}/saas/account/record/link-draft`
|
|
32
36
|
};
|
|
33
37
|
|
|
34
38
|
const getContractorsByAccountId = (params, context) => {
|
|
@@ -43,6 +47,10 @@ const getRecordHistory = (contractorId, context) => {
|
|
|
43
47
|
return requests.getRequestHandler(Endpoints.getRecordHistory(contractorId), {}, context);
|
|
44
48
|
};
|
|
45
49
|
|
|
50
|
+
const getRecordOcrStatus = (contractorId, context) => {
|
|
51
|
+
return requests.getRequestHandler(Endpoints.getRecordOcrStatus(contractorId), {}, context);
|
|
52
|
+
};
|
|
53
|
+
|
|
46
54
|
const deleteByContractorId = (contractorId, context) => {
|
|
47
55
|
return requests.deleteRequestHandler(Endpoints.delete(contractorId), context);
|
|
48
56
|
};
|
|
@@ -69,6 +77,14 @@ const unmuteNotifications = (recordModifyDateVerificationModel, context) => {
|
|
|
69
77
|
return requests.postRequestHandler(Endpoints.unmuteNotifications, recordModifyDateVerificationModel, context);
|
|
70
78
|
};
|
|
71
79
|
|
|
80
|
+
const unsubscribe = subscriptionModel => {
|
|
81
|
+
return requests.postRequestHandler(Endpoints.unsubscribe, subscriptionModel);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const subscribe = subscriptionModel => {
|
|
85
|
+
return requests.postRequestHandler(Endpoints.subscribe, subscriptionModel);
|
|
86
|
+
};
|
|
87
|
+
|
|
72
88
|
const changeRequirement = (recordModifyDateVerificationModel, context) => {
|
|
73
89
|
return requests.putRequestHandler(Endpoints.changeRequirement, recordModifyDateVerificationModel, context);
|
|
74
90
|
};
|
|
@@ -150,12 +166,17 @@ const getRecordsFromInsuredName = (insuredName, accountIds) => {
|
|
|
150
166
|
return internalRequests.getRequestHandler(Endpoints.getRecordsFromInsuredName(insuredName, accountIdsStr));
|
|
151
167
|
};
|
|
152
168
|
|
|
169
|
+
const linkDraftRequestToAccountRecord = async (linkRequestModel, context) => {
|
|
170
|
+
return requests.postRequestHandler(Endpoints.linkDraftRequest, linkRequestModel, context);
|
|
171
|
+
};
|
|
172
|
+
|
|
153
173
|
module.exports = {
|
|
154
174
|
changeRequirement,
|
|
155
175
|
assignRequirement,
|
|
156
176
|
getContractorsByAccountId,
|
|
157
177
|
getContractorById,
|
|
158
178
|
getRecordHistory,
|
|
179
|
+
getRecordOcrStatus,
|
|
159
180
|
deleteByContractorId,
|
|
160
181
|
archiveRecord,
|
|
161
182
|
restoreRecord,
|
|
@@ -171,9 +192,12 @@ module.exports = {
|
|
|
171
192
|
resendInvitation,
|
|
172
193
|
muteNotifications,
|
|
173
194
|
unmuteNotifications,
|
|
195
|
+
unsubscribe,
|
|
196
|
+
subscribe,
|
|
174
197
|
getLinkedProjectsCount,
|
|
175
198
|
updateLastInviteActionDate,
|
|
176
199
|
getInviteLinkStatus,
|
|
177
200
|
getBasicDetailsById,
|
|
178
|
-
getRecordsFromInsuredName
|
|
201
|
+
getRecordsFromInsuredName,
|
|
202
|
+
linkDraftRequestToAccountRecord
|
|
179
203
|
};
|
|
@@ -4,11 +4,12 @@ const { validateType } = require('../../../../common/validations/typeValidations
|
|
|
4
4
|
const { RecordModifyDateVerificationModel } = require('../models/verification.contractor.model');
|
|
5
5
|
const { AssignRequirementModel } = require('../models/assign.requirement.model');
|
|
6
6
|
const { ContractorDetailsModel } = require('../models/edit.contractor.model');
|
|
7
|
+
const { LinkRequestModel } = require('../models/link.request.model');
|
|
8
|
+
const { SubscriptionModel } = require('../models/subscription.contractor.model');
|
|
7
9
|
const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
|
|
8
10
|
const { waitFor } = require('../../../../common/utils/timeUtils');
|
|
9
11
|
const activationStatuses = require('../../../../common/consts/activationStatuses');
|
|
10
12
|
const utils = require('../utils');
|
|
11
|
-
const requestService = require('../../requests/api/requests.service');
|
|
12
13
|
|
|
13
14
|
const getContractorsByAccountId = async (accountId, context, activationStatus = null) => {
|
|
14
15
|
if (activationStatus) {
|
|
@@ -26,6 +27,10 @@ const getRecordHistory = (contractorId, context) => {
|
|
|
26
27
|
return contractorsAPI.getRecordHistory(contractorId, context);
|
|
27
28
|
};
|
|
28
29
|
|
|
30
|
+
const getRecordOcrStatus = (recordId, context) => {
|
|
31
|
+
return contractorsAPI.getRecordOcrStatus(recordId, context);
|
|
32
|
+
};
|
|
33
|
+
|
|
29
34
|
const archiveRecord = (recordVerificationModel, context) => {
|
|
30
35
|
validateType(recordVerificationModel, RecordModifyDateVerificationModel);
|
|
31
36
|
return contractorsAPI.archiveRecord(recordVerificationModel, context);
|
|
@@ -100,11 +105,59 @@ const muteNotifications = (recordModifyDateVerificationModel, context) => {
|
|
|
100
105
|
return contractorsAPI.muteNotifications(recordModifyDateVerificationModel, context);
|
|
101
106
|
};
|
|
102
107
|
|
|
108
|
+
const muteNotificationsByRecordId = async (recordId, context) => {
|
|
109
|
+
const recordModifyDateVerificationModel = await getRecordVerificationModel(recordId, context);
|
|
110
|
+
const muteResponse = await contractorsAPI.muteNotifications(recordModifyDateVerificationModel, context);
|
|
111
|
+
|
|
112
|
+
if (muteResponse.status !== httpResponseStatusCodes.NO_CONTENT) {
|
|
113
|
+
throw new Error(`Failed to mute record: ${muteResponse.statusText}`);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return muteResponse;
|
|
117
|
+
};
|
|
118
|
+
|
|
103
119
|
const unmuteNotifications = (recordModifyDateVerificationModel, context) => {
|
|
104
120
|
validateType(recordModifyDateVerificationModel, RecordModifyDateVerificationModel);
|
|
105
121
|
return contractorsAPI.unmuteNotifications(recordModifyDateVerificationModel, context);
|
|
106
122
|
};
|
|
107
123
|
|
|
124
|
+
const unmuteNotificationsByRecordId = async (recordId, context) => {
|
|
125
|
+
const recordModifyDateVerificationModel = await getRecordVerificationModel(recordId, context);
|
|
126
|
+
const unmuteResponse = await contractorsAPI.unmuteNotifications(recordModifyDateVerificationModel, context);
|
|
127
|
+
|
|
128
|
+
if (unmuteResponse.status !== httpResponseStatusCodes.NO_CONTENT) {
|
|
129
|
+
throw new Error(`Failed to unmute record: ${unmuteResponse.statusText}`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return unmuteResponse;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const unsubscribe = async (subscriptionModel, { expectError } = {}) => {
|
|
136
|
+
validateType(subscriptionModel, SubscriptionModel);
|
|
137
|
+
const unsubscribeResponse = await contractorsAPI.unsubscribe(subscriptionModel);
|
|
138
|
+
|
|
139
|
+
if (unsubscribeResponse.status !== httpResponseStatusCodes.OK && !expectError) {
|
|
140
|
+
throw new Error(`Failed to unsubscribe record: ${unsubscribeResponse.statusText}`);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return unsubscribeResponse;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const subscribe = async (subscriptionModel, { expectError } = {}) => {
|
|
147
|
+
validateType(subscriptionModel, SubscriptionModel);
|
|
148
|
+
const subscribeResponse = await contractorsAPI.subscribe(subscriptionModel);
|
|
149
|
+
|
|
150
|
+
if (subscribeResponse.status !== httpResponseStatusCodes.OK && !expectError) {
|
|
151
|
+
throw new Error(`Failed to subscribe record: ${subscribeResponse.statusText}`);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return subscribeResponse;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const getSubscriptionModel = (data, { recaptchaResponse = 'recaptchaResponse' } = {}) => {
|
|
158
|
+
return new SubscriptionModel(data, recaptchaResponse);
|
|
159
|
+
};
|
|
160
|
+
|
|
108
161
|
const deleteByContractorId = (contractorId, context) => {
|
|
109
162
|
return contractorsAPI.deleteByContractorId(contractorId, context);
|
|
110
163
|
};
|
|
@@ -210,11 +263,23 @@ const getRecordsFromInsuredName = async (insuredName, accountIds) => {
|
|
|
210
263
|
return response.data;
|
|
211
264
|
};
|
|
212
265
|
|
|
266
|
+
const linkDraftRequestToAccountRecord = async (requestToLink, targetAccountRecord, context, { shouldExpectError } = {}) => {
|
|
267
|
+
const linkRequestModel = new LinkRequestModel(requestToLink, targetAccountRecord);
|
|
268
|
+
const linkRequestResponse = await contractorsAPI.linkDraftRequestToAccountRecord(linkRequestModel, context);
|
|
269
|
+
|
|
270
|
+
if (linkRequestResponse.status !== httpResponseStatusCodes.OK && !shouldExpectError) {
|
|
271
|
+
throw Error(`Failed to link request - ${requestToLink.id} to accountRecord ${targetAccountRecord.id}\n${linkRequestResponse}`);
|
|
272
|
+
} else {
|
|
273
|
+
return linkRequestResponse;
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
213
277
|
module.exports = {
|
|
214
278
|
changeRequirement,
|
|
215
279
|
getContractorsByAccountId,
|
|
216
280
|
getContractorById,
|
|
217
281
|
getRecordHistory,
|
|
282
|
+
getRecordOcrStatus,
|
|
218
283
|
archiveRecord,
|
|
219
284
|
restoreRecord,
|
|
220
285
|
editContractor,
|
|
@@ -228,7 +293,12 @@ module.exports = {
|
|
|
228
293
|
requestNewCoiExpired,
|
|
229
294
|
resendInvitation,
|
|
230
295
|
muteNotifications,
|
|
296
|
+
muteNotificationsByRecordId,
|
|
231
297
|
unmuteNotifications,
|
|
298
|
+
unmuteNotificationsByRecordId,
|
|
299
|
+
unsubscribe,
|
|
300
|
+
subscribe,
|
|
301
|
+
getSubscriptionModel,
|
|
232
302
|
deleteByContractorId,
|
|
233
303
|
deleteAllRecordsInAccount,
|
|
234
304
|
deleteAllActiveRecordsInAccount,
|
|
@@ -243,5 +313,6 @@ module.exports = {
|
|
|
243
313
|
getInviteLinkStatus,
|
|
244
314
|
getContractorDetailsModel,
|
|
245
315
|
getBasicDetailsById,
|
|
246
|
-
getRecordsFromInsuredName
|
|
316
|
+
getRecordsFromInsuredName,
|
|
317
|
+
linkDraftRequestToAccountRecord
|
|
247
318
|
};
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
2
2
|
|
|
3
3
|
class ContractorModel {
|
|
4
|
-
constructor(contractorId, recordType, company, emailAddress, additionalDetails) {
|
|
4
|
+
constructor(contractorId, recordType, company, emailAddress, additionalDetails, { dateModified, contractorOverrideDateModified } = {}) {
|
|
5
5
|
validateType(additionalDetails, ContractorDetailsModel);
|
|
6
6
|
|
|
7
7
|
this.contractorId = contractorId;
|
|
8
8
|
this.recordType = recordType;
|
|
9
9
|
this.company = company;
|
|
10
10
|
this.emailAddress = emailAddress;
|
|
11
|
+
this.dateModified = dateModified;
|
|
12
|
+
this.contractorOverrideDateModified = contractorOverrideDateModified;
|
|
11
13
|
|
|
12
14
|
for (const detail in additionalDetails) {
|
|
13
15
|
if (additionalDetails[detail]) {
|
|
@@ -137,11 +137,20 @@ const waitForMail = async (emailModel, { maxSecondToWait = 30 } = {}) => {
|
|
|
137
137
|
return foundMails;
|
|
138
138
|
};
|
|
139
139
|
|
|
140
|
+
const getSubscriptionData = async function(recipients) {
|
|
141
|
+
const regex = util.getUnsubscribeButtonUrlRegex();
|
|
142
|
+
const unsubscribeButtonUrl = await getLastMessage({ recipients, regex, returnType: 'url' });
|
|
143
|
+
|
|
144
|
+
const data = util.getEncryptedDataFromLink(unsubscribeButtonUrl);
|
|
145
|
+
return decodeURIComponent(data);
|
|
146
|
+
};
|
|
147
|
+
|
|
140
148
|
module.exports = {
|
|
141
149
|
util,
|
|
142
150
|
waitForMail,
|
|
143
151
|
getAllMessages,
|
|
144
152
|
getLastMessage,
|
|
153
|
+
getSubscriptionData,
|
|
145
154
|
deleteMultipleMessages,
|
|
146
155
|
deleteAllMessages
|
|
147
156
|
};
|
|
@@ -66,9 +66,13 @@ const getMailActionButtonUrlRegex = () => {
|
|
|
66
66
|
return /(https:\/\/[a-zA-Z0-9.].*[a-zA-Z.]+\/CheckCustomersInviteLinkJSON\?data=[^"]+)/g;
|
|
67
67
|
};
|
|
68
68
|
|
|
69
|
-
const
|
|
69
|
+
const getUnsubscribeButtonUrlRegex = () => {
|
|
70
|
+
return /(\/[a-zA-Z0-9.].*[a-zA-Z.]+\/vendor-app\/email\/unsubscribe\?data=[^"]+)/g;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const getEncryptedDataFromLink = (link, { removeLastTwoCharts } = {}) => {
|
|
70
74
|
const encryptedData = link.split('data=').pop();
|
|
71
|
-
return encryptedData.slice(0, -2);
|
|
75
|
+
return removeLastTwoCharts ? encryptedData.slice(0, -2) : encryptedData;
|
|
72
76
|
};
|
|
73
77
|
|
|
74
78
|
module.exports = {
|
|
@@ -78,5 +82,6 @@ module.exports = {
|
|
|
78
82
|
logRetrievedEmailInfo,
|
|
79
83
|
getEmailTextInSubject,
|
|
80
84
|
getMailActionButtonUrlRegex,
|
|
85
|
+
getUnsubscribeButtonUrlRegex,
|
|
81
86
|
getEncryptedDataFromLink
|
|
82
87
|
};
|
|
@@ -37,7 +37,8 @@ const XlsxReportTypes = {
|
|
|
37
37
|
USER_MANAGEMENT_REPORT: 'UserManagementReport',
|
|
38
38
|
COVERAGE_GAPS_REPORT: 'CoverageGapsReport',
|
|
39
39
|
EXPIRING_RECORDS_REPORT: 'ExpiringRecordsReport',
|
|
40
|
-
COMPLIANCE_STATUS_BY_POLICY_REPORT: 'ComplianceStatusByPolicy'
|
|
40
|
+
COMPLIANCE_STATUS_BY_POLICY_REPORT: 'ComplianceStatusByPolicy',
|
|
41
|
+
NOT_COMPLIANT_REPORT: 'NotCompliantReport'
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
const ScheduledReportFrequency = {
|
|
@@ -8,6 +8,7 @@ const Endpoints = {
|
|
|
8
8
|
edit: contractorId => `${backendUrl}/saas/requests/${contractorId}/update`,
|
|
9
9
|
saveDraftRequest: `${backendUrl}/saas/requests/draft/save`,
|
|
10
10
|
activateDraftRequest: `${backendUrl}/saas/requests/draft/activate`,
|
|
11
|
+
draftRequestList: `${backendUrl}/saas/requests/draft`,
|
|
11
12
|
getById: requestId => `${backendUrl}/saas/request/${requestId}`,
|
|
12
13
|
getAccountRequests: accountId => `${backendUrl}/saas/requests/${accountId}`,
|
|
13
14
|
getByTabId: `${backendUrl}/saas/requests`,
|
|
@@ -16,7 +17,10 @@ const Endpoints = {
|
|
|
16
17
|
getAutocompleteAutoSelect: `${backendUrl}/saas/request/auto/selection`,
|
|
17
18
|
getTabTenantRequestsInProject: projectId => `${backendUrl}/saas/project/${projectId}/tenants/companies`,
|
|
18
19
|
innerPageRequests: `${backendUrl}/saas/requests/chart-filter`,
|
|
19
|
-
homePageRequests: `${backendUrl}/saas/requests/actionable
|
|
20
|
+
homePageRequests: `${backendUrl}/saas/requests/actionable`,
|
|
21
|
+
draftFilterCounters: tabId => `${backendUrl}/saas/tab/${tabId}/requests/draft/filter/counter`,
|
|
22
|
+
activityStatusCounter: tabId => `${backendUrl}/saas/tab/${tabId}/requests/activity-status/count`,
|
|
23
|
+
requestsCounters: tabId => `${backendUrl}/saas/tab/${tabId}/requests/counters`
|
|
20
24
|
};
|
|
21
25
|
|
|
22
26
|
const createRequest = (createRequestModel, context) => {
|
|
@@ -57,8 +61,8 @@ const getRequestsByAccountId = (accountId, context, params) => {
|
|
|
57
61
|
return requests.getRequestHandler(Endpoints.getAccountRequests(accountId), params, context);
|
|
58
62
|
};
|
|
59
63
|
|
|
60
|
-
const getRequestsByTabId = (tabId, context, activityStatus) => {
|
|
61
|
-
const body = { tabId, activityStatus };
|
|
64
|
+
const getRequestsByTabId = (tabId, context, activityStatus, sortBy = null, filterByStatus = null, filterByExpiryStatus = null, filterByResponsivenessStatus = null) => {
|
|
65
|
+
const body = { tabId, activityStatus, sortBy, filterByStatus, filterByExpiryStatus, filterByResponsivenessStatus };
|
|
62
66
|
return requests.postRequestHandler(Endpoints.getByTabId, body, context);
|
|
63
67
|
};
|
|
64
68
|
|
|
@@ -78,6 +82,22 @@ const getHomePageRequests = (requestListCriteriaModel, context) => {
|
|
|
78
82
|
return requests.postRequestHandler(Endpoints.homePageRequests, requestListCriteriaModel, context);
|
|
79
83
|
};
|
|
80
84
|
|
|
85
|
+
const getDraftRequestList = (draftRequestCriteriaModel, context) => {
|
|
86
|
+
return requests.postRequestHandler(Endpoints.draftRequestList, draftRequestCriteriaModel, context);
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const getDraftFilterCountersByTabId = (tabId, context) => {
|
|
90
|
+
return requests.getRequestHandler(Endpoints.draftFilterCounters(tabId), {}, context);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const getActivityStatusCounterByTabId = (tabId, context) => {
|
|
94
|
+
return requests.getRequestHandler(Endpoints.activityStatusCounter(tabId), {}, context);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const getRequestsCountersByTabId = (tabId, context) => {
|
|
98
|
+
return requests.getRequestHandler(Endpoints.requestsCounters(tabId), {}, context);
|
|
99
|
+
};
|
|
100
|
+
|
|
81
101
|
module.exports = {
|
|
82
102
|
createRequest,
|
|
83
103
|
addRequestToRecord,
|
|
@@ -92,5 +112,9 @@ module.exports = {
|
|
|
92
112
|
getAutocompleteAutoSelect,
|
|
93
113
|
getTabTenantRequestsInProject,
|
|
94
114
|
getInnerPageRequests,
|
|
95
|
-
getHomePageRequests
|
|
115
|
+
getHomePageRequests,
|
|
116
|
+
getDraftRequestList,
|
|
117
|
+
getDraftFilterCountersByTabId,
|
|
118
|
+
getActivityStatusCounterByTabId,
|
|
119
|
+
getRequestsCountersByTabId
|
|
96
120
|
};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
const requestsAPI = require('./requests.api');
|
|
2
2
|
const { CreateRequestModel, ContractorInfo } = require('../models/create.request.model');
|
|
3
|
+
const { DraftRequestCriteriaModel } = require('../models/draft.request.criteria.model');
|
|
3
4
|
const { RequestListCriteriaModel } = require('../models/requestListCriteriaModel');
|
|
4
5
|
const { DraftRequestReportModel } = require('../models/draft.request.report.model');
|
|
5
6
|
const { RequestModel } = require('../models/edit.request.model');
|
|
6
7
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
7
8
|
const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
|
|
9
|
+
const activationStatuses = require('../../../../common/consts/activationStatuses');
|
|
8
10
|
|
|
9
11
|
const createRequest = async (createRequestModel, context) => {
|
|
10
12
|
validateType(createRequestModel, CreateRequestModel);
|
|
@@ -30,7 +32,7 @@ const activateDraftRequest = (draftRequestReportModel, context) => {
|
|
|
30
32
|
return requestsAPI.activateDraftRequest(draftRequestReportModel, context);
|
|
31
33
|
};
|
|
32
34
|
|
|
33
|
-
const activateByRequest = async (request, context, { email, requirementId, additionalEmailList, dateModified, overrideDateModified } = {}) => {
|
|
35
|
+
const activateByRequest = async (request, context, { email, requirementId, additionalEmailList, dateModified, overrideDateModified, shouldSucceed = true } = {}) => {
|
|
34
36
|
const emailAddress = email || request.record.emailAddress;
|
|
35
37
|
const selectedRequirementsId = requirementId || request.record.requirementId;
|
|
36
38
|
const additionalEmails = additionalEmailList || request.record.additionalEmails;
|
|
@@ -47,7 +49,13 @@ const activateByRequest = async (request, context, { email, requirementId, addit
|
|
|
47
49
|
}
|
|
48
50
|
);
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
const activationResponse = await activateDraftRequest(draftRequestReportModel, context);
|
|
53
|
+
|
|
54
|
+
if (activationResponse.status !== httpResponseStatusCodes.NO_CONTENT && shouldSucceed) {
|
|
55
|
+
throw Error(`Failed to activate record: ${activationResponse.data}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return activationResponse;
|
|
51
59
|
};
|
|
52
60
|
|
|
53
61
|
const saveDraftRequest = (draftRequestReportModel, context) => {
|
|
@@ -86,8 +94,8 @@ const getAutocompleteAutoSelect = async (params, context) => {
|
|
|
86
94
|
return autoSelectedRequest.data;
|
|
87
95
|
};
|
|
88
96
|
|
|
89
|
-
const getRequestsByTabId = (tabId, context, activityStatus =
|
|
90
|
-
return requestsAPI.getRequestsByTabId(tabId, context, activityStatus);
|
|
97
|
+
const getRequestsByTabId = (tabId, context, activityStatus = activationStatuses.ACTIVE, sortBy = null, filterByStatus = null, filterByExpiryStatus = null, filterByResponsivenessStatus = null) => {
|
|
98
|
+
return requestsAPI.getRequestsByTabId(tabId, context, activityStatus, sortBy, filterByStatus, filterByExpiryStatus, filterByResponsivenessStatus);
|
|
91
99
|
};
|
|
92
100
|
|
|
93
101
|
const getRequestById = (requestId, context) => {
|
|
@@ -104,7 +112,7 @@ const getRequestsByAccountId = (accountId, context, activationStatus) => {
|
|
|
104
112
|
return requestsAPI.getRequestsByAccountId(accountId, context, params);
|
|
105
113
|
};
|
|
106
114
|
|
|
107
|
-
const getCreateRequestModel = (requirementId, contractor, { tabId, publicLink,
|
|
115
|
+
const getCreateRequestModel = (requirementId, contractor, { tabId, publicLink, requirementDateModified, isDraft } = {}) => {
|
|
108
116
|
const { recordType, email, companyName, additionalEmails } = contractor;
|
|
109
117
|
const contractorInfoModel = new ContractorInfo(recordType, email, companyName, additionalEmails, isDraft);
|
|
110
118
|
|
|
@@ -115,13 +123,12 @@ const getCreateRequestModel = (requirementId, contractor, { tabId, publicLink, s
|
|
|
115
123
|
{
|
|
116
124
|
tabId,
|
|
117
125
|
publicLink,
|
|
118
|
-
sendMail,
|
|
119
126
|
requirementDateModified
|
|
120
127
|
}
|
|
121
128
|
);
|
|
122
129
|
};
|
|
123
130
|
|
|
124
|
-
const getOrCreateRequest = async (context, tabId, requirementId, contractor, activationStatus, {
|
|
131
|
+
const getOrCreateRequest = async (context, tabId, requirementId, contractor, activationStatus, { requirementDateModified } = {}) => {
|
|
125
132
|
const { data: existingRequests } = await getRequestsByTabId(tabId, context, activationStatus);
|
|
126
133
|
|
|
127
134
|
const filteredRequests = Array.isArray(existingRequests) ? existingRequests.filter(({ record }) =>
|
|
@@ -133,7 +140,7 @@ const getOrCreateRequest = async (context, tabId, requirementId, contractor, act
|
|
|
133
140
|
|
|
134
141
|
const isDraft = activationStatus === 'Draft' ? true : false;
|
|
135
142
|
|
|
136
|
-
const createContractorModel = getCreateRequestModel(requirementId, contractor, { tabId,
|
|
143
|
+
const createContractorModel = getCreateRequestModel(requirementId, contractor, { tabId, requirementDateModified, isDraft });
|
|
137
144
|
const createContractorResponse = await createRequest(createContractorModel, context);
|
|
138
145
|
return createContractorResponse.data;
|
|
139
146
|
};
|
|
@@ -195,6 +202,47 @@ const getRequestByName = async (recordName, tabId, context) => {
|
|
|
195
202
|
return request;
|
|
196
203
|
};
|
|
197
204
|
|
|
205
|
+
const getDraftRequestList = async (draftRequestCriteriaModel, context) => {
|
|
206
|
+
validateType(draftRequestCriteriaModel, DraftRequestCriteriaModel);
|
|
207
|
+
const response = await requestsAPI.getDraftRequestList(draftRequestCriteriaModel, context);
|
|
208
|
+
|
|
209
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
210
|
+
throw Error(`Failed to get draft request list - ${response.status}`);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return response.data;
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const getDraftFilterCountersByTabId = async (tabId, context) => {
|
|
217
|
+
const response = await requestsAPI.getDraftFilterCountersByTabId(tabId, context);
|
|
218
|
+
|
|
219
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
220
|
+
throw Error(`Failed to get the draft filter counters - ${response.status}`);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return response.data;
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
const getActivityStatusCounterByTabId = async (tabId, context) => {
|
|
227
|
+
const response = await requestsAPI.getActivityStatusCounterByTabId(tabId, context);
|
|
228
|
+
|
|
229
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
230
|
+
throw Error(`Failed to get the requests counter by activity status - ${response.status}`);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return response.data;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const getRequestsCountersByTabId = async (tabId, context) => {
|
|
237
|
+
const response = await requestsAPI.getRequestsCountersByTabId(tabId, context);
|
|
238
|
+
|
|
239
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
240
|
+
throw Error(`Failed to get requests counter - ${response.status}`);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return response.data;
|
|
244
|
+
};
|
|
245
|
+
|
|
198
246
|
module.exports = {
|
|
199
247
|
createRequest,
|
|
200
248
|
getAutocompleteAutoSelect,
|
|
@@ -216,5 +264,9 @@ module.exports = {
|
|
|
216
264
|
getInnerPageRequests,
|
|
217
265
|
getHomePageRequests,
|
|
218
266
|
getAllRequestsByName,
|
|
219
|
-
getRequestByName
|
|
267
|
+
getRequestByName,
|
|
268
|
+
getDraftRequestList,
|
|
269
|
+
getDraftFilterCountersByTabId,
|
|
270
|
+
getActivityStatusCounterByTabId,
|
|
271
|
+
getRequestsCountersByTabId
|
|
220
272
|
};
|
|
@@ -4,6 +4,7 @@ const { TenantRequestModel, RequestModel, TabModel } = require('./models/edit.re
|
|
|
4
4
|
const { CreateRequestModel, ContractorInfo } = require('./models/create.request.model');
|
|
5
5
|
const { RequestListCriteriaModel } = require('./models/requestListCriteriaModel');
|
|
6
6
|
const { DraftRequestReportModel } = require('./models/draft.request.report.model');
|
|
7
|
+
const { DraftRequestCriteriaModel } = require('./models/draft.request.criteria.model');
|
|
7
8
|
|
|
8
9
|
const models = {
|
|
9
10
|
TenantRequestModel,
|
|
@@ -12,6 +13,7 @@ const models = {
|
|
|
12
13
|
CreateRequestModel,
|
|
13
14
|
ContractorInfo,
|
|
14
15
|
DraftRequestReportModel,
|
|
16
|
+
DraftRequestCriteriaModel,
|
|
15
17
|
RequestListCriteriaModel
|
|
16
18
|
};
|
|
17
19
|
|
|
@@ -6,11 +6,10 @@ const { validateType, validateDateString } = require('../../../../common/validat
|
|
|
6
6
|
const superUserEmail = credentials.superUser;
|
|
7
7
|
|
|
8
8
|
class CreateRequestModel {
|
|
9
|
-
constructor(requirementId, inviterEmail, vendorInfo, { tabId = null,
|
|
9
|
+
constructor(requirementId, inviterEmail, vendorInfo, { tabId = null, publicLink, requirementDateModified } = {}) {
|
|
10
10
|
this.reqId = requirementId;
|
|
11
11
|
this.inviterEmail = inviterEmail || superUserEmail;
|
|
12
12
|
this.vendorInfo = vendorInfo;
|
|
13
|
-
this.disableMail = !sendMail;
|
|
14
13
|
this.tabId = tabId;
|
|
15
14
|
this.publicLink = publicLink;
|
|
16
15
|
this.dateModified = requirementDateModified;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class DraftRequestCriteriaModel {
|
|
2
|
+
constructor(tabId, {
|
|
3
|
+
draftCompletionStatusesFilter = [],
|
|
4
|
+
sortBy = null,
|
|
5
|
+
pageNumber = 1,
|
|
6
|
+
isDescending = true
|
|
7
|
+
} = {}) {
|
|
8
|
+
this.tabId = tabId;
|
|
9
|
+
this.draftCompletionStatusesFilter = draftCompletionStatusesFilter;
|
|
10
|
+
this.sortBy = sortBy;
|
|
11
|
+
this.pageNumber = pageNumber;
|
|
12
|
+
this.isDescending = isDescending;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
module.exports = {
|
|
17
|
+
DraftRequestCriteriaModel
|
|
18
|
+
};
|
package/.npmrc.bak
DELETED
package/package.json.bak
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@getjones/test-infra",
|
|
3
|
-
"version": "3.0.0",
|
|
4
|
-
"description": "Providing internal and openapi interface",
|
|
5
|
-
"main": "src/index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "mocha \"./tests/**/*.test.js\" --slow 3000 --timeout 10000 --exit --inlineDiffs --bail",
|
|
8
|
-
"eslint-fix": "eslint \"./src/**/*.js\" --fix"
|
|
9
|
-
},
|
|
10
|
-
"author": "",
|
|
11
|
-
"license": "ISC",
|
|
12
|
-
"dependencies": {
|
|
13
|
-
"axios": "^0.21.1",
|
|
14
|
-
"axios-file": "^1.0.17",
|
|
15
|
-
"chai": "^4.3.4",
|
|
16
|
-
"dotenv": "^8.2.0",
|
|
17
|
-
"enum": "^3.0.4",
|
|
18
|
-
"form-data": "^4.0.0",
|
|
19
|
-
"mocha": "^8.3.2"
|
|
20
|
-
},
|
|
21
|
-
"devDependencies": {
|
|
22
|
-
"babel-eslint": "^10.0.3",
|
|
23
|
-
"eslint": "^6.8.0",
|
|
24
|
-
"eslint-plugin-import": "^2.19.1",
|
|
25
|
-
"mocha-spec-json-output-reporter": "^1.1.7"
|
|
26
|
-
},
|
|
27
|
-
"directories": {
|
|
28
|
-
"test": "tests"
|
|
29
|
-
}
|
|
30
|
-
}
|