diff --git a/api/src/lib/projectUseCodes.ts b/api/src/lib/projectUseCodes.ts new file mode 100644 index 00000000..f0335bfa --- /dev/null +++ b/api/src/lib/projectUseCodes.ts @@ -0,0 +1,4 @@ +const projectUseCodes = { + '1A': '1A-Broadband Infrastructure', +} +export default projectUseCodes diff --git a/api/src/lib/templateRules.ts b/api/src/lib/templateRules.ts index 1959ca14..e1aafd2f 100644 --- a/api/src/lib/templateRules.ts +++ b/api/src/lib/templateRules.ts @@ -1,7 +1,7 @@ export default { logic: { version: { - version: 'v:20230923', + version: 'v:20231212', key: 'version', index: 0, required: false, @@ -14,6216 +14,914 @@ export default { }, }, ec1: { - Name: { - key: 'Name', + Project_Name__c: { + key: 'Project_Name__c', index: 2, required: true, dataType: 'String', - maxLength: 80, + maxLength: 100, listVals: [], columnName: 'C', humanColName: 'Project Name', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + ecCodes: ['1A', '1B', '1C'], }, - Project_Identification_Number__c: { - key: 'Project_Identification_Number__c', + Identification_Number__c: { + key: 'Identification_Number__c', index: 3, required: true, dataType: 'String', maxLength: 20, listVals: [], columnName: 'D', - humanColName: 'Project Identification Number\r\n(Assigned by recipient)', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Identification Number', + ecCodes: ['1A', '1B', '1C'], }, - Completion_Status__c: { - key: 'Completion_Status__c', + Project_Description__c: { + key: 'Project_Description__c', index: 4, required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Not started', - 'Completed less than 50%', - 'Completed 50% or more', - 'Completed', - 'Cancelled', - ], + dataType: 'String', + maxLength: 3000, + listVals: [], columnName: 'E', - humanColName: 'Status of Completion', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Project Description', + ecCodes: ['1A', '1B', '1C'], }, - Adopted_Budget__c: { - key: 'Adopted_Budget__c', + Capital_Asset_Ownership_Type__c: { + key: 'Capital_Asset_Ownership_Type__c', index: 5, required: true, - dataType: 'Currency', + dataType: 'Pick List', maxLength: null, - listVals: [], - columnName: 'F', - humanColName: 'Adopted Budget', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', + listVals: [ + '1. Private', + '2. State Government', + '3. Municipal or Township Government', + '4. County Government', + '5. Tribal Government', + '6. Co-operative', + '7. Other', ], + columnName: 'F', + humanColName: 'Capital Asset Owenership Type', + ecCodes: ['1A', '1B', '1C'], }, - Total_Obligations__c: { - key: 'Total_Obligations__c', + Total_CPF_Funding_for_Project__c: { + key: 'Total_CPF_Funding_for_Project__c', index: 6, required: true, - dataType: 'Currency', + dataType: 'Currency1', maxLength: null, listVals: [], columnName: 'G', - humanColName: 'Total Cumulative \r\nObligations', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Total CPF Funding for Project', + ecCodes: ['1A', '1B', '1C'], }, - Total_Expenditures__c: { - key: 'Total_Expenditures__c', + Total_from_all_funding_sources__c: { + key: 'Total_from_all_funding_sources__c', index: 7, required: true, - dataType: 'Currency', + dataType: 'Currency1', maxLength: null, listVals: [], columnName: 'H', - humanColName: 'Total Cumulative \r\nExpenditures', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Total From all Funding Sources', + ecCodes: ['1A', '1B', '1C'], }, - Current_Period_Obligations__c: { - key: 'Current_Period_Obligations__c', + Narrative_Description__c: { + key: 'Narrative_Description__c', index: 8, - required: true, - dataType: 'Currency', - maxLength: null, + required: 'Conditional', + dataType: 'String', + maxLength: 3000, listVals: [], columnName: 'I', - humanColName: 'Current Period Obligations', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Narrative Description', + ecCodes: ['1A', '1B', '1C'], }, - Current_Period_Expenditures__c: { - key: 'Current_Period_Expenditures__c', + Current_Period_Obligation__c: { + key: 'Current_Period_Obligation__c', index: 9, required: true, - dataType: 'Currency', + dataType: 'Currency2', maxLength: null, listVals: [], columnName: 'J', - humanColName: 'Current Period Expenditures', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Current Period Obligation ', + ecCodes: ['1A', '1B', '1C'], }, - Project_Description__c: { - key: 'Project_Description__c', + Current_Period_Expenditure__c: { + key: 'Current_Period_Expenditure__c', index: 10, required: true, - dataType: 'String', - maxLength: 1500, + dataType: 'Currency2', + maxLength: null, listVals: [], columnName: 'K', - humanColName: 'Project Description', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Current Period Expenditure', + ecCodes: ['1A', '1B', '1C'], }, - Program_Income_Earned__c: { - key: 'Program_Income_Earned__c', + Cumulative_Obligation__c: { + key: 'Cumulative_Obligation__c', index: 11, - required: false, - dataType: 'Currency', + required: true, + dataType: 'Currency2', maxLength: null, listVals: [], columnName: 'L', - humanColName: 'Program Income Earned', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Cumulative Obligation', + ecCodes: ['1A', '1B', '1C'], }, - Program_Income_Expended__c: { - key: 'Program_Income_Expended__c', + Cumulative_Expenditure__c: { + key: 'Cumulative_Expenditure__c', index: 12, - required: false, - dataType: 'Currency', + required: true, + dataType: 'Currency2', maxLength: null, listVals: [], columnName: 'M', - humanColName: 'Program Income Expended', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Cumulative Expenditure', + ecCodes: ['1A', '1B', '1C'], }, - Primary_Project_Demographics__c: { - key: 'Primary_Project_Demographics__c', + Cost_Overview__c: { + key: 'Cost_Overview__c', index: 13, - required: 'Conditional', + required: true, + dataType: 'String', + maxLength: 3000, + listVals: [], + columnName: 'N', + humanColName: 'Cost Overview', + ecCodes: ['1A', '1B', '1C'], + }, + Project_Status__c: { + key: 'Project_Status__c', + index: 14, + required: true, dataType: 'Pick List', maxLength: null, listVals: [ - '1 Imp General Public', - '2 Imp Low or moderate income HHs or populations', - '3 Imp HHs that experienced unemployment', - '4 Imp HHs that experienced increased food or housing insecurity', - '5 Imp HHs that qualify for certain federal programs', - '6 Imp For services to address lost instructional time in K-12 schools', - '7 Imp Other HHs or populations that experienced a negative economic', - '8 Imp SBs that experienced a negative economic impact', - '9 Imp Classes of SBs designated as negatively economically impacted', - '10 Imp NPs that experienced a negative economic impact specify', - '11 Imp Classes of NPs designated as negatively economically impacted', - '12 Imp Travel tourism or hospitality sectors', - '13 Imp Industry outside the travel tourism or hospitality sectors specify', - '14 Dis Imp Low income HHs and populations', - '15 Dis Imp HHs and populations residing in Qualified Census Tracts', - '16 Dis Imp HHs that qualify for certain federal programs', - '17 Dis Imp HHs receiving services provided by Tribal governments', - '18 Dis Imp HHs residing in the U.S. territories or receiving services', - '19 Dis Imp For services to address educational disparities Title I eligible', - '20 Dis Imp Other HHs or populations that experienced a disproportionate', - '21 Dis Imp SBs operating in Qualified Census Tracts', - '22 Dis Imp SBs operated by Tribal governments or on Tribal lands', - '23 Dis Imp SBs operating in the U.S. territories', - '24 Dis Imp Other SBs Dis Imp by the pandemic specify', - '25 Dis Imp NPs operating in Qualified Census Tracts', - '26 Dis Imp NPs operated by Tribal governments or on Tribal lands', - '27 Dis Imp NPs operating in the U.S. territories', - '28 Dis Imp Other NPs Dis Imp by the pandemic specify', + '1. Not Started', + '2. Less than 50 percent complete', + '3. More than 50 percent complete', + '4. Completed', ], - columnName: 'N', - humanColName: - 'Project Demographic Distribution - Primary Populations Served', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], - }, - Primary_Project_Demographics_Explanation__c: { - key: 'Primary_Project_Demographics_Explanation__c', - index: 14, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], columnName: 'O', - humanColName: 'Primary Project Demographic Explanation', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Project Status', + ecCodes: ['1A', '1B', '1C'], }, - Secondary_Project_Demographics__c: { - key: 'Secondary_Project_Demographics__c', + Projected_Con_Start_Date__c: { + key: 'Projected_Con_Start_Date__c', index: 15, - required: false, - dataType: 'Pick List', + required: 'Conditional', + dataType: 'Date', maxLength: null, - listVals: [ - '1 Imp General Public', - '2 Imp Low or moderate income HHs or populations', - '3 Imp HHs that experienced unemployment', - '4 Imp HHs that experienced increased food or housing insecurity', - '5 Imp HHs that qualify for certain federal programs', - '6 Imp For services to address lost instructional time in K-12 schools', - '7 Imp Other HHs or populations that experienced a negative economic', - '8 Imp SBs that experienced a negative economic impact', - '9 Imp Classes of SBs designated as negatively economically impacted', - '10 Imp NPs that experienced a negative economic impact specify', - '11 Imp Classes of NPs designated as negatively economically impacted', - '12 Imp Travel tourism or hospitality sectors', - '13 Imp Industry outside the travel tourism or hospitality sectors specify', - '14 Dis Imp Low income HHs and populations', - '15 Dis Imp HHs and populations residing in Qualified Census Tracts', - '16 Dis Imp HHs that qualify for certain federal programs', - '17 Dis Imp HHs receiving services provided by Tribal governments', - '18 Dis Imp HHs residing in the U.S. territories or receiving services', - '19 Dis Imp For services to address educational disparities Title I eligible', - '20 Dis Imp Other HHs or populations that experienced a disproportionate', - '21 Dis Imp SBs operating in Qualified Census Tracts', - '22 Dis Imp SBs operated by Tribal governments or on Tribal lands', - '23 Dis Imp SBs operating in the U.S. territories', - '24 Dis Imp Other SBs Dis Imp by the pandemic specify', - '25 Dis Imp NPs operating in Qualified Census Tracts', - '26 Dis Imp NPs operated by Tribal governments or on Tribal lands', - '27 Dis Imp NPs operating in the U.S. territories', - '28 Dis Imp Other NPs Dis Imp by the pandemic specify', - ], + listVals: [], columnName: 'P', - humanColName: - 'Project Demographic Distribution - Additional Populations Served', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Projected Con. Start Date', + ecCodes: ['1A', '1B', '1C'], }, - Secondary_Proj_Demographics_Explanation__c: { - key: 'Secondary_Proj_Demographics_Explanation__c', + Projected_Con_Completion__c: { + key: 'Projected_Con_Completion__c', index: 16, required: 'Conditional', - dataType: 'String', - maxLength: 250, + dataType: 'Date', + maxLength: null, listVals: [], columnName: 'Q', - humanColName: 'Secondary Project Demographic Explanation', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Projected Con. Completion', + ecCodes: ['1A', '1B', '1C'], }, - Tertiary_Project_Demographics__c: { - key: 'Tertiary_Project_Demographics__c', + Projected_Init_of_Operations__c: { + key: 'Projected_Init_of_Operations__c', index: 17, - required: false, - dataType: 'Pick List', + required: 'Conditional', + dataType: 'Date', maxLength: null, - listVals: [ - '1 Imp General Public', - '2 Imp Low or moderate income HHs or populations', - '3 Imp HHs that experienced unemployment', - '4 Imp HHs that experienced increased food or housing insecurity', - '5 Imp HHs that qualify for certain federal programs', - '6 Imp For services to address lost instructional time in K-12 schools', - '7 Imp Other HHs or populations that experienced a negative economic', - '8 Imp SBs that experienced a negative economic impact', - '9 Imp Classes of SBs designated as negatively economically impacted', - '10 Imp NPs that experienced a negative economic impact specify', - '11 Imp Classes of NPs designated as negatively economically impacted', - '12 Imp Travel tourism or hospitality sectors', - '13 Imp Industry outside the travel tourism or hospitality sectors specify', - '14 Dis Imp Low income HHs and populations', - '15 Dis Imp HHs and populations residing in Qualified Census Tracts', - '16 Dis Imp HHs that qualify for certain federal programs', - '17 Dis Imp HHs receiving services provided by Tribal governments', - '18 Dis Imp HHs residing in the U.S. territories or receiving services', - '19 Dis Imp For services to address educational disparities Title I eligible', - '20 Dis Imp Other HHs or populations that experienced a disproportionate', - '21 Dis Imp SBs operating in Qualified Census Tracts', - '22 Dis Imp SBs operated by Tribal governments or on Tribal lands', - '23 Dis Imp SBs operating in the U.S. territories', - '24 Dis Imp Other SBs Dis Imp by the pandemic specify', - '25 Dis Imp NPs operating in Qualified Census Tracts', - '26 Dis Imp NPs operated by Tribal governments or on Tribal lands', - '27 Dis Imp NPs operating in the U.S. territories', - '28 Dis Imp Other NPs Dis Imp by the pandemic specify', - ], + listVals: [], columnName: 'R', - humanColName: - 'Project Demographic Distribution - Additional Populations Served', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Projected Init. of Operations', + ecCodes: ['1A', '1B', '1C'], }, - Tertiary_Proj_Demographics_Explanation__c: { - key: 'Tertiary_Proj_Demographics_Explanation__c', + Actual_Con_Start_Date__c: { + key: 'Actual_Con_Start_Date__c', index: 18, required: 'Conditional', - dataType: 'String', - maxLength: 250, + dataType: 'Date', + maxLength: null, listVals: [], columnName: 'S', - humanColName: 'Tertiary Project Demographic Explanation', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Actual Con. Start Date', + ecCodes: ['1A', '1B', '1C'], }, - Structure_Objectives_of_Asst_Programs__c: { - key: 'Structure_Objectives_of_Asst_Programs__c', + Actual_Con_Completion__c: { + key: 'Actual_Con_Completion__c', index: 19, required: 'Conditional', - dataType: 'String', - maxLength: 250, + dataType: 'Date', + maxLength: null, listVals: [], columnName: 'T', - humanColName: 'Structure and objectives of assistance program', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Actual Con. Completion', + ecCodes: ['1A', '1B', '1C'], }, - Recipient_Approach_Description__c: { - key: 'Recipient_Approach_Description__c', + Operations_intiated__c: { + key: 'Operations_intiated__c', index: 20, required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], + dataType: 'Pick List', + maxLength: null, + listVals: ['Yes', 'No'], columnName: 'U', - humanColName: 'Recipients approach', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Operations Initiated', + ecCodes: ['1A', '1B', '1C'], }, - Spending_Allocated_Toward_Evidence_Based_Interventions: { - key: 'Spending_Allocated_Toward_Evidence_Based_Interventions', + Actual_operations_date__c: { + key: 'Actual_operations_date__c', index: 21, required: 'Conditional', - dataType: 'Currency', + dataType: 'Date', maxLength: null, listVals: [], columnName: 'V', - humanColName: - 'Identify the dollar amount of the total project spending that is allocated towards evidence-based interventions', - ecCodes: ['1.4', '1.11', '1.12', '1.13'], + humanColName: 'Actual operations date', + ecCodes: ['1A', '1B', '1C'], }, - Whether_program_evaluation_is_being_conducted: { - key: 'Whether_program_evaluation_is_being_conducted', + Operations_explanation__c: { + key: 'Operations_explanation__c', index: 22, required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], + dataType: 'String', + maxLength: 3000, + listVals: [], columnName: 'W', - humanColName: 'Is a program evaluation of the project being conducted?', - ecCodes: ['1.4', '1.11', '1.12', '1.13'], + humanColName: 'Operations explanation', + ecCodes: ['1A', '1B', '1C'], }, - Small_Businesses_Served__c: { - key: 'Small_Businesses_Served__c', + Other_Federal_Funding__c: { + key: 'Other_Federal_Funding__c', index: 23, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], + required: true, + dataType: 'Pick List', + maxLength: null, + listVals: ['Yes', 'No'], columnName: 'X', - humanColName: 'Number of Small Businesses Served ', - ecCodes: ['1.8'], + humanColName: 'Other Federal Funding?', + ecCodes: ['1A', '1B', '1C'], }, - Number_Non_Profits_Served__c: { - key: 'Number_Non_Profits_Served__c', + Matching_Funds__c: { + key: 'Matching_Funds__c', index: 24, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'Y', - humanColName: 'Non-Profits Served', - ecCodes: ['1.9'], - }, - Does_Project_Include_Capital_Expenditure__c: { - key: 'Does_Project_Include_Capital_Expenditure__c', - index: 25, required: true, dataType: 'Pick List', maxLength: null, listVals: ['Yes', 'No'], + columnName: 'Y', + humanColName: 'Matching Funds?', + ecCodes: ['1A', '1B', '1C'], + }, + Program_Information__c: { + key: 'Program_Information__c', + index: 25, + required: 'Conditional', + dataType: 'String', + maxLength: 50, + listVals: [], columnName: 'Z', - humanColName: 'Does this project include a capital expenditure?', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Program Information', + ecCodes: ['1A', '1B', '1C'], }, - Total_Cost_Capital_Expenditure__c: { - key: 'Total_Cost_Capital_Expenditure__c', + Amount_of_Matching_Funds__c: { + key: 'Amount_of_Matching_Funds__c', index: 26, required: 'Conditional', - dataType: 'Currency', + dataType: 'Currency2', maxLength: null, listVals: [], columnName: 'AA', - humanColName: 'If yes, what is the total expected capital expenditure?', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Amount of Matching Funds', + ecCodes: ['1A', '1B', '1C'], }, - Type_of_Capital_Expenditure__c: { - key: 'Type_of_Capital_Expenditure__c', + Target_Project_Info__c: { + key: 'Target_Project_Info__c', index: 27, required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Acquisition of equipment for COVID-19 prevention and treatment', - 'Adaptations to congregate living facilities', - 'Affordable housing supportive housing or recovery housing', - 'Behavioral health facilities and equipment', - 'Childcare, daycare, and early learning facilities', - 'COVID-19 testing sites and laboratories', - 'COVID-19 vaccination sites', - 'Devices and equipment that assist households in accessing the internet', - 'Emergency operations centers and acquisition of emergency response equipment', - 'Food banks and other facilities', - 'Improvements to existing facilities', - 'Installation and improvement of ventilation systems', - 'Job and workforce training centers', - 'Medical equipment and facilities', - 'Medical facilities generally dedicated to COVID-19 treatment and mitigation', - 'Mitigation measures in small businesses, nonprofits, and impacted industries', - 'Parks, green spaces, recreational facilities, sidewalks', - 'Public health data systems', - 'Rehabilitations, renovation, remediation, cleanup, or conversions', - 'Schools and other educational facilities', - 'Technology and equipment to allow law enforcement', - 'Technology and tools', - 'Technology infrastructure to adapt government operations', - 'Temporary medical facilities and other measures', - 'Transitional shelters', - 'Other (please specify)', - ], + dataType: 'String', + maxLength: 3000, + listVals: [], columnName: 'AB', - humanColName: 'Capital Expenditure Type', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Target Project Info', + ecCodes: ['1A', '1B', '1C'], }, - Type_of_Capital_Expenditure_Other__c: { - key: 'Type_of_Capital_Expenditure_Other__c', + Davis_Bacon_Certification__c: { + key: 'Davis_Bacon_Certification__c', index: 28, required: 'Conditional', - dataType: 'String', - maxLength: 255, - listVals: [], + dataType: 'Pick List', + maxLength: null, + listVals: ['Yes', 'No'], columnName: 'AC', - humanColName: 'Other Capital Expenditure Explanation', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Davis Bacon Certification?', + ecCodes: ['1A', '1B', '1C'], }, - Capital_Expenditure_Justification__c: { - key: 'Capital_Expenditure_Justification__c', + Number_of_Direct_Employees__c: { + key: 'Number_of_Direct_Employees__c', index: 29, required: 'Conditional', - dataType: 'String', - maxLength: 1500, + dataType: 'Numeric', + maxLength: 99999999999, listVals: [], columnName: 'AD', - humanColName: 'Capital Expenditure Narrative', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Number of Direct Employees', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)1': { - key: '(manual entry)1', + Number_of_Contractor_Employees__c: { + key: 'Number_of_Contractor_Employees__c', index: 30, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], + required: 'Conditional', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], columnName: 'AE', - humanColName: - 'If budget is over $10M, was a Davis Bacon Act Certification completed?', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Number of Contractor Employees', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)2': { - key: '(manual entry)2', + Number_of_3rd_Party_Employees__c: { + key: 'Number_of_3rd_Party_Employees__c', index: 31, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 999999999999, listVals: [], columnName: 'AF', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the number of employees of contractors and sub-contractors working on the project.', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Number of 3rd Party Employees', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)3': { - key: '(manual entry)3', + Any_Wages_Less_Than_Prevailing__c: { + key: 'Any_Wages_Less_Than_Prevailing__c', index: 32, - required: 'Required if DB is No', - dataType: 'TBD', + required: 'Conditional', + dataType: 'Pick List', maxLength: null, - listVals: [], + listVals: ['Yes', 'No'], columnName: 'AG', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the number of employees on the project hired directly and hired through a third party. ', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Any Wages Less Than Prevailing?', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)4': { - key: '(manual entry)4', + Wages_and_benefits__c: { + key: 'Wages_and_benefits__c', index: 33, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, + required: 'Conditional', + dataType: 'String', + maxLength: 3000, listVals: [], columnName: 'AH', humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the wages and benefits of workers on the project by classification', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + 'Wages and benefits of workers on the project by classification', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)5': { - key: '(manual entry)5', + Project_Labor_Certification__c: { + key: 'Project_Labor_Certification__c', index: 34, - required: 'Required if DB is No', - dataType: 'TBD', + required: 'Conditional', + dataType: 'Pick List', maxLength: null, listVals: ['Yes', 'No'], columnName: 'AI', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - are those wages are at rates less than those prevailing?', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Project Labor Certification?', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)6': { - key: '(manual entry)6', + Assurance_of_Adequate_Labor__c: { + key: 'Assurance_of_Adequate_Labor__c', index: 35, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], + required: 'Conditional', + dataType: 'String', + maxLength: 3000, + listVals: [], columnName: 'AJ', - humanColName: - 'If budget is over $10M, was a Labor Agreement Certification completed?', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Assurance of Adequate Labor?', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)7': { - key: '(manual entry)7', + Minimizing_Risks__c: { + key: 'Minimizing_Risks__c', index: 36, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, + required: 'Conditional', + dataType: 'String', + maxLength: 3000, listVals: [], columnName: 'AK', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will ensure the project has ready access to a sufficient supply of appropriately skilled and unskilled labor to ensure high-quality construction throughout the life of the project, including a description of any required professional certifications and/or in-house training. ', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Minimizing Risks?', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)8': { - key: '(manual entry)8', + Safe_and_Healthy_Workplace__c: { + key: 'Safe_and_Healthy_Workplace__c', index: 37, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, + required: 'Conditional', + dataType: 'String', + maxLength: 3000, listVals: [], columnName: 'AL', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will minimize risks of labor disputes and disruptions that would jeopardize timeliness and cost-effectiveness of the project.', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Explain Safe and Healthy Workplace', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)9': { - key: '(manual entry)9', + Adequate_Wages__c: { + key: 'Adequate_Wages__c', index: 38, - required: 'Required if PLA is No', - dataType: 'TBD', + required: 'Conditional', + dataType: 'Pick List', maxLength: null, - listVals: [], + listVals: ['Yes', 'No'], columnName: 'AM', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will provide a safe and healthy workplace that avoids delays and costs associated with workplace illnesses, injuries, and fatalities, including descriptions of safety training, certification, and/or licensure requirements for all relevant workers (e.g., OSHA 10, OSHA 30).', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Adequate Wages?', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)10': { - key: '(manual entry)10', + Project_Labor_Agreement__c: { + key: 'Project_Labor_Agreement__c', index: 39, - required: 'Required if PLA is No', - dataType: 'TBD', + required: 'Conditional', + dataType: 'Pick List', maxLength: null, listVals: ['Yes', 'No'], columnName: 'AN', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter whether workers on the project will receive wages and benefits that will secure an appropriately skilled workforce in the context of the local or regional labor market.', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Project Labor Agreement?', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)11': { - key: '(manual entry)11', + Prioritize_Local_Hires__c: { + key: 'Prioritize_Local_Hires__c', index: 40, - required: 'Required if PLA is No', - dataType: 'TBD', + required: 'Conditional', + dataType: 'Pick List', maxLength: null, listVals: ['Yes', 'No'], columnName: 'AO', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter whether the project has completed a project labor agreement. ', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Prioritize Local Hires?', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)12': { - key: '(manual entry)12', + Community_Benefit_Agreement__c: { + key: 'Community_Benefit_Agreement__c', index: 41, - required: 'Required if Budget > $10M', + required: 'Conditional', dataType: 'Pick List', maxLength: null, listVals: ['Yes', 'No'], columnName: 'AP', - humanColName: - 'If budget is over $10M, does the project prioritize local hires? ', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Community Benefit Agreement?', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)13': { - key: '(manual entry)13', + Description_of_Community_Ben_Agr__c: { + key: 'Description_of_Community_Ben_Agr__c', index: 42, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], + required: 'Conditional', + dataType: 'String', + maxLength: 3000, + listVals: [], columnName: 'AQ', - humanColName: - 'If budget is over $10M, does the project have a Community Benefit Agreement?', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Description of Community Ben. Agr.', + ecCodes: ['1A', '1B', '1C'], }, - '(manual entry)14': { - key: '(manual entry)14', + Technology_Type_Planned__c: { + key: 'Technology_Type_Planned__c', index: 43, - required: 'Required if Budget > $10M', - dataType: 'TBD', + required: true, + dataType: 'Pick List', maxLength: null, - listVals: [], - columnName: 'AR', - humanColName: - 'If budget is over $10M and has a Community Benefit Agreement, provide a description. ', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', + listVals: [ + '1. Fiber', + '2. Coaxial Cable', + '3. Fixed Wireless', + '4. Other', ], + columnName: 'AR', + humanColName: 'Technology Type (Planned)', + ecCodes: ['1A'], }, - Number_Workers_Enrolled_Sectoral__c: { - key: 'Number_Workers_Enrolled_Sectoral__c', + Technology_Type_Actual__c: { + key: 'Technology_Type_Actual__c', index: 44, required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], + dataType: 'Pick List', + maxLength: null, + listVals: [ + '1. Fiber', + '2. Coaxial Cable', + '3. Fixed Wireless', + '4. Other', + ], columnName: 'AS', - humanColName: - 'Number of workers enrolled in sectoral job training programs', - ecCodes: ['1.11'], + humanColName: 'Technology Type (Actual)', + ecCodes: ['1A'], }, - Number_Workers_Competing_Sectoral__c: { - key: 'Number_Workers_Competing_Sectoral__c', + If_Other_Specify_Planned__c: { + key: 'If_Other_Specify_Planned__c', index: 45, required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, + dataType: 'String', + maxLength: 3000, listVals: [], columnName: 'AT', - humanColName: - 'Number of workers completing sectoral job training programs ', - ecCodes: ['1.11'], + humanColName: 'If Other, Specify (Planned)?', + ecCodes: ['1A'], }, - Number_People_Summer_Youth__c: { - key: 'Number_People_Summer_Youth__c', + If_Other_Specify_Actual__c: { + key: 'If_Other_Specify_Actual__c', index: 46, required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, + dataType: 'String', + maxLength: 3000, listVals: [], columnName: 'AU', - humanColName: - 'Number of people participating in summer youth employment programs', - ecCodes: ['1.11'], + humanColName: 'If Other, Specify (Actual?)?', + ecCodes: ['1A'], }, - Cancellation_Reason__c: { - key: 'Cancellation_Reason__c', + Total_Miles_Planned__c: { + key: 'Total_Miles_Planned__c', index: 47, - required: 'Conditional', - dataType: 'String', - maxLength: 255, + required: true, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], columnName: 'AV', - humanColName: 'Cancelled Status of Completion Explanation', - ecCodes: [ - '1.1', - '1.2', - '1.3', - '1.4', - '1.5', - '1.6', - '1.7', - '1.8', - '1.9', - '1.10', - '1.11', - '1.12', - '1.13', - '1.14', - ], + humanColName: 'Total Miles of Fiber Deployed (Planned)', + ecCodes: ['1A'], }, - }, - ec2: { - Name: { - key: 'Name', - index: 2, - required: true, - dataType: 'String', - maxLength: 150, + Total_Miles_Actual__c: { + key: 'Total_Miles_Actual__c', + index: 48, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'C', - humanColName: 'Project Name', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'AW', + humanColName: 'Total Miles of Fiber Deployed (Actual)', + ecCodes: ['1A'], }, - Project_Identification_Number__c: { - key: 'Project_Identification_Number__c', - index: 3, + Locations_Served_Planned__c: { + key: 'Locations_Served_Planned__c', + index: 49, required: true, - dataType: 'String', - maxLength: 20, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'D', - humanColName: 'Project Identification Number\r\n(Assigned by recipient)', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - Completion_Status__c: { - key: 'Completion_Status__c', - index: 4, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Not started', - 'Completed less than 50%', - 'Completed 50% or more', - 'Completed', - 'Cancelled', - ], - columnName: 'E', - humanColName: 'Status of Completion', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'AX', + humanColName: 'A) Total Number of Locations Served (Planned)', + ecCodes: ['1A'], }, - Adopted_Budget__c: { - key: 'Adopted_Budget__c', - index: 5, - required: true, - dataType: 'Currency', - maxLength: null, + Locations_Served_Actual__c: { + key: 'Locations_Served_Actual__c', + index: 50, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'F', - humanColName: 'Adopted Budget', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'AY', + humanColName: 'A) Total Number of Locations Served (Actual)', + ecCodes: ['1A'], }, - Total_Obligations__c: { - key: 'Total_Obligations__c', - index: 6, + X25_3_Mbps_or_below_Planned__c: { + key: 'X25_3_Mbps_or_below_Planned__c', + index: 51, required: true, - dataType: 'Currency', - maxLength: null, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'G', - humanColName: 'Total Cumulative\r\nObligations', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'AZ', + humanColName: 'B) Less than 25/3 Mbps (Planned)', + ecCodes: ['1A'], }, - Total_Expenditures__c: { - key: 'Total_Expenditures__c', - index: 7, + X25_3_Mbps_and_100_20_Mbps_Planned__c: { + key: 'X25_3_Mbps_and_100_20_Mbps_Planned__c', + index: 52, required: true, - dataType: 'Currency', - maxLength: null, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'H', - humanColName: 'Total Cumulative\r\nExpenditures', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BA', + humanColName: 'C) 25/3 Mbps and 100/20 Mbps (Planned)', + ecCodes: ['1A'], }, - Current_Period_Obligations__c: { - key: 'Current_Period_Obligations__c', - index: 8, + Minimum_100_100_Mbps_Planned__c: { + key: 'Minimum_100_100_Mbps_Planned__c', + index: 53, required: true, - dataType: 'Currency', - maxLength: null, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'I', - humanColName: 'Current Period Obligations', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BB', + humanColName: 'D) Minimum 100/100 Mbps (Planned) ', + ecCodes: ['1A'], }, - Current_Period_Expenditures__c: { - key: 'Current_Period_Expenditures__c', - index: 9, - required: true, - dataType: 'Currency', - maxLength: null, + Minimum_100_100_Mbps_Actual__c: { + key: 'Minimum_100_100_Mbps_Actual__c', + index: 54, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'J', - humanColName: 'Current Period Expenditures', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BC', + humanColName: 'D) Minimum 100/100 Mbps (Actual) ', + ecCodes: ['1A'], }, - Project_Description__c: { - key: 'Project_Description__c', - index: 10, + X100_20_Mbps_to_100_100_Mbps_Planned__c: { + key: 'X100_20_Mbps_to_100_100_Mbps_Planned__c', + index: 55, required: true, - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'K', - humanColName: 'Project Description', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - Program_Income_Earned__c: { - key: 'Program_Income_Earned__c', - index: 11, - required: false, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'L', - humanColName: 'Program Income Earned', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - Program_Income_Expended__c: { - key: 'Program_Income_Expended__c', - index: 12, - required: false, - dataType: 'Currency', - maxLength: null, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'M', - humanColName: 'Program Income Expended', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BD', + humanColName: 'E) 100/20 Mbps to 100/100 Mbps (Planned)', + ecCodes: ['1A'], }, - Primary_Project_Demographics__c: { - key: 'Primary_Project_Demographics__c', - index: 13, + X100_20_Mbps_to_100_100_Mbps_Actual__c: { + key: 'X100_20_Mbps_to_100_100_Mbps_Actual__c', + index: 56, required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [ - '1 Imp General Public', - '2 Imp Low or moderate income HHs or populations', - '3 Imp HHs that experienced unemployment', - '4 Imp HHs that experienced increased food or housing insecurity', - '5 Imp HHs that qualify for certain federal programs', - '6 Imp For services to address lost instructional time in K-12 schools', - '7 Imp Other HHs or populations that experienced a negative economic', - '8 Imp SBs that experienced a negative economic impact', - '9 Imp Classes of SBs designated as negatively economically impacted', - '10 Imp NPs that experienced a negative economic impact specify', - '11 Imp Classes of NPs designated as negatively economically impacted', - '12 Imp Travel tourism or hospitality sectors', - '13 Imp Industry outside the travel tourism or hospitality sectors specify', - '14 Dis Imp Low income HHs and populations', - '15 Dis Imp HHs and populations residing in Qualified Census Tracts', - '16 Dis Imp HHs that qualify for certain federal programs', - '17 Dis Imp HHs receiving services provided by Tribal governments', - '18 Dis Imp HHs residing in the U.S. territories or receiving services', - '19 Dis Imp For services to address educational disparities Title I eligible', - '20 Dis Imp Other HHs or populations that experienced a disproportionate', - '21 Dis Imp SBs operating in Qualified Census Tracts', - '22 Dis Imp SBs operated by Tribal governments or on Tribal lands', - '23 Dis Imp SBs operating in the U.S. territories', - '24 Dis Imp Other SBs Dis Imp by the pandemic specify', - '25 Dis Imp NPs operating in Qualified Census Tracts', - '26 Dis Imp NPs operated by Tribal governments or on Tribal lands', - '27 Dis Imp NPs operating in the U.S. territories', - '28 Dis Imp Other NPs Dis Imp by the pandemic specify', - ], - columnName: 'N', - humanColName: - 'Project Demographic Distribution - Primary Populations Served', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + dataType: 'Numeric', + maxLength: 999999999, + listVals: [], + columnName: 'BE', + humanColName: 'E) 100/20 Mbps to 100/100 Mbps (Actual)', + ecCodes: ['1A'], }, - Primary_Project_Demographics_Explanation__c: { - key: 'Primary_Project_Demographics_Explanation__c', - index: 14, + Explanation_of_Discrepancy__c: { + key: 'Explanation_of_Discrepancy__c', + index: 57, required: 'Conditional', dataType: 'String', - maxLength: 250, + maxLength: 3000, listVals: [], - columnName: 'O', - humanColName: 'Primary Project Demographic Explanation', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BF', + humanColName: 'Explanation of Discrepancy (Location by Speed)', + ecCodes: ['1A'], }, - Secondary_Project_Demographics__c: { - key: 'Secondary_Project_Demographics__c', - index: 15, - required: false, - dataType: 'Pick List', - maxLength: null, - listVals: [ - '1 Imp General Public', - '2 Imp Low or moderate income HHs or populations', - '3 Imp HHs that experienced unemployment', - '4 Imp HHs that experienced increased food or housing insecurity', - '5 Imp HHs that qualify for certain federal programs', - '6 Imp For services to address lost instructional time in K-12 schools', - '7 Imp Other HHs or populations that experienced a negative economic', - '8 Imp SBs that experienced a negative economic impact', - '9 Imp Classes of SBs designated as negatively economically impacted', - '10 Imp NPs that experienced a negative economic impact specify', - '11 Imp Classes of NPs designated as negatively economically impacted', - '12 Imp Travel tourism or hospitality sectors', - '13 Imp Industry outside the travel tourism or hospitality sectors specify', - '14 Dis Imp Low income HHs and populations', - '15 Dis Imp HHs and populations residing in Qualified Census Tracts', - '16 Dis Imp HHs that qualify for certain federal programs', - '17 Dis Imp HHs receiving services provided by Tribal governments', - '18 Dis Imp HHs residing in the U.S. territories or receiving services', - '19 Dis Imp For services to address educational disparities Title I eligible', - '20 Dis Imp Other HHs or populations that experienced a disproportionate', - '21 Dis Imp SBs operating in Qualified Census Tracts', - '22 Dis Imp SBs operated by Tribal governments or on Tribal lands', - '23 Dis Imp SBs operating in the U.S. territories', - '24 Dis Imp Other SBs Dis Imp by the pandemic specify', - '25 Dis Imp NPs operating in Qualified Census Tracts', - '26 Dis Imp NPs operated by Tribal governments or on Tribal lands', - '27 Dis Imp NPs operating in the U.S. territories', - '28 Dis Imp Other NPs Dis Imp by the pandemic specify', - ], - columnName: 'P', + Number_of_Locations_Planned__c: { + key: 'Number_of_Locations_Planned__c', + index: 58, + required: true, + dataType: 'Numeric', + maxLength: 999999999, + listVals: [], + columnName: 'BG', humanColName: - 'Project Demographic Distribution - Secondary Populations Served', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + 'F) Total Number of Locations Served by Type - Residential (Planned)', + ecCodes: ['1A'], }, - Secondary_Proj_Demographics_Explanation__c: { - key: 'Secondary_Proj_Demographics_Explanation__c', - index: 16, + Number_of_Locations_Actual__c: { + key: 'Number_of_Locations_Actual__c', + index: 59, required: 'Conditional', - dataType: 'String', - maxLength: 250, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'Q', - humanColName: 'Secondary Project Demographic Explanation', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - Tertiary_Project_Demographics__c: { - key: 'Tertiary_Project_Demographics__c', - index: 17, - required: false, - dataType: 'Pick List', - maxLength: null, - listVals: [ - '1 Imp General Public', - '2 Imp Low or moderate income HHs or populations', - '3 Imp HHs that experienced unemployment', - '4 Imp HHs that experienced increased food or housing insecurity', - '5 Imp HHs that qualify for certain federal programs', - '6 Imp For services to address lost instructional time in K-12 schools', - '7 Imp Other HHs or populations that experienced a negative economic', - '8 Imp SBs that experienced a negative economic impact', - '9 Imp Classes of SBs designated as negatively economically impacted', - '10 Imp NPs that experienced a negative economic impact specify', - '11 Imp Classes of NPs designated as negatively economically impacted', - '12 Imp Travel tourism or hospitality sectors', - '13 Imp Industry outside the travel tourism or hospitality sectors specify', - '14 Dis Imp Low income HHs and populations', - '15 Dis Imp HHs and populations residing in Qualified Census Tracts', - '16 Dis Imp HHs that qualify for certain federal programs', - '17 Dis Imp HHs receiving services provided by Tribal governments', - '18 Dis Imp HHs residing in the U.S. territories or receiving services', - '19 Dis Imp For services to address educational disparities Title I eligible', - '20 Dis Imp Other HHs or populations that experienced a disproportionate', - '21 Dis Imp SBs operating in Qualified Census Tracts', - '22 Dis Imp SBs operated by Tribal governments or on Tribal lands', - '23 Dis Imp SBs operating in the U.S. territories', - '24 Dis Imp Other SBs Dis Imp by the pandemic specify', - '25 Dis Imp NPs operating in Qualified Census Tracts', - '26 Dis Imp NPs operated by Tribal governments or on Tribal lands', - '27 Dis Imp NPs operating in the U.S. territories', - '28 Dis Imp Other NPs Dis Imp by the pandemic specify', - ], - columnName: 'R', + columnName: 'BH', humanColName: - 'Project Demographic Distribution - Tertiary Populations Served', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + 'F) Total Number of Locations Served by Type - Residential (Actual)', + ecCodes: ['1A'], }, - Tertiary_Proj_Demographics_Explanation__c: { - key: 'Tertiary_Proj_Demographics_Explanation__c', - index: 18, - required: 'Conditional', - dataType: 'String', - maxLength: 250, + Housing_Units_Planned__c: { + key: 'Housing_Units_Planned__c', + index: 60, + required: true, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'S', - humanColName: 'Tertiary Project Demographic Explanation', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BI', + humanColName: 'G) Total Housing Units (Planned)', + ecCodes: ['1A'], }, - Structure_Objectives_of_Asst_Programs__c: { - key: 'Structure_Objectives_of_Asst_Programs__c', - index: 19, + Housing_Units_Actual__c: { + key: 'Housing_Units_Actual__c', + index: 61, required: 'Conditional', - dataType: 'String', - maxLength: 250, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'T', - humanColName: - 'Brief description of structure and objectives of assistance program(s), including public health or negative economic impact experienced.', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BJ', + humanColName: 'G) Total Housing Units (Actual)', + ecCodes: ['1A'], }, - Recipient_Approach_Description__c: { - key: 'Recipient_Approach_Description__c', - index: 20, - required: 'Conditional', - dataType: 'String', - maxLength: 250, + Number_of_Bus_Locations_Planned__c: { + key: 'Number_of_Bus_Locations_Planned__c', + index: 62, + required: true, + dataType: 'Numeric', + maxLength: 999999999, listVals: [], - columnName: 'U', + columnName: 'BK', humanColName: - 'Brief description of how a recipient’s response is related and reasonably and proportional to a public health or negative economic impact of COVID-19.', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + 'H) Total Number of Locations Served by Type - Business (Planned)', + ecCodes: ['1A'], }, - Individuals_Served__c: { - key: 'Individuals_Served__c', - index: 21, + Number_of_Bus_Locations_Actual__c: { + key: 'Number_of_Bus_Locations_Actual__c', + index: 63, required: 'Conditional', dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'V', - humanColName: 'Number of households served', - ecCodes: ['2.1', '2.2', '2.3', '2.4', '2.5', '2.6', '2.7', '2.8'], - }, - Spending_Allocated_Toward_Evidence_Based_Interventions: { - key: 'Spending_Allocated_Toward_Evidence_Based_Interventions', - index: 22, - required: 'Conditional', - dataType: 'Currency', - maxLength: null, + maxLength: 999999999, listVals: [], - columnName: 'W', + columnName: 'BL', humanColName: - 'The dollar amount of the total project spending that is allocated towards evidence-based interventions', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.6', - '2.7', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.25', - '2.26', - '2.30', - '2.32', - '2.33', - '2.37', - ], + 'H) Total Number of Locations Served by Type - Business (Actual)', + ecCodes: ['1A'], }, - Whether_program_evaluation_is_being_conducted: { - key: 'Whether_program_evaluation_is_being_conducted', - index: 23, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'X', + Number_of_CAI_Planned__c: { + key: 'Number_of_CAI_Planned__c', + index: 64, + required: true, + dataType: 'Numeric', + maxLength: 999999999, + listVals: [], + columnName: 'BM', humanColName: - 'Indicate if a program evaluation of the project is being conducted ', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.6', - '2.7', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.25', - '2.26', - '2.30', - '2.32', - '2.33', - '2.37', - ], + 'I) Total Number of Locations Served by Type - Community Anchor Institution (Planned)', + ecCodes: ['1A'], }, - Small_Businesses_Served__c: { - key: 'Small_Businesses_Served__c', - index: 24, + Number_of_CAI_Actual__c: { + key: 'Number_of_CAI_Actual__c', + index: 65, required: 'Conditional', dataType: 'Numeric', - maxLength: 9999999999, + maxLength: 999999999, listVals: [], - columnName: 'Y', + columnName: 'BN', humanColName: - 'Number of small businesses served (by program if recipient establishes multiple separate \r\nsmall businesses assistance programs) ', - ecCodes: ['2.29', '2.30', '2.31', '2.32', '2.33'], + 'I) Total Number of Locations Served by Type - Community Anchor Institution (Actual)', + ecCodes: ['1A'], }, - Number_Non_Profits_Served__c: { - key: 'Number_Non_Profits_Served__c', - index: 25, + Explanation_Planned__c: { + key: 'Explanation_Planned__c', + index: 66, required: 'Conditional', dataType: 'String', - maxLength: 10, + maxLength: 3000, listVals: [], - columnName: 'Z', - humanColName: - 'Number of Non-Profits served (by program if recipient establishes multiple separate non-\r\nprofit assistance programs) ', - ecCodes: ['2.34'], + columnName: 'BO', + humanColName: 'Explanation (Planned)', + ecCodes: ['1A'], }, - School_ID_or_District_ID__c: { - key: 'School_ID_or_District_ID__c', - index: 26, - required: 'Conditional', + Affordable_Connectivity_Program_ACP__c: { + key: 'Affordable_Connectivity_Program_ACP__c', + index: 67, + required: true, + dataType: 'Pick List', + maxLength: null, + listVals: ['Yes', 'No'], + columnName: 'BP', + humanColName: 'Affordable Connectivity Program (ACP)?', + ecCodes: ['1A'], + }, + Street_1_Planned__c: { + key: 'Street_1_Planned__c', + index: 68, + required: true, dataType: 'String', - maxLength: 750, + maxLength: 40, listVals: [], - columnName: 'AA', - humanColName: 'NCES School ID or NCES District ID', - ecCodes: ['2.11', '2.12', '2.13', '2.14', '2.24', '2.25', '2.26', '2.27'], + columnName: 'BQ', + humanColName: 'Street 1 (Planned)', + ecCodes: ['1B', '1C'], }, - Industry_Experienced_8_Percent_Loss__c: { - key: 'Industry_Experienced_8_Percent_Loss__c', - index: 27, - required: 'Conditional', + Street_2_Planned__c: { + key: 'Street_2_Planned__c', + index: 69, + required: false, dataType: 'String', - maxLength: 250, + maxLength: 40, listVals: [], - columnName: 'AB', - humanColName: 'Industry other than tourism Narrative', - ecCodes: ['2.36'], + columnName: 'BR', + humanColName: 'Street 2 (Planned)', + ecCodes: ['1B', '1C'], }, - Does_Project_Include_Capital_Expenditure__c: { - key: 'Does_Project_Include_Capital_Expenditure__c', - index: 28, - required: true, + Same_Address__c: { + key: 'Same_Address__c', + index: 70, + required: 'Conditional', dataType: 'Pick List', maxLength: null, listVals: ['Yes', 'No'], - columnName: 'AC', - humanColName: 'Does this project include a capital expenditure?', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BS', + humanColName: 'Same Address', + ecCodes: ['1B', '1C'], }, - Total_Cost_Capital_Expenditure__c: { - key: 'Total_Cost_Capital_Expenditure__c', - index: 29, + Street_1_Actual__c: { + key: 'Street_1_Actual__c', + index: 71, required: 'Conditional', - dataType: 'Currency', - maxLength: null, + dataType: 'String', + maxLength: 40, listVals: [], - columnName: 'AD', - humanColName: 'If yes, what is the total expected capital expenditure?', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BT', + humanColName: 'Street 1 (Actual)', + ecCodes: ['1B', '1C'], }, - Type_of_Capital_Expenditure__c: { - key: 'Type_of_Capital_Expenditure__c', - index: 30, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Acquisition of equipment for COVID-19 prevention and treatment', - 'Adaptations to congregate living facilities', - 'Affordable housing supportive housing or recovery housing', - 'Behavioral health facilities and equipment', - 'Childcare, daycare, and early learning facilities', - 'COVID-19 testing sites and laboratories', - 'COVID-19 vaccination sites', - 'Devices and equipment that assist households in accessing the internet', - 'Emergency operations centers and acquisition of emergency response equipment', - 'Food banks and other facilities', - 'Improvements to existing facilities', - 'Installation and improvement of ventilation systems', - 'Job and workforce training centers', - 'Medical equipment and facilities', - 'Medical facilities generally dedicated to COVID-19 treatment and mitigation', - 'Mitigation measures in small businesses, nonprofits, and impacted industries', - 'Parks, green spaces, recreational facilities, sidewalks', - 'Public health data systems', - 'Rehabilitations, renovation, remediation, cleanup, or conversions', - 'Schools and other educational facilities', - 'Technology and equipment to allow law enforcement', - 'Technology and tools', - 'Technology infrastructure to adapt government operations', - 'Temporary medical facilities and other measures', - 'Transitional shelters', - 'Other (please specify)', - ], - columnName: 'AE', - humanColName: 'Capital Expenditure Type', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + Street_2_Actual__c: { + key: 'Street_2_Actual__c', + index: 72, + required: false, + dataType: 'String', + maxLength: 40, + listVals: [], + columnName: 'BU', + humanColName: 'Street 2 (Actual)', + ecCodes: ['1B', '1C'], }, - Type_of_Capital_Expenditure_Other__c: { - key: 'Type_of_Capital_Expenditure_Other__c', - index: 31, - required: 'Conditional', + City_Planned__c: { + key: 'City_Planned__c', + index: 73, + required: true, dataType: 'String', - maxLength: 255, + maxLength: 40, listVals: [], - columnName: 'AF', - humanColName: 'Other Capital Expenditure Explanation', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], + columnName: 'BV', + humanColName: 'City (Planned)', + ecCodes: ['1B', '1C'], }, - Capital_Expenditure_Justification__c: { - key: 'Capital_Expenditure_Justification__c', - index: 32, + City_Actual__c: { + key: 'City_Actual__c', + index: 74, required: 'Conditional', dataType: 'String', - maxLength: 1500, + maxLength: 40, listVals: [], - columnName: 'AG', - humanColName: 'Capital Expenditure Narrative', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)1': { - key: '(manual entry)1', - index: 33, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AH', - humanColName: - 'If budget is over $10M, was a Davis Bacon Act Certification completed?', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)2': { - key: '(manual entry)2', - index: 34, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AI', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the number of employees of contractors and sub-contractors working on the project.', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)3': { - key: '(manual entry)3', - index: 35, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AJ', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the number of employees on the project hired directly and hired through a third party. ', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)4': { - key: '(manual entry)4', - index: 36, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AK', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the wages and benefits of workers on the project by classification', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)5': { - key: '(manual entry)5', - index: 37, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AL', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - are those wages are at rates less than those prevailing?', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)6': { - key: '(manual entry)6', - index: 38, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AM', - humanColName: - 'If budget is over $10M, was a Labor Agreement Certification completed?', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)7': { - key: '(manual entry)7', - index: 39, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AN', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will ensure the project has ready access to a sufficient supply of appropriately skilled and unskilled labor to ensure high-quality construction throughout the life of the project, including a description of any required professional certifications and/or in-house training. ', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)8': { - key: '(manual entry)8', - index: 40, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AO', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will minimize risks of labor disputes and disruptions that would jeopardize timeliness and cost-effectiveness of the project.', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)9': { - key: '(manual entry)9', - index: 41, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AP', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will provide a safe and healthy workplace that avoids delays and costs associated with workplace illnesses, injuries, and fatalities, including descriptions of safety training, certification, and/or licensure requirements for all relevant workers (e.g., OSHA 10, OSHA 30).', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)10': { - key: '(manual entry)10', - index: 42, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AQ', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter whether workers on the project will receive wages and benefits that will secure an appropriately skilled workforce in the context of the local or regional labor market.', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)11': { - key: '(manual entry)11', - index: 43, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AR', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter whether the project has completed a project labor agreement. ', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)12': { - key: '(manual entry)12', - index: 44, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AS', - humanColName: - 'If budget is over $10M, does the project prioritize local hires? ', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)13': { - key: '(manual entry)13', - index: 45, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AT', - humanColName: - 'If budget is over $10M, does the project have a Community Benefit Agreement?', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - '(manual entry)14': { - key: '(manual entry)14', - index: 46, - required: 'Required if Budget > $10M', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AU', - humanColName: - 'If budget is over $10M and has a Community Benefit Agreement, provide a description. ', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - Number_Workers_Enrolled_Sectoral__c: { - key: 'Number_Workers_Enrolled_Sectoral__c', - index: 47, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AV', - humanColName: - 'Number of workers enrolled in sectoral job training programs', - ecCodes: ['2.10'], - }, - Number_Workers_Competing_Sectoral__c: { - key: 'Number_Workers_Competing_Sectoral__c', - index: 48, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AW', - humanColName: - 'Number of workers completing sectoral job training programs ', - ecCodes: ['2.10'], - }, - Number_People_Summer_Youth__c: { - key: 'Number_People_Summer_Youth__c', - index: 49, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AX', - humanColName: - 'Number of people participating in summer youth employment programs', - ecCodes: ['2.10'], - }, - Number_Households_Eviction_Prevention__c: { - key: 'Number_Households_Eviction_Prevention__c', - index: 50, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AY', - humanColName: - 'Number of Households receiving eviction prevention services (including legal representation)', - ecCodes: ['2.2', '2.15', '2.16', '2.17', '2.18'], - }, - Number_Affordable_Housing_Units__c: { - key: 'Number_Affordable_Housing_Units__c', - index: 51, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AZ', - humanColName: 'Number of affordable housing units preserved or developed', - ecCodes: ['2.2', '2.15', '2.16', '2.17', '2.18'], - }, - Number_Students_Tutoring_Programs__c: { - key: 'Number_Students_Tutoring_Programs__c', - index: 52, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BA', - humanColName: - 'Number of students participating in evidence-based tutoring programs', - ecCodes: ['2.24', '2.25', '2.26', '2.27'], - }, - Number_Children_Served_Childcare__c: { - key: 'Number_Children_Served_Childcare__c', - index: 53, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BB', - humanColName: - 'Number of children served by childcare and early learning services (pre-school/pre-K/ages 3-5)', - ecCodes: ['2.11', '2.12', '2.13', '2.14'], - }, - Number_Families_Served_Home_Visiting__c: { - key: 'Number_Families_Served_Home_Visiting__c', - index: 54, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BC', - humanColName: 'Number of families served by home visiting', - ecCodes: ['2.11', '2.12', '2.13', '2.14'], - }, - Cancellation_Reason__c: { - key: 'Cancellation_Reason__c', - index: 55, - required: 'Conditional', - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'BD', - humanColName: 'Cancelled Status of Completion Explanation', - ecCodes: [ - '2.1', - '2.2', - '2.3', - '2.4', - '2.5', - '2.6', - '2.7', - '2.8', - '2.9', - '2.10', - '2.11', - '2.12', - '2.13', - '2.14', - '2.15', - '2.16', - '2.17', - '2.18', - '2.19', - '2.20', - '2.21', - '2.22', - '2.23', - '2.24', - '2.25', - '2.26', - '2.27', - '2.28', - '2.29', - '2.30', - '2.31', - '2.32', - '2.33', - '2.34', - '2.35', - '2.36', - '2.37', - ], - }, - }, - ec3: { - Name: { - key: 'Name', - index: 2, - required: true, - dataType: 'String', - maxLength: 150, - listVals: [], - columnName: 'C', - humanColName: 'Project Name', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Project_Identification_Number__c: { - key: 'Project_Identification_Number__c', - index: 3, - required: true, - dataType: 'String', - maxLength: 20, - listVals: [], - columnName: 'D', - humanColName: 'Project Identification Number\r\n(Assigned by recipient)', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Completion_Status__c: { - key: 'Completion_Status__c', - index: 4, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Not started', - 'Completed less than 50%', - 'Completed 50% or more', - 'Completed', - 'Cancelled', - ], - columnName: 'E', - humanColName: 'Status of Completion', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Adopted_Budget__c: { - key: 'Adopted_Budget__c', - index: 5, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'F', - humanColName: 'Adopted Budget', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Total_Obligations__c: { - key: 'Total_Obligations__c', - index: 6, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'G', - humanColName: 'Total Cumulative\r\nObligations', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Total_Expenditures__c: { - key: 'Total_Expenditures__c', - index: 7, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'H', - humanColName: 'Total Cumulative\r\nExpenditures', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Current_Period_Obligations__c: { - key: 'Current_Period_Obligations__c', - index: 8, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'I', - humanColName: 'Current Period Obligations', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Current_Period_Expenditures__c: { - key: 'Current_Period_Expenditures__c', - index: 9, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'J', - humanColName: 'Current Period Expenditures', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Project_Description__c: { - key: 'Project_Description__c', - index: 10, - required: true, - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'K', - humanColName: 'Project Description', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Program_Income_Earned__c: { - key: 'Program_Income_Earned__c', - index: 11, - required: false, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'L', - humanColName: 'Program Income Earned', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Program_Income_Expended__c: { - key: 'Program_Income_Expended__c', - index: 12, - required: false, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'M', - humanColName: 'Program Income Expended', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Structure_Objectives_of_Asst_Programs__c: { - key: 'Structure_Objectives_of_Asst_Programs__c', - index: 13, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'N', - humanColName: - 'Brief description of structure and objectives of assistance program(s), including public health or negative economic impact experienced.', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Recipient_Approach_Description__c: { - key: 'Recipient_Approach_Description__c', - index: 14, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'O', - humanColName: - 'Brief description of how a recipient’s response is related and reasonably and proportional to a public health or negative economic impact of COVID-19.', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Payroll_Public_Health_Safety__c: { - key: 'Payroll_Public_Health_Safety__c', - index: 15, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'P', - humanColName: - 'Number of government FTEs responding to COVID-19 supported under this authority', - ecCodes: ['3.1'], - }, - Number_of_FTEs_Rehired__c: { - key: 'Number_of_FTEs_Rehired__c', - index: 16, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'Q', - humanColName: - 'Number of FTEs rehired by governments under this authority', - ecCodes: ['3.2'], - }, - Does_Project_Include_Capital_Expenditure__c: { - key: 'Does_Project_Include_Capital_Expenditure__c', - index: 17, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'R', - humanColName: 'Does this project include a capital expenditure?', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Total_Cost_Capital_Expenditure__c: { - key: 'Total_Cost_Capital_Expenditure__c', - index: 18, - required: 'Conditional', - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'S', - humanColName: 'If yes, what is the total expected capital expenditure?', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Type_of_Capital_Expenditure__c: { - key: 'Type_of_Capital_Expenditure__c', - index: 19, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Acquisition of equipment for COVID-19 prevention and treatment', - 'Adaptations to congregate living facilities', - 'Affordable housing supportive housing or recovery housing', - 'Behavioral health facilities and equipment', - 'Childcare, daycare, and early learning facilities', - 'COVID-19 testing sites and laboratories', - 'COVID-19 vaccination sites', - 'Devices and equipment that assist households in accessing the internet', - 'Emergency operations centers and acquisition of emergency response equipment', - 'Food banks and other facilities', - 'Improvements to existing facilities', - 'Installation and improvement of ventilation systems', - 'Job and workforce training centers', - 'Medical equipment and facilities', - 'Medical facilities generally dedicated to COVID-19 treatment and mitigation', - 'Mitigation measures in small businesses, nonprofits, and impacted industries', - 'Parks, green spaces, recreational facilities, sidewalks', - 'Public health data systems', - 'Rehabilitations, renovation, remediation, cleanup, or conversions', - 'Schools and other educational facilities', - 'Technology and equipment to allow law enforcement', - 'Technology and tools', - 'Technology infrastructure to adapt government operations', - 'Temporary medical facilities and other measures', - 'Transitional shelters', - 'Other (please specify)', - ], - columnName: 'T', - humanColName: 'Capital Expenditure Type', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Type_of_Capital_Expenditure_Other__c: { - key: 'Type_of_Capital_Expenditure_Other__c', - index: 20, - required: 'Conditional', - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'U', - humanColName: 'Other Capital Expenditure Explanation', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Capital_Expenditure_Justification__c: { - key: 'Capital_Expenditure_Justification__c', - index: 21, - required: 'Conditional', - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'V', - humanColName: 'Capital Expenditure Narrative', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)1': { - key: '(manual entry)1', - index: 22, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'W', - humanColName: - 'If budget is over $10M, was a Davis Bacon Act Certification completed?', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)2': { - key: '(manual entry)2', - index: 23, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'X', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the number of employees of contractors and sub-contractors working on the project.', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)3': { - key: '(manual entry)3', - index: 24, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'Y', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the number of employees on the project hired directly and hired through a third party. ', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)4': { - key: '(manual entry)4', - index: 25, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'Z', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the wages and benefits of workers on the project by classification', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)5': { - key: '(manual entry)5', - index: 26, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AA', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - are those wages are at rates less than those prevailing?', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)6': { - key: '(manual entry)6', - index: 27, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AB', - humanColName: - 'If budget is over $10M, was a Labor Agreement Certification completed?', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)7': { - key: '(manual entry)7', - index: 28, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AC', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will ensure the project has ready access to a sufficient supply of appropriately skilled and unskilled labor to ensure high-quality construction throughout the life of the project, including a description of any required professional certifications and/or in-house training. ', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)8': { - key: '(manual entry)8', - index: 29, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AD', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will minimize risks of labor disputes and disruptions that would jeopardize timeliness and cost-effectiveness of the project.', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)9': { - key: '(manual entry)9', - index: 30, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AE', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will provide a safe and healthy workplace that avoids delays and costs associated with workplace illnesses, injuries, and fatalities, including descriptions of safety training, certification, and/or licensure requirements for all relevant workers (e.g., OSHA 10, OSHA 30).', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)10': { - key: '(manual entry)10', - index: 31, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AF', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter whether workers on the project will receive wages and benefits that will secure an appropriately skilled workforce in the context of the local or regional labor market.', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)11': { - key: '(manual entry)11', - index: 32, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AG', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter whether the project has completed a project labor agreement. ', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)12': { - key: '(manual entry)12', - index: 33, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AH', - humanColName: - 'If budget is over $10M, does the project prioritize local hires? ', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)13': { - key: '(manual entry)13', - index: 34, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AI', - humanColName: - 'If budget is over $10M, does the project have a Community Benefit Agreement?', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - '(manual entry)14': { - key: '(manual entry)14', - index: 35, - required: 'Required if Budget > $10M', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AJ', - humanColName: - 'If budget is over $10M and has a Community Benefit Agreement, provide a description. ', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - Cancellation_Reason__c: { - key: 'Cancellation_Reason__c', - index: 36, - required: 'Conditional', - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'AK', - humanColName: 'Cancelled Status of Completion Explanation', - ecCodes: ['3.1', '3.2', '3.3', '3.4', '3.5'], - }, - }, - ec4: { - Name: { - key: 'Name', - index: 2, - required: true, - dataType: 'String', - maxLength: 80, - listVals: [], - columnName: 'C', - humanColName: 'Project Name', - ecCodes: ['4.1', '4.2'], - }, - Project_Identification_Number__c: { - key: 'Project_Identification_Number__c', - index: 3, - required: true, - dataType: 'String', - maxLength: 20, - listVals: [], - columnName: 'D', - humanColName: 'Project Identification Number\r\n(Assigned by recipient)', - ecCodes: ['4.1', '4.2'], - }, - Completion_Status__c: { - key: 'Completion_Status__c', - index: 4, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Not started', - 'Completed less than 50%', - 'Completed 50% or more', - 'Completed', - 'Cancelled', - ], - columnName: 'E', - humanColName: 'Status of Completion', - ecCodes: ['4.1', '4.2'], - }, - Adopted_Budget__c: { - key: 'Adopted_Budget__c', - index: 5, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'F', - humanColName: 'Adopted Budget', - ecCodes: ['4.1', '4.2'], - }, - Total_Obligations__c: { - key: 'Total_Obligations__c', - index: 6, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'G', - humanColName: 'Total Cumulative \r\nObligations', - ecCodes: ['4.1', '4.2'], - }, - Total_Expenditures__c: { - key: 'Total_Expenditures__c', - index: 7, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'H', - humanColName: 'Total Cumulative \r\nExpenditures', - ecCodes: ['4.1', '4.2'], - }, - Current_Period_Obligations__c: { - key: 'Current_Period_Obligations__c', - index: 8, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'I', - humanColName: 'Current Period Obligations', - ecCodes: ['4.1', '4.2'], - }, - Current_Period_Expenditures__c: { - key: 'Current_Period_Expenditures__c', - index: 9, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'J', - humanColName: 'Current Period Expenditures', - ecCodes: ['4.1', '4.2'], - }, - Project_Description__c: { - key: 'Project_Description__c', - index: 10, - required: true, - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'K', - humanColName: 'Project Description', - ecCodes: ['4.1', '4.2'], - }, - Program_Income_Earned__c: { - key: 'Program_Income_Earned__c', - index: 11, - required: false, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'L', - humanColName: 'Program Income Earned', - ecCodes: ['4.1', '4.2'], - }, - Program_Income_Expended__c: { - key: 'Program_Income_Expended__c', - index: 12, - required: false, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'M', - humanColName: 'Program Income Expended', - ecCodes: ['4.1', '4.2'], - }, - Sectors_Critical_to_Health_Well_Being__c: { - key: 'Sectors_Critical_to_Health_Well_Being__c', - index: 13, - required: 'Conditional', - dataType: 'Multi-Select', - maxLength: 1500, - listVals: [ - 'Any work performed by an employee of a State local or Tribal government', - 'Behavioral health work', - 'Biomedical research', - 'Dental care work', - 'Educational work school nutrition work and other work required to operate a school facility', - 'Elections work', - 'Emergency response', - 'Family or child care', - 'Grocery stores restaurants food production and food delivery', - 'Health care', - 'Home- and community-based health care or assistance with activities of daily living', - 'Laundry work', - 'Maintenance work', - 'Medical testing and diagnostics', - 'Pharmacy', - 'Public health work', - 'Sanitation disinfection and cleaning work', - 'Social services work', - 'Solid waste or hazardous materials management response and cleanup work', - 'Transportation and warehousing', - 'Vital services to Tribes', - 'Work at hotel and commercial lodging facilities that are used for COVID-19 mitigation and containment', - 'Work in a mortuary', - 'Work in critical clinical research development and testing necessary for COVID-19 response', - 'Work requiring physical interaction with patients', - 'Other', - ], - columnName: 'N', - humanColName: 'Sectors Designated as Essential Critical Infrastructure', - ecCodes: ['4.1', '4.2'], - }, - Workers_Served__c: { - key: 'Workers_Served__c', - index: 14, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999, - listVals: [], - columnName: 'O', - humanColName: 'Number of workers to be served', - ecCodes: ['4.1', '4.2'], - }, - Premium_Pay_Narrative__c: { - key: 'Premium_Pay_Narrative__c', - index: 15, - required: 'Conditional', - dataType: 'String', - maxLength: 3000, - listVals: [], - columnName: 'P', - humanColName: 'Premium Pay Narrative', - ecCodes: ['4.1', '4.2'], - }, - Number_of_Workers_K_12__c: { - key: 'Number_of_Workers_K_12__c', - index: 16, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'Q', - humanColName: - 'Number of workers to be served with premium pay in K-12 schools ', - ecCodes: ['4.1', '4.2'], - }, - Cancellation_Reason__c: { - key: 'Cancellation_Reason__c', - index: 17, - required: 'Conditional', - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'R', - humanColName: 'Cancelled Status of Completion Explanation', - ecCodes: ['4.1', '4.2'], - }, - }, - ec5: { - Name: { - key: 'Name', - index: 2, - required: true, - dataType: 'String', - maxLength: 80, - listVals: [], - columnName: 'C', - humanColName: 'Project Name', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Project_Identification_Number__c: { - key: 'Project_Identification_Number__c', - index: 3, - required: true, - dataType: 'String', - maxLength: 20, - listVals: [], - columnName: 'D', - humanColName: 'Project Identification Number\r\n(Assigned by recipient)', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Completion_Status__c: { - key: 'Completion_Status__c', - index: 4, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Not started', - 'Completed less than 50%', - 'Completed 50% or more', - 'Completed', - 'Cancelled', - ], - columnName: 'E', - humanColName: 'Status of Completion', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Adopted_Budget__c: { - key: 'Adopted_Budget__c', - index: 5, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'F', - humanColName: 'Adopted Budget', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Total_Obligations__c: { - key: 'Total_Obligations__c', - index: 6, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'G', - humanColName: 'Total Cumulative \r\nObligations', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Total_Expenditures__c: { - key: 'Total_Expenditures__c', - index: 7, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'H', - humanColName: 'Total Cumulative \r\nExpenditures', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Current_Period_Obligations__c: { - key: 'Current_Period_Obligations__c', - index: 8, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'I', - humanColName: 'Current Period Obligations', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Current_Period_Expenditures__c: { - key: 'Current_Period_Expenditures__c', - index: 9, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'J', - humanColName: 'Current Period Expenditures', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Project_Description__c: { - key: 'Project_Description__c', - index: 10, - required: true, - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'K', - humanColName: 'Project Description', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Program_Income_Earned__c: { - key: 'Program_Income_Earned__c', - index: 11, - required: false, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'L', - humanColName: 'Program Income Earned', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Program_Income_Expended__c: { - key: 'Program_Income_Expended__c', - index: 12, - required: false, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'M', - humanColName: 'Program Income Expended', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Proj_Actual_Construction_Start_Date__c: { - key: 'Proj_Actual_Construction_Start_Date__c', - index: 13, - required: 'Conditional', - dataType: 'Date', - maxLength: null, - listVals: [], - columnName: 'N', - humanColName: 'Projected/actual construction start date', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Initiation_of_Operations_Date__c: { - key: 'Initiation_of_Operations_Date__c', - index: 14, - required: 'Conditional', - dataType: 'Date', - maxLength: null, - listVals: [], - columnName: 'O', - humanColName: 'Projected/actual initiation of operations date', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Location__c: { - key: 'Location__c', - index: 15, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Latitude/longitude (WGS84 or NAD83 geographic coordinate system)', - 'Address', - 'Address Range', - 'Road Segment', - ], - columnName: 'P', - humanColName: 'Location Type', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - ], - }, - Location_Detail__c: { - key: 'Location_Detail__c', - index: 16, - required: 'Conditional', - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'Q', - humanColName: 'Location Details', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - ], - }, - '(manual entry)1': { - key: '(manual entry)1', - index: 17, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'R', - humanColName: - 'If budget is over $10M, was a Davis Bacon Act Certification completed?', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)2': { - key: '(manual entry)2', - index: 18, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'S', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the number of employees of contractors and sub-contractors working on the project.', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)3': { - key: '(manual entry)3', - index: 19, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'T', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the number of employees on the project hired directly and hired through a third party. ', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)4': { - key: '(manual entry)4', - index: 20, - required: 'Required if DB is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'U', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - enter the wages and benefits of workers on the project by classification', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)5': { - key: '(manual entry)5', - index: 21, - required: 'Required if DB is No', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'V', - humanColName: - 'If budget is over $10M and Davis Bacon Act Certification NOT completed - are those wages are at rates less than those prevailing?', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)6': { - key: '(manual entry)6', - index: 22, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'W', - humanColName: - 'If budget is over $10M, was a Labor Agreement Certification completed?', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)7': { - key: '(manual entry)7', - index: 23, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'X', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will ensure the project has ready access to a sufficient supply of appropriately skilled and unskilled labor to ensure high-quality construction throughout the life of the project, including a description of any required professional certifications and/or in-house training. ', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)8': { - key: '(manual entry)8', - index: 24, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'Y', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will minimize risks of labor disputes and disruptions that would jeopardize timeliness and cost-effectiveness of the project.', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)9': { - key: '(manual entry)9', - index: 25, - required: 'Required if PLA is No', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'Z', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter how the recipient will provide a safe and healthy workplace that avoids delays and costs associated with workplace illnesses, injuries, and fatalities, including descriptions of safety training, certification, and/or licensure requirements for all relevant workers (e.g., OSHA 10, OSHA 30).', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)10': { - key: '(manual entry)10', - index: 26, - required: 'Required if PLA is No', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AA', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter whether workers on the project will receive wages and benefits that will secure an appropriately skilled workforce in the context of the local or regional labor market.', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)11': { - key: '(manual entry)11', - index: 27, - required: 'Required if PLA is No', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AB', - humanColName: - 'If budget is over $10M and Labor Agreement Certification NOT completed - enter whether the project has completed a project labor agreement. ', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)12': { - key: '(manual entry)12', - index: 28, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AC', - humanColName: - 'If budget is over $10M, does the project prioritize local hires? ', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)13': { - key: '(manual entry)13', - index: 29, - required: 'Required if Budget > $10M', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AD', - humanColName: - 'If budget is over $10M, does the project have a Community Benefit Agreement?', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - '(manual entry)14': { - key: '(manual entry)14', - index: 30, - required: 'Required if Budget > $10M', - dataType: 'TBD', - maxLength: null, - listVals: [], - columnName: 'AE', - humanColName: - 'If budget is over $10M and has a Community Benefit Agreement, provide a description. ', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - National_Pollutant_Discharge_Number__c: { - key: 'National_Pollutant_Discharge_Number__c', - index: 31, - required: 'Conditional', - dataType: 'String', - maxLength: 50, - listVals: [], - columnName: 'AF', - humanColName: 'National Pollutant Discharge Elimination System (NPDES)', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - ], - }, - Public_Water_System_PWS_ID_number__c: { - key: 'Public_Water_System_PWS_ID_number__c', - index: 32, - required: 'Conditional', - dataType: 'String', - maxLength: 50, - listVals: [], - columnName: 'AG', - humanColName: 'Public Water System (PWS) ID number ', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - ], - }, - Is_project_designed_to_meet_100_mbps__c: { - key: 'Is_project_designed_to_meet_100_mbps__c', - index: 33, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AH', - humanColName: - 'Confirm that the project is designed to, upon completion, reliably meet or exceed symmetrical 100 Mbps download and upload speeds', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Project_not_met_100_mbps_explanation__c: { - key: 'Project_not_met_100_mbps_explanation__c', - index: 34, - required: 'Conditional', - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'AI', - humanColName: - 'If the project is not designed to reliably meet or exceed symmetrical 100 Mbps download and upload speeds, explain why not', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Is_project_designed_to_exceed_100_mbps__c: { - key: 'Is_project_designed_to_exceed_100_mbps__c', - index: 35, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'AJ', - humanColName: - 'Confirm that the project is designed to, upon completion, meet or exceed symmetrical 100 Mbps download speed and between at least 20 Mbps and 100 Mbps upload speed, and be scalable to a minimum of 100 Mbps download speed and 100 Mbps upload speed', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Median_Household_Income_Service_Area__c: { - key: 'Median_Household_Income_Service_Area__c', - index: 36, - required: 'Conditional', - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'AK', - humanColName: 'Median Household Income of service area ', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - ], - }, - Lowest_Quintile_Income__c: { - key: 'Lowest_Quintile_Income__c', - index: 37, - required: 'Conditional', - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'AL', - humanColName: 'Lowest Quintile Income of the service area ', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - ], - }, - Is_project_designed_provide_hh_service__c: { - key: 'Is_project_designed_provide_hh_service__c', - index: 38, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [], - columnName: 'AM', - humanColName: 'Is project designed to provide service to households?', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Technology_Type_Planned__c: { - key: 'Technology_Type_Planned__c', - index: 39, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Fiber', - 'Coaxial Cable', - 'Terrestrial Fixed Wireless', - 'Other', - ], - columnName: 'AN', - humanColName: 'Technology Type Planned', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Technology_Type_Planned_Other__c: { - key: 'Technology_Type_Planned_Other__c', - index: 40, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'AO', - humanColName: 'If Technology Type Planned is "Other" please specify', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Technology_Type_Actual__c: { - key: 'Technology_Type_Actual__c', - index: 41, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Fiber', - 'Coaxial Cable', - 'Terrestrial Fixed Wireless', - 'Other', - ], - columnName: 'AP', - humanColName: 'Technology Type Actual', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Technology_Type_Actual_Other__c: { - key: 'Technology_Type_Actual_Other__c', - index: 42, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'AQ', - humanColName: 'If Technology Type Actual is "Other" please specify', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Total_Miles_of_Fiber_Deployed_c: { - key: 'Total_Miles_of_Fiber_Deployed_c', - index: 43, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AR', - humanColName: 'Total Miles of Fiber Deployed Planned', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Total_Miles_of_Fiber_Deployed_Actual__c: { - key: 'Total_Miles_of_Fiber_Deployed_Actual__c', - index: 44, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AS', - humanColName: 'Total Miles of Fiber Deployed Actual', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_Served__c: { - key: 'Planned_Funded_Locations_Served__c', - index: 45, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AT', - humanColName: 'Total Number of Funded Locations Served Planned', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Actual_Funded_Locations_Served__c: { - key: 'Actual_Funded_Locations_Served__c', - index: 46, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AU', - humanColName: 'Total Number of Funded Locations Served Actual', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_25_3_Below__c: { - key: 'Planned_Funded_Locations_25_3_Below__c', - index: 47, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AV', - humanColName: - 'Planned Total Number of Funded Locations Served, broken out by speeds (Pre-SLFRF investment, Number receiving 25/3 Mbps or below)', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_Between_25_100__c: { - key: 'Planned_Funded_Locations_Between_25_100__c', - index: 48, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AW', - humanColName: - 'Planned Total Number of Funded Locations Served, broken out by speeds (Pre-SLFRF investment, Number receiving between 25/3 Mbps and 100/20 Mbps)', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_Minimum_1_Gbps__c: { - key: 'Planned_Funded_Locations_Minimum_1_Gbps__c', - index: 49, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AX', - humanColName: - 'Planned Total Number of Funded Locations Served, broken out by speeds (Post-SLFRF investment, Number receiving minimum 1 Gbps)', - ecCodes: [], - }, - Actual_Funded_Locations_Minimum_1_Gbps__c: { - key: 'Actual_Funded_Locations_Minimum_1_Gbps__c', - index: 50, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AY', - humanColName: - 'Actual Total Number of Funded Locations Served, broken out by speeds (Post-SLFRF investment, Number receiving minimum 1 Gbps)', - ecCodes: [], - }, - Planned_Funded_Locations_Minimum_100_100__c: { - key: 'Planned_Funded_Locations_Minimum_100_100__c', - index: 51, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'AZ', - humanColName: - 'Planned Total Number of Funded Locations Served, broken out by speeds (Post-SLFRF investment, Number receiving minimum 100/100 Mbps)', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Actual_Funded_Locations_Minimum_100_100__c: { - key: 'Actual_Funded_Locations_Minimum_100_100__c', - index: 52, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BA', - humanColName: - 'Actual Total Number of Funded Locations Served, broken out by speeds (Post-SLFRF investment, Number receiving minimum 100/100 Mbps)', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_Minimum_100_20__c: { - key: 'Planned_Funded_Locations_Minimum_100_20__c', - index: 53, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BB', - humanColName: - 'Planned Total Number of Funded Locations Served, broken out by speeds (Post-SLFRF investment, Number receiving minimum 100/20 Mbps and scalable to minimum 100/100 Mbps)', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Actual_Funded_Locations_Minimum_100_20__c: { - key: 'Actual_Funded_Locations_Minimum_100_20__c', - index: 54, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BC', - humanColName: - 'Actual Total Number of Funded Locations Served, broken out by speeds (Post-SLFRF investment, Number receiving minimum 100/20 Mbps and scalable to minimum 100/100 Mbps)', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_Residential__c: { - key: 'Planned_Funded_Locations_Residential__c', - index: 55, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BD', - humanColName: - 'Planned Total Number of Funded Locations Served, Residential', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Actual_Funded_Locations_Residential__c: { - key: 'Actual_Funded_Locations_Residential__c', - index: 56, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BE', - humanColName: - 'Actual Total Number of Funded Locations Served, Residential', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_Total_Housing__c: { - key: 'Planned_Funded_Locations_Total_Housing__c', - index: 57, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BF', - humanColName: - 'Planned Total Number of Funded Locations Served, Total Housing', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Actual_Funded_Locations_Total_Housing__c: { - key: 'Actual_Funded_Locations_Total_Housing__c', - index: 58, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BG', - humanColName: - 'Actual Total Number of Funded Locations Served, Total Housing', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_Business__c: { - key: 'Planned_Funded_Locations_Business__c', - index: 59, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BH', - humanColName: 'Planned Total Number of Funded Locations Served, Business', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Actual_Funded_Locations_Business__c: { - key: 'Actual_Funded_Locations_Business__c', - index: 60, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BI', - humanColName: 'Actual Total Number of Funded Locations Served, Business', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_Community__c: { - key: 'Planned_Funded_Locations_Community__c', - index: 61, - required: true, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BJ', - humanColName: - 'Planned Total Number of Funded Locations Served, Community Anchor Institution', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Actual_Funded_Locations_Community__c: { - key: 'Actual_Funded_Locations_Community__c', - index: 62, - required: 'Conditional', - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BK', - humanColName: - 'Actual Total Number of Funded Locations Served, Community Anchor Institution', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Planned_Funded_Locations_Explanation__c: { - key: 'Planned_Funded_Locations_Explanation__c', - index: 63, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'BL', - humanColName: 'Planned Funded Locations Explanation', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Actual_Funded_Locations_Explanation__c: { - key: 'Actual_Funded_Locations_Explanation__c', - index: 64, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'BM', - humanColName: 'Actual Funded Locations Explanation', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Confirm_Service_Provider__c: { - key: 'Confirm_Service_Provider__c', - index: 65, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [], - columnName: 'BN', - humanColName: - "Confirm that the service provider for the project has, or will upon completion of the project, either participated in the Federal Communications Commission (FCC)'s Affordable Connectivity Program (ACP) or otherwise provided access to a broad-based affordability program that proides benefits to households commensurate with those provided under the ACP to low-income consumers in the proposed service area of the broadband infrastructure (applicable only to projects that provide service to households)", - ecCodes: ['5.19', '5.20', '5.21'], - }, - Cancellation_Reason__c: { - key: 'Cancellation_Reason__c', - index: 66, - required: 'Conditional', - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'BO', - humanColName: 'Cancelled Status of Completion Explanation', - ecCodes: [ - '5.1', - '5.2', - '5.3', - '5.4', - '5.5', - '5.6', - '5.7', - '5.8', - '5.9', - '5.10', - '5.11', - '5.12', - '5.13', - '5.14', - '5.15', - '5.16', - '5.17', - '5.18', - '5.19', - '5.20', - '5.21', - ], - }, - Planned_Sum_Speed_Types_Explanation__c: { - key: 'Planned_Sum_Speed_Types_Explanation__c', - index: 67, - required: 'Conditional', - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'BP', - humanColName: - 'Explanation if the sum of broadband speed types does not equal total number of funded locations served\r\nPlanned', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Actual_Sum_Speed_Types_Explanation__c: { - key: 'Actual_Sum_Speed_Types_Explanation__c', - index: 68, - required: 'Conditional', - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'BQ', - humanColName: - 'Explanation if the sum of broadband speed types does not equal total number of funded locations served\r\nActual', - ecCodes: ['5.19', '5.20', '5.21'], - }, - Fabric_ID__c: { - key: 'Fabric_ID__c', - index: 69, - required: false, - dataType: 'Numeric', - maxLength: 9999999999, - listVals: [], - columnName: 'BR', - humanColName: 'Fabric ID#', - ecCodes: ['5.19', '5.20', '5.21'], - }, - FCC_Provider_ID__c: { - key: 'FCC_Provider_ID__c', - index: 70, - required: false, - dataType: 'Numeric', - maxLength: 999999, - listVals: [], - columnName: 'BS', - humanColName: 'FCC Prodiver ID#', - ecCodes: ['5.19', '5.20', '5.21'], - }, - }, - ec7: { - Name: { - key: 'Name', - index: 2, - required: true, - dataType: 'String', - maxLength: 80, - listVals: [], - columnName: 'C', - humanColName: 'Project Name', - ecCodes: ['7.1', '7.2'], - }, - Project_Identification_Number__c: { - key: 'Project_Identification_Number__c', - index: 3, - required: true, - dataType: 'String', - maxLength: 20, - listVals: [], - columnName: 'D', - humanColName: 'Project Identification Number\r\n(Assigned by recipient)', - ecCodes: ['7.1', '7.2'], - }, - Completion_Status__c: { - key: 'Completion_Status__c', - index: 4, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Not started', - 'Completed less than 50%', - 'Completed 50% or more', - 'Completed', - 'Cancelled', - ], - columnName: 'E', - humanColName: 'Status of Completion', - ecCodes: ['7.1', '7.2'], - }, - Adopted_Budget__c: { - key: 'Adopted_Budget__c', - index: 5, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'F', - humanColName: 'Adopted Budget', - ecCodes: ['7.1', '7.2'], - }, - Total_Obligations__c: { - key: 'Total_Obligations__c', - index: 6, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'G', - humanColName: 'Total Cumulative \r\nObligations', - ecCodes: ['7.1', '7.2'], - }, - Total_Expenditures__c: { - key: 'Total_Expenditures__c', - index: 7, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'H', - humanColName: 'Total Cumulative \r\nExpenditures', - ecCodes: ['7.1', '7.2'], - }, - Current_Period_Obligations__c: { - key: 'Current_Period_Obligations__c', - index: 8, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'I', - humanColName: 'Current Period Obligations', - ecCodes: ['7.1', '7.2'], - }, - Current_Period_Expenditures__c: { - key: 'Current_Period_Expenditures__c', - index: 9, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'J', - humanColName: 'Current Period Expenditures', - ecCodes: ['7.1', '7.2'], - }, - Does_Project_Include_Capital_Expenditure__c: { - key: 'Does_Project_Include_Capital_Expenditure__c', - index: 10, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'K', - humanColName: 'Does this project include a capital expenditure?', - ecCodes: [], - }, - Total_Cost_Capital_Expenditure__c: { - key: 'Total_Cost_Capital_Expenditure__c', - index: 11, - required: 'Conditional', - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'L', - humanColName: 'If yes, what is the total expected capital expenditure?', - ecCodes: [], - }, - Type_of_Capital_Expenditure__c: { - key: 'Type_of_Capital_Expenditure__c', - index: 12, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Acquisition of equipment for COVID-19 prevention and treatment', - 'Adaptations to congregate living facilities', - 'Affordable housing supportive housing or recovery housing', - 'Behavioral health facilities and equipment', - 'Childcare, daycare, and early learning facilities', - 'COVID-19 testing sites and laboratories', - 'COVID-19 vaccination sites', - 'Devices and equipment that assist households in accessing the internet', - 'Emergency operations centers and acquisition of emergency response equipment', - 'Food banks and other facilities', - 'Improvements to existing facilities', - 'Installation and improvement of ventilation systems', - 'Job and workforce training centers', - 'Medical equipment and facilities', - 'Medical facilities generally dedicated to COVID-19 treatment and mitigation', - 'Mitigation measures in small businesses, nonprofits, and impacted industries', - 'Parks, green spaces, recreational facilities, sidewalks', - 'Public health data systems', - 'Rehabilitations, renovation, remediation, cleanup, or conversions', - 'Schools and other educational facilities', - 'Technology and equipment to allow law enforcement', - 'Technology and tools', - 'Technology infrastructure to adapt government operations', - 'Temporary medical facilities and other measures', - 'Transitional shelters', - 'Other (please specify)', - ], - columnName: 'M', - humanColName: 'Capital Expenditure Type', - ecCodes: [], - }, - Type_of_Capital_Expenditure_Other__c: { - key: 'Type_of_Capital_Expenditure_Other__c', - index: 13, - required: 'Conditional', - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'N', - humanColName: 'Other Capital Expenditure Explanation', - ecCodes: [], - }, - Capital_Expenditure_Justification__c: { - key: 'Capital_Expenditure_Justification__c', - index: 14, - required: 'Conditional', - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'O', - humanColName: 'Capital Expenditure Narrative', - ecCodes: [], - }, - Project_Description__c: { - key: 'Project_Description__c', - index: 15, - required: true, - dataType: 'String', - maxLength: 1500, - listVals: [], - columnName: 'P', - humanColName: 'Project Description', - ecCodes: ['7.1', '7.2'], - }, - Program_Income_Earned__c: { - key: 'Program_Income_Earned__c', - index: 16, - required: false, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'Q', - humanColName: 'Program Income Earned', - ecCodes: ['7.1', '7.2'], - }, - Program_Income_Expended__c: { - key: 'Program_Income_Expended__c', - index: 17, - required: false, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'R', - humanColName: 'Program Income Expended', - ecCodes: ['7.1', '7.2'], - }, - Primary_Project_Demographics__c: { - key: 'Primary_Project_Demographics__c', - index: 18, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [ - '1 Imp General Public', - '2 Imp Low or moderate income HHs or populations', - '3 Imp HHs that experienced unemployment', - '4 Imp HHs that experienced increased food or housing insecurity', - '5 Imp HHs that qualify for certain federal programs', - '6 Imp For services to address lost instructional time in K-12 schools', - '7 Imp Other HHs or populations that experienced a negative economic', - '8 Imp SBs that experienced a negative economic impact', - '9 Imp Classes of SBs designated as negatively economically impacted', - '10 Imp NPs that experienced a negative economic impact specify', - '11 Imp Classes of NPs designated as negatively economically impacted', - '12 Imp Travel tourism or hospitality sectors', - '13 Imp Industry outside the travel tourism or hospitality sectors specify', - '14 Dis Imp Low income HHs and populations', - '15 Dis Imp HHs and populations residing in Qualified Census Tracts', - '16 Dis Imp HHs that qualify for certain federal programs', - '17 Dis Imp HHs receiving services provided by Tribal governments', - '18 Dis Imp HHs residing in the U.S. territories or receiving services', - '19 Dis Imp For services to address educational disparities Title I eligible', - '20 Dis Imp Other HHs or populations that experienced a disproportionate', - '21 Dis Imp SBs operating in Qualified Census Tracts', - '22 Dis Imp SBs operated by Tribal governments or on Tribal lands', - '23 Dis Imp SBs operating in the U.S. territories', - '24 Dis Imp Other SBs Dis Imp by the pandemic specify', - '25 Dis Imp NPs operating in Qualified Census Tracts', - '26 Dis Imp NPs operated by Tribal governments or on Tribal lands', - '27 Dis Imp NPs operating in the U.S. territories', - '28 Dis Imp Other NPs Dis Imp by the pandemic specify', - ], - columnName: 'S', - humanColName: - 'Project Demographic Distribution - Primary Populations Served', - ecCodes: [], - }, - Primary_Project_Demographics_Explanation__c: { - key: 'Primary_Project_Demographics_Explanation__c', - index: 19, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'T', - humanColName: 'Primary Project Demographic Explanation', - ecCodes: [], - }, - Secondary_Project_Demographics__c: { - key: 'Secondary_Project_Demographics__c', - index: 20, - required: false, - dataType: 'Pick List', - maxLength: null, - listVals: [ - '1 Imp General Public', - '2 Imp Low or moderate income HHs or populations', - '3 Imp HHs that experienced unemployment', - '4 Imp HHs that experienced increased food or housing insecurity', - '5 Imp HHs that qualify for certain federal programs', - '6 Imp For services to address lost instructional time in K-12 schools', - '7 Imp Other HHs or populations that experienced a negative economic', - '8 Imp SBs that experienced a negative economic impact', - '9 Imp Classes of SBs designated as negatively economically impacted', - '10 Imp NPs that experienced a negative economic impact specify', - '11 Imp Classes of NPs designated as negatively economically impacted', - '12 Imp Travel tourism or hospitality sectors', - '13 Imp Industry outside the travel tourism or hospitality sectors specify', - '14 Dis Imp Low income HHs and populations', - '15 Dis Imp HHs and populations residing in Qualified Census Tracts', - '16 Dis Imp HHs that qualify for certain federal programs', - '17 Dis Imp HHs receiving services provided by Tribal governments', - '18 Dis Imp HHs residing in the U.S. territories or receiving services', - '19 Dis Imp For services to address educational disparities Title I eligible', - '20 Dis Imp Other HHs or populations that experienced a disproportionate', - '21 Dis Imp SBs operating in Qualified Census Tracts', - '22 Dis Imp SBs operated by Tribal governments or on Tribal lands', - '23 Dis Imp SBs operating in the U.S. territories', - '24 Dis Imp Other SBs Dis Imp by the pandemic specify', - '25 Dis Imp NPs operating in Qualified Census Tracts', - '26 Dis Imp NPs operated by Tribal governments or on Tribal lands', - '27 Dis Imp NPs operating in the U.S. territories', - '28 Dis Imp Other NPs Dis Imp by the pandemic specify', - ], - columnName: 'U', - humanColName: - 'Project Demographic Distribution - Secondary Populations Served', - ecCodes: [], - }, - Secondary_Proj_Demographics_Explanation__c: { - key: 'Secondary_Proj_Demographics_Explanation__c', - index: 21, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'V', - humanColName: 'Secondary Project Demographic Explanation', - ecCodes: [], + columnName: 'BW', + humanColName: 'City (Actual)', + ecCodes: ['1B', '1C'], }, - Tertiary_Project_Demographics__c: { - key: 'Tertiary_Project_Demographics__c', - index: 22, - required: false, + State_Planned__c: { + key: 'State_Planned__c', + index: 75, + required: true, dataType: 'Pick List', maxLength: null, listVals: [ - '1 Imp General Public', - '2 Imp Low or moderate income HHs or populations', - '3 Imp HHs that experienced unemployment', - '4 Imp HHs that experienced increased food or housing insecurity', - '5 Imp HHs that qualify for certain federal programs', - '6 Imp For services to address lost instructional time in K-12 schools', - '7 Imp Other HHs or populations that experienced a negative economic', - '8 Imp SBs that experienced a negative economic impact', - '9 Imp Classes of SBs designated as negatively economically impacted', - '10 Imp NPs that experienced a negative economic impact specify', - '11 Imp Classes of NPs designated as negatively economically impacted', - '12 Imp Travel tourism or hospitality sectors', - '13 Imp Industry outside the travel tourism or hospitality sectors specify', - '14 Dis Imp Low income HHs and populations', - '15 Dis Imp HHs and populations residing in Qualified Census Tracts', - '16 Dis Imp HHs that qualify for certain federal programs', - '17 Dis Imp HHs receiving services provided by Tribal governments', - '18 Dis Imp HHs residing in the U.S. territories or receiving services', - '19 Dis Imp For services to address educational disparities Title I eligible', - '20 Dis Imp Other HHs or populations that experienced a disproportionate', - '21 Dis Imp SBs operating in Qualified Census Tracts', - '22 Dis Imp SBs operated by Tribal governments or on Tribal lands', - '23 Dis Imp SBs operating in the U.S. territories', - '24 Dis Imp Other SBs Dis Imp by the pandemic specify', - '25 Dis Imp NPs operating in Qualified Census Tracts', - '26 Dis Imp NPs operated by Tribal governments or on Tribal lands', - '27 Dis Imp NPs operating in the U.S. territories', - '28 Dis Imp Other NPs Dis Imp by the pandemic specify', + 'AL', + 'AK', + 'AS', + 'AZ', + 'AR', + 'CA', + 'CO', + 'CT', + 'DE', + 'DC', + 'FM', + 'FL', + 'GA', + 'GU', + 'HI', + 'ID', + 'IL', + 'IN', + 'IA', + 'KS', + 'KY', + 'LA', + 'ME', + 'MH', + 'MD', + 'MA', + 'MI', + 'MN', + 'MS', + 'MO', + 'MT', + 'NE', + 'NV', + 'NH', + 'NJ', + 'NM', + 'NY', + 'NC', + 'ND', + 'MP', + 'OH', + 'OK', + 'OR', + 'PW', + 'PA', + 'PR', + 'RI', + 'SC', + 'SD', + 'TN', + 'TX', + 'UT', + 'VT', + 'VA', + 'VI', + 'WA', + 'WV', + 'WI', + 'WY', ], - columnName: 'W', - humanColName: - 'Project Demographic Distribution - Tertiary Populations Served', - ecCodes: [], - }, - Tertiary_Proj_Demographics_Explanation__c: { - key: 'Tertiary_Proj_Demographics_Explanation__c', - index: 23, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'X', - humanColName: 'Tertiary Project Demographic Explanation', - ecCodes: [], - }, - Structure_Objectives_of_Asst_Programs__c: { - key: 'Structure_Objectives_of_Asst_Programs__c', - index: 24, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'Y', - humanColName: 'Structure and objectives of assistance program', - ecCodes: [], - }, - Recipient_Approach_Description__c: { - key: 'Recipient_Approach_Description__c', - index: 25, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'Z', - humanColName: 'Recipients approach', - ecCodes: [], + columnName: 'BX', + humanColName: 'State (Planned)', + ecCodes: ['1B', '1C'], }, - Cancellation_Reason__c: { - key: 'Cancellation_Reason__c', - index: 26, + State_Actual__c: { + key: 'State_Actual__c', + index: 76, required: 'Conditional', - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'AA', - humanColName: 'Cancelled Status of Completion Explanation', - ecCodes: ['7.1', '7.2'], - }, - }, - subrecipient: { - Unique_Entity_Identifier__c: { - key: 'Unique_Entity_Identifier__c', - index: 2, - required: 'RequiredOptional', - dataType: 'String-Fixed', - maxLength: 12, - listVals: [], - columnName: 'C', - humanColName: 'UEI', - ecCodes: false, - }, - EIN__c: { - key: 'EIN__c', - index: 3, - required: 'RequiredOptional', - dataType: 'String-Fixed', - maxLength: 9, - listVals: [], - columnName: 'D', - humanColName: 'TIN', - ecCodes: false, - }, - Name: { - key: 'Name', - index: 4, - required: true, - dataType: 'String', - maxLength: 80, - listVals: [], - columnName: 'E', - humanColName: 'Legal Name', - ecCodes: false, - }, - Entity_Type_2__c: { - key: 'Entity_Type_2__c', - index: 5, - required: true, - dataType: 'Multi-Select', - maxLength: null, - listVals: ['Subrecipient', 'Contractor', 'Beneficiary'], - columnName: 'F', - humanColName: 'Entity Type', - ecCodes: false, - }, - POC_Email_Address__c: { - key: 'POC_Email_Address__c', - index: 6, - required: false, - dataType: 'String', - maxLength: 40, - listVals: [], - columnName: 'G', - humanColName: 'Point of Contact Email Address', - ecCodes: false, - }, - Address__c: { - key: 'Address__c', - index: 7, - required: true, - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'H', - humanColName: 'Address Line 1', - ecCodes: false, - }, - Address_2__c: { - key: 'Address_2__c', - index: 8, - required: false, - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'I', - humanColName: 'Address Line 2', - ecCodes: false, - }, - Address_3__c: { - key: 'Address_3__c', - index: 9, - required: false, - dataType: 'String', - maxLength: 255, - listVals: [], - columnName: 'J', - humanColName: 'Address Line 3', - ecCodes: false, - }, - City__c: { - key: 'City__c', - index: 10, - required: true, - dataType: 'String', - maxLength: 100, - listVals: [], - columnName: 'K', - humanColName: 'City Name', - ecCodes: false, - }, - State_Abbreviated__c: { - key: 'State_Abbreviated__c', - index: 11, - required: true, dataType: 'Pick List', maxLength: null, listVals: [ @@ -6287,447 +985,611 @@ export default { 'WI', 'WY', ], - columnName: 'L', - humanColName: 'State Code', - ecCodes: false, + columnName: 'BY', + humanColName: 'State (Actual) ', + ecCodes: ['1B', '1C'], + }, + Zip_Code_Planned__c: { + key: 'Zip_Code_Planned__c', + index: 77, + required: true, + dataType: 'String', + maxLength: 5, + listVals: [], + columnName: 'BZ', + humanColName: 'Zip Code (Planned)', + ecCodes: ['1B', '1C'], + }, + Zip_Code_Actual__c: { + key: 'Zip_Code_Actual__c', + index: 78, + required: 'Conditional', + dataType: 'String', + maxLength: 5, + listVals: [], + humanColName: 'Zip Code (Actual)', + ecCodes: [], + }, + Laptops_Planned__c: { + key: 'Laptops_Planned__c', + index: 79, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Laptops (Planned)', + ecCodes: [], + }, + Laptops_Actual__c: { + key: 'Laptops_Actual__c', + index: 80, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Laptops (Actual)', + ecCodes: [], + }, + Laptops_Expenditures_Planned__c: { + key: 'Laptops_Expenditures_Planned__c', + index: 81, + required: true, + dataType: 'Currency3', + maxLength: null, + listVals: [], + humanColName: 'Laptops Expenditure (Planned)', + ecCodes: [], + }, + Laptops_Expenditures_Actual__c: { + key: 'Laptops_Expenditures_Actual__c', + index: 82, + required: 'Conditional', + dataType: 'Currency3', + maxLength: null, + listVals: [], + humanColName: 'Laptops Expenditure (Actual)', + ecCodes: [], }, - Zip__c: { - key: 'Zip__c', - index: 12, + Tablets_Planned__c: { + key: 'Tablets_Planned__c', + index: 83, required: true, - dataType: 'String', - maxLength: 5, + dataType: 'Numeric', + maxLength: 9999999999, listVals: [], - columnName: 'M', - humanColName: 'Zip', - ecCodes: false, + humanColName: 'Tablets (Planned)', + ecCodes: [], }, - Zip_4__c: { - key: 'Zip_4__c', - index: 13, - required: false, - dataType: 'String', - maxLength: 4, + Tablets_Actual__c: { + key: 'Tablets_Actual__c', + index: 84, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 9999999999, listVals: [], - columnName: 'N', - humanColName: 'Zip4', - ecCodes: false, + humanColName: 'Tablets (Actual)', + ecCodes: [], }, - Country__c: { - key: 'Country__c', - index: 14, - required: false, - dataType: 'String', - maxLength: 2, + Tablet_Expenditures_Planned__c: { + key: 'Tablet_Expenditures_Planned__c', + index: 85, + required: true, + dataType: 'Currency3', + maxLength: null, listVals: [], - columnName: 'O', - humanColName: 'Country Code', - ecCodes: false, + humanColName: 'Tablets Expenditure (Planned)', + ecCodes: [], }, - Registered_in_Sam_gov__c: { - key: 'Registered_in_Sam_gov__c', - index: 15, + Tablets_Expenditures_Actual__c: { + key: 'Tablets_Expenditures_Actual__c', + index: 86, + required: 'Conditional', + dataType: 'Currency3', + maxLength: null, + listVals: [], + humanColName: 'Tablets Expenditure (Actual)', + ecCodes: [], + }, + Desktop_Computers_Planned__c: { + key: 'Desktop_Computers_Planned__c', + index: 87, required: true, - dataType: 'Pick List', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Desktop Computers (Planned)', + ecCodes: [], + }, + Desktop_Computers_Actual__c: { + key: 'Desktop_Computers_Actual__c', + index: 88, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Desktop Computers (Actual)', + ecCodes: [], + }, + Desktop_Computers_Expenditures_Planned__c: { + key: 'Desktop_Computers_Expenditures_Planned__c', + index: 89, + required: true, + dataType: 'Currency3', maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'P', - humanColName: 'Recipient SAM.gov Registration?', - ecCodes: false, + listVals: [], + humanColName: 'Desktop Computers Expenditure (Planned)', + ecCodes: [], }, - Federal_Funds_80_or_More_of_Revenue__c: { - key: 'Federal_Funds_80_or_More_of_Revenue__c', - index: 16, + Desktop_Computers_Expenditures_Actual__c: { + key: 'Desktop_Computers_Expenditures_Actual__c', + index: 90, required: 'Conditional', - dataType: 'Pick List', + dataType: 'Currency3', maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'Q', - humanColName: - 'In its preceding fiscal year, did recipient receive 80% or more of its annual gross revenue from federal funds?', - ecCodes: false, + listVals: [], + humanColName: 'Desktop Computers Expenditure (Actual)', + ecCodes: [], }, - Derives_25_Million_or_More_from_Federal__c: { - key: 'Derives_25_Million_or_More_from_Federal__c', - index: 17, + Public_WiFi_Planned__c: { + key: 'Public_WiFi_Planned__c', + index: 91, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Public WiFi (Planned)', + ecCodes: [], + }, + Public_WiFi_Actual__c: { + key: 'Public_WiFi_Actual__c', + index: 92, required: 'Conditional', - dataType: 'Pick List', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Public WiFi (Actual)', + ecCodes: [], + }, + Public_WiFi_Expenditures_Planned__c: { + key: 'Public_WiFi_Expenditures_Planned__c', + index: 93, + required: true, + dataType: 'Currency3', maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'R', - humanColName: - 'In the preceding fiscal year, did recipient receive $25 million or more of its annual gross revenue from federal funds?', - ecCodes: false, + listVals: [], + humanColName: 'Public Wifi Expenditures (Planned)', + ecCodes: [], }, - Total_Compensation_for_Officers_Public__c: { - key: 'Total_Compensation_for_Officers_Public__c', - index: 18, + Public_WiFi_Expenditures_Actual__c: { + key: 'Public_WiFi_Expenditures_Actual__c', + index: 94, required: 'Conditional', - dataType: 'Pick List', + dataType: 'Currency3', maxLength: null, - listVals: ['Yes', 'No'], - columnName: 'S', - humanColName: - 'Is the "total compensation" for the organization\'s five highest paid officers publicly listed or otherwise listed in SAM.gov?', - ecCodes: false, + listVals: [], + humanColName: 'Public Wifi Expenditures (Actual)', + ecCodes: [], }, - Officer_Name__c: { - key: 'Officer_Name__c', - index: 19, + Other_Devices_Planned__c: { + key: 'Other_Devices_Planned__c', + index: 95, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Other Devices (Planned)', + ecCodes: [], + }, + Other_Devices_Actual__c: { + key: 'Other_Devices_Actual__c', + index: 96, required: 'Conditional', - dataType: 'String', - maxLength: 80, + dataType: 'Numeric', + maxLength: 9999999999, listVals: [], - columnName: 'T', - humanColName: 'Executive Name (1)', - ecCodes: false, + humanColName: 'Other Devices (Actual)', + ecCodes: [], }, - Officer_Total_Comp__c: { - key: 'Officer_Total_Comp__c', - index: 20, + Other_Expenditures_Planned__c: { + key: 'Other_Expenditures_Planned__c', + index: 97, + required: true, + dataType: 'Currency3', + maxLength: null, + listVals: [], + humanColName: 'Other Expenditures (Planned)', + ecCodes: [], + }, + Other_Expenditures_Actual__c: { + key: 'Other_Expenditures_Actual__c', + index: 98, required: 'Conditional', - dataType: 'Currency', + dataType: 'Currency3', maxLength: null, listVals: [], - columnName: 'U', - humanColName: 'Total Compensation Executive (1)', - ecCodes: false, + humanColName: 'Other Expenditures (Actual)', + ecCodes: [], }, - Officer_2_Name__c: { - key: 'Officer_2_Name__c', - index: 21, + Explanation_of_Other_Expend__c: { + key: 'Explanation_of_Other_Expend__c', + index: 99, required: 'Conditional', dataType: 'String', - maxLength: 80, + maxLength: 3000, listVals: [], - columnName: 'V', - humanColName: 'Executive Name (2)', - ecCodes: false, + humanColName: 'Explanation of Other Expenditures', + ecCodes: [], }, - Officer_2_Total_Comp__c: { - key: 'Officer_2_Total_Comp__c', - index: 22, - required: 'Conditional', - dataType: 'Currency', - maxLength: null, + Number_of_Users_Planned__c: { + key: 'Number_of_Users_Planned__c', + index: 100, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, listVals: [], - columnName: 'W', - humanColName: 'Total Compensation Executive (2)', - ecCodes: false, + humanColName: 'Number of Users (Planned)', + ecCodes: [], }, - Officer_3_Name__c: { - key: 'Officer_3_Name__c', - index: 23, + Number_of_Users_Actual__c: { + key: 'Number_of_Users_Actual__c', + index: 101, required: 'Conditional', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Number of Users (Actual)', + ecCodes: [], + }, + Brief_Narrative_Planned__c: { + key: 'Brief_Narrative_Planned__c', + index: 102, + required: true, dataType: 'String', - maxLength: 80, + maxLength: 3000, listVals: [], - columnName: 'X', - humanColName: 'Executive Name (3)', - ecCodes: false, + humanColName: 'Brief Narrative (Planned) ', + ecCodes: [], }, - Officer_3_Total_Comp__c: { - key: 'Officer_3_Total_Comp__c', - index: 24, + Brief_Narrative_Actual__c: { + key: 'Brief_Narrative_Actual__c', + index: 103, required: 'Conditional', - dataType: 'Currency', + dataType: 'String', + maxLength: 3000, + listVals: [], + humanColName: 'Brief Narrative (Actual)', + ecCodes: [], + }, + Measurement_of_Effectiveness__c: { + key: 'Measurement_of_Effectiveness__c', + index: 104, + required: true, + dataType: 'Pick List', maxLength: null, + listVals: ['Yes', 'No'], + humanColName: 'Measurment of Effectiveness?', + ecCodes: [], + }, + Type_of_Investment__c: { + key: 'Type_of_Investment__c', + index: 105, + required: true, + dataType: 'Pick List', + maxLength: null, + listVals: ['1. New Construction', '2. Renovation'], + humanColName: 'Type of Investment ', + ecCodes: [], + }, + Additional_Address__c: { + key: 'Additional_Address__c', + index: 106, + required: false, + dataType: 'String', + maxLength: 32000, listVals: [], - columnName: 'Y', - humanColName: 'Total Compensation Executive (3)', - ecCodes: false, + humanColName: 'Additional Addresses', + ecCodes: [], }, - Officer_4_Name__c: { - key: 'Officer_4_Name__c', - index: 25, + Classrooms_Planned__c: { + key: 'Classrooms_Planned__c', + index: 107, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Classrooms (Planned)', + ecCodes: [], + }, + Classrooms_Actual__c: { + key: 'Classrooms_Actual__c', + index: 108, required: 'Conditional', - dataType: 'String', - maxLength: 80, + dataType: 'Numeric', + maxLength: 9999999999, listVals: [], - columnName: 'Z', - humanColName: 'Executive Name (4)', - ecCodes: false, + humanColName: 'Classrooms (Actual)', + ecCodes: [], }, - Officer_4_Total_Comp__c: { - key: 'Officer_4_Total_Comp__c', - index: 26, + Computer_labs_Planned__c: { + key: 'Computer_labs_Planned__c', + index: 109, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Computer labs (Planned)', + ecCodes: [], + }, + Computer_labs_Actual__c: { + key: 'Computer_labs_Actual__c', + index: 110, required: 'Conditional', - dataType: 'Currency', - maxLength: null, + dataType: 'Numeric', + maxLength: 9999999999, listVals: [], - columnName: 'AA', - humanColName: 'Total Compensation Executive (4)', - ecCodes: false, + humanColName: 'Computer labs (Actual)', + ecCodes: [], }, - Officer_5_Name__c: { - key: 'Officer_5_Name__c', - index: 27, + Multi_purpose_Spaces_Planned__c: { + key: 'Multi_purpose_Spaces_Planned__c', + index: 111, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Multi-purpose Spaces (Planned)', + ecCodes: [], + }, + Multi_purpose_Spaces_Actual__c: { + key: 'Multi_purpose_Spaces_Actual__c', + index: 112, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Multi-purpose Spaces (Actual)', + ecCodes: [], + }, + Telemedicine_Rooms_Planned__c: { + key: 'Telemedicine_Rooms_Planned__c', + index: 113, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Telemedicine Rooms (Planned)', + ecCodes: [], + }, + Telemedicine_Rooms_Actual__c: { + key: 'Telemedicine_Rooms_Actual__c', + index: 114, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Telemedicine Rooms (Actual)', + ecCodes: [], + }, + Other_Capital_Assets_Planned__c: { + key: 'Other_Capital_Assets_Planned__c', + index: 115, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Other Capital Assets (Planned)', + ecCodes: [], + }, + Other_Capital_Assets_Actual__c: { + key: 'Other_Capital_Assets_Actual__c', + index: 116, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Other Capital Assets (Actual)', + ecCodes: [], + }, + Type_and_Features__c: { + key: 'Type_and_Features__c', + index: 117, required: 'Conditional', dataType: 'String', - maxLength: 80, + maxLength: 3000, listVals: [], - columnName: 'AB', - humanColName: 'Executive Name (5)', - ecCodes: false, + humanColName: 'Type and Features', + ecCodes: [], }, - Officer_5_Total_Comp__c: { - key: 'Officer_5_Total_Comp__c', - index: 28, + Total_square_footage_Planned__c: { + key: 'Total_square_footage_Planned__c', + index: 118, + required: true, + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Total square footage (Planned)', + ecCodes: [], + }, + Total_square_footage_Actual__c: { + key: 'Total_square_footage_Actual__c', + index: 119, + required: 'Conditional', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Total square footage (Actual)', + ecCodes: [], + }, + Total_Number_of_Users_Actual__c: { + key: 'Total_Number_of_Users_Actual__c', + index: 120, required: 'Conditional', - dataType: 'Currency', + dataType: 'Numeric', + maxLength: 9999999999, + listVals: [], + humanColName: 'Total Number of Users (Actual)', + ecCodes: [], + }, + Further_Explanation__c: { + key: 'Further_Explanation__c', + index: 121, + required: false, + dataType: 'String', + maxLength: 2000, + listVals: [], + humanColName: 'Further Explanation', + ecCodes: [], + }, + Access_to_Public_Transit__c: { + key: 'Access_to_Public_Transit__c', + index: 122, + required: true, + dataType: 'Pick List', maxLength: null, - listVals: [], - columnName: 'AC', - humanColName: 'Total Compensation Executive (5)', - ecCodes: false, + listVals: ['Yes', 'No'], + humanColName: 'Access to Public Transit? ', + ecCodes: [], }, }, - awards50k: { - Recipient_UEI__c: { - key: 'Recipient_UEI__c', + subrecipient: { + Name: { + key: 'Name', index: 2, - required: 'RequiredOptional', - dataType: 'String-Fixed', - maxLength: 12, + required: true, + dataType: 'String', + maxLength: 80, listVals: [], columnName: 'C', - humanColName: 'UEI', + humanColName: 'Subrecipient Name', ecCodes: false, }, - Recipient_EIN__c: { - key: 'Recipient_EIN__c', + EIN__c: { + key: 'EIN__c', index: 3, - required: 'RequiredOptional', + required: true, dataType: 'String-Fixed', maxLength: 9, listVals: [], columnName: 'D', - humanColName: 'TIN', + humanColName: 'Subrecipient Tax ID Number (TIN)', ecCodes: false, }, - Display_Only: { - key: 'Display_Only', - index: 8, - required: 'Hidden', - dataType: 'Display Only', - maxLength: null, + Unique_Entity_Identifier__c: { + key: 'Unique_Entity_Identifier__c', + index: 4, + required: true, + dataType: 'String-Fixed', + maxLength: 12, listVals: [], - columnName: 'I', - humanColName: 'Helper Column - Hidden From User - Do Not Alter', + columnName: 'E', + humanColName: 'Unique Entity Identifier (UEI)', ecCodes: false, }, - Entity_Type_2__c: { - key: 'Entity_Type_2__c', + POC_Name__c: { + key: 'POC_Name__c', index: 5, required: true, - dataType: 'Pick List', - maxLength: null, - listVals: ['Subrecipient', 'Contractor', 'Beneficiary'], + dataType: 'String', + maxLength: 100, + listVals: [], columnName: 'F', - humanColName: 'Entity Type', + humanColName: 'POC Name', ecCodes: false, }, - Project_Identification_Number__c: { - key: 'Project_Identification_Number__c', + POC_Phone_Number__c: { + key: 'POC_Phone_Number__c', index: 6, required: true, - dataType: 'String', - maxLength: 20, + dataType: 'String-Fixed', + maxLength: 10, listVals: [], columnName: 'G', - humanColName: 'Project Identification Number\r\n(Assigned by recipient)', + humanColName: 'POC Phone Number', ecCodes: false, }, - Award_No__c: { - key: 'Award_No__c', + POC_Email_Address__c: { + key: 'POC_Email_Address__c', index: 7, required: true, dataType: 'String', - maxLength: 20, + maxLength: 80, listVals: [], columnName: 'H', - humanColName: 'SubAward Number (unique identifier)', - ecCodes: false, - }, - Award_Type__c: { - key: 'Award_Type__c', - index: 9, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Contract: Purchase Order', - 'Contract: Delivery Order', - 'Contract: Blanket Purchase Agreement', - 'Contract: Definitive Contract', - 'Grant: Lump Sum Payment(s)', - 'Grant: Reimbursable', - 'Direct Payment', - 'Transfer: Lump Sum Payment(s)', - 'Transfer: Reimbursable', - 'Loan - maturity prior to 12/31/26 with planned forgiveness', - 'Loan - maturity prior to 12/31/26 without planned forgiveness', - 'Loan - maturity past 12/31/26 with planned forgiveness', - 'Loan - maturity past 12/31/26 without planned forgiveness', - ], - columnName: 'J', - humanColName: 'SubAward Type', - ecCodes: false, - }, - Award_Amount__c: { - key: 'Award_Amount__c', - index: 10, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'K', - humanColName: 'SubAward Amount (Obligation)', + humanColName: 'POC Email Address', ecCodes: false, }, - Award_Date__c: { - key: 'Award_Date__c', - index: 11, + Zip__c: { + key: 'Zip__c', + index: 8, required: true, - dataType: 'Date', - maxLength: null, - listVals: [], - columnName: 'L', - humanColName: 'SubAward Award Date', - ecCodes: false, - }, - Primary_Sector__c: { - key: 'Primary_Sector__c', - index: 12, - required: 'Conditional', - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Any work performed by an employee of a State local or Tribal government', - 'Behavioral health work', - 'Biomedical research', - 'Dental care work', - 'Educational work school nutrition work and other work required to operate a school facility', - 'Elections work', - 'Emergency response', - 'Family or child care', - 'Grocery stores restaurants food production and food delivery', - 'Health care', - 'Home- and community-based health care or assistance with activities of daily living', - 'Laundry work', - 'Maintenance work', - 'Medical testing and diagnostics', - 'Pharmacy', - 'Public health work', - 'Sanitation disinfection and cleaning work', - 'Social services work', - 'Solid waste or hazardous materials management response and cleanup work', - 'Transportation and warehousing', - 'Vital services to Tribes', - 'Work at hotel and commercial lodging facilities that are used for COVID-19 mitigation and containment', - 'Work in a mortuary', - 'Work in critical clinical research development and testing necessary for COVID-19 response', - 'Work requiring physical interaction with patients', - 'Other', - ], - columnName: 'M', - humanColName: 'Primary Sector', - ecCodes: false, - }, - If_Other__c: { - key: 'If_Other__c', - index: 13, - required: 'Conditional', dataType: 'String', - maxLength: 100, + maxLength: 5, listVals: [], - columnName: 'N', - humanColName: 'If Other', + columnName: 'I', + humanColName: 'Zip5', ecCodes: false, }, - Purpose_of_Funds__c: { - key: 'Purpose_of_Funds__c', - index: 14, - required: 'Conditional', + Zip_4__c: { + key: 'Zip_4__c', + index: 9, + required: false, dataType: 'String', - maxLength: 3000, - listVals: [], - columnName: 'O', - humanColName: 'Purpose of funds', - ecCodes: false, - }, - Period_of_Performance_Start__c: { - key: 'Period_of_Performance_Start__c', - index: 15, - required: true, - dataType: 'Date', - maxLength: null, - listVals: [], - columnName: 'P', - humanColName: 'Period of Performance Start Date ', - ecCodes: false, - }, - Period_of_Performance_End__c: { - key: 'Period_of_Performance_End__c', - index: 16, - required: true, - dataType: 'Date', - maxLength: null, + maxLength: 4, listVals: [], - columnName: 'Q', - humanColName: 'Period of Performance End Date ', + columnName: 'J', + humanColName: 'Zip4', ecCodes: false, }, - Place_of_Performance_Address_1__c: { - key: 'Place_of_Performance_Address_1__c', - index: 17, + Address__c: { + key: 'Address__c', + index: 10, required: true, dataType: 'String', - maxLength: 120, + maxLength: 40, listVals: [], - columnName: 'R', - humanColName: 'Primary Place of Performance Address Line 1 ', + columnName: 'K', + humanColName: 'Address Line 1', ecCodes: false, }, - Place_of_Performance_Address_2__c: { - key: 'Place_of_Performance_Address_2__c', - index: 18, + Address_2__c: { + key: 'Address_2__c', + index: 11, required: false, dataType: 'String', - maxLength: 120, + maxLength: 40, listVals: [], - columnName: 'S', - humanColName: 'Primary Place of Performance Address Line 2', + columnName: 'L', + humanColName: 'Address Line 2', ecCodes: false, }, - Place_of_Performance_Address_3__c: { - key: 'Place_of_Performance_Address_3__c', - index: 19, + Address_3__c: { + key: 'Address_3__c', + index: 12, required: false, dataType: 'String', - maxLength: 120, + maxLength: 40, listVals: [], - columnName: 'T', - humanColName: 'Primary Place of Performance Address Line 3', + columnName: 'M', + humanColName: 'Address Line 3', ecCodes: false, }, - Place_of_Performance_City__c: { - key: 'Place_of_Performance_City__c', - index: 20, + City__c: { + key: 'City__c', + index: 13, required: true, dataType: 'String', - maxLength: 40, + maxLength: 100, listVals: [], - columnName: 'U', - humanColName: 'Primary Place of Performance City Name ', + columnName: 'N', + humanColName: 'City', ecCodes: false, }, State_Abbreviated__c: { key: 'State_Abbreviated__c', - index: 21, + index: 14, required: true, dataType: 'Pick List', - maxLength: 2, + maxLength: null, listVals: [ 'AL', 'AK', @@ -6789,174 +1651,8 @@ export default { 'WI', 'WY', ], - columnName: 'V', - humanColName: 'Primary Place of Performance State Code ', - ecCodes: false, - }, - Place_of_Performance_Zip__c: { - key: 'Place_of_Performance_Zip__c', - index: 22, - required: true, - dataType: 'String', - maxLength: 5, - listVals: [], - columnName: 'W', - humanColName: 'Primary Place of Performance Zip', - ecCodes: false, - }, - Place_of_Performance_Zip_4__c: { - key: 'Place_of_Performance_Zip_4__c', - index: 23, - required: false, - dataType: 'String', - maxLength: 4, - listVals: [], - columnName: 'X', - humanColName: 'Place of Performance Zip4', - ecCodes: false, - }, - Description__c: { - key: 'Description__c', - index: 24, - required: true, - dataType: 'String', - maxLength: 750, - listVals: [], - columnName: 'Y', - humanColName: 'SubAward Description', - ecCodes: false, - }, - Subaward_Changed__c: { - key: 'Subaward_Changed__c', - index: 25, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [], - columnName: 'Z', - humanColName: - 'Did the Subaward Amount (Obligation) Change From Last Reporting Period?', - ecCodes: false, - }, - Change_Reason__c: { - key: 'Change_Reason__c', - index: 26, - required: 'Conditional', - dataType: 'String', - maxLength: 250, - listVals: [], - columnName: 'AA', - humanColName: 'Reason for the Subaward Amount (Obligation) Change', - ecCodes: false, - }, - }, - expenditures50k: { - Sub_Award_Lookup__c: { - key: 'Sub_Award_Lookup__c', - index: 2, - required: true, - dataType: 'String', - maxLength: 20, - listVals: [], - columnName: 'C', - humanColName: 'SubAward Number (unique identifier)', - ecCodes: false, - }, - Display_Only: { - key: 'Display_Only', - index: 4, - required: 'Informational', - dataType: 'Display Only', - maxLength: null, - listVals: [], - columnName: 'E', - humanColName: 'Legal Name', - ecCodes: false, - }, - Expenditure_Start__c: { - key: 'Expenditure_Start__c', - index: 5, - required: true, - dataType: 'Date', - maxLength: null, - listVals: [], - columnName: 'F', - humanColName: 'Expenditure Start Date', - ecCodes: false, - }, - Expenditure_End__c: { - key: 'Expenditure_End__c', - index: 6, - required: true, - dataType: 'Date', - maxLength: null, - listVals: [], - columnName: 'G', - humanColName: 'Expenditure End Date', - ecCodes: false, - }, - Expenditure_Amount__c: { - key: 'Expenditure_Amount__c', - index: 7, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'H', - humanColName: 'Total Expenditure Amount', - ecCodes: false, - }, - }, - awards: { - Project_Identification_Number__c: { - key: 'Project_Identification_Number__c', - index: 2, - required: true, - dataType: 'String', - maxLength: 20, - listVals: [], - columnName: 'C', - humanColName: 'Project Identification Number\r\n(Assigned by recipient)', - ecCodes: false, - }, - Sub_Award_Type_Aggregates_SLFRF__c: { - key: 'Sub_Award_Type_Aggregates_SLFRF__c', - index: 3, - required: true, - dataType: 'Pick List', - maxLength: null, - listVals: [ - 'Aggregate of Contracts Awarded', - 'Aggregate of Grants Awarded', - 'Aggregate of Loans Issued', - 'Aggregate of Transfers', - 'Aggregate of Direct Payments', - 'Payments to Individuals', - ], - columnName: 'D', - humanColName: 'Aggregate Sub Award Type', - ecCodes: false, - }, - Quarterly_Obligation_Amt_Aggregates__c: { - key: 'Quarterly_Obligation_Amt_Aggregates__c', - index: 4, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'E', - humanColName: 'Current Quarter Obligation', - ecCodes: false, - }, - Quarterly_Expenditure_Amt_Aggregates__c: { - key: 'Quarterly_Expenditure_Amt_Aggregates__c', - index: 5, - required: true, - dataType: 'Currency', - maxLength: null, - listVals: [], - columnName: 'F', - humanColName: 'Current Quarter Expenditure/Payments', + columnName: 'O', + humanColName: 'State Abbreviated', ecCodes: false, }, }, diff --git a/api/src/lib/uploadValidationTypes.ts b/api/src/lib/uploadValidationTypes.ts new file mode 100644 index 00000000..f49da5c6 --- /dev/null +++ b/api/src/lib/uploadValidationTypes.ts @@ -0,0 +1,24 @@ +export type FormatterFunction = (value: string | number) => string | number + +export type Rule = { + key: string + index: number + required: boolean | string + dataType: string + maxLength: number + listVals: string[] + columnName: string + humanColName: string + ecCodes: string[] | boolean + version?: string + isRequiredFn?: (value: WorkbookContentItem) => boolean + validationFormatters: FormatterFunction[] +} + +export type WorkbookContentItem = Record + +export type WorkbookRecord = { + type: string + content: WorkbookContentItem + subcategory?: string +} diff --git a/api/src/lib/validate-upload.js b/api/src/lib/validate-upload.ts similarity index 58% rename from api/src/lib/validate-upload.js rename to api/src/lib/validate-upload.ts index 487eed1e..e3ed417b 100644 --- a/api/src/lib/validate-upload.js +++ b/api/src/lib/validate-upload.ts @@ -1,5 +1,12 @@ -import { ecCodes } from 'src/lib/ec-codes' +import { Subrecipient, Upload } from '@prisma/client' + +import projectUseCodes from 'src/lib/projectUseCodes' import { recordsForUpload, TYPE_TO_SHEET_NAME } from 'src/lib/records' +import { + Rule, + WorkbookContentItem, + WorkbookRecord, +} from 'src/lib/uploadValidationTypes' import { ValidationError } from 'src/lib/validation-error' import { getRules } from 'src/lib/validation-rules' import { @@ -21,9 +28,6 @@ const CURRENCY_REGEX_PATTERN = /^\d+(?: \.\d{ 1, 2 })?$/g const EMAIL_REGEX_PATTERN = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ -const BETA_VALIDATION_MESSAGE = - '[BETA] This is a new validation that is running in beta mode (as a warning instead of a blocking error). If you see anything incorrect about this validation, please report it at grants-helpdesk@usdigitalresponse.org' - const SHOULD_NOT_CONTAIN_PERIOD_REGEX_PATTERN = /^[^.]*$/ // This maps from field name to regular expression that must match on the field. @@ -39,17 +43,7 @@ const FIELD_NAME_TO_PATTERN = { }, } -// This is a convenience wrapper that lets us use consistent behavior for new validation errors. -// Specifically, all new validations should have a message explaining they are in beta and errors -// should be reported to us. The validation should also be a warning (not a blocking error) until -// it graduates out of beta -function betaValidationWarning(message) { - return new ValidationError(`${message} -- ${BETA_VALIDATION_MESSAGE}`, { - severity: 'warn', - }) -} - -function validateFieldPattern(fieldName, value) { +function validateFieldPattern(fieldName: string, value: string) { let error = null const matchedFieldPatternInfo = FIELD_NAME_TO_PATTERN[fieldName] if (matchedFieldPatternInfo) { @@ -62,48 +56,32 @@ function validateFieldPattern(fieldName, value) { return error } -async function validateEcCode({ upload, records }) { - // grab ec code string from cover sheet - const coverSheet = records.find((doc) => doc.type === 'cover').content - const codeString = coverSheet['Detailed Expenditure Category'] - - if (!codeString) { - return new ValidationError('EC code must be set', { - tab: 'cover', - row: 2, - col: 'D', +async function validateVersion({ + records, + rules, +}: { + records: WorkbookRecord[] + rules: { logic: { version: Rule } } +}) { + const logicRecord = records.find((record) => record?.type === 'logic') + if (!logicRecord) { + return new ValidationError(`Upload is missing Logic record`, { + tab: 'logic', + row: 1, + col: 1, + severity: 'warn', }) } - - const codeParts = codeString.split('-') - const code = codeParts[0] - - if (!ecCodes[code]) { - return new ValidationError( - `Record EC code ${code} from entry ${codeString} does not match any known EC code`, - { - tab: 'cover', - row: 2, - col: 'D', - severity: 'err', - } - ) - } - - // always set EC code if possible; we omit passing the transaction in this - // case, so that the code gets set even if the upload fails to validate - if (code !== upload.expenditureCategory.code) { - await updateUpload(upload.id, code) - upload.expenditureCategory.code = code + if (!logicRecord.content) { + return new ValidationError(`Logic record is missing "content"`, { + tab: 'logic', + row: 1, + col: 1, + severity: 'warn', + }) } - - return undefined -} - -async function validateVersion({ records, rules }) { - const logicSheet = records.find((record) => record.type === 'logic').content - const { version } = logicSheet - + const { version } = logicRecord.content + if (!version) return const versionRule = rules.logic.version let error = null @@ -128,28 +106,22 @@ async function validateVersion({ records, rules }) { return undefined } -/** - * Return an already existing record in the db, defined via UEI or TIN - * @param {object} recipient - the recipient record - * @param {object} trns - the transaction to use for db queries - * @returns {Promise} - the existing recipient record - */ -async function findRecipientInDatabase({ recipient }) { +async function findRecipientInDatabase({ + recipient, +}: { + recipient: WorkbookContentItem +}): Promise { // There are two types of identifiers, UEI and TIN. // A given recipient may have either or both of these identifiers. - const byUei = recipient.Unique_Entity_Identifier__c - ? await subrecipient(recipient.Unique_Entity_Identifier__c, null) + return recipient.Unique_Entity_Identifier__c + ? await subrecipient({ id: Number(recipient.Unique_Entity_Identifier__c) }) : null - - return byUei } -/** - * Validate the recipient's identifier - * @param {object} recipient - the recipient record - * @returns {Array} - an array of validation errors if found - */ -function validateIdentifier(recipient, recipientExists) { +function validateIdentifier( + recipient: WorkbookContentItem, + recipientExists: boolean +) { const errors = [] // As of Q1, 2023 we require a UEI for all entities of type subrecipient and/or contractor. @@ -159,7 +131,8 @@ function validateIdentifier(recipient, recipientExists) { const hasTIN = Boolean(recipient.EIN__c) const entityType = recipient.Entity_Type_2__c const isContractorOrSubrecipient = - entityType.includes('Contractor') || entityType.includes('Subrecipient') + String(entityType).includes('Contractor') || + String(entityType).includes('Subrecipient') if (isContractorOrSubrecipient && !recipientExists && !hasUEI) { errors.push( @@ -181,32 +154,21 @@ function validateIdentifier(recipient, recipientExists) { return errors } -/** - * Check if the recipient belongs to the given upload - * @param {object} existingRecipient - the existing recipient record - * @param {object} upload - the upload record - * @returns {boolean} - true if the recipient belongs to the upload - */ -function recipientBelongsToUpload(existingRecipient, upload) { +function recipientBelongsToUpload( + existingRecipient: Subrecipient, + upload: Upload +): boolean { return ( Boolean(existingRecipient) && - existingRecipient.upload_id === upload?.id && - !existingRecipient.updated_at + existingRecipient.originationUploadId === upload?.id && + !existingRecipient.updatedAt ) } -/** - * Update or create a recipient record - * @param {object} recipientInfo - the information about the recipient - * @param {object} trns - the transaction to use for db queries - * @param {object} upload - the upload record - * @returns - */ async function updateOrCreateRecipient( - existingRecipient, - newRecipient, - trns, - upload + existingRecipient: Subrecipient, + newRecipient: WorkbookContentItem, + upload: Upload ) { // TODO: what if the same upload specifies the same recipient multiple times, // but different? @@ -214,60 +176,118 @@ async function updateOrCreateRecipient( // If the current upload owns the recipient, we can actually update it if (existingRecipient) { if (recipientBelongsToUpload(existingRecipient, upload)) { - await updateSubrecipient(existingRecipient.id, newRecipient) + await updateSubrecipient({ + id: existingRecipient.id, + input: newRecipient, + }) } } else { - await createSubrecipient( - { - id: newRecipient.Unique_Entity_Identifier__c, + await createSubrecipient({ + input: { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + id: newRecipient.Unique_Entity_Identifier__c, // fixme not sure how to force the id if it is set to auto-index tin: newRecipient.EIN__c, record: newRecipient, originationUploadId: upload?.id, }, - trns - ) + }) } } -/** - * Validates a subrecipient record by checking the unique entity identifier (UEI) or taxpayer identification number (TIN/EIN). - * If the record passes validation, updates the existing recipient in the database or creates a new one. - * - * @async - * @function - * @param {object} options - The options object. - * @param {object} upload - The upload object. - * @param {object} record - The new recipient object to be validated. - * @param {array} recordErrors - The array of errors detected for the record so far. - * @returns {Promise} - The array of errors detected during the validation process. - */ async function validateSubrecipientRecord({ upload, record: recipient, recordErrors, -}) { - const errors = [] +}: { + upload: Upload + record: WorkbookContentItem + recordErrors: ValidationError[] +}): Promise> { + const errors: ValidationError[] = [] const existingRecipient = await findRecipientInDatabase({ recipient }) - errors.push(...validateIdentifier(recipient, existingRecipient)) + errors.push(...validateIdentifier(recipient, !!existingRecipient)) // Either: the record has already been validated before this method was invoked, or // we found an error above. If it's not valid, don't update or create it if (recordErrors.length === 0 && errors.length === 0) { - updateOrCreateRecipient(existingRecipient, recipient, upload) + await updateOrCreateRecipient(existingRecipient, recipient, upload) } return errors } +function validateProjectUseCode({ records }) { + const coverRecord = records.find( + (record: { type: string }) => record?.type === 'cover' + ) + if (!coverRecord) { + return new ValidationError(`Upload is missing Cover record`, { + tab: 'cover', + row: 1, + col: 'A', + severity: 'warn', + }) + } + const coverSheet = coverRecord?.content + if (!coverSheet) { + return new ValidationError(`Cover record is missing "content"`, { + tab: 'cover', + row: 2, + col: 'A', + severity: 'warn', + }) + } + + const codeString = coverSheet['Project Use Code'] + + if (!codeString) { + return new ValidationError('Project Use Code must be set', { + tab: 'cover', + row: 2, + col: 'A', + }) + } + + const codeParts = codeString.split('-') + const code = codeParts[0] + + if (!projectUseCodes[code]) { + return new ValidationError( + `Record Project Use Code (${code}) from entry (${codeString}) does not match any known Project Use Code`, + { + tab: 'cover', + row: 2, + col: 'A', + severity: 'err', + } + ) + } + + // TODO EC Code validation in ARPA caused a database update, + // even if we want to do that for CPF it probably shouldn't happen as part of validation -async function validateRecord({ upload, record, typeRules: rules }) { + return undefined +} +async function validateRecord({ + upload, + record, + typeRules: rules, +}: { + upload: Upload + record: WorkbookContentItem + typeRules: Record +}) { // placeholder for rule errors we're going to find const errors = [] // check all the rules for (const [key, rule] of Object.entries(rules)) { + const recordItem = record[key] + // if the rule only applies on different EC codes, skip it if ( rule.ecCodes && - (!upload.ec_code || !rule.ecCodes.includes(upload.expenditureCategoryId)) + (!upload.expenditureCategoryId || + !(rule.ecCodes).includes(upload.expenditureCategoryId)) ) { // eslint-disable-next-line no-continue continue @@ -275,7 +295,10 @@ async function validateRecord({ upload, record, typeRules: rules }) { // if the field is unset/missing/blank, is that okay? // we don't treat numeric `0` as unset - if ([undefined, null, ''].includes(record[key])) { + if ( + [undefined, null].includes(recordItem) || + (typeof recordItem === 'string' && recordItem === '') + ) { // make sure required keys are present if (rule.required === true) { errors.push( @@ -299,7 +322,7 @@ async function validateRecord({ upload, record, typeRules: rules }) { // if there's something in the field, make sure it meets requirements } else { // how do we format the value before checking it? - let value = record[key] + let value = recordItem let formatFailures = 0 for (const formatter of rule.validationFormatters) { try { @@ -323,7 +346,7 @@ async function validateRecord({ upload, record, typeRules: rules }) { const lcItems = rule.listVals.map((val) => val.toLowerCase()) // for pick lists, the value must be one of possible values - if (rule.dataType === 'Pick List' && !lcItems.includes(value)) { + if (rule.dataType === 'Pick List' && !lcItems.includes(String(value))) { errors.push( new ValidationError( `Value for ${key} ('${value}') must be one of ${lcItems.length} options in the input template`, @@ -334,7 +357,9 @@ async function validateRecord({ upload, record, typeRules: rules }) { // for multi select, all the values must be in the list of possible values if (rule.dataType === 'Multi-Select') { - const entries = value.split(';').map((val) => val.trim()) + const entries = String(value) + .split(';') + .map((val) => val.trim()) for (const entry of entries) { if (!lcItems.includes(entry)) { errors.push( @@ -348,7 +373,11 @@ async function validateRecord({ upload, record, typeRules: rules }) { } } - if (rule.dataType === 'Currency') { + if ( + ['Currency', 'Currency1', 'Currency2', 'Currency3'].includes( + rule.dataType + ) + ) { if ( value && typeof value === 'string' && @@ -379,7 +408,7 @@ async function validateRecord({ upload, record, typeRules: rules }) { } if (rule.dataType === 'String') { - const patternError = validateFieldPattern(key, value) + const patternError = validateFieldPattern(key, String(value)) if (patternError) { errors.push( new ValidationError(patternError.message, { @@ -408,28 +437,32 @@ async function validateRecord({ upload, record, typeRules: rules }) { if (rule.maxLength) { if ( (rule.dataType === 'String' || rule.dataType === 'String-Fixed') && - String(record[key]).length > rule.maxLength + String(recordItem).length > rule.maxLength ) { errors.push( new ValidationError( `Value for ${key} cannot be longer than ${ rule.maxLength - } (currently, ${String(record[key]).length})`, + } (currently, ${String(recordItem).length})`, { col: rule.columnName, severity: 'err' } ) ) } - - // TODO: should we validate max length on currency? or numeric fields? } } } - - // return all the found errors return errors } -async function validateRules({ upload, records, rules, trns }) { +async function validateRules({ + upload, + records, + rules, +}: { + upload: Upload + records: WorkbookRecord[] + rules: Record> +}) { const errors = [] // go through every rule type we have @@ -441,7 +474,7 @@ async function validateRules({ upload, records, rules, trns }) { // for each of those records, generate a list of rule violations for (const [recordIdx, record] of tRecords.entries()) { - let recordErrors + let recordErrors: ValidationError[] try { // TODO: Consider refactoring this to take better advantage of async parallelization // eslint-disable-next-line no-await-in-loop @@ -464,9 +497,7 @@ async function validateRules({ upload, records, rules, trns }) { ...(await validateSubrecipientRecord({ upload, record, - typeRules, recordErrors, - trns, })), ] } @@ -493,188 +524,7 @@ async function validateRules({ upload, records, rules, trns }) { return errors } -// Subrecipients can use either the uei, or the tin, or both as their identifier. -// This helper takes those 2 nullable fields and converts it to a reliable format -// so we can index and search by them. -function subrecipientIdString(uei, tin) { - if (!uei && !tin) { - return '' - } - return JSON.stringify({ uei, tin }) -} - -function sortRecords(records, errors) { - // These 3 types need to search-able by their unique id so we can quickly verify they exist - const projects = {} - const subrecipients = {} - const awardsGT50k = {} - - const awards = [] - const expendituresGT50k = [] - for (const record of records) { - switch (record.type) { - case 'ec1': - case 'ec2': - case 'ec3': - case 'ec4': - case 'ec5': - case 'ec7': { - const projectID = record.content.Project_Identification_Number__c - if (projectID in projects) { - errors.push( - betaValidationWarning( - `Project ids must be unique, but another row used the id ${projectID}` - ) - ) - } - projects[projectID] = record.content - break - } - case 'subrecipient': { - const subRecipId = subrecipientIdString( - record.content.Unique_Entity_Identifier__c, - record.content.EIN__c - ) - if (subRecipId && subRecipId in subrecipients) { - errors.push( - betaValidationWarning( - `Subrecipient ids must be unique, but another row used the id ${subRecipId}` - ) - ) - } - subrecipients[subRecipId] = record.content - break - } - case 'awards50k': { - const awardNumber = record.content.Award_No__c - if (awardNumber && awardNumber in awardsGT50k) { - errors.push( - betaValidationWarning( - `Award numbers must be unique, but another row used the number ${awardNumber}` - ) - ) - } - awardsGT50k[awardNumber] = record.content - break - } - case 'awards': - awards.push(record.content) - break - case 'expenditures50k': - expendituresGT50k.push(record.content) - break - case 'certification': - case 'cover': - case 'logic': - // Skip these sheets, they don't include records - // eslint-disable-next-line no-continue - continue - default: - console.error(`Unexpected record type: ${record.type}`) - } - } - - return { - projects, - subrecipients, - awardsGT50k, - awards, - expendituresGT50k, - } -} - -function validateSubawardRefs(awardsGT50k, projects, subrecipients, errors) { - // Any subawards must reference valid projects and subrecipients. - // Track the subrecipient ids that were referenced, since we'll need them later - const usedSubrecipients = new Set() - for (const [awardNumber, subaward] of Object.entries(awardsGT50k)) { - const projectRef = subaward.Project_Identification_Number__c - if (!(projectRef in projects)) { - errors.push( - betaValidationWarning( - `Subaward number ${awardNumber} referenced a non-existent projectId ${projectRef}` - ) - ) - } - const subRecipRef = subrecipientIdString( - subaward.Recipient_UEI__c, - subaward.Recipient_EIN__c - ) - if (!(subRecipRef in subrecipients)) { - errors.push( - betaValidationWarning( - `Subaward number ${awardNumber} referenced a non-existent subrecipient with id ${subRecipRef}` - ) - ) - } - usedSubrecipients.add(subRecipRef) - } - // Return this so that it can be used in the subrecipient validations - return usedSubrecipients -} - -function validateSubrecipientRefs(subrecipients, usedSubrecipients, errors) { - // Make sure that every subrecip included in this upload was referenced by at least one subaward - for (const subRecipId of Object.keys(subrecipients)) { - if (!(subRecipId && usedSubrecipients.has(subRecipId))) { - errors.push( - betaValidationWarning( - `Subrecipient with id ${subRecipId} has no related subawards and can be ommitted.` - ) - ) - } - } -} - -function validateExpenditureRefs(expendituresGT50k, awardsGT50k, errors) { - // Make sure each expenditure references a valid subward - for (const expenditure of expendituresGT50k) { - const awardRef = expenditure.Sub_Award_Lookup__c - if (!(awardRef in awardsGT50k)) { - errors.push( - betaValidationWarning( - `An expenditure referenced an unknown award number ${awardRef}` - ) - ) - } - } -} - -async function validateReferences({ records }) { - const errors = [] - - const sortedRecords = sortRecords(records, errors) - - // Must include at least 1 project in the upload - if (Object.keys(sortedRecords.projects).length === 0) { - errors.push( - new ValidationError(`Upload doesn't include any project records`, { - severity: 'err', - }) - ) - } - - const usedSubrecipients = validateSubawardRefs( - sortedRecords.awardsGT50k, - sortedRecords.projects, - sortedRecords.subrecipients, - errors - ) - validateSubrecipientRefs( - sortedRecords.subrecipients, - usedSubrecipients, - errors - ) - validateExpenditureRefs( - sortedRecords.expendituresGT50k, - sortedRecords.awardsGT50k, - errors - ) - - return errors -} - -async function validateUpload(upload, user, trns = null) { +async function validateUpload(upload: Upload, user, trns = null) { // holder for our validation errors const errors = [] @@ -689,9 +539,10 @@ async function validateUpload(upload, user, trns = null) { // list of all of our validations const validations = [ validateVersion, - validateEcCode, + validateProjectUseCode, + // validateEcCode, validateRules, - validateReferences, + // validateReferences, ] // we should do this in a transaction, unless someone is doing it for us @@ -711,7 +562,6 @@ async function validateUpload(upload, user, trns = null) { upload, records, rules, - trns, }) ) } catch (e) { @@ -734,7 +584,7 @@ async function validateUpload(upload, user, trns = null) { const validated = fatal.length === 0 // if we successfully validated for the first time, let's mark it! - if (validated && !upload.validated_at) { + if (validated && !upload.validatedAt) { try { await markValidated(upload.id, user.id) } catch (e) { @@ -753,7 +603,7 @@ async function validateUpload(upload, user, trns = null) { } // if it was valid before but is no longer valid, clear it; this happens outside the transaction - if (!validated && upload.validated_at) { + if (!validated && upload.validatedAt) { await markInvalidated(upload.id, trns) } @@ -761,7 +611,7 @@ async function validateUpload(upload, user, trns = null) { return flatErrors } -async function invalidateUpload(upload, user, trns = null) { +async function invalidateUpload(upload: Upload, user, trns = null) { const errors = [] const ourTransaction = !trns diff --git a/api/src/lib/validation-rules.js b/api/src/lib/validation-rules.js index 8afad93b..c7ba4b52 100644 --- a/api/src/lib/validation-rules.js +++ b/api/src/lib/validation-rules.js @@ -121,12 +121,13 @@ function generateRules() { // FIXME: this is supposed to be the contents of templateRules.json const rules = srcRules + // TODO issues with EIN* not being in the rules? // subrecipient EIN is actually a length-10 string - rules.subrecipient.EIN__c.dataType = 'String' - rules.subrecipient.EIN__c.maxLength = 10 + // rules.subrecipient.EIN__c.dataType = 'String' + // rules.subrecipient.EIN__c.maxLength = 10 - rules.awards50k.Recipient_EIN__c.dataType = 'String' - rules.awards50k.Recipient_EIN__c.maxLength = 10 + // rules.awards50k.Recipient_EIN__c.dataType = 'String' + // rules.awards50k.Recipient_EIN__c.maxLength = 10 // value formatters modify the value in the record before it's validated // we check any rule against the formatted value