From cec63bdff0fe061c6a32d7f2be74010ec19df040 Mon Sep 17 00:00:00 2001 From: Vysakh Menon Date: Tue, 11 Aug 2026 13:07:20 -0700 Subject: [PATCH 1/5] 34483 validation of continuationOut and amalgamationOut in correction --- legal-api/pyproject.toml | 2 +- .../filings/validations/amalgamation_out.py | 5 +- .../filings/validations/continuation_out.py | 15 ++- .../filings/validations/correction.py | 19 ++++ .../filings/validations/test_correction_ia.py | 99 +++++++++++++++++++ 5 files changed, 127 insertions(+), 13 deletions(-) diff --git a/legal-api/pyproject.toml b/legal-api/pyproject.toml index abbb228fbf..3928523802 100644 --- a/legal-api/pyproject.toml +++ b/legal-api/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "legal-api" -version = "3.1.11" +version = "3.1.12" description = "" authors = [ {name = "thor",email = "1042854+thorwolpert@users.noreply.github.com"} diff --git a/legal-api/src/legal_api/services/filings/validations/amalgamation_out.py b/legal-api/src/legal_api/services/filings/validations/amalgamation_out.py index ef7f2e1f1f..4e81ff9d5b 100644 --- a/legal-api/src/legal_api/services/filings/validations/amalgamation_out.py +++ b/legal-api/src/legal_api/services/filings/validations/amalgamation_out.py @@ -44,7 +44,7 @@ def validate(business: Business, filing: dict) -> Error | None: is_valid_co_date = True is_valid_foreign_jurisdiction = True - if err := validate_amalgamation_out_date(filing, filing_type): + if err := validate_amalgamation_out_date(filing, f"/filing/{filing_type}/amalgamationOutDate"): msg.extend(err) is_valid_co_date = False @@ -96,10 +96,9 @@ def validate_active_cao(business: Business, filing: dict, filing_type: str) -> l return msg -def validate_amalgamation_out_date(filing: dict, filing_type: str) -> list: +def validate_amalgamation_out_date(filing: dict, amalgamation_out_date_path: str) -> list: """Validate amalgamation out date.""" msg = [] - amalgamation_out_date_path = f"/filing/{filing_type}/amalgamationOutDate" amalgamation_out_date = get_date(filing, amalgamation_out_date_path) now = LegislationDatetime.now().date() diff --git a/legal-api/src/legal_api/services/filings/validations/continuation_out.py b/legal-api/src/legal_api/services/filings/validations/continuation_out.py index 1b79d1420c..071ed298c4 100644 --- a/legal-api/src/legal_api/services/filings/validations/continuation_out.py +++ b/legal-api/src/legal_api/services/filings/validations/continuation_out.py @@ -41,13 +41,11 @@ def validate(business: Business, filing: dict) -> Error | None: msg = [] filing_type = "continuationOut" - - if err := validate_continuation_out_date(filing, filing_type): - msg.extend(err) - - if err := validate_foreign_jurisdiction(filing["filing"][filing_type]["foreignJurisdiction"], - f"/filing/{filing_type}/foreignJurisdiction"): - msg.extend(err) + msg.extend(validate_continuation_out_date(filing, f"/filing/{filing_type}/continuationOutDate")) + msg.extend(validate_foreign_jurisdiction( + filing["filing"][filing_type]["foreignJurisdiction"], + f"/filing/{filing_type}/foreignJurisdiction" + )) if court_order := filing.get("filing", {}).get(filing_type, {}).get("courtOrder", None): court_order_path: Final = f"/filing/{filing_type}/courtOrder" @@ -60,10 +58,9 @@ def validate(business: Business, filing: dict) -> Error | None: return None -def validate_continuation_out_date(filing: dict, filing_type: str) -> list: +def validate_continuation_out_date(filing: dict, continuation_out_date_path: str) -> list: """Validate continuation out date.""" msg = [] - continuation_out_date_path = f"/filing/{filing_type}/continuationOutDate" continuation_out_date = get_date(filing, continuation_out_date_path) now = LegislationDatetime.now().date() diff --git a/legal-api/src/legal_api/services/filings/validations/correction.py b/legal-api/src/legal_api/services/filings/validations/correction.py index 9111beed9c..4b2b3e4b9d 100644 --- a/legal-api/src/legal_api/services/filings/validations/correction.py +++ b/legal-api/src/legal_api/services/filings/validations/correction.py @@ -25,8 +25,12 @@ from legal_api.errors import Error from legal_api.services import STAFF_ROLE, SYSTEM_ROLE, NaicsService from legal_api.services.filings.validations.alteration import validate_type_change +from legal_api.services.filings.validations.amalgamation_out import ( + validate_amalgamation_out_date +) from legal_api.services.filings.validations.common_validations import ( validate_court_order, + validate_foreign_jurisdiction, validate_name_request, validate_offices_addresses, validate_parties_addresses, @@ -41,6 +45,9 @@ validate_continuation_in_foreign_jurisdiction, validate_continuation_in_xpro_business_in_colin, ) +from legal_api.services.filings.validations.continuation_out import ( + validate_continuation_out_date +) from legal_api.services.filings.validations.incorporation_application import ( validate_coop_parties_mailing_address, validate_roles, @@ -160,6 +167,7 @@ def _validate_corps_correction(business: Business, filing_dict, legal_type, msg) msg.extend(validate_resolution_date_in_share_structure(filing_dict, filing_type, business)) msg.extend(_validate_continuation_in_correction(filing_dict, filing_type, legal_type)) + msg.extend(_validate_out_correction(filing_dict, filing_type, legal_type)) def _validate_continuation_in_correction(filing_dict, filing_type, legal_type): @@ -179,6 +187,17 @@ def _validate_continuation_in_correction(filing_dict, filing_type, legal_type): return msg +def _validate_out_correction(filing_dict, filing_type, legal_type): + msg = [] + if continuation_out := filing_dict["filing"][filing_type].get("continuationOut"): + msg.extend(validate_continuation_out_date(filing_dict, f"/filing/{filing_type}/continuationOut/date")) + msg.extend(validate_foreign_jurisdiction(continuation_out, f"/filing/{filing_type}/continuationOut")) + elif amalgamation_out := filing_dict["filing"][filing_type].get("amalgamationOut"): + msg.extend(validate_amalgamation_out_date(filing_dict, f"/filing/{filing_type}/amalgamationOut/date")) + msg.extend(validate_foreign_jurisdiction(amalgamation_out, f"/filing/{filing_type}/amalgamationOut")) + return msg + + def _validate_special_resolution_correction(filing_dict, legal_type, msg): filing_type = "correction" if filing_dict.get("filing", {}).get(filing_type, {}).get("nameRequest", {}).get("nrNumber", None): diff --git a/legal-api/tests/unit/services/filings/validations/test_correction_ia.py b/legal-api/tests/unit/services/filings/validations/test_correction_ia.py index 16aebcf5cc..b105095ab5 100644 --- a/legal-api/tests/unit/services/filings/validations/test_correction_ia.py +++ b/legal-api/tests/unit/services/filings/validations/test_correction_ia.py @@ -15,6 +15,7 @@ import copy import datedelta +import pycountry from datetime import datetime, timezone from freezegun import freeze_time from http import HTTPStatus @@ -23,6 +24,7 @@ import pytest from business_model.models import Business, Resolution +from business_common.utils.legislation_datetime import LegislationDatetime from business_common.utils.datetime import datetime as dt, timedelta from legal_api.services import NameXService from legal_api.services.authz import BASIC_USER, STAFF_ROLE @@ -39,6 +41,7 @@ from tests.unit.services.utils import jwt_request_context +date_format = '%Y-%m-%d' INCORPORATION_APPLICATION = copy.deepcopy(INCORPORATION_FILING_TEMPLATE) CORRECTION = copy.deepcopy(CORRECTION_INCORPORATION) @@ -808,3 +811,99 @@ def test_validate_continuation_in_xpro_founding_date_match(mocker, app, session, err = validate(business, filing) assert not err + +@pytest.mark.parametrize('filing_type', ['continuationOut', 'amalgamationOut']) +@pytest.mark.parametrize( + 'test_name, expected_code, message', + [ + ('FAIL_IN_FUTURE', HTTPStatus.BAD_REQUEST, '{0} out date must be today or past.'), + ('SUCCESS_NO_CCO', None, None), + ('SUCCESS', None, None) + ] +) +def test_validate_continuation_out_date(session, app, jwt, filing_type, test_name, expected_code, message): + """Assert validate continuation_out_date.""" + identifier = 'BC1234567' + business = factory_business(identifier, entity_type='BC') + corrected_filing = factory_completed_filing(business, INCORPORATION_APPLICATION) + + filing = copy.deepcopy(CORRECTION) + filing['filing']['header']['identifier'] = identifier + filing['filing']['correction']['correctedFilingId'] = corrected_filing.id + filing['filing']['correction']['correctedFilingType'] = filing_type + filing['filing']['correction'][filing_type] = { + 'country': 'CA', + 'region': 'AB', + 'legalName': 'HAULER SERVICES', + 'date': '2023-06-19' + } + del filing['filing']['correction']['commentOnly'] + + if test_name == 'FAIL_IN_FUTURE': + filing['filing']['correction'][filing_type]['date'] = \ + (LegislationDatetime.now() + datedelta.datedelta(days=1)).strftime(date_format) + + with jwt_request_context(app, jwt, [BASIC_USER]): + err = validate(business, filing) + + # validate outcomes + if test_name == 'FAIL_IN_FUTURE': + assert expected_code == err.code + assert message.format(filing_type.replace('Out', '').capitalize()) == err.msg[0]['error'] + else: + assert not err + + +@pytest.mark.parametrize('filing_type', ['continuationOut', 'amalgamationOut']) +@pytest.mark.parametrize( + 'test_name, expected_code, message', + [ + ('FAIL_NO_COUNTRY', HTTPStatus.UNPROCESSABLE_ENTITY, None), + ('FAIL_INVALID_COUNTRY', HTTPStatus.BAD_REQUEST, 'Invalid country.'), + ('FAIL_REGION_BC', HTTPStatus.BAD_REQUEST, 'Region should not be BC.'), + ('FAIL_INVALID_REGION', HTTPStatus.BAD_REQUEST, 'Invalid region.'), + ('FAIL_INVALID_US_REGION', HTTPStatus.BAD_REQUEST, 'Invalid region.'), + ('SUCCESS', None, None) + ] +) +def test_validate_continuation_out_foreign_jurisdiction(session, app, jwt, filing_type, test_name, expected_code, message): + """Assert validate continuation_out foreign jurisdiction.""" + identifier = 'BC1234567' + business = factory_business(identifier, entity_type='BC') + corrected_filing = factory_completed_filing(business, INCORPORATION_APPLICATION) + + filing = copy.deepcopy(CORRECTION) + filing['filing']['header']['identifier'] = identifier + filing['filing']['correction']['correctedFilingId'] = corrected_filing.id + filing['filing']['correction']['correctedFilingType'] = filing_type + filing['filing']['correction'][filing_type] = { + 'country': 'CA', + 'region': 'AB', + 'legalName': 'HAULER SERVICES', + 'date': '2023-06-19' + } + del filing['filing']['correction']['commentOnly'] + + + if test_name == 'FAIL_NO_COUNTRY': + del filing['filing']['correction'][filing_type]['country'] + elif test_name == 'FAIL_INVALID_COUNTRY': + filing['filing']['correction'][filing_type]['country'] = 'NONE' + elif test_name == 'FAIL_REGION_BC': + filing['filing']['correction'][filing_type]['region'] = 'BC' + elif test_name == 'FAIL_INVALID_REGION': + filing['filing']['correction'][filing_type]['region'] = 'NONE' + elif test_name == 'FAIL_INVALID_US_REGION': + filing['filing']['correction'][filing_type]['country'] = 'US' + filing['filing']['correction'][filing_type]['region'] = 'NONE' + + with jwt_request_context(app, jwt, [BASIC_USER]): + err = validate(business, filing) + + # validate outcomes + if test_name != 'SUCCESS': + assert expected_code == err.code + if message: + assert message == err.msg[0]['error'] + else: + assert not err From 70ae56432dc7dd430fa143d89f5254d9998b4e30 Mon Sep 17 00:00:00 2001 From: Vysakh Menon Date: Tue, 11 Aug 2026 14:45:43 -0700 Subject: [PATCH 2/5] no message --- legal-api/src/legal_api/services/authz.py | 7 +++++++ .../services/filings/validations/correction.py | 12 ++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/legal-api/src/legal_api/services/authz.py b/legal-api/src/legal_api/services/authz.py index 4fd7f0e5bc..ca65a9db9e 100644 --- a/legal-api/src/legal_api/services/authz.py +++ b/legal-api/src/legal_api/services/authz.py @@ -447,6 +447,13 @@ def get_allowable_filings_dict(is_authorization: bool = False): } }, Business.State.HISTORICAL: { + "correction": { + "legalTypes": ["BEN", "BC", "ULC", "CC", "C", "CBEN", "CUL", "CCC"], + "blockerChecks": { + "warningTypes": [WarningType.MISSING_REQUIRED_BUSINESS_INFO], + "business": [BusinessBlocker.DEFAULT] + } + }, "courtOrder": { "legalTypes": ["SP", "GP", "CP", "BC", "BEN", "CC", "ULC", "C", "CBEN", "CUL", "CCC"], }, diff --git a/legal-api/src/legal_api/services/filings/validations/correction.py b/legal-api/src/legal_api/services/filings/validations/correction.py index 4b2b3e4b9d..dce52609b2 100644 --- a/legal-api/src/legal_api/services/filings/validations/correction.py +++ b/legal-api/src/legal_api/services/filings/validations/correction.py @@ -25,9 +25,7 @@ from legal_api.errors import Error from legal_api.services import STAFF_ROLE, SYSTEM_ROLE, NaicsService from legal_api.services.filings.validations.alteration import validate_type_change -from legal_api.services.filings.validations.amalgamation_out import ( - validate_amalgamation_out_date -) +from legal_api.services.filings.validations.amalgamation_out import validate_amalgamation_out_date from legal_api.services.filings.validations.common_validations import ( validate_court_order, validate_foreign_jurisdiction, @@ -45,9 +43,7 @@ validate_continuation_in_foreign_jurisdiction, validate_continuation_in_xpro_business_in_colin, ) -from legal_api.services.filings.validations.continuation_out import ( - validate_continuation_out_date -) +from legal_api.services.filings.validations.continuation_out import validate_continuation_out_date from legal_api.services.filings.validations.incorporation_application import ( validate_coop_parties_mailing_address, validate_roles, @@ -167,7 +163,7 @@ def _validate_corps_correction(business: Business, filing_dict, legal_type, msg) msg.extend(validate_resolution_date_in_share_structure(filing_dict, filing_type, business)) msg.extend(_validate_continuation_in_correction(filing_dict, filing_type, legal_type)) - msg.extend(_validate_out_correction(filing_dict, filing_type, legal_type)) + msg.extend(_validate_out_correction(filing_dict, filing_type)) def _validate_continuation_in_correction(filing_dict, filing_type, legal_type): @@ -187,7 +183,7 @@ def _validate_continuation_in_correction(filing_dict, filing_type, legal_type): return msg -def _validate_out_correction(filing_dict, filing_type, legal_type): +def _validate_out_correction(filing_dict, filing_type): msg = [] if continuation_out := filing_dict["filing"][filing_type].get("continuationOut"): msg.extend(validate_continuation_out_date(filing_dict, f"/filing/{filing_type}/continuationOut/date")) From dbfedcf46fb0e068fb92890206e7f7c27164b1a6 Mon Sep 17 00:00:00 2001 From: Vysakh Menon Date: Tue, 11 Aug 2026 15:27:59 -0700 Subject: [PATCH 3/5] no message --- .../filings/validations/correction.py | 5 ++ .../tests/unit/services/test_authorization.py | 57 ++++++++++++------- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/legal-api/src/legal_api/services/filings/validations/correction.py b/legal-api/src/legal_api/services/filings/validations/correction.py index dce52609b2..3a28728338 100644 --- a/legal-api/src/legal_api/services/filings/validations/correction.py +++ b/legal-api/src/legal_api/services/filings/validations/correction.py @@ -87,6 +87,11 @@ def validate(business: Business, filing: dict) -> Error: path = "/filing/correction/correctedFilingId" msg.append({"error": _("Corrected filing is not a valid filing for this business."), "path": path}) + elif corrected_filing.filing_type != filing["filing"]["correction"]["correctedFilingType"]: + path = "/filing/correction/correctedFilingType" + msg.append({"error": _("The corrected filing type does not match filing type of corrected filing."), + "path": path}) + # skip all the other validation checks if comment only correction if not is_comment_only_correction: if filing.get("filing", {}).get("correction", {}).get("parties", None): diff --git a/legal-api/tests/unit/services/test_authorization.py b/legal-api/tests/unit/services/test_authorization.py index 4f1c7ca918..5c981dfd23 100644 --- a/legal-api/tests/unit/services/test_authorization.py +++ b/legal-api/tests/unit/services/test_authorization.py @@ -642,10 +642,10 @@ def test_authorized_invalid_roles(monkeypatch, app, jwt): ('staff_historical_cp', Business.State.HISTORICAL, ['CP'], 'staff', [STAFF_ROLE], ['courtOrder', 'putBackOn', 'registrarsNotation', 'registrarsOrder']), ('staff_historical_corps', Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC'], 'staff', [STAFF_ROLE], - ['courtOrder', 'putBackOn', 'registrarsNotation', 'registrarsOrder', + ['correction', 'courtOrder', 'putBackOn', 'registrarsNotation', 'registrarsOrder', {'restoration': ['fullRestoration', 'limitedRestoration']}]), ('staff_historical_continue_in_corps', Business.State.HISTORICAL, ['C', 'CBEN', 'CUL', 'CCC'], 'staff', [STAFF_ROLE], - ['courtOrder', 'putBackOn', 'registrarsNotation', 'registrarsOrder', + ['correction', 'courtOrder', 'putBackOn', 'registrarsNotation', 'registrarsOrder', {'restoration': ['fullRestoration', 'limitedRestoration']}]), ('staff_historical_llc', Business.State.HISTORICAL, ['LLC'], 'staff', [STAFF_ROLE], []), ('staff_historical_firms', Business.State.HISTORICAL, ['SP', 'GP'], 'staff', [STAFF_ROLE], @@ -878,7 +878,10 @@ def test_get_allowed(monkeypatch, app, jwt, test_name, state, legal_types, usern ['CP', 'BC', 'BEN', 'CC', 'ULC', 'LLC', 'C', 'CBEN', 'CUL', 'CCC'], 'staff', [STAFF_ROLE], False), ('staff_historical', Business.State.HISTORICAL, 'correction', None, - ['CP', 'BC', 'BEN', 'CC', 'ULC', 'LLC', 'C', 'CBEN', 'CUL', 'CCC'], 'staff', [STAFF_ROLE], False), + ['CP', 'LLC', 'SP', 'GP'], 'staff', [STAFF_ROLE], False), + + ('staff_historical_allowed', Business.State.HISTORICAL, 'correction', None, + ['BC', 'BEN', 'CC', 'ULC', 'C', 'CBEN', 'CUL', 'CCC'], 'staff', [STAFF_ROLE], True), ('staff_historical_allowed', Business.State.HISTORICAL, 'courtOrder', None, ['SP', 'GP', 'CP', 'BC', 'BEN', 'CC', 'ULC', 'C', 'CBEN', 'CUL', 'CCC'], 'staff', [STAFF_ROLE], True), @@ -1140,7 +1143,8 @@ def test_is_allowed(monkeypatch, app, session, jwt, test_name, state, filing_typ FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER])), ('staff_historical_corps', True, Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC'], 'staff', [STAFF_ROLE], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -1148,7 +1152,8 @@ def test_is_allowed(monkeypatch, app, session, jwt, test_name, state, filing_typ FilingKey.RESTRN_LTD_CORPS])), ('staff_historical_continue_in_corps', True, Business.State.HISTORICAL, ['C', 'CBEN', 'CCC', 'CUL'], 'staff', [STAFF_ROLE], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -1475,7 +1480,8 @@ def test_get_allowed_actions(monkeypatch, app, session, jwt, requests_mock, FilingKey.REGISTRARS_ORDER])), ('staff_historical_corps', True, Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC', 'C', 'CBEN', 'CCC', 'CUL'], 'staff', [STAFF_ROLE], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -1637,13 +1643,15 @@ def test_get_allowed_filings_blocker_admin_freeze(monkeypatch, app, session, jwt FilingKey.REGISTRARS_ORDER]), ), ('staff_historical_corps', True, Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC'], 'staff', [STAFF_ROLE], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER])), ('staff_historical_continue_in_corps', True, Business.State.HISTORICAL, ['C', 'CBEN', 'CCC', 'CUL'], 'staff', [STAFF_ROLE], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER])), @@ -1800,7 +1808,8 @@ def test_get_allowed_filings_blocker_for_amalgamating_business(monkeypatch, app, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER])), ('staff_historical_corps', True, Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC'], 'staff', [STAFF_ROLE], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -1808,7 +1817,8 @@ def test_get_allowed_filings_blocker_for_amalgamating_business(monkeypatch, app, FilingKey.RESTRN_LTD_CORPS])), ('staff_historical_continue_in_corps', True, Business.State.HISTORICAL, ['C', 'CBEN', 'CCC', 'CUL'], 'staff', [STAFF_ROLE], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -2314,7 +2324,8 @@ def test_allowed_filings_blocker_filing_amalgamations(monkeypatch, app, session, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER])), ('staff_historical_corps', Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC'], 'staff', [STAFF_ROLE], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -2322,7 +2333,8 @@ def test_allowed_filings_blocker_filing_amalgamations(monkeypatch, app, session, FilingKey.RESTRN_LTD_CORPS])), ('staff_historical_continue_in_corps', Business.State.HISTORICAL, ['C', 'CBEN', 'CCC', 'CUL'], 'staff', [STAFF_ROLE], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -2638,7 +2650,8 @@ def test_allowed_filings_warnings(monkeypatch, app, session, jwt, test_name, sta FilingKey.REGISTRARS_ORDER])), ('staff_historical_corps_unaffected', Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC'], 'staff', [STAFF_ROLE], ['dissolution', None], [None, None], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -2646,7 +2659,8 @@ def test_allowed_filings_warnings(monkeypatch, app, session, jwt, test_name, sta FilingKey.RESTRN_LTD_CORPS])), ('staff_historical_continue_in_corps_unaffected', Business.State.HISTORICAL, ['C', 'CBEN', 'CCC', 'CUL'], 'staff', [STAFF_ROLE], ['dissolution', None], [None, None], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -2654,13 +2668,15 @@ def test_allowed_filings_warnings(monkeypatch, app, session, jwt, test_name, sta FilingKey.RESTRN_LTD_CORPS])), ('staff_historical_corps_invalid_state_filing_fail', Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC'], 'staff', [STAFF_ROLE], ['amalgamationOut', 'continuationOut'], [None, None], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER])), ('staff_historical_continue_in_corps_invalid_state_filing_fail', Business.State.HISTORICAL, ['C', 'CBEN', 'CCC', 'CUL'], 'staff', [STAFF_ROLE], ['amalgamationOut', 'continuationOut'], [None, None], - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER])), @@ -3091,7 +3107,8 @@ def test_allowed_filings_completed_filing_check(monkeypatch, app, session, jwt, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER])), ('staff_historical_corps', True, Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC'], 'staff', [STAFF_ROLE], 0, - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -3287,7 +3304,8 @@ def test_get_allowed_filings_blocker_in_dissolution(monkeypatch, app, session, j # historical business - staff user ('staff_historical_corps', Business.State.HISTORICAL, ['BC', 'BEN', 'CC', 'ULC'], 'staff', [STAFF_ROLE], None, - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, @@ -3295,7 +3313,8 @@ def test_get_allowed_filings_blocker_in_dissolution(monkeypatch, app, session, j FilingKey.RESTRN_LTD_CORPS])), ('staff_historical_continue_in_corps', Business.State.HISTORICAL, ['C', 'CBEN', 'CCC', 'CUL'], 'staff', [STAFF_ROLE], None, - expected_lookup([FilingKey.COURT_ORDER, + expected_lookup([FilingKey.CORRCTN, + FilingKey.COURT_ORDER, FilingKey.PUT_BACK_ON, FilingKey.REGISTRARS_NOTATION, FilingKey.REGISTRARS_ORDER, From 3e130fa287e05cea1490b140bf6a5caaa17b775b Mon Sep 17 00:00:00 2001 From: Vysakh Menon Date: Tue, 11 Aug 2026 15:36:04 -0700 Subject: [PATCH 4/5] no message --- .../services/filings/validations/correction.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/legal-api/src/legal_api/services/filings/validations/correction.py b/legal-api/src/legal_api/services/filings/validations/correction.py index 3a28728338..0a473c11ab 100644 --- a/legal-api/src/legal_api/services/filings/validations/correction.py +++ b/legal-api/src/legal_api/services/filings/validations/correction.py @@ -113,19 +113,22 @@ def validate(business: Business, filing: dict) -> Error: )) if filing.get("filing", {}).get("correction", {}).get("offices", None): msg.extend(validate_offices_addresses(filing, filing_type)) - # validations for firms - if business.legal_type in [Business.LegalTypes.SOLE_PROP.value, Business.LegalTypes.PARTNERSHIP.value]: - _validate_firms_correction(business, filing, business.legal_type, msg) - elif business.legal_type in Business.CORPS: - _validate_corps_correction(business, filing, business.legal_type, msg) - elif business.legal_type == Business.LegalTypes.COOP.value: - _validate_special_resolution_correction(filing, business.legal_type, msg) + + _validate_type_specific_props(business, filing, msg) if msg: return Error(HTTPStatus.BAD_REQUEST, msg) return None +def _validate_type_specific_props(business: Business, filing: dict, msg: list): + if business.legal_type in [Business.LegalTypes.SOLE_PROP.value, Business.LegalTypes.PARTNERSHIP.value]: + _validate_firms_correction(business, filing, business.legal_type, msg) + elif business.legal_type in Business.CORPS: + _validate_corps_correction(business, filing, business.legal_type, msg) + elif business.legal_type == Business.LegalTypes.COOP.value: + _validate_special_resolution_correction(filing, business.legal_type, msg) + def _validate_firms_correction(business: Business, filing, legal_type, msg): filing_type = "correction" From 3aea31620a1f55d6570dc4b282f0af5b624df731 Mon Sep 17 00:00:00 2001 From: Vysakh Menon Date: Wed, 12 Aug 2026 08:42:14 -0700 Subject: [PATCH 5/5] no message --- .../validations/test_correction_firms.py | 4 ++++ .../filings/validations/test_correction_ia.py | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/legal-api/tests/unit/services/filings/validations/test_correction_firms.py b/legal-api/tests/unit/services/filings/validations/test_correction_firms.py index 4c7a758bc9..39bc8b12dc 100644 --- a/legal-api/tests/unit/services/filings/validations/test_correction_firms.py +++ b/legal-api/tests/unit/services/filings/validations/test_correction_firms.py @@ -90,6 +90,7 @@ def test_valid_firms_correction(app, session, jwt, test_name, filing): f['filing']['header']['identifier'] = identifier f['filing']['correction']['correctedFilingId'] = corrected_filing.id + f['filing']['correction']['correctedFilingType'] = 'changeOfRegistration' nr_res = copy.deepcopy(nr_response) nr_res['legalType'] = legal_type @@ -121,6 +122,7 @@ def test_firms_correction_invalid_parties(app, session, jwt, test_name, filing, f['filing']['header']['identifier'] = identifier f['filing']['correction']['correctedFilingId'] = corrected_filing.id + f['filing']['correction']['correctedFilingType'] = 'changeOfRegistration' del f['filing']['correction']['parties'][0]['roles'][0] nr_res = copy.deepcopy(nr_response) @@ -189,6 +191,7 @@ def test_firms_correction_naics(app, session, jwt, test_name, filing, existing_n f['filing']['header']['identifier'] = identifier f['filing']['correction']['correctedFilingId'] = corrected_filing.id + f['filing']['correction']['correctedFilingType'] = 'changeOfRegistration' if correction_naics_code: f['filing']['correction']['business']['naics']['naicsCode'] = correction_naics_code else: @@ -252,6 +255,7 @@ def test_firms_correction_start_date(app, session, jwt, test_name, filing, usern f['filing']['header']['identifier'] = identifier f['filing']['correction']['correctedFilingId'] = corrected_filing.id + f['filing']['correction']['correctedFilingType'] = 'changeOfRegistration' f['filing']['correction']['startDate'] = start_date.strftime('%Y-%m-%d') nr_res = copy.deepcopy(nr_response) diff --git a/legal-api/tests/unit/services/filings/validations/test_correction_ia.py b/legal-api/tests/unit/services/filings/validations/test_correction_ia.py index b105095ab5..a0ff88e873 100644 --- a/legal-api/tests/unit/services/filings/validations/test_correction_ia.py +++ b/legal-api/tests/unit/services/filings/validations/test_correction_ia.py @@ -30,8 +30,11 @@ from legal_api.services.authz import BASIC_USER, STAFF_ROLE from legal_api.services.filings import validate from registry_schemas.example_data import ( - CORRECTION_INCORPORATION, + AMALGAMATION_OUT, + CORRECTION_INCORPORATION, CONTINUATION_IN_FILING_TEMPLATE, + CONTINUATION_OUT, + FILING_HEADER, INCORPORATION_FILING_TEMPLATE ) @@ -825,7 +828,12 @@ def test_validate_continuation_out_date(session, app, jwt, filing_type, test_nam """Assert validate continuation_out_date.""" identifier = 'BC1234567' business = factory_business(identifier, entity_type='BC') - corrected_filing = factory_completed_filing(business, INCORPORATION_APPLICATION) + continuation_out_filing = copy.deepcopy(FILING_HEADER) + continuation_out_filing['filing'][filing_type] = copy.deepcopy(CONTINUATION_OUT if filing_type == 'continuationOut' else AMALGAMATION_OUT) + continuation_out_filing['filing']['header']['name'] = filing_type + + corrected_filing = factory_completed_filing(business, continuation_out_filing) + filing = copy.deepcopy(CORRECTION) filing['filing']['header']['identifier'] = identifier @@ -870,7 +878,11 @@ def test_validate_continuation_out_foreign_jurisdiction(session, app, jwt, filin """Assert validate continuation_out foreign jurisdiction.""" identifier = 'BC1234567' business = factory_business(identifier, entity_type='BC') - corrected_filing = factory_completed_filing(business, INCORPORATION_APPLICATION) + continuation_out_filing = copy.deepcopy(FILING_HEADER) + continuation_out_filing['filing'][filing_type] = copy.deepcopy(CONTINUATION_OUT if filing_type == 'continuationOut' else AMALGAMATION_OUT) + continuation_out_filing['filing']['header']['name'] = filing_type + + corrected_filing = factory_completed_filing(business, continuation_out_filing) filing = copy.deepcopy(CORRECTION) filing['filing']['header']['identifier'] = identifier