From 621ced6a89eee2da049be81b44f66468f599006d Mon Sep 17 00:00:00 2001 From: Matt Jadud Date: Fri, 16 Jun 2023 07:17:50 -0400 Subject: [PATCH 01/12] Adding help text for XLSX workbooks This commit adds placeholder help structures to all of our Jsonnet templates for XLSX workbooks. This commit is only the structures, not the content of the error messages. --- .gitignore | 2 - .../schemas/source/excel/libs/Help.libsonnet | 62 ++++++ .../excel/libs/SheetValidations.libsonnet | 1 + .../corrective-action-plan-template.jsonnet | 44 ++-- .../federal-awards-expended-template.jsonnet | 191 +++++++++++++++--- .../templates/findings-text-template.jsonnet | 44 ++-- ...findings-uniform-guidance-template.jsonnet | 137 +++++++++++-- 7 files changed, 410 insertions(+), 71 deletions(-) create mode 100644 backend/schemas/source/excel/libs/Help.libsonnet diff --git a/.gitignore b/.gitignore index ce14684648..1e454c6e72 100644 --- a/.gitignore +++ b/.gitignore @@ -166,8 +166,6 @@ staticfiles/ # pa11y_tests/screenshots/*.png -excel/ - # Things that folks might want to have in their local directories # that don't need to be checked in .local/ diff --git a/backend/schemas/source/excel/libs/Help.libsonnet b/backend/schemas/source/excel/libs/Help.libsonnet new file mode 100644 index 0000000000..3912f9486a --- /dev/null +++ b/backend/schemas/source/excel/libs/Help.libsonnet @@ -0,0 +1,62 @@ +local scheme = 'https'; +local domain = 'fac.gov'; +local path = 'documentation/validation'; + +local make_url = function(anchor) + scheme + '://' + domain + '/' + path + '/#' + anchor; + +{ + // A + aln_extension: { + text: '', + link: make_url('aln_extension'), + }, + aln_prefix: { + text: '', + link: make_url('aln_prefix'), + }, + // C + cluster_name: { + text: '', + link: make_url('cluster_name'), + }, + // F + federal_program_name: { + text: '', + link: make_url('federal_program_name'), + }, + // O + other_cluster_name: { + text: '', + link: make_url('other_cluster_name'), + }, + // P + plain_text: { + text: '', + link: make_url('plain_text'), + }, + positive_number: { + text: '', + link: make_url('positive_number'), + }, + // R + reference_number: { + text: '', + link: make_url('reference_number'), + }, + // U + uei: { + text: '', + link: make_url('uei'), + }, + unknown: { + text: 'If you see this error, please contact support.', + link: make_url('unknown'), + }, + // Y + yorn: { + text: '', + link: make_url('yorn'), + }, + +} diff --git a/backend/schemas/source/excel/libs/SheetValidations.libsonnet b/backend/schemas/source/excel/libs/SheetValidations.libsonnet index c5befecf6c..0f60130bc4 100644 --- a/backend/schemas/source/excel/libs/SheetValidations.libsonnet +++ b/backend/schemas/source/excel/libs/SheetValidations.libsonnet @@ -65,6 +65,7 @@ local ComplianceRequirementValidation = { }; { + NoValidation: {}, FAPPrefixValidation: FAPPrefixValidation, PositiveNumberValidation: PositiveNumberValidation, StringOfLengthThree: StringOfLengthThree, diff --git a/backend/schemas/source/excel/templates/corrective-action-plan-template.jsonnet b/backend/schemas/source/excel/templates/corrective-action-plan-template.jsonnet index 61e5f2a601..a4a80e388b 100644 --- a/backend/schemas/source/excel/templates/corrective-action-plan-template.jsonnet +++ b/backend/schemas/source/excel/templates/corrective-action-plan-template.jsonnet @@ -1,4 +1,5 @@ local Fun = import '../libs/Functions.libsonnet'; +local Help = import '../libs/Help.libsonnet'; local SV = import '../libs/SheetValidations.libsonnet'; local Sheets = import '../libs/Sheets.libsonnet'; @@ -11,22 +12,41 @@ local single_cells = [ title_cell: 'A2', range_cell: 'B2', validation: SV.StringOfLengthTwelve, + help: Help.uei, }, ]; local open_ranges_defns = [ - [Sheets.open_range { - title_cell: 'A3', - width: 36, - }, SV.ReferenceNumberValidation, 'Audit Finding Reference Number', 'reference_number'], - [Sheets.open_range { - title_cell: 'C3', - width: 100, - }, {}, 'Planned Corrective Action', 'planned_action'], - [Sheets.y_or_n_range { - title_cell: 'G3', - width: 36, - }, SV.YoNValidation, 'Did Text Contain a Chart or Table?', 'contains_chart_or_table'], + [ + Sheets.open_range { + title_cell: 'A3', + width: 36, + help: Help.reference_number, + }, + SV.ReferenceNumberValidation, + 'Audit Finding Reference Number', + 'reference_number', + ], + [ + Sheets.open_range { + title_cell: 'C3', + width: 100, + help: Help.plain_text, + }, + SV.NoValidation, + 'Planned Corrective Action', + 'planned_action', + ], + [ + Sheets.y_or_n_range { + title_cell: 'G3', + width: 36, + help: Help.yorn, + }, + SV.YoNValidation, + 'Did Text Contain a Chart or Table?', + 'contains_chart_or_table', + ], ]; local sheets = [ diff --git a/backend/schemas/source/excel/templates/federal-awards-expended-template.jsonnet b/backend/schemas/source/excel/templates/federal-awards-expended-template.jsonnet index c8b79dbb82..5da7544700 100644 --- a/backend/schemas/source/excel/templates/federal-awards-expended-template.jsonnet +++ b/backend/schemas/source/excel/templates/federal-awards-expended-template.jsonnet @@ -1,4 +1,5 @@ local Fun = import '../libs/Functions.libsonnet'; +local Help = import '../libs/Help.libsonnet'; local SV = import '../libs/SheetValidations.libsonnet'; local Sheets = import '../libs/Sheets.libsonnet'; @@ -11,6 +12,7 @@ local single_cells = [ title_cell: 'A2', range_cell: 'B2', validation: SV.StringOfLengthTwelve, + help: Help.uei, }, Sheets.single_cell { title: 'Total amount expended', @@ -19,48 +21,177 @@ local single_cells = [ range_cell: 'E2', formula: '=SUM(FIRSTCELLREF:LASTCELLREF)', width: 36, + help: Help.positive_number, + }, ]; local open_ranges_defns = [ - [Sheets.open_range { - width: 12, - }, SV.FAPPrefixValidation, 'Federal Agency Prefix', 'federal_agency_prefix'], - [Sheets.open_range { - width: 12, - }, SV.StringOfLengthThree, 'CFDA Three Digit Extension', 'three_digit_extension'], - [Sheets.open_range, {}, 'Additional Award Identification', 'additional_award_identification'], - [Sheets.open_range { - width: 48, - }, {}, 'Federal Program Name', 'program_name'], - [Sheets.open_range, SV.PositiveNumberValidation, 'Amount Expended', 'amount_expended'], - [Sheets.open_range, {}, 'Cluster Name', 'cluster_name'], - [Sheets.open_range, {}, 'If State Cluster, Enter State Cluster Name', 'state_cluster_name'], - [Sheets.open_range, {}, 'If Other Cluster, Enter Other Cluster Name', 'other_cluster_name'], + [ + Sheets.open_range { + width: 12, + help: Help.aln_prefix, + }, + SV.FAPPrefixValidation, + 'Federal Agency Prefix', + 'federal_agency_prefix', + ], + [ + Sheets.open_range { + width: 12, + help: Help.aln_extension, + }, + SV.StringOfLengthThree, + 'ALN (CFDA) Three Digit Extension', + 'three_digit_extension', + ], + [ + Sheets.open_range, + SV.NoValidation, + 'Additional Award Identification', + 'additional_award_identification', + ], + [ + Sheets.open_range { + width: 48, + help: Help.federal_program_name, + }, + SV.NoValidation, + 'Federal Program Name', + 'program_name', + ], + [ + Sheets.open_range { + help: Help.positive_number, + }, + SV.PositiveNumberValidation, + 'Amount Expended', + 'amount_expended', + ], + [ + Sheets.open_range { + help: Help.yorn, + }, + SV.NoValidation, + 'Cluster Name', + 'cluster_name', + ], + [ + Sheets.open_range { + help: Help.cluster_name, + }, + SV.NoValidation, + 'If State Cluster, Enter State Cluster Name', + 'state_cluster_name', + ], + [ + Sheets.open_range { + help: Help.other_cluster_name, + }, + SV.NoValidation, + 'If Other Cluster, Enter Other Cluster Name', + 'other_cluster_name', + ], // 20230525 HDMS FIXME: A formula to auto calculate federal_program_total in the excel is missing (see instructions in census template)!!! - [Sheets.open_range, SV.PositiveNumberValidation, 'Federal Program Total', 'federal_program_total'], - [Sheets.open_range, SV.PositiveNumberValidation, 'Cluster Total', 'cluster_total'], - [Sheets.y_or_n_range, SV.YoNValidation, 'Loan / Loan Guarantee', 'is_guaranteed'], - [Sheets.open_range, {}, 'If yes (Loan/Loan Guarantee, End of Audit Period Outstanding Loan Balance)', 'loan_balance_at_audit_period_end'], - [Sheets.y_or_n_range, SV.YoNValidation, 'Direct Award', 'is_direct'], - [Sheets.y_or_n_range, SV.YoNValidation, 'If no (Direct Award), Name of Passthrough Entity', 'passthrough_name'], + [ + Sheets.open_range { + help: Help.positive_number, + }, + SV.PositiveNumberValidation, + 'Federal Program Total', + 'federal_program_total', + ], + [ + Sheets.open_range { + help: Help.positive_number, + }, + SV.PositiveNumberValidation, + 'Cluster Total', + 'cluster_total', + ], + [ + Sheets.y_or_n_range { + help: Help.yorn, + }, + SV.YoNValidation, + 'Loan / Loan Guarantee', + 'is_guaranteed', + ], + [ + Sheets.open_range { + help: Help.positive_number, + }, + SV.NoValidation, + 'If yes (Loan/Loan Guarantee, End of Audit Period Outstanding Loan Balance)', + 'loan_balance_at_audit_period_end', + ], + [ + Sheets.y_or_n_range { + help: Help.yorn, + }, + SV.YoNValidation, + 'Direct Award', + 'is_direct', + ], + [ + Sheets.y_or_n_range { + help: Help.plain_text, + }, + SV.YoNValidation, + 'If no (Direct Award), Name of Passthrough Entity', + 'passthrough_name', + ], [ Sheets.open_range { width: 18, + help: Help.unknown, }, - {}, + SV.YoNValidation, 'If no (Direct Award), Identifying Number Assigned by the Pass-through Entity, if assigned', 'passthrough_identifying_number', ], - [Sheets.y_or_n_range, SV.YoNValidation, 'Federal Award Passed Through to Subrecipients', 'is_passed'], - [Sheets.open_range, {}, 'If yes (Passed Through), Amount Passed Through to Subrecipients', 'subrecipient_amount'], - [Sheets.y_or_n_range, SV.YoNValidation, 'Major Program (MP)', 'is_major'], - [Sheets.open_range { - width: 12, - }, {}, 'If yes (MP), Type of Audit Report', 'audit_report_type'], - [Sheets.open_range { - width: 12, - }, SV.PositiveNumberValidation, 'Number of Audit Findings', 'number_of_audit_findings'], + [ + Sheets.y_or_n_range { + help: Help.yorn, + }, + SV.YoNValidation, + 'Federal Award Passed Through to Subrecipients', + 'is_passed', + ], + [ + Sheets.open_range { + help: Help.positive_number, + }, + SV.NoValidation, + 'If yes (Passed Through), Amount Passed Through to Subrecipients', + 'subrecipient_amount', + ], + [ + Sheets.y_or_n_range { + help: Help.yorn, + }, + SV.YoNValidation, + 'Major Program (MP)', + 'is_major', + ], + [ + Sheets.open_range { + width: 12, + help: Help.unknown, + }, + SV.NoValidation, + 'If yes (MP), Type of Audit Report', + 'audit_report_type', + ], + [ + Sheets.open_range { + width: 12, + help: Help.positive_number, + }, + SV.PositiveNumberValidation, + 'Number of Audit Findings', + 'number_of_audit_findings', + ], ]; local sheets = [ diff --git a/backend/schemas/source/excel/templates/findings-text-template.jsonnet b/backend/schemas/source/excel/templates/findings-text-template.jsonnet index b091ab8eb8..b18b29ccdc 100644 --- a/backend/schemas/source/excel/templates/findings-text-template.jsonnet +++ b/backend/schemas/source/excel/templates/findings-text-template.jsonnet @@ -1,4 +1,5 @@ local Fun = import '../libs/Functions.libsonnet'; +local Help = import '../libs/Help.libsonnet'; local SV = import '../libs/SheetValidations.libsonnet'; local Sheets = import '../libs/Sheets.libsonnet'; @@ -12,22 +13,41 @@ local single_cells = [ title_cell: 'A2', range_cell: 'B2', validation: SV.StringOfLengthTwelve, + help: Help.uei, }, ]; local open_ranges_defns = [ - [Sheets.open_range { - title_cell: 'A3', - width: 36, - }, SV.ReferenceNumberValidation, 'Audit Finding Reference Number', 'reference_number'], - [Sheets.open_range { - title_cell: 'C3', - width: 100, - }, {}, 'Text of the Audit Finding', 'text_of_finding'], - [Sheets.y_or_n_range { - title_cell: 'G3', - width: 36, - }, SV.YoNValidation, 'Did Text Contain a Chart or Table?', 'contains_chart_or_table'], + [ + Sheets.open_range { + title_cell: 'A3', + width: 36, + help: Help.reference_number, + }, + SV.ReferenceNumberValidation, + 'Audit Finding Reference Number', + 'reference_number', + ], + [ + Sheets.open_range { + title_cell: 'C3', + width: 100, + help: Help.plain_text, + }, + SV.NoValidation, + 'Text of the Audit Finding', + 'text_of_finding', + ], + [ + Sheets.y_or_n_range { + title_cell: 'G3', + width: 36, + help: Help.yorn, + }, + SV.YoNValidation, + 'Did Text Contain a Chart or Table?', + 'contains_chart_or_table', + ], ]; local sheets = [ diff --git a/backend/schemas/source/excel/templates/findings-uniform-guidance-template.jsonnet b/backend/schemas/source/excel/templates/findings-uniform-guidance-template.jsonnet index 6a0d1555ae..f0eeb42ecd 100644 --- a/backend/schemas/source/excel/templates/findings-uniform-guidance-template.jsonnet +++ b/backend/schemas/source/excel/templates/findings-uniform-guidance-template.jsonnet @@ -1,4 +1,5 @@ local Fun = import '../libs/Functions.libsonnet'; +local Help = import '../libs/Help.libsonnet'; local SV = import '../libs/SheetValidations.libsonnet'; local Sheets = import '../libs/Sheets.libsonnet'; @@ -11,6 +12,7 @@ local single_cells = [ title_cell: 'A2', range_cell: 'B2', validation: SV.StringOfLengthTwelve, + help: Help.uei, }, ]; @@ -44,21 +46,126 @@ local y_or_n_range_w12 = Sheets.y_or_n_range { }; local open_ranges_defns = [ - [open_range_w12, SV.FAPPrefixValidation, 'Federal Agency Prefix', 'federal_agency_prefix'], - [open_range_w12, SV.StringOfLengthThree, 'CFDA Three Digit Extension', 'three_digit_extension'], - [Sheets.open_range, {}, 'Additional Award Identification', 'additional_award_identification'], - [open_range_w48, {}, 'Federal Program Name', 'program_name'], - [Sheets.open_range, SV.ReferenceNumberValidation, 'Audit Finding Reference Number', 'reference_number'], - [open_range_w20, SV.ComplianceRequirementValidation, 'Type(s) of Compliance Requirement(s)', 'compliance_requirement'], - [y_or_n_range_w12, SV.YoNValidation, 'Modified Opinion', 'modified_opinion'], - [y_or_n_range_w12, SV.YoNValidation, 'Other Matters', 'other_matters'], - [y_or_n_range_w12, SV.YoNValidation, 'Material Weakness', 'material_weakness'], - [y_or_n_range_w12, SV.YoNValidation, 'Significant Deficiency', 'significant_deficiency'], - [y_or_n_range_w12, SV.YoNValidation, 'Other Findings', 'other_findings'], - [y_or_n_range_w12, SV.YoNValidation, 'Questioned Costs', 'questioned_costs'], - [y_or_n_range_w12, SV.YoNValidation, 'Repeat Findings from Prior Year', 'repeat_prior_reference'], - [open_range_w24, {}, 'If Repeat Finding, provide Prior Year Audit Finding Reference Number(s)', 'prior_references'], - [y_or_n_range_w16_with_formula, SV.YoNValidation, 'Is Findings Combination Valid? (Read Only - Please See Instructions tab)', 'is_valid'], + [ + open_range_w12 { + help: Help.aln_prefix, + }, + SV.FAPPrefixValidation, + 'Federal Agency Prefix', + 'federal_agency_prefix', + ], + [ + open_range_w12 { + help: Help.aln_extension, + }, + SV.StringOfLengthThree, + 'CFDA Three Digit Extension', + 'three_digit_extension', + ], + [ + Sheets.open_range { + help: Help.unknown, + }, + SV.NoValidation, + 'Additional Award Identification', + 'additional_award_identification', + ], + [ + open_range_w48 { + help: Help.plain_text, + }, + SV.NoValidation, + 'Federal Program Name', + 'program_name', + ], + [ + Sheets.open_range { + help: Help.reference_number + }, + SV.ReferenceNumberValidation, + 'Audit Finding Reference Number', + 'reference_number', + ], + [ + open_range_w20 { + help: Help.unknown + }, + SV.ComplianceRequirementValidation, + 'Type(s) of Compliance Requirement(s)', + 'compliance_requirement', + ], + [ + y_or_n_range_w12 { + help: Help.yorn + }, + SV.YoNValidation, + 'Modified Opinion', + 'modified_opinion', + ], + [ + y_or_n_range_w12 { + help: Help.unknown + }, + SV.YoNValidation, + 'Other Matters', + 'other_matters', + ], + [ + y_or_n_range_w12 { + help: Help.unknown + }, + SV.YoNValidation, + 'Material Weakness', + 'material_weakness', + ], + [ + y_or_n_range_w12 { + help: Help.yorn + }, + SV.YoNValidation, + 'Significant Deficiency', + 'significant_deficiency', + ], + [ + y_or_n_range_w12 { + help: Help.yorn + }, + SV.YoNValidation, + 'Other Findings', + 'other_findings', + ], + [ + y_or_n_range_w12 { + help: Help.yorn + }, + SV.YoNValidation, + 'Questioned Costs', + 'questioned_costs', + ], + [ + y_or_n_range_w12 { + help: Help.yorn + }, + SV.YoNValidation, + 'Repeat Findings from Prior Year', + 'repeat_prior_reference', + ], + [ + open_range_w24 { + help: Help.yorn + }, + SV.NoValidation, + 'If Repeat Finding, provide Prior Year Audit Finding Reference Number(s)', + 'prior_references', + ], + [ + y_or_n_range_w16_with_formula { + help: Help.yorn + }, + SV.YoNValidation, + 'Is Findings Combination Valid? (Read Only - Please See Instructions tab)', + 'is_valid', + ], ]; local sheets = [ From 242b366ec25569c1557dfc25f0c68e811a79bcf5 Mon Sep 17 00:00:00 2001 From: Matt Jadud Date: Fri, 16 Jun 2023 07:22:30 -0400 Subject: [PATCH 02/12] Add initial help messages This commit adds text to the help messages. We will need to revisit two things: 1. The content of these help messages. 2. All fields where `Help.unknown` was used. In the second case, I did not know what help message should be used in all cases. Therefore, we will need to do a walk through the messages (and how they are attached) before we test with users. --- .../schemas/source/excel/libs/Help.libsonnet | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/backend/schemas/source/excel/libs/Help.libsonnet b/backend/schemas/source/excel/libs/Help.libsonnet index 3912f9486a..b0919ac02d 100644 --- a/backend/schemas/source/excel/libs/Help.libsonnet +++ b/backend/schemas/source/excel/libs/Help.libsonnet @@ -8,45 +8,45 @@ local make_url = function(anchor) { // A aln_extension: { - text: '', + text: 'An ALN (CFDA) extension is typically three digits, with some exceptions', link: make_url('aln_extension'), }, aln_prefix: { - text: '', + text: 'Not a valid agency ALN (CFDA) prefix', link: make_url('aln_prefix'), }, // C cluster_name: { - text: '', + text: 'Not one of the allowed cluster names', link: make_url('cluster_name'), }, // F federal_program_name: { - text: '', + text: 'Not one of the allowed federal program names', link: make_url('federal_program_name'), }, // O other_cluster_name: { - text: '', + text: 'Not one of the alternative (other) cluster names', link: make_url('other_cluster_name'), }, // P plain_text: { - text: '', + text: 'Only plain text is allowed in this field, no emoji or other special additions', link: make_url('plain_text'), }, positive_number: { - text: '', + text: 'The number in this field must be zero or greater', link: make_url('positive_number'), }, // R reference_number: { - text: '', + text: 'Reference numbers have the form YYYY-NNN (e.g. 2023-001)', link: make_url('reference_number'), }, // U uei: { - text: '', + text: 'UEIs are 12 characters long and match rules as given by SAM.gov', link: make_url('uei'), }, unknown: { @@ -55,7 +55,7 @@ local make_url = function(anchor) }, // Y yorn: { - text: '', + text: 'This field must be either `Y` or `N`', link: make_url('yorn'), }, From 90057b2febafc855668be81b32fb65cfbc3ed2d9 Mon Sep 17 00:00:00 2001 From: Matt Jadud Date: Fri, 16 Jun 2023 07:24:49 -0400 Subject: [PATCH 03/12] Applying linting/formatting This commit only applies formatting changes to the libraries/schemas. In VSCode, `Format Document` was invoked on all of the Jsonnet files. This fixed indentation/etc. according to Jsonnet's whims. Before committing Jsonnet files, we should always apply the default tooling's indentation preferences. --- .../source/excel/libs/Functions.libsonnet | 68 +++++++++----- .../excel/libs/SheetValidations.libsonnet | 92 +++++++++---------- .../source/excel/libs/Sheets.libsonnet | 44 ++++----- ...findings-uniform-guidance-template.jsonnet | 22 ++--- 4 files changed, 123 insertions(+), 103 deletions(-) diff --git a/backend/schemas/source/excel/libs/Functions.libsonnet b/backend/schemas/source/excel/libs/Functions.libsonnet index 9599d04d0b..a1967312d1 100644 --- a/backend/schemas/source/excel/libs/Functions.libsonnet +++ b/backend/schemas/source/excel/libs/Functions.libsonnet @@ -1,37 +1,57 @@ local Sheets = import 'Sheets.libsonnet'; local columns = [ - "A", "B", "C", "D", "E", - "F", "G", "H", "I", "J", - "K", "L", "M", "N", "O", - "P", "Q", "R", "S", "T", - "U", "V", "W", "X", "Y", - "Z", + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z', ]; { -// base is the base object; e.g. Sheets.open_range -// row is the cell row; e.g. 3 -// arrs is the array-of-arrays that the objects are built from. -make_open_ranges(row, arrs):: - std.mapWithIndex(function(ndx, a) a[0] + { - title: a[2], - range_name: a[3], - title_cell: columns[ndx] + std.toString(row), - validation: a[1], + // base is the base object; e.g. Sheets.open_range + // row is the cell row; e.g. 3 + // arrs is the array-of-arrays that the objects are built from. + make_open_ranges(row, arrs):: + std.mapWithIndex(function(ndx, a) a[0] { + title: a[2], + range_name: a[3], + title_cell: columns[ndx] + std.toString(row), + validation: a[1], }, arrs), -make_open_ranges_with_column(row, arrs):: - std.mapWithIndex(function(ndx, a) a[0] + { - title: a[2], - range_name: a[3], - title_cell: a[0].title_cell[0] + std.toString(row), - validation: a[1], + make_open_ranges_with_column(row, arrs):: + std.mapWithIndex(function(ndx, a) a[0] { + title: a[2], + range_name: a[3], + title_cell: a[0].title_cell[0] + std.toString(row), + validation: a[1], }, arrs), -make_aln_prefixes(lon):: + make_aln_prefixes(lon):: std.join( - ",", - std.map(function(num) std.toString(num), lon) + ',', + std.map(function(num) std.toString(num), lon) ), } diff --git a/backend/schemas/source/excel/libs/SheetValidations.libsonnet b/backend/schemas/source/excel/libs/SheetValidations.libsonnet index 0f60130bc4..29243518fb 100644 --- a/backend/schemas/source/excel/libs/SheetValidations.libsonnet +++ b/backend/schemas/source/excel/libs/SheetValidations.libsonnet @@ -1,21 +1,21 @@ -local Fun = import 'Functions.libsonnet'; local Base = import '../../base/Base.libsonnet'; local Requirement = import '../../sections/FindingsUniformGuidance.libsonnet'; +local Fun = import 'Functions.libsonnet'; local FAPPrefixValidation = { - type: "list", - allow_blank: "False", - formula1: "\"" + Fun.make_aln_prefixes(Base.Enum.ALNPrefixes.enum) + "\"", - custom_error: "The Federal Agency Prefix you entered is not recognized", - custom_title: "Unknown ALN Prefix" + type: 'list', + allow_blank: 'False', + formula1: '"' + Fun.make_aln_prefixes(Base.Enum.ALNPrefixes.enum) + '"', + custom_error: 'The Federal Agency Prefix you entered is not recognized', + custom_title: 'Unknown ALN Prefix', }; local YoNValidation = { - type: "list", - allow_blank: "False", - formula1: "\"Y,N\"", - custom_error: "Must be 'Y' or 'N'", - custom_title: "Y/N" + type: 'list', + allow_blank: 'False', + formula1: '"Y,N"', + custom_error: "Must be 'Y' or 'N'", + custom_title: 'Y/N', }; // FIRSTCELLREF is magic, and gets replaced with the top @@ -24,53 +24,53 @@ local YoNValidation = { // "type" is required; everything else is optional local PositiveNumberValidation = { - type: "custom", - // Is it a number, and is the number either zero or greater than zero? - formula1: "=AND(ISNUMBER(FIRSTCELLREF),OR(SIGN(FIRSTCELLREF)=0,SIGN(FIRSTCELLREF)=1))", - custom_error: "This cell must be a positive number", - custom_title: "Positive numbers" + type: 'custom', + // Is it a number, and is the number either zero or greater than zero? + formula1: '=AND(ISNUMBER(FIRSTCELLREF),OR(SIGN(FIRSTCELLREF)=0,SIGN(FIRSTCELLREF)=1))', + custom_error: 'This cell must be a positive number', + custom_title: 'Positive numbers', }; local ReferenceNumberValidation = { - type: "custom", - //It is neccessary to allow blank otherwise user cannot delete the value - formula1: "=OR(ISBLANK(FIRSTCELLREF), AND(LEN(FIRSTCELLREF) = 8, LEFT(FIRSTCELLREF, 2) = \"20\", ISNUMBER(MID(FIRSTCELLREF, 3, 2) * 1), MID(FIRSTCELLREF, 5, 1) = \"-\", ISNUMBER(RIGHT(FIRSTCELLREF, 3) * 1)))", - custom_error: "Expecting a value in the format YYYY-NNN, where YYYY is a year and NNN a three digit number (e.g. 2023-001)", - custom_title: "Reference number" + type: 'custom', + //It is neccessary to allow blank otherwise user cannot delete the value + formula1: '=OR(ISBLANK(FIRSTCELLREF), AND(LEN(FIRSTCELLREF) = 8, LEFT(FIRSTCELLREF, 2) = "20", ISNUMBER(MID(FIRSTCELLREF, 3, 2) * 1), MID(FIRSTCELLREF, 5, 1) = "-", ISNUMBER(RIGHT(FIRSTCELLREF, 3) * 1)))', + custom_error: 'Expecting a value in the format YYYY-NNN, where YYYY is a year and NNN a three digit number (e.g. 2023-001)', + custom_title: 'Reference number', }; local StringOfLengthThree = { - type: "textLength", - operator: "equal", - formula1: 3, - custom_error: "Expecting something with only three characters", - custom_title: "Must be length of 3" + type: 'textLength', + operator: 'equal', + formula1: 3, + custom_error: 'Expecting something with only three characters', + custom_title: 'Must be length of 3', }; local StringOfLengthTwelve = { - type: "textLength", - operator: "equal", - formula1: 12, - custom_error: "Expecting something with only twelve characters", - custom_title: "Must be length of 12" + type: 'textLength', + operator: 'equal', + formula1: 12, + custom_error: 'Expecting something with only twelve characters', + custom_title: 'Must be length of 12', }; local ComplianceRequirementValidation = { - type: "custom", - //This formula only checks if valid characters are used, it does not validate alphabetical order - //The json schema validation checks both valid characters and alphabetical order - formula1: "=IF(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(FIRSTCELLREF, \"A\", \"\"), \"B\", \"\"), \"C\", \"\"), \"E\", \"\"), \"F\", \"\"), \"G\", \"\"), \"H\", \"\"), \"I\", \"\"), \"J\", \"\"), \"L\", \"\"), \"M\", \"\"), \"N\", \"\"), \"P\", \"\")<>\"\", \"Invalid\", \"Valid\")", - custom_error: "Expecting a valid combination of the letters: A,B,C,E,F,G,H,I,J,L,M,N,P", - custom_title: "Compliance requirement" + type: 'custom', + //This formula only checks if valid characters are used, it does not validate alphabetical order + //The json schema validation checks both valid characters and alphabetical order + formula1: '=IF(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(FIRSTCELLREF, "A", ""), "B", ""), "C", ""), "E", ""), "F", ""), "G", ""), "H", ""), "I", ""), "J", ""), "L", ""), "M", ""), "N", ""), "P", "")<>"", "Invalid", "Valid")', + custom_error: 'Expecting a valid combination of the letters: A,B,C,E,F,G,H,I,J,L,M,N,P', + custom_title: 'Compliance requirement', }; { - NoValidation: {}, - FAPPrefixValidation: FAPPrefixValidation, - PositiveNumberValidation: PositiveNumberValidation, - StringOfLengthThree: StringOfLengthThree, - StringOfLengthTwelve: StringOfLengthTwelve, - YoNValidation: YoNValidation, - ReferenceNumberValidation: ReferenceNumberValidation, - ComplianceRequirementValidation: ComplianceRequirementValidation, -} \ No newline at end of file + NoValidation: {}, + FAPPrefixValidation: FAPPrefixValidation, + PositiveNumberValidation: PositiveNumberValidation, + StringOfLengthThree: StringOfLengthThree, + StringOfLengthTwelve: StringOfLengthTwelve, + YoNValidation: YoNValidation, + ReferenceNumberValidation: ReferenceNumberValidation, + ComplianceRequirementValidation: ComplianceRequirementValidation, +} diff --git a/backend/schemas/source/excel/libs/Sheets.libsonnet b/backend/schemas/source/excel/libs/Sheets.libsonnet index 4c7375402e..dcbad1efcb 100644 --- a/backend/schemas/source/excel/libs/Sheets.libsonnet +++ b/backend/schemas/source/excel/libs/Sheets.libsonnet @@ -1,34 +1,34 @@ local single_cell = { - type: "single_cell", - title: "Example Cell", - range_name: "example_cell", - title_cell: "A1", - range_cell: "B1" + type: 'single_cell', + title: 'Example Cell', + range_name: 'example_cell', + title_cell: 'A1', + range_cell: 'B1', }; local open_range = { - type: "open_range", - title: "Example open range", - range_name: "Example open range", - title_cell: "A1", - // Range start is redundant. - // It should start below the title cell. - // range_start: "B1" + type: 'open_range', + title: 'Example open range', + range_name: 'Example open range', + title_cell: 'A1', + // Range start is redundant. + // It should start below the title cell. + // range_start: "B1" }; -local y_or_n_range = open_range + { - type: "yorn_range", - title: "Example YorN range", - range_name: "Example YorN range" +local y_or_n_range = open_range { + type: 'yorn_range', + title: 'Example YorN range', + range_name: 'Example YorN range', }; -# MAX_ROWS here is equal to MAX_ROWS in render.py plus 1 to account for the header row. +// MAX_ROWS here is equal to MAX_ROWS in render.py plus 1 to account for the header row. local MAX_ROWS = 3001; { - single_cell: single_cell, - open_range: open_range, - y_or_n_range: y_or_n_range, - MAX_ROWS: MAX_ROWS -} \ No newline at end of file + single_cell: single_cell, + open_range: open_range, + y_or_n_range: y_or_n_range, + MAX_ROWS: MAX_ROWS, +} diff --git a/backend/schemas/source/excel/templates/findings-uniform-guidance-template.jsonnet b/backend/schemas/source/excel/templates/findings-uniform-guidance-template.jsonnet index f0eeb42ecd..81501e880d 100644 --- a/backend/schemas/source/excel/templates/findings-uniform-guidance-template.jsonnet +++ b/backend/schemas/source/excel/templates/findings-uniform-guidance-template.jsonnet @@ -80,7 +80,7 @@ local open_ranges_defns = [ ], [ Sheets.open_range { - help: Help.reference_number + help: Help.reference_number, }, SV.ReferenceNumberValidation, 'Audit Finding Reference Number', @@ -88,7 +88,7 @@ local open_ranges_defns = [ ], [ open_range_w20 { - help: Help.unknown + help: Help.unknown, }, SV.ComplianceRequirementValidation, 'Type(s) of Compliance Requirement(s)', @@ -96,7 +96,7 @@ local open_ranges_defns = [ ], [ y_or_n_range_w12 { - help: Help.yorn + help: Help.yorn, }, SV.YoNValidation, 'Modified Opinion', @@ -104,7 +104,7 @@ local open_ranges_defns = [ ], [ y_or_n_range_w12 { - help: Help.unknown + help: Help.unknown, }, SV.YoNValidation, 'Other Matters', @@ -112,7 +112,7 @@ local open_ranges_defns = [ ], [ y_or_n_range_w12 { - help: Help.unknown + help: Help.unknown, }, SV.YoNValidation, 'Material Weakness', @@ -120,7 +120,7 @@ local open_ranges_defns = [ ], [ y_or_n_range_w12 { - help: Help.yorn + help: Help.yorn, }, SV.YoNValidation, 'Significant Deficiency', @@ -128,7 +128,7 @@ local open_ranges_defns = [ ], [ y_or_n_range_w12 { - help: Help.yorn + help: Help.yorn, }, SV.YoNValidation, 'Other Findings', @@ -136,7 +136,7 @@ local open_ranges_defns = [ ], [ y_or_n_range_w12 { - help: Help.yorn + help: Help.yorn, }, SV.YoNValidation, 'Questioned Costs', @@ -144,7 +144,7 @@ local open_ranges_defns = [ ], [ y_or_n_range_w12 { - help: Help.yorn + help: Help.yorn, }, SV.YoNValidation, 'Repeat Findings from Prior Year', @@ -152,7 +152,7 @@ local open_ranges_defns = [ ], [ open_range_w24 { - help: Help.yorn + help: Help.yorn, }, SV.NoValidation, 'If Repeat Finding, provide Prior Year Audit Finding Reference Number(s)', @@ -160,7 +160,7 @@ local open_ranges_defns = [ ], [ y_or_n_range_w16_with_formula { - help: Help.yorn + help: Help.yorn, }, SV.YoNValidation, 'Is Findings Combination Valid? (Read Only - Please See Instructions tab)', From 1a5324304b5fb81e680634784d9edd42cdb2e762 Mon Sep 17 00:00:00 2001 From: Tadhg O'Higgins <2626258+tadhg-ohiggins@users.noreply.github.com> Date: Fri, 16 Jun 2023 12:15:28 -0700 Subject: [PATCH 04/12] Refactor form section name handling. (#1273) --- backend/audit/fixtures/excel.py | 21 ++++++++++++++---- backend/audit/test_views.py | 38 ++++++++++++--------------------- backend/audit/urls.py | 25 ++++++++++------------ backend/audit/views.py | 15 +++++-------- 4 files changed, 47 insertions(+), 52 deletions(-) diff --git a/backend/audit/fixtures/excel.py b/backend/audit/fixtures/excel.py index 84973bf29a..9cc4221edd 100644 --- a/backend/audit/fixtures/excel.py +++ b/backend/audit/fixtures/excel.py @@ -1,3 +1,4 @@ +from collections import namedtuple from django.conf import settings SHEETS_DIR = settings.XLSX_TEMPLATE_SHEET_DIR @@ -37,7 +38,19 @@ SIMPLE_CASES_TEST_FILE = settings.AUDIT_TEST_DATA_ENTRY_DIR / "simple-cases.json" -FEDERAL_AWARDS_EXPENDED = "FederalAwardsExpended" -CORRECTIVE_ACTION_PLAN = "CorrectiveActionPlan" -FINDINGS_TEXT = "FindingsText" -FINDINGS_UNIFORM_GUIDANCE = "FindingsUniformGuidance" +# Make FORM_SECTIONS convenient to both iterate over and access by field name: +FormSections = namedtuple( + "FormSections", + ( + "CORRECTIVE_ACTION_PLAN", + "FEDERAL_AWARDS_EXPENDED", + "FINDINGS_TEXT", + "FINDINGS_UNIFORM_GUIDANCE", + ), +) +FORM_SECTIONS = FormSections( + CORRECTIVE_ACTION_PLAN="CorrectiveActionPlan", + FEDERAL_AWARDS_EXPENDED="FederalAwardsExpended", + FINDINGS_TEXT="FindingsText", + FINDINGS_UNIFORM_GUIDANCE="FindingsUniformGuidance", +) diff --git a/backend/audit/test_views.py b/backend/audit/test_views.py index 996c0c083a..9f33b71da7 100644 --- a/backend/audit/test_views.py +++ b/backend/audit/test_views.py @@ -22,10 +22,7 @@ FINDINGS_TEXT_ENTRY_FIXTURES, FINDINGS_UNIFORM_GUIDANCE_ENTRY_FIXTURES, FEDERAL_AWARDS_ENTRY_FIXTURES, - FEDERAL_AWARDS_EXPENDED, - CORRECTIVE_ACTION_PLAN, - FINDINGS_TEXT, - FINDINGS_UNIFORM_GUIDANCE, + FORM_SECTIONS, ) from .models import Access, SingleAuditChecklist from .views import MySubmissions @@ -56,13 +53,6 @@ "auditor_contacts": ["d@d.com"], } -EXCEL_FILES = [ - CORRECTIVE_ACTION_PLAN, - FEDERAL_AWARDS_EXPENDED, - FINDINGS_UNIFORM_GUIDANCE, - FINDINGS_TEXT, -] - # Mocking the user login and file scan functions def _mock_login_and_scan(client, mock_scan_file): @@ -262,7 +252,7 @@ class ExcelFileHandlerViewTests(TestCase): def test_login_required(self): """When an unauthenticated request is made""" - for form_section in EXCEL_FILES: + for form_section in FORM_SECTIONS: response = self.client.post( reverse( f"audit:{form_section}", @@ -278,7 +268,7 @@ def test_bad_report_id_returns_403(self): self.client.force_login(user) - for form_section in EXCEL_FILES: + for form_section in FORM_SECTIONS: response = self.client.post( reverse( f"audit:{form_section}", @@ -296,7 +286,7 @@ def test_inaccessible_audit_returns_403(self): user, sac = _make_user_and_sac() self.client.force_login(user) - for form_section in EXCEL_FILES: + for form_section in FORM_SECTIONS: response = self.client.post( reverse( f"audit:{form_section}", @@ -313,7 +303,7 @@ def test_no_file_attached_returns_400(self): self.client.force_login(user) - for form_section in EXCEL_FILES: + for form_section in FORM_SECTIONS: response = self.client.post( reverse( f"audit:{form_section}", @@ -332,7 +322,7 @@ def test_invalid_file_upload_returns_400(self): file = SimpleUploadedFile("not-excel.txt", b"asdf", "text/plain") - for form_section in EXCEL_FILES: + for form_section in FORM_SECTIONS: response = self.client.post( reverse( f"audit:{form_section}", @@ -365,10 +355,10 @@ def test_valid_file_upload_for_federal_awards(self, mock_scan_file): with open(tmp.name, "rb") as excel_file: response = self.client.post( reverse( - f"audit:{EXCEL_FILES[1]}", + f"audit:{FORM_SECTIONS.FEDERAL_AWARDS_EXPENDED}", kwargs={ "report_id": sac.report_id, - "form_section": EXCEL_FILES[1], + "form_section": FORM_SECTIONS.FEDERAL_AWARDS_EXPENDED, }, ), data={"FILES": excel_file}, @@ -488,10 +478,10 @@ def test_valid_file_upload_for_corrective_action_plan(self, mock_scan_file): with open(tmp.name, "rb") as excel_file: response = self.client.post( reverse( - f"audit:{EXCEL_FILES[0]}", + f"audit:{FORM_SECTIONS.CORRECTIVE_ACTION_PLAN}", kwargs={ "report_id": sac.report_id, - "form_section": EXCEL_FILES[0], + "form_section": FORM_SECTIONS.CORRECTIVE_ACTION_PLAN, }, ), data={"FILES": excel_file}, @@ -554,10 +544,10 @@ def test_valid_file_upload_for_findings_uniform_guidance(self, mock_scan_file): with open(tmp.name, "rb") as excel_file: response = self.client.post( reverse( - f"audit:{EXCEL_FILES[2]}", + f"audit:{FORM_SECTIONS.FINDINGS_UNIFORM_GUIDANCE}", kwargs={ "report_id": sac.report_id, - "form_section": EXCEL_FILES[2], + "form_section": FORM_SECTIONS.FINDINGS_UNIFORM_GUIDANCE, }, ), data={"FILES": excel_file}, @@ -632,10 +622,10 @@ def test_valid_file_upload_for_findings_text(self, mock_scan_file): with open(tmp.name, "rb") as excel_file: response = self.client.post( reverse( - f"audit:{EXCEL_FILES[3]}", + f"audit:{FORM_SECTIONS.FINDINGS_TEXT}", kwargs={ "report_id": sac.report_id, - "form_section": EXCEL_FILES[3], + "form_section": FORM_SECTIONS.FINDINGS_TEXT, }, ), data={"FILES": excel_file}, diff --git a/backend/audit/urls.py b/backend/audit/urls.py index d9ceda8140..afa5b75b37 100644 --- a/backend/audit/urls.py +++ b/backend/audit/urls.py @@ -1,20 +1,17 @@ from django.urls import path -from .fixtures.excel import ( - CORRECTIVE_ACTION_PLAN, - FEDERAL_AWARDS_EXPENDED, - FINDINGS_TEXT, - FINDINGS_UNIFORM_GUIDANCE, -) +from .fixtures.excel import FORM_SECTIONS from . import views app_name = "audit" -form_sections = [ - CORRECTIVE_ACTION_PLAN, - FEDERAL_AWARDS_EXPENDED, - FINDINGS_TEXT, - FINDINGS_UNIFORM_GUIDANCE, -] + + +def camel_to_hyphen(raw: str) -> str: + """Convert camel case to hyphen-delimited.""" + text = f"{raw[0].lower()}{raw[1:]}" + return "".join(c if c.islower() else f"-{c.lower()}" for c in text) + + urlpatterns = [ path("", views.MySubmissions.as_view(), name="MySubmissions"), path("", views.EditSubmission.as_view(), name="EditSubmission"), @@ -50,10 +47,10 @@ ), ] -for form_section in form_sections: +for form_section in FORM_SECTIONS: urlpatterns.append( path( - f"excel/{form_section}/", + f"excel/{camel_to_hyphen(form_section)}/", views.ExcelFileHandlerView.as_view(), name=form_section, kwargs={"form_section": form_section}, diff --git a/backend/audit/views.py b/backend/audit/views.py index 6f4a4269ac..d878a6953d 100644 --- a/backend/audit/views.py +++ b/backend/audit/views.py @@ -10,12 +10,7 @@ from django.utils.datastructures import MultiValueDictKeyError from django.utils.decorators import method_decorator -from .fixtures.excel import ( - FEDERAL_AWARDS_EXPENDED, - CORRECTIVE_ACTION_PLAN, - FINDINGS_TEXT, - FINDINGS_UNIFORM_GUIDANCE, -) +from .fixtures.excel import FORM_SECTIONS from audit.excel import ( extract_federal_awards, @@ -104,25 +99,25 @@ def post(self, request, *args, **kwargs): excel_file.full_clean() excel_file.save() - if form_section == FEDERAL_AWARDS_EXPENDED: + if form_section == FORM_SECTIONS.FEDERAL_AWARDS_EXPENDED: audit_data = extract_federal_awards(excel_file.file) validate_federal_award_json(audit_data) SingleAuditChecklist.objects.filter(pk=sac.id).update( federal_awards=audit_data ) - elif form_section == CORRECTIVE_ACTION_PLAN: + elif form_section == FORM_SECTIONS.CORRECTIVE_ACTION_PLAN: audit_data = extract_corrective_action_plan(excel_file.file) validate_corrective_action_plan_json(audit_data) SingleAuditChecklist.objects.filter(pk=sac.id).update( corrective_action_plan=audit_data ) - elif form_section == FINDINGS_UNIFORM_GUIDANCE: + elif form_section == FORM_SECTIONS.FINDINGS_UNIFORM_GUIDANCE: audit_data = extract_findings_uniform_guidance(excel_file.file) validate_findings_uniform_guidance_json(audit_data) SingleAuditChecklist.objects.filter(pk=sac.id).update( findings_uniform_guidance=audit_data ) - elif form_section == FINDINGS_TEXT: + elif form_section == FORM_SECTIONS.FINDINGS_TEXT: audit_data = extract_findings_text(excel_file.file) validate_findings_text_json(audit_data) SingleAuditChecklist.objects.filter(pk=sac.id).update( From 9d6b410dc28943e219abafbf2cac813dfc237ee1 Mon Sep 17 00:00:00 2001 From: "Hassan D. M. Sambo" Date: Fri, 16 Jun 2023 18:32:40 -0400 Subject: [PATCH 05/12] Updated code to use the help details added to the template definitions --- backend/audit/test_validators.py | 11 +++++++++-- backend/audit/validators.py | 6 ++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/backend/audit/test_validators.py b/backend/audit/test_validators.py index 11cc13f4d7..0d8363c588 100644 --- a/backend/audit/test_validators.py +++ b/backend/audit/test_validators.py @@ -2,6 +2,7 @@ import string from unittest import TestCase from unittest.mock import patch +from django.conf import settings from django.test import SimpleTestCase from django.core.exceptions import ValidationError from django.core.files.uploadedfile import TemporaryUploadedFile @@ -12,11 +13,11 @@ import requests from audit.fixtures.excel import SIMPLE_CASES_TEST_FILE +from audit.fixtures.excel import CORRECTIVE_ACTION_TEMPLATE_DEFINITION from .validators import ( ALLOWED_EXCEL_CONTENT_TYPES, ALLOWED_EXCEL_FILE_EXTENSIONS, - ERROR_MESSAGE, MAX_EXCEL_FILE_SIZE_MB, validate_corrective_action_plan_json, validate_excel_file_content_type, @@ -692,8 +693,14 @@ def test_validation_is_applied(self): """ Empty Corrective Action Plan should fail, simple case should pass. """ + template_definition_path = ( + settings.XLSX_TEMPLATE_JSON_DIR / CORRECTIVE_ACTION_TEMPLATE_DEFINITION + ) + template = json.loads(template_definition_path.read_text(encoding="utf-8")) invalid = json.loads('{"CorrectiveActionPlan":{}}') - expected_msg = str(("B", "2", "Auditee UEI", ERROR_MESSAGE)) + expected_msg = str( + ("B", "2", "Auditee UEI", template["sheets"][0]["single_cells"][0]["help"]) + ) self.assertRaisesRegex( ValidationError, expected_msg, validate_corrective_action_plan_json, invalid ) diff --git a/backend/audit/validators.py b/backend/audit/validators.py index 1f81a49eea..0c6f040f7b 100644 --- a/backend/audit/validators.py +++ b/backend/audit/validators.py @@ -29,8 +29,6 @@ MAX_EXCEL_FILE_SIZE_MB = 25 -ERROR_MESSAGE = "No input found or invalid input provided." - ALLOWED_EXCEL_FILE_EXTENSIONS = [".xls", ".xlsx"] ALLOWED_EXCEL_CONTENT_TYPES = [ @@ -316,7 +314,7 @@ def _get_error_details(xlsx_definition_template, named_ranges_row_indices): open_range["title_cell"][0], xlsx_definition_template["title_row"] + row_index + 1, open_range["title"], - ERROR_MESSAGE, + open_range["help"], ) ) break @@ -327,7 +325,7 @@ def _get_error_details(xlsx_definition_template, named_ranges_row_indices): single_cell["range_cell"][0], single_cell["range_cell"][1], single_cell["title"], - ERROR_MESSAGE, + single_cell["help"], ) ) break From beb7c9f1e51f984e3d9ce66a199587d9e975e40b Mon Sep 17 00:00:00 2001 From: "Hassan D. M. Sambo" Date: Fri, 16 Jun 2023 18:33:37 -0400 Subject: [PATCH 06/12] Updated template definitions to include help field --- .../json/corrective-action-plan-template.json | 16 +++ .../federal-awards-expended-template.json | 96 +++++++++++++++++- .../excel/json/findings-text-template.json | 16 +++ .../findings-uniform-guidance-template.json | 66 +++++++++++- .../xlsx/corrective-action-plan-template.xlsx | Bin 108539 -> 108543 bytes .../federal-awards-expended-template.xlsx | Bin 120913 -> 120905 bytes .../excel/xlsx/findings-text-template.xlsx | Bin 108526 -> 108522 bytes .../findings-uniform-guidance-template.xlsx | Bin 291284 -> 291260 bytes 8 files changed, 190 insertions(+), 4 deletions(-) diff --git a/backend/schemas/output/excel/json/corrective-action-plan-template.json b/backend/schemas/output/excel/json/corrective-action-plan-template.json index 3cbad15852..a11b63507d 100644 --- a/backend/schemas/output/excel/json/corrective-action-plan-template.json +++ b/backend/schemas/output/excel/json/corrective-action-plan-template.json @@ -48,6 +48,10 @@ "name": "Form", "open_ranges": [ { + "help": { + "link": "https://fac.gov/documentation/validation/#reference_number", + "text": "Reference numbers have the form YYYY-NNN (e.g. 2023-001)" + }, "range_name": "reference_number", "title": "Audit Finding Reference Number", "title_cell": "A3", @@ -61,6 +65,10 @@ "width": 36 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#plain_text", + "text": "Only plain text is allowed in this field, no emoji or other special additions" + }, "range_name": "planned_action", "title": "Planned Corrective Action", "title_cell": "C3", @@ -69,6 +77,10 @@ "width": 100 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "contains_chart_or_table", "title": "Did Text Contain a Chart or Table?", "title_cell": "G3", @@ -85,6 +97,10 @@ ], "single_cells": [ { + "help": { + "link": "https://fac.gov/documentation/validation/#uei", + "text": "UEIs are 12 characters long and match rules as given by SAM.gov" + }, "range_cell": "B2", "range_name": "auditee_uei", "title": "Auditee UEI", diff --git a/backend/schemas/output/excel/json/federal-awards-expended-template.json b/backend/schemas/output/excel/json/federal-awards-expended-template.json index e6e7611c26..e8c135be50 100644 --- a/backend/schemas/output/excel/json/federal-awards-expended-template.json +++ b/backend/schemas/output/excel/json/federal-awards-expended-template.json @@ -24,6 +24,10 @@ "name": "Form", "open_ranges": [ { + "help": { + "link": "https://fac.gov/documentation/validation/#aln_prefix", + "text": "Not a valid agency ALN (CFDA) prefix" + }, "range_name": "federal_agency_prefix", "title": "Federal Agency Prefix", "title_cell": "A3", @@ -32,14 +36,18 @@ "allow_blank": "False", "custom_error": "The Federal Agency Prefix you entered is not recognized", "custom_title": "Unknown ALN Prefix", - "formula1": "\"01,02,03,04,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,27,29,30,32,33,34,36,39,40,41,42,43,44,45,46,47,53,57,58,59,60,61,62,64,66,68,70,77,78,81,82,83,84,85,86,87,88,89,90,91,92,93,94,96,97,98,99\"", + "formula1": "\"10,11,12,13,14,15,16,17,18,19,20,21,22,23,27,29,30,32,33,34,36,39,40,41,42,43,44,45,46,47,53,57,58,59,60,61,62,64,66,68,70,77,78,81,82,83,84,85,86,87,88,89,90,91,92,93,94,96,97,98,99\"", "type": "list" }, "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#aln_extension", + "text": "An ALN (CFDA) extension is typically three digits, with some exceptions" + }, "range_name": "three_digit_extension", - "title": "CFDA Three Digit Extension", + "title": "ALN (CFDA) Three Digit Extension", "title_cell": "B3", "type": "open_range", "validation": { @@ -59,6 +67,10 @@ "validation": { } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#federal_program_name", + "text": "Not one of the allowed federal program names" + }, "range_name": "program_name", "title": "Federal Program Name", "title_cell": "D3", @@ -67,6 +79,10 @@ "width": 48 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#positive_number", + "text": "The number in this field must be zero or greater" + }, "range_name": "amount_expended", "title": "Amount Expended", "title_cell": "E3", @@ -79,6 +95,10 @@ } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "cluster_name", "title": "Cluster Name", "title_cell": "F3", @@ -86,6 +106,10 @@ "validation": { } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#cluster_name", + "text": "Not one of the allowed cluster names" + }, "range_name": "state_cluster_name", "title": "If State Cluster, Enter State Cluster Name", "title_cell": "G3", @@ -93,6 +117,10 @@ "validation": { } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#other_cluster_name", + "text": "Not one of the alternative (other) cluster names" + }, "range_name": "other_cluster_name", "title": "If Other Cluster, Enter Other Cluster Name", "title_cell": "H3", @@ -100,6 +128,10 @@ "validation": { } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#positive_number", + "text": "The number in this field must be zero or greater" + }, "range_name": "federal_program_total", "title": "Federal Program Total", "title_cell": "I3", @@ -112,6 +144,10 @@ } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#positive_number", + "text": "The number in this field must be zero or greater" + }, "range_name": "cluster_total", "title": "Cluster Total", "title_cell": "J3", @@ -124,6 +160,10 @@ } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "is_guaranteed", "title": "Loan / Loan Guarantee", "title_cell": "K3", @@ -137,6 +177,10 @@ } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#positive_number", + "text": "The number in this field must be zero or greater" + }, "range_name": "loan_balance_at_audit_period_end", "title": "If yes (Loan/Loan Guarantee, End of Audit Period Outstanding Loan Balance)", "title_cell": "L3", @@ -144,6 +188,10 @@ "validation": { } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "is_direct", "title": "Direct Award", "title_cell": "M3", @@ -157,6 +205,10 @@ } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#plain_text", + "text": "Only plain text is allowed in this field, no emoji or other special additions" + }, "range_name": "passthrough_name", "title": "If no (Direct Award), Name of Passthrough Entity", "title_cell": "N3", @@ -170,14 +222,28 @@ } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#unknown", + "text": "If you see this error, please contact support." + }, "range_name": "passthrough_identifying_number", "title": "If no (Direct Award), Identifying Number Assigned by the Pass-through Entity, if assigned", "title_cell": "O3", "type": "open_range", - "validation": { }, + "validation": { + "allow_blank": "False", + "custom_error": "Must be 'Y' or 'N'", + "custom_title": "Y/N", + "formula1": "\"Y,N\"", + "type": "list" + }, "width": 18 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "is_passed", "title": "Federal Award Passed Through to Subrecipients", "title_cell": "P3", @@ -191,6 +257,10 @@ } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#positive_number", + "text": "The number in this field must be zero or greater" + }, "range_name": "subrecipient_amount", "title": "If yes (Passed Through), Amount Passed Through to Subrecipients", "title_cell": "Q3", @@ -198,6 +268,10 @@ "validation": { } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "is_major", "title": "Major Program (MP)", "title_cell": "R3", @@ -211,6 +285,10 @@ } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#unknown", + "text": "If you see this error, please contact support." + }, "range_name": "audit_report_type", "title": "If yes (MP), Type of Audit Report", "title_cell": "S3", @@ -219,6 +297,10 @@ "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#positive_number", + "text": "The number in this field must be zero or greater" + }, "range_name": "number_of_audit_findings", "title": "Number of Audit Findings", "title_cell": "T3", @@ -234,6 +316,10 @@ ], "single_cells": [ { + "help": { + "link": "https://fac.gov/documentation/validation/#uei", + "text": "UEIs are 12 characters long and match rules as given by SAM.gov" + }, "range_cell": "B2", "range_name": "auditee_uei", "title": "Auditee UEI", @@ -249,6 +335,10 @@ }, { "formula": "=SUM(FIRSTCELLREF:LASTCELLREF)", + "help": { + "link": "https://fac.gov/documentation/validation/#positive_number", + "text": "The number in this field must be zero or greater" + }, "range_cell": "E2", "range_name": "total_amount_expended", "title": "Total amount expended", diff --git a/backend/schemas/output/excel/json/findings-text-template.json b/backend/schemas/output/excel/json/findings-text-template.json index 1a8992d891..ab995abd17 100644 --- a/backend/schemas/output/excel/json/findings-text-template.json +++ b/backend/schemas/output/excel/json/findings-text-template.json @@ -48,6 +48,10 @@ "name": "Form", "open_ranges": [ { + "help": { + "link": "https://fac.gov/documentation/validation/#reference_number", + "text": "Reference numbers have the form YYYY-NNN (e.g. 2023-001)" + }, "range_name": "reference_number", "title": "Audit Finding Reference Number", "title_cell": "A3", @@ -61,6 +65,10 @@ "width": 36 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#plain_text", + "text": "Only plain text is allowed in this field, no emoji or other special additions" + }, "range_name": "text_of_finding", "title": "Text of the Audit Finding", "title_cell": "C3", @@ -69,6 +77,10 @@ "width": 100 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "contains_chart_or_table", "title": "Did Text Contain a Chart or Table?", "title_cell": "G3", @@ -85,6 +97,10 @@ ], "single_cells": [ { + "help": { + "link": "https://fac.gov/documentation/validation/#uei", + "text": "UEIs are 12 characters long and match rules as given by SAM.gov" + }, "range_cell": "B2", "range_name": "auditee_uei", "title": "Auditee UEI", diff --git a/backend/schemas/output/excel/json/findings-uniform-guidance-template.json b/backend/schemas/output/excel/json/findings-uniform-guidance-template.json index bcd6534e73..11590861a9 100644 --- a/backend/schemas/output/excel/json/findings-uniform-guidance-template.json +++ b/backend/schemas/output/excel/json/findings-uniform-guidance-template.json @@ -23,6 +23,10 @@ "name": "Form", "open_ranges": [ { + "help": { + "link": "https://fac.gov/documentation/validation/#aln_prefix", + "text": "Not a valid agency ALN (CFDA) prefix" + }, "range_name": "federal_agency_prefix", "title": "Federal Agency Prefix", "title_cell": "A3", @@ -31,12 +35,16 @@ "allow_blank": "False", "custom_error": "The Federal Agency Prefix you entered is not recognized", "custom_title": "Unknown ALN Prefix", - "formula1": "\"01,02,03,04,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,27,29,30,32,33,34,36,39,40,41,42,43,44,45,46,47,53,57,58,59,60,61,62,64,66,68,70,77,78,81,82,83,84,85,86,87,88,89,90,91,92,93,94,96,97,98,99\"", + "formula1": "\"10,11,12,13,14,15,16,17,18,19,20,21,22,23,27,29,30,32,33,34,36,39,40,41,42,43,44,45,46,47,53,57,58,59,60,61,62,64,66,68,70,77,78,81,82,83,84,85,86,87,88,89,90,91,92,93,94,96,97,98,99\"", "type": "list" }, "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#aln_extension", + "text": "An ALN (CFDA) extension is typically three digits, with some exceptions" + }, "range_name": "three_digit_extension", "title": "CFDA Three Digit Extension", "title_cell": "B3", @@ -51,6 +59,10 @@ "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#unknown", + "text": "If you see this error, please contact support." + }, "range_name": "additional_award_identification", "title": "Additional Award Identification", "title_cell": "C3", @@ -58,6 +70,10 @@ "validation": { } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#plain_text", + "text": "Only plain text is allowed in this field, no emoji or other special additions" + }, "range_name": "program_name", "title": "Federal Program Name", "title_cell": "D3", @@ -66,6 +82,10 @@ "width": 48 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#reference_number", + "text": "Reference numbers have the form YYYY-NNN (e.g. 2023-001)" + }, "range_name": "reference_number", "title": "Audit Finding Reference Number", "title_cell": "E3", @@ -78,6 +98,10 @@ } }, { + "help": { + "link": "https://fac.gov/documentation/validation/#unknown", + "text": "If you see this error, please contact support." + }, "range_name": "compliance_requirement", "title": "Type(s) of Compliance Requirement(s)", "title_cell": "F3", @@ -91,6 +115,10 @@ "width": 20 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "modified_opinion", "title": "Modified Opinion", "title_cell": "G3", @@ -105,6 +133,10 @@ "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#unknown", + "text": "If you see this error, please contact support." + }, "range_name": "other_matters", "title": "Other Matters", "title_cell": "H3", @@ -119,6 +151,10 @@ "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#unknown", + "text": "If you see this error, please contact support." + }, "range_name": "material_weakness", "title": "Material Weakness", "title_cell": "I3", @@ -133,6 +169,10 @@ "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "significant_deficiency", "title": "Significant Deficiency", "title_cell": "J3", @@ -147,6 +187,10 @@ "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "other_findings", "title": "Other Findings", "title_cell": "K3", @@ -161,6 +205,10 @@ "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "questioned_costs", "title": "Questioned Costs", "title_cell": "L3", @@ -175,6 +223,10 @@ "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "repeat_prior_reference", "title": "Repeat Findings from Prior Year", "title_cell": "M3", @@ -189,6 +241,10 @@ "width": 12 }, { + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "prior_references", "title": "If Repeat Finding, provide Prior Year Audit Finding Reference Number(s)", "title_cell": "N3", @@ -198,6 +254,10 @@ }, { "formula": "=IF(OR(G{0}=\"\", H{0}=\"\", I{0}=\"\", J{0}=\"\", K{0}=\"\"), \"\", IF(OR(AND(G{0}=\"Y\", H{0}=\"N\", I{0}=\"N\", J{0}=\"N\", K{0}=\"N\"), AND(G{0}=\"Y\", H{0}=\"N\", I{0}=\"Y\", J{0}=\"N\", K{0}=\"N\"), AND(G{0}=\"Y\", H{0}=\"N\", I{0}=\"N\", J{0}=\"Y\", K{0}=\"N\"), AND(G{0}=\"N\", H{0}=\"Y\", I{0}=\"N\", J{0}=\"N\", K{0}=\"N\"), AND(G{0}=\"N\", H{0}=\"Y\", I{0}=\"Y\", J{0}=\"N\", K{0}=\"N\"), AND(G{0}=\"N\", H{0}=\"Y\", I{0}=\"N\", J{0}=\"Y\", K{0}=\"N\"), AND(G{0}=\"N\", H{0}=\"N\", I{0}=\"Y\", J{0}=\"N\", K{0}=\"N\"), AND(G{0}=\"N\", H{0}=\"N\", I{0}=\"N\", J{0}=\"Y\", K{0}=\"N\"), AND(G{0}=\"N\", H{0}=\"N\", I{0}=\"N\", J{0}=\"N\", K{0}=\"Y\")), \"Y\", \"N\"))", + "help": { + "link": "https://fac.gov/documentation/validation/#yorn", + "text": "This field must be either `Y` or `N`" + }, "range_name": "is_valid", "title": "Is Findings Combination Valid? (Read Only - Please See Instructions tab)", "title_cell": "O3", @@ -214,6 +274,10 @@ ], "single_cells": [ { + "help": { + "link": "https://fac.gov/documentation/validation/#uei", + "text": "UEIs are 12 characters long and match rules as given by SAM.gov" + }, "range_cell": "B2", "range_name": "auditee_uei", "title": "Auditee UEI", diff --git a/backend/schemas/output/excel/xlsx/corrective-action-plan-template.xlsx b/backend/schemas/output/excel/xlsx/corrective-action-plan-template.xlsx index 58856bcff1604193a28117ab645a70213099c390..2cbdb00afbf89c0b2d52b6596203e2aaab3db367 100644 GIT binary patch delta 53624 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

j$ki)0LUA_$%hT);42?^q z6L{oqkT`_P*8IEnK_Czzh)w1YuDuY-;N#~>=++YGf-p~TD3qfBZ_!ny&_ldi$CS>V zBxIK~-{u(u-!YH#QtmeBH*Iglh(lFM#4sDP+&!s5jYgbf7~A2%WEa?zeTX%+)1>Hc z`=@DH$n%%na9Qn8lks3_&baWGQV6Z(s7TMVbV>ud_*;ThdllsRQz@6Xz4aLlkd>6qxQc_*cy4` zW1`PW`1pJjBV4aRD(A1qP?q|C&EC<^p4TVVMMmW^5EuO$r0r^0SBhk-dYoK8>4fb4 zWfJ6PQxM%(K~Sa&O_@zB7@f>pxp+ISmH!+x=t4F@YGj=HBwn6b9I`xh?ipSl$ZWqq zR`ZeGk6LR!HxR(MOGNyOT=d^BpydB@i@Q?}wTAv-xv>Ij@Q3AILo|ej-l>3|QTQ+E z&s+*rBm^Lk0yPLknin1aYjMy4wB1Xn@*kz&_tPT7a-a~U(Y+Aa|7r00#&~gb=1ZvB z9}CSdq4MXN3Zak(0q}cakpW)!v>yZpT(*Yt?SuSZ+&SPbET^{dpfY?Ai0J=YDh^tY zmc&5i{@D8yiBJgSK0gE^{x79M^hFHx$RB(D7^pln3Z0CBs{aAyCz(8y=Yhs~pnvZK Qi5|p2RRyXlc(aiI0F6x)00000 delta 53591 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