diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index f9127cee8..dd6726624 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -39,7 +39,7 @@ jobs: run: docker build -t ${{ env.DOCKER_NAME }}:${{ steps.date.outputs.date }} . - name: Run Trivy vulnerability scanner - uses: aquasecurity/trivy-action@0.22.0 + uses: aquasecurity/trivy-action@0.23.0 with: image-ref: '${{ env.DOCKER_NAME }}:${{ steps.date.outputs.date }}' scan-type: 'image' @@ -74,7 +74,7 @@ jobs: run: docker pull ${{ matrix.image.name }} - name: Run Trivy vulnerability scanner on Third Party Images - uses: aquasecurity/trivy-action@0.22.0 + uses: aquasecurity/trivy-action@0.23.0 with: image-ref: '${{ matrix.image.name }}' scan-type: 'image' diff --git a/backend/audit/validators.py b/backend/audit/validators.py index 24c5f97ad..bf9e995fa 100644 --- a/backend/audit/validators.py +++ b/backend/audit/validators.py @@ -268,6 +268,13 @@ def validate_use_of_gsa_migration_keyword_in_audit_info( if not is_data_migration and settings.GSA_MIGRATION in [ audit_information.get("is_sp_framework_required", ""), audit_information.get("is_low_risk_auditee", ""), + audit_information.get("is_going_concern_included", ""), + audit_information.get("is_internal_control_deficiency_disclosed", ""), + audit_information.get("is_internal_control_material_weakness_disclosed", ""), + audit_information.get("is_material_noncompliance_disclosed", ""), + audit_information.get("is_aicpa_audit_guide_included", ""), + ",".join(audit_information.get("agencies", [])), + ",".join(audit_information.get("gaap_results", [])), ]: raise ValidationError( _(f"{settings.GSA_MIGRATION} not permitted outside of migrations"), diff --git a/backend/census_historical_migration/end_to_end_core.py b/backend/census_historical_migration/end_to_end_core.py index f28541b4a..800b9e72c 100644 --- a/backend/census_historical_migration/end_to_end_core.py +++ b/backend/census_historical_migration/end_to_end_core.py @@ -35,6 +35,7 @@ from census_historical_migration.migration_result import MigrationResult from .change_record import InspectionRecord from .invalid_record import InvalidRecord +from .report_type_flag import AceFlag from django.core.exceptions import ValidationError from django.utils import timezone as django_timezone @@ -114,6 +115,7 @@ def run_end_to_end(user, audit_header): """Attempts to migrate the given audit""" InspectionRecord.reset() InvalidRecord.reset() + AceFlag.reset() try: sac = setup_sac(user, audit_header) builder_loader = workbook_builder_loader(user, sac, audit_header) @@ -236,6 +238,7 @@ def track_invalid_audit_records(audit_year, dbkey, report_id): # Save the invalid audit record and reset InvalidRecord invalid_audit_record.save() InvalidRecord.reset() + AceFlag.reset() def record_migration_status(audit_year, dbkey): diff --git a/backend/census_historical_migration/invalid_migration_tags.py b/backend/census_historical_migration/invalid_migration_tags.py index 490e12d36..c00e557e8 100644 --- a/backend/census_historical_migration/invalid_migration_tags.py +++ b/backend/census_historical_migration/invalid_migration_tags.py @@ -11,3 +11,5 @@ class INVALID_MIGRATION_TAGS: "extra_finding_reference_numbers_in_findingstext" ) INCORRECT_FINDINGS_COUNT = "incorrect_findings_count" + + ACE_AUDIT_REPORT = "ace_audit_report" diff --git a/backend/census_historical_migration/report_type_flag.py b/backend/census_historical_migration/report_type_flag.py new file mode 100644 index 000000000..3b7b87b12 --- /dev/null +++ b/backend/census_historical_migration/report_type_flag.py @@ -0,0 +1,23 @@ +import copy +from typing import Any + + +class AceFlag: + """Hold ACE report flag for the ongoing report migration""" + + DEFAULT: dict[str, Any] = { + "is_ace_report": False, + } + fields = copy.deepcopy(DEFAULT) + + @staticmethod + def reset(): + AceFlag.fields = copy.deepcopy(AceFlag.DEFAULT) + + @staticmethod + def set_ace_report_flag(flag): + AceFlag.fields["is_ace_report"] = flag + + @staticmethod + def get_ace_report_flag(): + return AceFlag.fields["is_ace_report"] diff --git a/backend/census_historical_migration/sac_general_lib/audit_information.py b/backend/census_historical_migration/sac_general_lib/audit_information.py index 3e0d2a0d1..44c1f5018 100644 --- a/backend/census_historical_migration/sac_general_lib/audit_information.py +++ b/backend/census_historical_migration/sac_general_lib/audit_information.py @@ -1,11 +1,15 @@ import re from django.conf import settings + +from census_historical_migration.invalid_migration_tags import INVALID_MIGRATION_TAGS +from census_historical_migration.invalid_record import InvalidRecord +from census_historical_migration.report_type_flag import AceFlag from ..transforms.xform_string_to_int import string_to_int from ..transforms.xform_string_to_bool import string_to_bool from ..transforms.xform_string_to_string import string_to_string from ..exception_utils import DataMigrationError -from ..workbooklib.excel_creation_utils import get_audits +from ..workbooklib.excel_creation_utils import get_audits, track_invalid_records from ..base_field_maps import FormFieldMap, FormFieldInDissem from ..sac_general_lib.utils import ( create_json_from_db_object, @@ -328,17 +332,63 @@ def xform_lowrisk(audit_header): def audit_information(audit_header): """Generates audit information JSON.""" - xform_sp_framework_required(audit_header) - xform_lowrisk(audit_header) - results = xform_build_sp_framework_gaap_results(audit_header) + if AceFlag.get_ace_report_flag(): + audit_info = ace_audit_information(audit_header) + else: + xform_sp_framework_required(audit_header) + xform_lowrisk(audit_header) + results = xform_build_sp_framework_gaap_results(audit_header) + audit_info = create_json_from_db_object(audit_header, mappings) + audit_info = { + key: results.get(key, audit_info.get(key)) + for key in set(audit_info) | set(results) + } + agencies_prefixes = _get_agency_prefixes(audit_header.DBKEY, audit_header.AUDITYEAR) - audit_info = create_json_from_db_object(audit_header, mappings) - audit_info = { - key: results.get(key, audit_info.get(key)) - for key in set(audit_info) | set(results) - } audit_info["agencies"] = list(agencies_prefixes) audit.validators.validate_audit_information_json(audit_info) return audit_info + + +def ace_audit_information(audit_header): + """Constructs the audit information JSON object for an ACE report.""" + actual = create_json_from_db_object(audit_header, mappings) + default = { + "dollar_threshold": settings.GSA_MIGRATION_INT, + "gaap_results": [settings.GSA_MIGRATION], + "is_going_concern_included": settings.GSA_MIGRATION, + "is_internal_control_deficiency_disclosed": settings.GSA_MIGRATION, + "is_internal_control_material_weakness_disclosed": settings.GSA_MIGRATION, + "is_material_noncompliance_disclosed": settings.GSA_MIGRATION, + "is_aicpa_audit_guide_included": settings.GSA_MIGRATION, + "is_low_risk_auditee": settings.GSA_MIGRATION, + "agencies": [settings.GSA_MIGRATION], + } + if actual: + for key, value in actual.items(): + if value: + default[key] = value + # Tracking invalid records + invalid_records = [] + for mapping in mappings: + in_dissem = ( + mapping.in_dissem + if mapping.in_dissem != FormFieldInDissem + else mapping.in_form + ) + track_invalid_records( + [ + (mapping.in_db, getattr(audit_header, mapping.in_db)), + ], + in_dissem, + default[mapping.in_form], + invalid_records, + ) + if invalid_records: + InvalidRecord.append_invalid_migration_tag( + INVALID_MIGRATION_TAGS.ACE_AUDIT_REPORT, + ) + + return default diff --git a/backend/census_historical_migration/sac_general_lib/general_information.py b/backend/census_historical_migration/sac_general_lib/general_information.py index 3addfaaf8..ca15b8853 100644 --- a/backend/census_historical_migration/sac_general_lib/general_information.py +++ b/backend/census_historical_migration/sac_general_lib/general_information.py @@ -21,7 +21,7 @@ from jsonschema import validate from jsonschema.exceptions import ValidationError from ..change_record import InspectionRecord, CensusRecord, GsaFacRecord - +from ..report_type_flag import AceFlag PERIOD_DICT = {"A": "annual", "B": "biennial", "O": "other"} AUDIT_TYPE_DICT = { @@ -351,10 +351,8 @@ def xform_audit_type(general_information): value_in_db = general_information["audit_type"] audit_type = _census_audit_type(value_in_db.upper()) if audit_type == AUDIT_TYPE_DICT["A"]: - raise DataMigrationError( - "Skipping ACE audit", - "skip_ace_audit", - ) + audit_type = settings.GSA_MIGRATION + AceFlag.set_ace_report_flag(True) general_information["audit_type"] = audit_type track_transformations( "AUDITTYPE", diff --git a/backend/census_historical_migration/sac_general_lib/utils.py b/backend/census_historical_migration/sac_general_lib/utils.py index 826d2599f..a1a05ba1f 100644 --- a/backend/census_historical_migration/sac_general_lib/utils.py +++ b/backend/census_historical_migration/sac_general_lib/utils.py @@ -2,6 +2,8 @@ from datetime import datetime, timezone import sys +from census_historical_migration.report_type_flag import AceFlag + from ..transforms.xform_string_to_string import ( string_to_string, ) @@ -22,7 +24,7 @@ def create_json_from_db_object(gobj, mappings): value = mapping.default # Fields with a value of None are skipped to maintain consistency with the logic # used in workbook data extraction and to prevent converting None into the string "None". - if value is None: + if value is None or (value == "" and AceFlag.get_ace_report_flag()): continue # Check for the type and apply the correct conversion method if mapping.type is str: diff --git a/backend/census_historical_migration/test_audit_information_xforms.py b/backend/census_historical_migration/test_audit_information_xforms.py index 5876f94e6..a5f65c469 100644 --- a/backend/census_historical_migration/test_audit_information_xforms.py +++ b/backend/census_historical_migration/test_audit_information_xforms.py @@ -1,6 +1,8 @@ +from unittest.mock import MagicMock, patch from django.test import SimpleTestCase from .sac_general_lib.audit_information import ( + ace_audit_information, xform_build_sp_framework_gaap_results, xform_framework_basis, xform_sp_framework_required, @@ -205,3 +207,76 @@ def test_lowrisk_blank(self): audit_header.LOWRISK = "" xform_lowrisk(audit_header) self.assertEqual(audit_header.LOWRISK, settings.GSA_MIGRATION) + + +class TestAceAuditInformation(SimpleTestCase): + + def setUp(self): + self.audit_header = MagicMock() + self.audit_header.some_field = "test_value" + + self.default_values = { + "dollar_threshold": settings.GSA_MIGRATION_INT, + "gaap_results": [settings.GSA_MIGRATION], + "is_going_concern_included": settings.GSA_MIGRATION, + "is_internal_control_deficiency_disclosed": settings.GSA_MIGRATION, + "is_internal_control_material_weakness_disclosed": settings.GSA_MIGRATION, + "is_material_noncompliance_disclosed": settings.GSA_MIGRATION, + "is_aicpa_audit_guide_included": settings.GSA_MIGRATION, + "is_low_risk_auditee": settings.GSA_MIGRATION, + "agencies": [settings.GSA_MIGRATION], + } + + @patch( + "census_historical_migration.sac_general_lib.audit_information.create_json_from_db_object" + ) + def test_ace_audit_information_with_actual_values(self, mock_create_json): + """Test that the function returns the correct values when all fields are present.""" + mock_create_json.return_value = { + "dollar_threshold": 1000, + "is_low_risk_auditee": True, + "new_field": "new_value", + } + + result = ace_audit_information(self.audit_header) + + expected_result = self.default_values.copy() + expected_result.update( + { + "dollar_threshold": 1000, + "is_low_risk_auditee": True, + "new_field": "new_value", + } + ) + + self.assertEqual(result, expected_result) + + @patch( + "census_historical_migration.sac_general_lib.audit_information.create_json_from_db_object" + ) + def test_ace_audit_information_with_default_values(self, mock_create_json): + """Test that the function returns the correct values when all fields are missing.""" + mock_create_json.return_value = {} + + result = ace_audit_information(self.audit_header) + + expected_result = self.default_values + + self.assertEqual(result, expected_result) + + @patch( + "census_historical_migration.sac_general_lib.audit_information.create_json_from_db_object" + ) + def test_ace_audit_information_with_mixed_values(self, mock_create_json): + """Test that the function returns the correct values when some fields are missing.""" + mock_create_json.return_value = { + "dollar_threshold": None, + "is_low_risk_auditee": True, + } + + result = ace_audit_information(self.audit_header) + + expected_result = self.default_values.copy() + expected_result.update({"is_low_risk_auditee": True}) + + self.assertEqual(result, expected_result) diff --git a/backend/package-lock.json b/backend/package-lock.json index 999bf430c..6a50f0608 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@uswds/uswds": "3.8.1", "autoprefixer": "^10.4.19", - "esbuild": "^0.21.4", + "esbuild": "^0.21.5", "esbuild-sass-plugin": "3.3.1", "glob": "10.4.1", "npm-run-all": "^4.1.5", @@ -21,17 +21,17 @@ "devDependencies": { "@4tw/cypress-drag-drop": "^2.2.5", "@babel/eslint-parser": "^7.24.7", - "@eslint/js": "^9.4.0", + "@eslint/js": "^9.5.0", "cypress": "^13.11.0", "cypress-axe": "^1.5.0", - "cypress-downloadfile": "^1.2.3", + "cypress-downloadfile": "^1.2.4", "cypress-file-upload": "^5.0.8", "cypress-otp": "^1.0.3", - "eslint": "^9.4.0", + "eslint": "^9.5.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-cypress": "^3.3.0", "eslint-plugin-prettier": "^5.1.3", - "prettier": "^3.3.1", + "prettier": "^3.3.2", "stylelint": "^15.10.1", "stylelint-config-scss": "^1.0.0-security", "stylelint-config-standard": "^34.0.0", @@ -545,9 +545,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.4.tgz", - "integrity": "sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -560,9 +560,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.4.tgz", - "integrity": "sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -575,9 +575,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.4.tgz", - "integrity": "sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -590,9 +590,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.4.tgz", - "integrity": "sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -605,9 +605,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.4.tgz", - "integrity": "sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -620,9 +620,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.4.tgz", - "integrity": "sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -635,9 +635,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.4.tgz", - "integrity": "sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -650,9 +650,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.4.tgz", - "integrity": "sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -665,9 +665,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.4.tgz", - "integrity": "sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -680,9 +680,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.4.tgz", - "integrity": "sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -695,9 +695,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.4.tgz", - "integrity": "sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -710,9 +710,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.4.tgz", - "integrity": "sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -725,9 +725,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.4.tgz", - "integrity": "sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -740,9 +740,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.4.tgz", - "integrity": "sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -755,9 +755,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.4.tgz", - "integrity": "sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -770,9 +770,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.4.tgz", - "integrity": "sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -785,9 +785,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.4.tgz", - "integrity": "sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -800,9 +800,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.4.tgz", - "integrity": "sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -815,9 +815,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.4.tgz", - "integrity": "sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -830,9 +830,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.4.tgz", - "integrity": "sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -845,9 +845,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.4.tgz", - "integrity": "sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -860,9 +860,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.4.tgz", - "integrity": "sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -875,9 +875,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.4.tgz", - "integrity": "sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -926,12 +926,12 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.15.1.tgz", - "integrity": "sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.16.0.tgz", + "integrity": "sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==", "dev": true, "dependencies": { - "@eslint/object-schema": "^2.1.3", + "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -975,18 +975,18 @@ } }, "node_modules/@eslint/js": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.4.0.tgz", - "integrity": "sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.5.0.tgz", + "integrity": "sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.3.tgz", - "integrity": "sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2183,9 +2183,9 @@ } }, "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dev": true, "dependencies": { "node-fetch": "^2.6.12" @@ -2309,19 +2309,19 @@ } }, "node_modules/cypress-downloadfile": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cypress-downloadfile/-/cypress-downloadfile-1.2.3.tgz", - "integrity": "sha512-XvjMi081VJPs8gdmITHLpdbcscW8HHlTpIuKBqqFTRnIqPqcsjaZfJ22tqqDSr5w4X9T5FPFfr4SiklPsfoXiw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/cypress-downloadfile/-/cypress-downloadfile-1.2.4.tgz", + "integrity": "sha512-jItfeK6vWS9a8jU1pQM/ltpcrH0AzhzGUm4d/ujaNlLMGsyZAjUazvklqBBQaexY/SuCtbitvDDp7RqaZLwruQ==", "dev": true, "dependencies": { - "cross-fetch": "^3.1.5", - "fs-extra": "10.1.0" + "cross-fetch": "^4.0.0", + "fs-extra": "^11.2.0" } }, "node_modules/cypress-downloadfile/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -2329,7 +2329,7 @@ "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, "node_modules/cypress-file-upload": { @@ -2837,9 +2837,9 @@ } }, "node_modules/esbuild": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.4.tgz", - "integrity": "sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -2848,29 +2848,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.4", - "@esbuild/android-arm": "0.21.4", - "@esbuild/android-arm64": "0.21.4", - "@esbuild/android-x64": "0.21.4", - "@esbuild/darwin-arm64": "0.21.4", - "@esbuild/darwin-x64": "0.21.4", - "@esbuild/freebsd-arm64": "0.21.4", - "@esbuild/freebsd-x64": "0.21.4", - "@esbuild/linux-arm": "0.21.4", - "@esbuild/linux-arm64": "0.21.4", - "@esbuild/linux-ia32": "0.21.4", - "@esbuild/linux-loong64": "0.21.4", - "@esbuild/linux-mips64el": "0.21.4", - "@esbuild/linux-ppc64": "0.21.4", - "@esbuild/linux-riscv64": "0.21.4", - "@esbuild/linux-s390x": "0.21.4", - "@esbuild/linux-x64": "0.21.4", - "@esbuild/netbsd-x64": "0.21.4", - "@esbuild/openbsd-x64": "0.21.4", - "@esbuild/sunos-x64": "0.21.4", - "@esbuild/win32-arm64": "0.21.4", - "@esbuild/win32-ia32": "0.21.4", - "@esbuild/win32-x64": "0.21.4" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/esbuild-sass-plugin": { @@ -2904,16 +2904,16 @@ } }, "node_modules/eslint": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.4.0.tgz", - "integrity": "sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.5.0.tgz", + "integrity": "sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/config-array": "^0.15.1", + "@eslint/config-array": "^0.16.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.4.0", + "@eslint/js": "9.5.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -2925,7 +2925,7 @@ "eslint-scope": "^8.0.1", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.1", - "esquery": "^1.4.2", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -2951,7 +2951,7 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" } }, "node_modules/eslint-config-prettier": { @@ -5943,9 +5943,9 @@ } }, "node_modules/prettier": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.1.tgz", - "integrity": "sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" diff --git a/backend/package.json b/backend/package.json index 845c27546..876d5e4e1 100644 --- a/backend/package.json +++ b/backend/package.json @@ -25,17 +25,17 @@ "devDependencies": { "@4tw/cypress-drag-drop": "^2.2.5", "@babel/eslint-parser": "^7.24.7", - "@eslint/js": "^9.4.0", + "@eslint/js": "^9.5.0", "cypress": "^13.11.0", "cypress-axe": "^1.5.0", - "cypress-downloadfile": "^1.2.3", + "cypress-downloadfile": "^1.2.4", "cypress-file-upload": "^5.0.8", "cypress-otp": "^1.0.3", - "eslint": "^9.4.0", + "eslint": "^9.5.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-cypress": "^3.3.0", "eslint-plugin-prettier": "^5.1.3", - "prettier": "^3.3.1", + "prettier": "^3.3.2", "stylelint": "^15.10.1", "stylelint-config-scss": "^1.0.0-security", "stylelint-config-standard": "^34.0.0", @@ -44,7 +44,7 @@ "dependencies": { "@uswds/uswds": "3.8.1", "autoprefixer": "^10.4.19", - "esbuild": "^0.21.4", + "esbuild": "^0.21.5", "esbuild-sass-plugin": "3.3.1", "glob": "10.4.1", "npm-run-all": "^4.1.5", diff --git a/backend/schemas/output/sections/AuditInformation.schema.json b/backend/schemas/output/sections/AuditInformation.schema.json index 6b7056ca6..c013394c2 100644 --- a/backend/schemas/output/sections/AuditInformation.schema.json +++ b/backend/schemas/output/sections/AuditInformation.schema.json @@ -83,16 +83,24 @@ "properties": { "agencies": { "items": { - "allOf": [ + "oneOf": [ { - "maxLength": 2, - "minLength": 2 + "allOf": [ + { + "maxLength": 2, + "minLength": 2 + }, + { + "pattern": "^([0-9]{2})$" + } + ], + "type": "string" }, { - "pattern": "^([0-9]{2})$" + "const": "GSA_MIGRATION", + "type": "string" } - ], - "type": "string" + ] }, "type": "array" }, @@ -107,23 +115,56 @@ "qualified_opinion", "adverse_opinion", "disclaimer_of_opinion", - "not_gaap" + "not_gaap", + "GSA_MIGRATION" ], "type": "string" }, "type": "array" }, "is_aicpa_audit_guide_included": { - "type": "boolean" + "oneOf": [ + { + "type": "boolean" + }, + { + "const": "GSA_MIGRATION", + "type": "string" + } + ] }, "is_going_concern_included": { - "type": "boolean" + "oneOf": [ + { + "type": "boolean" + }, + { + "const": "GSA_MIGRATION", + "type": "string" + } + ] }, "is_internal_control_deficiency_disclosed": { - "type": "boolean" + "oneOf": [ + { + "type": "boolean" + }, + { + "const": "GSA_MIGRATION", + "type": "string" + } + ] }, "is_internal_control_material_weakness_disclosed": { - "type": "boolean" + "oneOf": [ + { + "type": "boolean" + }, + { + "const": "GSA_MIGRATION", + "type": "string" + } + ] }, "is_low_risk_auditee": { "oneOf": [ @@ -137,7 +178,15 @@ ] }, "is_material_noncompliance_disclosed": { - "type": "boolean" + "oneOf": [ + { + "type": "boolean" + }, + { + "const": "GSA_MIGRATION", + "type": "string" + } + ] }, "is_sp_framework_required": { "oneOf": [ diff --git a/backend/schemas/output/sections/GeneralInformation.schema.json b/backend/schemas/output/sections/GeneralInformation.schema.json index e259f4a5f..24edbb5a5 100644 --- a/backend/schemas/output/sections/GeneralInformation.schema.json +++ b/backend/schemas/output/sections/GeneralInformation.schema.json @@ -19,13 +19,21 @@ "type": "string" }, "audit_type": { - "description": "Type of audit being submitted", - "enum": [ - "program-specific", - "single-audit" - ], - "title": "AuditType", - "type": "string" + "oneOf": [ + { + "description": "Type of audit being submitted", + "enum": [ + "program-specific", + "single-audit" + ], + "title": "AuditType", + "type": "string" + }, + { + "const": "GSA_MIGRATION", + "type": "string" + } + ] }, "auditee_address_line_1": { "maxLength": 100, diff --git a/backend/schemas/output/sections/GeneralInformationRequired.schema.json b/backend/schemas/output/sections/GeneralInformationRequired.schema.json index 78a800983..b7eeb8944 100644 --- a/backend/schemas/output/sections/GeneralInformationRequired.schema.json +++ b/backend/schemas/output/sections/GeneralInformationRequired.schema.json @@ -129,13 +129,21 @@ "type": "string" }, "audit_type": { - "description": "Type of audit being submitted", - "enum": [ - "program-specific", - "single-audit" - ], - "title": "AuditType", - "type": "string" + "oneOf": [ + { + "description": "Type of audit being submitted", + "enum": [ + "program-specific", + "single-audit" + ], + "title": "AuditType", + "type": "string" + }, + { + "const": "GSA_MIGRATION", + "type": "string" + } + ] }, "auditee_address_line_1": { "maxLength": 100, diff --git a/backend/schemas/source/base/Base.libsonnet b/backend/schemas/source/base/Base.libsonnet index 3192b9063..5a35f2ddb 100644 --- a/backend/schemas/source/base/Base.libsonnet +++ b/backend/schemas/source/base/Base.libsonnet @@ -222,6 +222,10 @@ local Enum = { description: 'GAAP Results (Audit Information)', enum: std.map(function(pair) pair.key, GAAP.gaap_results), }, + GAAPResults_GSAMigration: Types.string { + description: 'GAAP Results (Audit Information)', + enum: std.map(function(pair) pair.key, GAAP.gaap_results) + [Const.GSA_MIGRATION], + }, SP_Framework_Basis: Types.string { description: 'SP Framework Basis (Audit Information)', enum: std.map(function(pair) pair.key, GAAP.sp_framework_basis), @@ -381,6 +385,14 @@ local SchemaBase = Types.object { enum: ClusterNames.cluster_names + [Const.STATE_CLUSTER, Const.OTHER_CLUSTER], }, ALNPrefixes: type_aln_prefix, + ALNPrefixesWithGsaMigration: { + oneOf: [ + type_aln_prefix, + Types.string { + const: Const.GSA_MIGRATION, + }, + ], + }, ThreeDigitExtension: { oneOf: [ type_three_digit_extension, diff --git a/backend/schemas/source/sections/AuditInformation.schema.jsonnet b/backend/schemas/source/sections/AuditInformation.schema.jsonnet index ea708d381..a3581e43f 100644 --- a/backend/schemas/source/sections/AuditInformation.schema.jsonnet +++ b/backend/schemas/source/sections/AuditInformation.schema.jsonnet @@ -6,7 +6,7 @@ local AuditInformation = Types.object { additionalProperties: false, properties: { gaap_results: Types.array { - items: Base.Enum.GAAPResults, + items: Base.Enum.GAAPResults_GSAMigration, }, sp_framework_basis: Types.array { items: Base.Enum.SP_Framework_Basis, @@ -23,11 +23,46 @@ local AuditInformation = Types.object { }, ], }, - is_going_concern_included: Types.boolean, - is_internal_control_deficiency_disclosed: Types.boolean, - is_internal_control_material_weakness_disclosed: Types.boolean, - is_material_noncompliance_disclosed: Types.boolean, - is_aicpa_audit_guide_included: Types.boolean, + is_going_concern_included: { + oneOf: [ + Types.boolean, + Types.string { + const: Base.Const.GSA_MIGRATION, + }, + ], + }, + is_internal_control_deficiency_disclosed: { + oneOf: [ + Types.boolean, + Types.string { + const: Base.Const.GSA_MIGRATION, + }, + ], + }, + is_internal_control_material_weakness_disclosed: { + oneOf: [ + Types.boolean, + Types.string { + const: Base.Const.GSA_MIGRATION, + }, + ], + }, + is_material_noncompliance_disclosed: { + oneOf: [ + Types.boolean, + Types.string { + const: Base.Const.GSA_MIGRATION, + }, + ], + }, + is_aicpa_audit_guide_included: { + oneOf: [ + Types.boolean, + Types.string { + const: Base.Const.GSA_MIGRATION, + }, + ], + }, is_low_risk_auditee: { oneOf: [ Types.boolean, @@ -37,7 +72,7 @@ local AuditInformation = Types.object { ], }, agencies: Types.array { - items: Base.Compound.ALNPrefixes, + items: Base.Compound.ALNPrefixesWithGsaMigration, }, }, required: [ diff --git a/backend/schemas/source/sections/GeneralInformation.schema.jsonnet b/backend/schemas/source/sections/GeneralInformation.schema.jsonnet index da1a153ec..6a1d25d56 100644 --- a/backend/schemas/source/sections/GeneralInformation.schema.jsonnet +++ b/backend/schemas/source/sections/GeneralInformation.schema.jsonnet @@ -18,7 +18,14 @@ Typechecks fields, but allows for empty data as well. Contains conditional check auditee_fiscal_period_end: { format: 'date', }, - audit_type: Base.Enum.AuditType, + audit_type: { + oneOf: [ + Base.Enum.AuditType, + Types.string { + const: Base.Const.GSA_MIGRATION, + }, + ], + }, audit_period_covered: Base.Enum.AuditPeriod, audit_period_other_months: Base.Compound.MonthsOther, diff --git a/backend/templates/includes/footer.html b/backend/templates/includes/footer.html index 2548ed820..b120c587a 100644 --- a/backend/templates/includes/footer.html +++ b/backend/templates/includes/footer.html @@ -60,6 +60,13 @@ View No FEAR Act data +