Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion legal-api/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "legal-api"
version = "3.1.10"
version = "3.1.11"
description = ""
authors = [
{name = "thor",email = "1042854+thorwolpert@users.noreply.github.com"}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,18 @@ def validate(filing_json: dict) -> Error | None: # pylint: disable=too-many-bra
return Error(HTTPStatus.FORBIDDEN,
[{"error": babel(f"{legal_type} does not support continuation in filing.")}])

msg.extend(validate_business_in_colin(filing_json, filing_type))
msg.extend(validate_continuation_in_xpro_business_in_colin(
filing_json["filing"][filing_type].get("business"),
f"/filing/{filing_type}/business"
))
msg.extend(validate_continuation_in_authorization(filing_json, filing_type, legal_type))
msg.extend(_validate_foreign_jurisdiction(filing_json, filing_type, legal_type))

foreign_jurisdiction = filing_json["filing"][filing_type]["foreignJurisdiction"]
msg.extend(validate_continuation_in_foreign_jurisdiction(
legal_type,
foreign_jurisdiction,
f"/filing/{filing_type}/foreignJurisdiction"
))
msg.extend(validate_name_request(filing_json, legal_type, filing_type))

if get_bool(filing_json, "/filing/continuationIn/isApproved"):
Expand Down Expand Up @@ -161,13 +170,14 @@ def _validate_incorporation_date(incorporation_date: str, incorporation_date_pat
return msg


def _validate_foreign_jurisdiction(filing_json: dict, filing_type: str, legal_type: str) -> list:
def validate_continuation_in_foreign_jurisdiction(
legal_type: str,
foreign_jurisdiction: dict,
foreign_jurisdiction_path: str,
skip_affidavit: bool = False
) -> list:
"""Validate continuation in foreign jurisdiction."""
msg = []
foreign_jurisdiction = filing_json["filing"][filing_type]["foreignJurisdiction"]
incorporation_date = filing_json["filing"][filing_type]["foreignJurisdiction"]["incorporationDate"]
foreign_jurisdiction_path = f"/filing/{filing_type}/foreignJurisdiction"
incorporation_date_path = f"/filing/{filing_type}/foreignJurisdiction/incorporationDate"

# identifier required (non-empty / non-whitespace) is enforced by the schema
# (business-schemas continuation_in foreignJurisdiction.identifier pattern).
Expand All @@ -189,16 +199,23 @@ def _validate_foreign_jurisdiction(filing_json: dict, filing_type: str, legal_ty

if err := validate_foreign_jurisdiction(foreign_jurisdiction, foreign_jurisdiction_path):
msg.extend(err)
elif (legal_type == Business.LegalTypes.ULC_CONTINUE_IN.value and
foreign_jurisdiction["country"] == "CA" and
((region := foreign_jurisdiction.get("region")) and region == "AB")):

# Skip affidavit if skip_affidavit is True (correction)
if (
not skip_affidavit and
legal_type == Business.LegalTypes.ULC_CONTINUE_IN.value and
foreign_jurisdiction.get("country") == "CA" and
foreign_jurisdiction.get("region") == "AB"
):
affidavit_file_key_path = f"{foreign_jurisdiction_path}/affidavitFileKey"
if file_key := foreign_jurisdiction.get("affidavitFileKey"):
if err := validate_pdf(file_key, affidavit_file_key_path, False):
msg.extend(err)
else:
msg.append({"error": "Affidavit from the directors is required.", "path": affidavit_file_key_path})

incorporation_date = foreign_jurisdiction["incorporationDate"]
incorporation_date_path = f"{foreign_jurisdiction_path}/incorporationDate"
msg.extend(_validate_incorporation_date(incorporation_date, incorporation_date_path))

return msg
Expand Down Expand Up @@ -233,17 +250,17 @@ def validate_continuation_in_court_order(filing: dict, filing_type) -> list:
return []


def validate_business_in_colin(filing_json: dict, filing_type: str) -> list:
def validate_continuation_in_xpro_business_in_colin(xpro: dict, path: str, skip_founding_date: bool = False) -> list:
"""Validate continuation EXPRO business by making a call to Colin API."""
msg = []
business_identifier_path = f"/filing/{filing_type}/business/identifier"
business_legal_name_path = f"/filing/{filing_type}/business/legalName"
business_founding_date_path = f"/filing/{filing_type}/business/foundingDate"

if filing_json["filing"][filing_type].get("business"):
identifier = filing_json["filing"][filing_type]["business"]["identifier"]
legal_name = filing_json["filing"][filing_type]["business"].get("legalName")
founding_date = filing_json["filing"][filing_type]["business"].get("foundingDate")
business_identifier_path = f"{path}/identifier"
business_legal_name_path = f"{path}/legalName"
business_founding_date_path = f"{path}/foundingDate"

if xpro:
identifier = xpro["identifier"]
legal_name = xpro.get("legalName")
founding_date = xpro.get("foundingDate")
response = colin.query_business(identifier)
response_json = response.json()
if response.status_code != HTTPStatus.OK:
Expand All @@ -252,7 +269,7 @@ def validate_business_in_colin(filing_json: dict, filing_type: str) -> list:
elif legal_name != response_json["business"]["legalName"]:
msg.append({"error": "Legal name does not match with company legal name from Colin.",
"path": business_legal_name_path})
elif founding_date != response_json["business"]["foundingDate"]:
elif not skip_founding_date and founding_date != response_json["business"]["foundingDate"]:
msg.append({"error": "Founding date does not match with founding date from Colin.",
"path": business_founding_date_path})

Expand Down
23 changes: 23 additions & 0 deletions legal-api/src/legal_api/services/filings/validations/correction.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@
validate_share_currency,
validate_share_structure,
)
from legal_api.services.filings.validations.continuation_in import (
validate_continuation_in_foreign_jurisdiction,
validate_continuation_in_xpro_business_in_colin,
)
from legal_api.services.filings.validations.incorporation_application import (
validate_coop_parties_mailing_address,
validate_roles,
Expand Down Expand Up @@ -155,6 +159,25 @@ def _validate_corps_correction(business: Business, filing_dict, legal_type, msg)
msg.extend(validate_share_currency(filing_dict, filing_type, business))
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))


def _validate_continuation_in_correction(filing_dict, filing_type, legal_type):
msg = []
if continuation_in := filing_dict["filing"][filing_type].get("continuationIn"):
msg.extend(validate_continuation_in_foreign_jurisdiction(
legal_type,
continuation_in,
f"/filing/{filing_type}/continuationIn",
skip_affidavit=True
))
msg.extend(validate_continuation_in_xpro_business_in_colin(
continuation_in.get("xpro"),
f"/filing/{filing_type}/continuationIn/xpro",
skip_founding_date=True
))
return msg


def _validate_special_resolution_correction(filing_dict, legal_type, msg):
filing_type = "correction"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1916,7 +1916,7 @@ def mockFlagsValue(flag, _user=None, _account_id=None):
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=[])

if filing_status == Filing.Status.APPROVED.value:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from business_model.models import Business
from legal_api.services import NameXService
from legal_api.services.filings.validations.validation import validate
from legal_api.services.filings.validations.continuation_in import validate_business_in_colin, _validate_foreign_jurisdiction
from legal_api.services.filings.validations.continuation_in import validate_continuation_in_foreign_jurisdiction, validate_continuation_in_xpro_business_in_colin
from registry_schemas.example_data import CONTINUATION_IN

from tests.unit.services.filings.validations import create_party, create_party_address, lists_are_equal
Expand Down Expand Up @@ -86,7 +86,7 @@ def test_invalid_nr_continuation_in(mocker, app, session, monkeypatch):
}]
}
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=[])
with patch.object(NameXService, 'query_nr_number', return_value=MockResponse(invalid_nr_response)):
err = validate(None, filing)
Expand Down Expand Up @@ -127,7 +127,7 @@ def test_continuation_in_parties_missing_role(mocker, app, session, legal_type,
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=[])

err = validate(None, filing)
Expand Down Expand Up @@ -170,7 +170,7 @@ def test_continuation_in_parties_invalid_role(mocker, app, session, parties, exp

mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request', return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin', return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin', return_value=[])

err = validate(None, filing)

Expand Down Expand Up @@ -378,7 +378,7 @@ def test_validate_continuation_in_office(session, mocker, test_name, legal_type,
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=[])

err = validate(None, filing)
Expand Down Expand Up @@ -684,7 +684,7 @@ def test_validate_continuation_in_share_classes(session, mocker, test_name, lega
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=[])

# perform test
Expand Down Expand Up @@ -726,7 +726,7 @@ def test_continuation_in_court_orders(mocker, app, session,
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=[])

err = validate(None, filing)
Expand Down Expand Up @@ -764,7 +764,7 @@ def test_continuation_in_foreign_jurisdiction(mocker, app, session, legal_type,
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=[])

err = validate(None, filing)
Expand All @@ -776,7 +776,7 @@ def test_continuation_in_foreign_jurisdiction(mocker, app, session, legal_type,
assert not err


def test_validate_business_in_colin(mocker, app, session, monkeypatch):
def test_validate_continuation_in_xpro_business_in_colin(mocker, app, session, monkeypatch):
"""Assert valid continuation EXPRO business"""
monkeypatch.setattr(
'legal_api.services.flags.value',
Expand All @@ -790,14 +790,14 @@ def test_validate_business_in_colin(mocker, app, session, monkeypatch):
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=(404, {}))

err = validate(None, filing)
assert err.code == HTTPStatus.BAD_REQUEST


def test_validate_business_in_colin_founding_date_mismatch(mocker, app, session):
def test_validate_continuation_in_xpro_business_in_colin_founding_date_mismatch(mocker, app, session):
"""Assert continuation EXPRO business with founding date mismatch."""
filing = _get_continuation_in_template()

Expand All @@ -820,12 +820,14 @@ def test_validate_business_in_colin_founding_date_mismatch(mocker, app, session)
}
))

err = validate_business_in_colin(filing, 'continuationIn')
err = validate_continuation_in_xpro_business_in_colin(
filing["filing"]["continuationIn"].get("business"),
f"/filing/continuationIn/business")
assert err[0]['error'] == 'Founding date does not match with founding date from Colin.'
assert err[0]['path'] == '/filing/continuationIn/business/foundingDate'


def test_validate_business_in_colin_founding_date_match(mocker, app, session):
def test_validate_continuation_in_xpro_business_in_colin_founding_date_match(mocker, app, session):
"""Assert continuation EXPRO business with matching founding date."""
filing = _get_continuation_in_template()

Expand All @@ -847,7 +849,9 @@ def test_validate_business_in_colin_founding_date_match(mocker, app, session):
}
))

err = validate_business_in_colin(filing, 'continuationIn')
err = validate_continuation_in_xpro_business_in_colin(
filing["filing"]["continuationIn"].get("business"),
f"/filing/continuationIn/business")
assert len(err) == 0


Expand Down Expand Up @@ -881,7 +885,8 @@ def test_validate_foreign_jurisdiction_incorporation_date(mocker, app, session):
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)

# Run the validation function
err = _validate_foreign_jurisdiction(filing, 'continuationIn', 'CCC')
foreign_jurisdiction = filing['filing']['continuationIn']['foreignJurisdiction']
err = validate_continuation_in_foreign_jurisdiction('CCC', foreign_jurisdiction, '/filing/continuationIn/foreignJurisdiction')

# Assert that the error list contains the appropriate error for future incorporation date
assert len(err) == 1
Expand Down Expand Up @@ -911,7 +916,7 @@ def test_validate_before_and_after_approval(mocker, app, session, test_status, i
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=[])

err = validate(None, filing)
Expand Down Expand Up @@ -971,7 +976,7 @@ def test_continuation_in_share_class_series_validation(mocker, app, session, leg
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin',
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin',
return_value=[])

err = validate(None, filing)
Expand Down Expand Up @@ -1013,7 +1018,7 @@ def test_continuation_in_parties_delivery_address_validation(mocker, app, sessio
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_roles', return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request', return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin', return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin', return_value=[])

err = validate(None, filing)

Expand Down Expand Up @@ -1076,7 +1081,7 @@ def test_validate_continuation_in_effective_date(mocker, app, session, jwt, test
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_roles', return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_name_request', return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_business_in_colin', return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_continuation_in_xpro_business_in_colin', return_value=[])

# perform test
with freeze_time(now):
Expand Down Expand Up @@ -1176,17 +1181,18 @@ def test_validate_foreign_jurisdiction_field_lengths(mocker, app, session,
}
}

foreign_jurisdiction = filing['filing']['continuationIn']['foreignJurisdiction']
if identifier is not None:
filing['filing']['continuationIn']['foreignJurisdiction']['identifier'] = identifier
foreign_jurisdiction['identifier'] = identifier

if legal_name is not None:
filing['filing']['continuationIn']['foreignJurisdiction']['legalName'] = legal_name
foreign_jurisdiction['legalName'] = legal_name

mocker.patch('legal_api.services.filings.validations.continuation_in.validate_foreign_jurisdiction',
return_value=[])
mocker.patch('legal_api.services.filings.validations.continuation_in.validate_pdf', return_value=None)

err = _validate_foreign_jurisdiction(filing, 'continuationIn', 'C')
err = validate_continuation_in_foreign_jurisdiction('C', foreign_jurisdiction, '/filing/continuationIn/foreignJurisdiction')

assert err == expected_errors

Expand Down
Loading