diff --git a/app/server/app/routes/config.js b/app/server/app/routes/config.js index 03c4408e..5064c34f 100644 --- a/app/server/app/routes/config.js +++ b/app/server/app/routes/config.js @@ -10,7 +10,7 @@ const router = express.Router(); router.use(ensureAuthenticated); // --- get CSB app specific configuration -router.get("/", (req, res) => { +router.get("/", (_req, res) => { // NOTE: fallback to current year if CSB_REBATE_YEAR is not set const date = new Date(); const year = date.getFullYear().toString(); diff --git a/app/server/app/routes/status.js b/app/server/app/routes/status.js index 4f5a136e..49522570 100644 --- a/app/server/app/routes/status.js +++ b/app/server/app/routes/status.js @@ -42,7 +42,7 @@ function verifySchema({ schema, substring }) { const router = express.Router(); -router.get("/app", (req, res) => { +router.get("/app", (_req, res) => { return res.json({ status: true }); }); diff --git a/app/server/app/utilities/bap.js b/app/server/app/utilities/bap.js index 2aa95375..d7496b13 100644 --- a/app/server/app/utilities/bap.js +++ b/app/server/app/utilities/bap.js @@ -250,6 +250,7 @@ const { submissionPeriodOpen } = require("../config/formio"); * Primary_Applicant__r: { * attributes: { type: "Contact", url: string } * Id: string + * RecordTypeId: string * FirstName: string * LastName: string * Title: string @@ -259,6 +260,7 @@ const { submissionPeriodOpen } = require("../config/formio"); * Alternate_Applicant__r: { * attributes: { type: "Contact", url: string } * Id: string + * RecordTypeId: string * FirstName: string * LastName: string * Title: string @@ -277,6 +279,7 @@ const { submissionPeriodOpen } = require("../config/formio"); * School_District_Contact__r: { * attributes: { type: "Contact", url: string } * Id: string + * RecordTypeId: string * FirstName: string * LastName: string * Title: string @@ -320,6 +323,7 @@ const { submissionPeriodOpen } = require("../config/formio"); * Contact__r: { * attributes: { type: "Contact", url: string } * Id: string + * RecordTypeId: string * FirstName: string * LastName: string * Title: string @@ -337,6 +341,12 @@ const { submissionPeriodOpen } = require("../config/formio"); * } * } * }[]} frf2024BusRecordsContactsQueries + * @property {{ + * attributes: { type: "RecordType", url: string } + * Id: string + * Name: string + * Description: string + * }[]} frf2024ContactsRecordTypesQuery */ /** @@ -1341,12 +1351,14 @@ async function queryBapFor2024PRFData(req, frfReviewItemId) { // Applicant_Organization__r.Id // Applicant_Organization__r.County__c // Primary_Applicant__r.Id, + // Primary_Applicant__r.RecordTypeId, // Primary_Applicant__r.FirstName, // Primary_Applicant__r.LastName, // Primary_Applicant__r.Title, // Primary_Applicant__r.Email, // Primary_Applicant__r.Phone, // Alternate_Applicant__r.Id, + // Alternate_Applicant__r.RecordTypeId, // Alternate_Applicant__r.FirstName, // Alternate_Applicant__r.LastName, // Alternate_Applicant__r.Title, @@ -1359,6 +1371,7 @@ async function queryBapFor2024PRFData(req, frfReviewItemId) { // CSB_School_District__r.BillingState, // CSB_School_District__r.BillingPostalCode, // School_District_Contact__r.Id, + // School_District_Contact__r.RecordTypeId // School_District_Contact__r.FirstName, // School_District_Contact__r.LastName, // School_District_Contact__r.Title, @@ -1393,12 +1406,14 @@ async function queryBapFor2024PRFData(req, frfReviewItemId) { "Applicant_Organization__r.Id": 1, "Applicant_Organization__r.County__c": 1, "Primary_Applicant__r.Id": 1, + "Primary_Applicant__r.RecordTypeId": 1, "Primary_Applicant__r.FirstName": 1, "Primary_Applicant__r.LastName": 1, "Primary_Applicant__r.Title": 1, "Primary_Applicant__r.Email": 1, "Primary_Applicant__r.Phone": 1, "Alternate_Applicant__r.Id": 1, + "Alternate_Applicant__r.RecordTypeId": 1, "Alternate_Applicant__r.FirstName": 1, "Alternate_Applicant__r.LastName": 1, "Alternate_Applicant__r.Title": 1, @@ -1411,6 +1426,7 @@ async function queryBapFor2024PRFData(req, frfReviewItemId) { "CSB_School_District__r.BillingState": 1, "CSB_School_District__r.BillingPostalCode": 1, "School_District_Contact__r.Id": 1, + "School_District_Contact__r.RecordTypeId": 1, "School_District_Contact__r.FirstName": 1, "School_District_Contact__r.LastName": 1, "School_District_Contact__r.Title": 1, @@ -1426,7 +1442,8 @@ async function queryBapFor2024PRFData(req, frfReviewItemId) { ) .execute(async (err, records) => ((await err) ? err : records)); - const frf2024RecordId = frf2024RecordQuery["0"].Id; + const frf2024Record = frf2024RecordQuery["0"]; + const frf2024RecordId = frf2024Record.Id; // `SELECT // Id @@ -1524,6 +1541,7 @@ async function queryBapFor2024PRFData(req, frfReviewItemId) { // Related_Line_Item__c, // Relationship_Type__c, // Contact__r.Id, + // Contant__r.RecordTypeId, // Contact__r.FirstName, // Contact__r.LastName // Contact__r.Title, @@ -1557,6 +1575,7 @@ async function queryBapFor2024PRFData(req, frfReviewItemId) { Related_Line_Item__c: 1, Relationship_Type__c: 1, "Contact__r.Id": 1, + "Contact__r.RecordTypeId": 1, "Contact__r.FirstName": 1, "Contact__r.LastName": 1, "Contact__r.Title": 1, @@ -1576,10 +1595,51 @@ async function queryBapFor2024PRFData(req, frfReviewItemId) { ) ).flat(); + const recordTypeIds = []; + + recordTypeIds.push(frf2024Record?.Primary_Applicant__r?.RecordTypeId); + recordTypeIds.push(frf2024Record?.Alternate_Applicant__r?.RecordTypeId); + recordTypeIds.push(frf2024Record?.School_District_Contact__r?.RecordTypeId); + + for (const busRecordsContactsQuery of frf2024BusRecordsContactsQueries) { + const { Contact__r } = busRecordsContactsQuery; + recordTypeIds.push(Contact__r?.RecordTypeId); + } + + const uniqueRecordTypeIds = [...new Set(recordTypeIds)].filter(Boolean); + + // `SELECT + // Id, + // Name, + // Description + // FROM + // RecordType + // WHERE + // Id IN(${uniqueRecordTypeIds.map((id) => `'${id}'`)})` + + const frf2024ContactsRecordTypesQuery = + uniqueRecordTypeIds.length === 0 + ? [] + : await bapConnection + .sobject("RecordType") + .find( + { + Id: { $in: uniqueRecordTypeIds }, + }, + { + // "*": 1, + Id: 1, // Salesforce record ID + Name: 1, + Description: 1, + }, + ) + .execute(async (err, records) => ((await err) ? err : records)); + return { frf2024RecordQuery, frf2024BusRecordsQuery, frf2024BusRecordsContactsQueries, + frf2024ContactsRecordTypesQuery, }; } diff --git a/app/server/app/utilities/formio.js b/app/server/app/utilities/formio.js index 3878932b..6dbc1d11 100644 --- a/app/server/app/utilities/formio.js +++ b/app/server/app/utilities/formio.js @@ -503,6 +503,7 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { frf2024RecordQuery, frf2024BusRecordsQuery, frf2024BusRecordsContactsQueries, + frf2024ContactsRecordTypesQuery, } = results; const existingBusOwnerType = "Old Bus Private Fleet Owner (if changed)"; @@ -535,6 +536,7 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { const { Id: contactId, + RecordTypeId, FirstName, LastName, Title, @@ -577,6 +579,10 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { BillingStreet ?? "\n" ).split("\n"); + const orgContactRecordType = frf2024ContactsRecordTypesQuery.find( + (item) => item.Id === RecordTypeId, + ); + array.push({ _bap_org_frf: true, org_number: jsonOrg.org_number, @@ -588,6 +594,7 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { _bap_org_id: orgId, _bap_org_name: orgName, _bap_org_contact_id_frf: contactId, + _bap_org_contact_recordtype: orgContactRecordType?.Name || "", _bap_org_contact_fname: FirstName, _bap_org_contact_lname: LastName, _bap_org_contact_title: Title, @@ -642,12 +649,21 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { item.Relationship_Type__c === newBusOwnerType, ); + const existingOwnerRecordType = frf2024ContactsRecordTypesQuery.find( + (item) => item.Id === existingOwnerRecord?.Contact__r?.RecordTypeId, + ); + + const newOwnerRecordType = frf2024ContactsRecordTypesQuery.find( + (item) => item.Id === newOwnerRecord?.Contact__r?.RecordTypeId, + ); + return { bus_number: Rebate_Item_num__c, bus_existing_owner: { org_id: existingOwnerRecord?.Contact__r?.Account?.Id, org_name: existingOwnerRecord?.Contact__r?.Account?.Name, org_contact_id: existingOwnerRecord?.Contact__r?.Id, + org_contact_recordtype: existingOwnerRecordType?.Name || "", org_contact_fname: existingOwnerRecord?.Contact__r?.FirstName, org_contact_lname: existingOwnerRecord?.Contact__r?.LastName, }, @@ -668,6 +684,7 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { org_id: newOwnerRecord?.Contact__r?.Account?.Id, org_name: newOwnerRecord?.Contact__r?.Account?.Name, org_contact_id: newOwnerRecord?.Contact__r?.Id, + org_contact_recordtype: newOwnerRecordType?.Name || "", org_contact_fname: newOwnerRecord?.Contact__r?.FirstName, org_contact_lname: newOwnerRecord?.Contact__r?.LastName, }, @@ -678,6 +695,18 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { }; }); + const primaryContactRecordType = frf2024ContactsRecordTypesQuery.find( + (item) => item.Id === Primary_Applicant__r?.RecordTypeId, + ); + + const alternateContactRecordType = frf2024ContactsRecordTypesQuery.find( + (item) => item.Id === Alternate_Applicant__r?.RecordTypeId, + ); + + const districtContactRecordType = frf2024ContactsRecordTypesQuery.find( + (item) => item.Id === School_District_Contact__r?.RecordTypeId, + ); + return { data: { _frf_modified: frfModified, @@ -704,12 +733,14 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { _bap_govt_bus_poc_email: GOVT_BUS_POC_EMAIL__c, _bap_alt_govt_bus_poc_email: ALT_GOVT_BUS_POC_EMAIL__c, _bap_primary_id: Primary_Applicant__r?.Id, + _bap_primary_recordtype: primaryContactRecordType?.Name || "", _bap_primary_fname: Primary_Applicant__r?.FirstName, _bap_primary_lname: Primary_Applicant__r?.LastName, _bap_primary_title: Primary_Applicant__r?.Title, _bap_primary_email: Primary_Applicant__r?.Email, _bap_primary_phone: Primary_Applicant__r?.Phone, _bap_alternate_id: Alternate_Applicant__r?.Id, + _bap_alternate_recordtype: alternateContactRecordType?.Name, _bap_alternate_fname: Alternate_Applicant__r?.FirstName, _bap_alternate_lname: Alternate_Applicant__r?.LastName, _bap_alternate_title: Alternate_Applicant__r?.Title, @@ -731,6 +762,7 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { }, _bap_district_self_certify: Self_Certification_Category__c, _bap_district_contact_id: School_District_Contact__r?.Id, + _bap_district_contact_recordtype: districtContactRecordType?.Name || "", // prettier-ignore _bap_district_contact_fname: School_District_Contact__r?.FirstName, _bap_district_contact_lname: School_District_Contact__r?.LastName, _bap_district_contact_title: School_District_Contact__r?.Title, @@ -1999,7 +2031,7 @@ function updateCRFSubmission({ rebateYear, req, res }) { return res.status(errorStatus).json({ message: errorMessage }); }); }) - .catch((error) => { + .catch((_error) => { const logMessage = `User with email '${mail}' attempted to update ${rebateYear} CRF ` + `submission '${rebateId}' when the CSB CRF enrollment period was closed.`;