diff --git a/app/client/src/utilities.ts b/app/client/src/utilities.ts index 7282f1fa..267fe6a8 100644 --- a/app/client/src/utilities.ts +++ b/app/client/src/utilities.ts @@ -36,6 +36,7 @@ type ConfigData = { }; export type BapSamEntity = { + Id: string; ENTITY_COMBO_KEY__c: string; UNIQUE_ENTITY_ID__c: string; ENTITY_EFT_INDICATOR__c: string; diff --git a/app/server/app/routes/bap.js b/app/server/app/routes/bap.js index cc3bc3d8..93b36bd9 100644 --- a/app/server/app/routes/bap.js +++ b/app/server/app/routes/bap.js @@ -51,7 +51,7 @@ router.get("/sam", (req, res) => { entities, }); }) - .catch((error) => { + .catch((_error) => { // NOTE: logged in bap verifyBapConnection const errorStatus = 500; const errorMessage = `Error getting SAM.gov data from the BAP.`; @@ -61,11 +61,9 @@ router.get("/sam", (req, res) => { // --- get user's form submissions statuses from EPA's BAP router.get("/submissions", storeBapComboKeys, (req, res) => { - const { bapComboKeys } = req; - - return getBapFormSubmissionsStatuses(req, bapComboKeys) + return getBapFormSubmissionsStatuses(req) .then((submissions) => res.json(submissions)) - .catch((error) => { + .catch((_error) => { // NOTE: logged in bap verifyBapConnection const errorStatus = 500; const errorMessage = `Error getting form submissions statuses from the BAP.`; diff --git a/app/server/app/utilities/bap.js b/app/server/app/utilities/bap.js index 41e18692..f6daa855 100644 --- a/app/server/app/utilities/bap.js +++ b/app/server/app/utilities/bap.js @@ -8,6 +8,7 @@ const { submissionPeriodOpen } = require("../config/formio"); /** * @typedef {Object} BapSamEntity + * @property {string} Id * @property {string} ENTITY_COMBO_KEY__c * @property {string} ENTITY_STATUS__c * @property {string} UNIQUE_ENTITY_ID__c @@ -114,6 +115,7 @@ const { submissionPeriodOpen } = require("../config/formio"); * JSON_Snapshot__c: string * } * Primary_Applicant__r: { + * Id: string * FirstName: string * LastName: string * Title: string @@ -121,6 +123,7 @@ const { submissionPeriodOpen } = require("../config/formio"); * Phone: string * } | null * Alternate_Applicant__r: { + * Id: string * FirstName: string * LastName: string * Title: string @@ -128,6 +131,7 @@ const { submissionPeriodOpen } = require("../config/formio"); * Phone: string * } | null * CSB_School_District__r: { + * Id: string * Name: string * BillingStreet: string * BillingCity: string @@ -135,6 +139,7 @@ const { submissionPeriodOpen } = require("../config/formio"); * BillingPostalCode: string * } | null * School_District_Contact__r: { + * Id: string * FirstName: string * LastName: string * Title: string @@ -173,7 +178,6 @@ const { submissionPeriodOpen } = require("../config/formio"); * Id: string * Related_Line_Item__c: string * Relationship_Type__c: string - * Contact_Organization_Name__c: string * Contact__r: { * Id: string * FirstName: string @@ -330,10 +334,11 @@ async function queryForSamEntities(req, email) { const logMessage = `Querying the BAP for SAM.gov entities for user with email: '${email}'.`; log({ level: "info", message: logMessage, req }); - /** @type {jsforce.Connection} */ + /** @type {{ bapConnection: jsforce.Connection }} */ const { bapConnection } = req.app.locals; // `SELECT + // Id, // ENTITY_COMBO_KEY__c, // ENTITY_STATUS__c, // UNIQUE_ENTITY_ID__c, @@ -379,6 +384,7 @@ async function queryForSamEntities(req, email) { }, { // "*": 1, + Id: 1, ENTITY_COMBO_KEY__c: 1, ENTITY_STATUS__c: 1, UNIQUE_ENTITY_ID__c: 1, @@ -431,7 +437,7 @@ async function queryForBapFormSubmissionData( `associated with ${logId}.`; log({ level: "info", message: logMessage, req }); - /** @type {jsforce.Connection} */ + /** @type {{ bapConnection: jsforce.Connection }} */ const { bapConnection } = req.app.locals; const developerNameField = { @@ -528,16 +534,18 @@ async function queryForBapFormSubmissionData( * and related metadata. * * @param {express.Request} req - * @param {string[]} comboKeys * @returns {Promise} collection of fields associated with each form submission */ -async function queryForBapFormSubmissionsStatuses(req, comboKeys) { +async function queryForBapFormSubmissionsStatuses(req) { + /** @type {{ bapComboKeys: string[] }} */ + const { bapComboKeys } = req; + const logMessage = `Querying the BAP for form submissions statuses associated with ` + - `combokeys: '${comboKeys}'.`; + `combokeys: '${bapComboKeys}'.`; log({ level: "info", message: logMessage, req }); - /** @type {jsforce.Connection} */ + /** @type {{ bapConnection: jsforce.Connection }} */ const { bapConnection } = req.app.locals; // `SELECT @@ -545,7 +553,7 @@ async function queryForBapFormSubmissionsStatuses(req, comboKeys) { // FROM // Order_Request__c // WHERE - // (${comboKeys + // (${bapComboKeys // .map((key) => `UEI_EFTI_Combo_Key__c = '${key}'`) // .join(" OR ")}) AND // Latest_Version__c = TRUE` @@ -554,7 +562,7 @@ async function queryForBapFormSubmissionsStatuses(req, comboKeys) { .sobject("Order_Request__c") .find( { - UEI_EFTI_Combo_Key__c: { $in: comboKeys }, + UEI_EFTI_Combo_Key__c: { $in: bapComboKeys }, Latest_Version__c: true, }, { @@ -633,7 +641,7 @@ async function queryBapFor2022PRFData(req, frfReviewItemId) { `FRF Review Item ID: '${frfReviewItemId}'.`; log({ level: "info", message: logMessage, req }); - /** @type {jsforce.Connection} */ + /** @type {{ bapConnection: jsforce.Connection }} */ const { bapConnection } = req.app.locals; // `SELECT @@ -797,7 +805,7 @@ async function queryBapFor2023PRFData(req, frfReviewItemId) { `FRF Review Item ID: '${frfReviewItemId}'.`; log({ level: "info", message: logMessage, req }); - /** @type {jsforce.Connection} */ + /** @type {{ bapConnection: jsforce.Connection }} */ const { bapConnection } = req.app.locals; // `SELECT @@ -829,21 +837,25 @@ async function queryBapFor2023PRFData(req, frfReviewItemId) { // `SELECT // Id, // CSB_Snapshot__r.JSON_Snapshot__c + // Primary_Applicant__r.Id, // 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.FirstName, // Alternate_Applicant__r.LastName, // Alternate_Applicant__r.Title, // Alternate_Applicant__r.Email, // Alternate_Applicant__r.Phone, + // CSB_School_District__r.Id, // CSB_School_District__r.Name, // CSB_School_District__r.BillingStreet, // CSB_School_District__r.BillingCity, // CSB_School_District__r.BillingState, // CSB_School_District__r.BillingPostalCode, + // School_District_Contact__r.Id, // School_District_Contact__r.FirstName, // School_District_Contact__r.LastName, // School_District_Contact__r.Title, @@ -874,21 +886,25 @@ async function queryBapFor2023PRFData(req, frfReviewItemId) { // "*": 1, Id: 1, // Salesforce record ID "CSB_Snapshot__r.JSON_Snapshot__c": 1, + "Primary_Applicant__r.Id": 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.FirstName": 1, "Alternate_Applicant__r.LastName": 1, "Alternate_Applicant__r.Title": 1, "Alternate_Applicant__r.Email": 1, "Alternate_Applicant__r.Phone": 1, + "CSB_School_District__r.Id": 1, "CSB_School_District__r.Name": 1, "CSB_School_District__r.BillingStreet": 1, "CSB_School_District__r.BillingCity": 1, "CSB_School_District__r.BillingState": 1, "CSB_School_District__r.BillingPostalCode": 1, + "School_District_Contact__r.Id": 1, "School_District_Contact__r.FirstName": 1, "School_District_Contact__r.LastName": 1, "School_District_Contact__r.Title": 1, @@ -1001,7 +1017,6 @@ async function queryBapFor2023PRFData(req, frfReviewItemId) { // Id, // Related_Line_Item__c, // Relationship_Type__c, - // Contact_Organization_Name__c, // Contact__r.Id, // Contact__r.FirstName, // Contact__r.LastName @@ -1029,7 +1044,6 @@ async function queryBapFor2023PRFData(req, frfReviewItemId) { Id: 1, // Salesforce record ID Related_Line_Item__c: 1, Relationship_Type__c: 1, - Contact_Organization_Name__c: 1, "Contact__r.Id": 1, "Contact__r.FirstName": 1, "Contact__r.LastName": 1, @@ -1081,7 +1095,7 @@ async function queryBapFor2022CRFData(req, frfReviewItemId, prfReviewItemId) { `PRF Review Item ID: '${prfReviewItemId}'.`; log({ level: "info", message: logMessage, req }); - /** @type {jsforce.Connection} */ + /** @type {{ bapConnection: jsforce.Connection }} */ const { bapConnection } = req.app.locals; // `SELECT @@ -1351,7 +1365,7 @@ async function queryBapFor2022CRFData(req, frfReviewItemId, prfReviewItemId) { * @param {any[]} fn.args arguments to pass to the callback function */ function verifyBapConnection(req, { name, args }) { - /** @type {jsforce.Connection} */ + /** @type {{ bapConnection: jsforce.Connection }} */ const { bapConnection } = req.app.locals; function callback() { @@ -1438,13 +1452,12 @@ function getBapFormSubmissionData({ * Fetches form submissions statuses associated with a provided set of combo keys. * * @param {express.Request} req - * @param {string[]} comboKeys * @returns {ReturnType} */ -function getBapFormSubmissionsStatuses(req, comboKeys) { +function getBapFormSubmissionsStatuses(req) { return verifyBapConnection(req, { name: queryForBapFormSubmissionsStatuses, - args: [req, comboKeys], + args: [req], }); } diff --git a/app/server/app/utilities/formio.js b/app/server/app/utilities/formio.js index 41feedb3..7e1d22e0 100644 --- a/app/server/app/utilities/formio.js +++ b/app/server/app/utilities/formio.js @@ -68,6 +68,7 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { } = req.body; const { + Id: entityId, UNIQUE_ENTITY_ID__c, ENTITY_EFT_INDICATOR__c, LEGAL_BUSINESS_NAME__c, @@ -203,16 +204,16 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { ).split("\n"); const org_organizations = frf2023BusRecordsContactsOrgsQueries.reduce( - (array, frf2023BusRecordsContactsOrgs) => { + (array, frf2023BusRecordsContactsOrg) => { const { - Id, + Id: orgId, Name, BillingStreet, BillingCountry, BillingCity, BillingState, BillingPostalCode, - } = frf2023BusRecordsContactsOrgs; + } = frf2023BusRecordsContactsOrg; const jsonOrg = frf2023RecordJson.data.organizations.find( (item) => item.org_orgName === Name, @@ -224,7 +225,7 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { ).split("\n"); const orgContacts = frf2023BusRecordsContactsQueries.filter( - (item) => item.Contact__r.AccountId === Id, + (item) => item.Contact__r.AccountId === orgId, ); const existingBusOwner = orgContacts.some( @@ -235,8 +236,14 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { (item) => item.Relationship_Type__c === newBusOwnerType, ); - const { FirstName, LastName, Title, Email, Phone } = - orgContacts[0].Contact__r ?? {}; + const { + Id: contactId, + FirstName, + LastName, + Title, + Email, + Phone, + } = orgContacts[0].Contact__r ?? {}; array.push({ org_number: jsonOrg.org_number, @@ -246,7 +253,9 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { // privateFleet: false, }, // _org_typeCombined: "", // NOTE: 'Existing Bus Owner, New Bus Owner' - org_orgName: Name, + org_id: orgId, + org_name: Name, + org_contact_id: contactId, org_contactFName: FirstName, org_contactLName: LastName, org_contactTitle: Title, @@ -271,7 +280,7 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { const bus_buses = frf2023BusRecordsQuery.map((frf2023BusRecord) => { const { - Id, + Id: busRecordId, Rebate_Item_num__c, CSB_VIN__c, CSB_Fuel_Type__c, @@ -294,22 +303,32 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { const existingOwnerRecord = frf2023BusRecordsContactsQueries.find( (item) => - item.Related_Line_Item__c === Id && + item.Related_Line_Item__c === busRecordId && item.Relationship_Type__c === existingBusOwnerType, ); const newOwnerRecord = frf2023BusRecordsContactsQueries.find( (item) => - item.Related_Line_Item__c === Id && + item.Related_Line_Item__c === busRecordId && item.Relationship_Type__c === newBusOwnerType, ); + const existingOwnerOrg = frf2023BusRecordsContactsOrgsQueries.find( + (item) => item.Id === existingOwnerRecord?.Contact__r?.AccountId, + ); + + const newOwnerOrg = frf2023BusRecordsContactsOrgsQueries.find( + (item) => item.Id === newOwnerRecord?.Contact__r?.AccountId, + ); + return { bus_busNumber: Rebate_Item_num__c, bus_existingOwner: { - organization: existingOwnerRecord?.Contact_Organization_Name__c, - orgContactFName: existingOwnerRecord?.Contact__r?.FirstName, - orgContactLName: existingOwnerRecord?.Contact__r?.LastName, + org_id: existingOwnerOrg.Id, + org_name: existingOwnerOrg.Name, + org_contact_id: existingOwnerRecord?.Contact__r?.Id, + org_contact_fname: existingOwnerRecord?.Contact__r?.FirstName, + org_contact_lname: existingOwnerRecord?.Contact__r?.LastName, }, bus_existingVin: CSB_VIN__c, bus_existingFuelType: CSB_Fuel_Type__c, @@ -325,9 +344,11 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { bus_existingRemainingLife: Old_Bus_Estimated_Remaining_Life__c, bus_existingIdlingHours: Old_Bus_Annual_Idling_Hours__c, bus_newOwner: { - organization: newOwnerRecord?.Contact_Organization_Name__c, - orgContactFName: newOwnerRecord?.Contact__r?.FirstName, - orgContactLName: newOwnerRecord?.Contact__r?.LastName, + org_id: newOwnerOrg?.Id, + org_name: newOwnerOrg?.Name, + org_contact_id: newOwnerRecord?.Contact__r?.Id, + org_contact_fname: newOwnerRecord?.Contact__r?.FirstName, + org_contact_lname: newOwnerRecord?.Contact__r?.LastName, }, bus_newFuelType: New_Bus_Fuel_Type__c, bus_newGvwr: New_Bus_GVWR__c, @@ -349,6 +370,7 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { _bap_applicant_name: name, _bap_applicant_efti: ENTITY_EFT_INDICATOR__c || "0000", _bap_applicant_uei: UNIQUE_ENTITY_ID__c, + _bap_applicant_organization_id: entityId, _bap_applicant_organization_name: LEGAL_BUSINESS_NAME__c, _bap_applicant_street_address_1: PHYSICAL_ADDRESS_LINE_1__c, _bap_applicant_street_address_2: PHYSICAL_ADDRESS_LINE_2__c, @@ -360,17 +382,20 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { _bap_alt_elec_bus_poc_email: ALT_ELEC_BUS_POC_EMAIL__c, _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_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_number: Primary_Applicant__r?.Phone, + _bap_primary_phone: Primary_Applicant__r?.Phone, + _bap_alternate_id: Alternate_Applicant__r?.Id, _bap_alternate_fname: Alternate_Applicant__r?.FirstName, _bap_alternate_lname: Alternate_Applicant__r?.LastName, _bap_alternate_title: Alternate_Applicant__r?.Title, _bap_alternate_email: Alternate_Applicant__r?.Email, - _bap_alternate_phone_number: Alternate_Applicant__r?.Phone, - _bap_district_ncesID: CSB_NCES_ID__c, + _bap_alternate_phone: Alternate_Applicant__r?.Phone, + _bap_district_id: CSB_School_District__r?.Id, + _bap_district_nces_id: CSB_NCES_ID__c, _bap_district_name: CSB_School_District__r?.Name, _bap_district_address_1: schoolDistrictStreetAddress1 || "", _bap_district_address_2: schoolDistrictStreetAddress2 || "", @@ -378,17 +403,18 @@ function fetchDataForPRFSubmission({ rebateYear, req, res }) { _bap_district_state: CSB_School_District__r?.BillingState, _bap_district_zip: CSB_School_District__r?.BillingPostalCode, _bap_district_priority: School_District_Prioritized__c, - _bap_district_selfCertify: Self_Certification_Category__c, - _bap_district_priorityReason: { + _bap_district_self_certify: Self_Certification_Category__c, + _bap_district_priority_reason: { highNeed: Prioritized_as_High_Need__c, tribal: Prioritized_as_Tribal__c, rural: Prioritized_as_Rural__c, }, - _bap_district_contactFName: School_District_Contact__r?.FirstName, - _bap_district_contactLName: School_District_Contact__r?.LastName, - _bap_district_contactTitle: School_District_Contact__r?.Title, - _bap_district_contactEmail: School_District_Contact__r?.Email, - _bap_district_contactPhone: School_District_Contact__r?.Phone, + _bad_district_contact_id: School_District_Contact__r?.Id, + _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, + _bap_district_contact_email: School_District_Contact__r?.Email, + _bap_district_contact_phone: School_District_Contact__r?.Phone, org_organizations, bus_buses, },