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
4 changes: 2 additions & 2 deletions queue_services/business-filer/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@
# POSSIBILITY OF SUCH DAMAGE.
"""File processing rules and actions for change of liquidators filings."""
import copy
from datetime import UTC, datetime

from business_model.models import Business, Filing, PartyRole
from business_model.utils.legislation_datetime import LegislationDatetime

from business_filer.filing_meta import FilingMeta
from business_filer.filing_processors.filing_components.filings import update_filing_court_order
Expand All @@ -46,20 +48,33 @@
)


def _init_liquidation(business: Business, filing_meta: FilingMeta):
"""Put the business into liquidation."""
if not business.in_liquidation:
business.in_liquidation = True
business.in_liquidation_date = filing_meta.application_date or datetime.now(UTC)


def _update_last_lr_year(business: Business):
"""Update the business last liquidation report year."""
if business.last_lr_year:
business.last_lr_year += 1
else:
in_liquidation_date = LegislationDatetime.as_legislation_timezone(business.in_liquidation_date).date()
business.last_lr_year = in_liquidation_date.year + 1


def process(business: Business, filing_rec: Filing, filing_meta: FilingMeta):
"""Render the changeOfLiquidators onto the business model objects."""
filing_json = copy.deepcopy(filing_rec.filing_json)
relationships = filing_json["filing"]["changeOfLiquidators"].get("relationships", [])
offices = filing_json["filing"]["changeOfLiquidators"].get("offices", {})

if filing_rec.filing_sub_type == "intentToLiquidate":
if filing_rec.filing_sub_type in ["intentToLiquidate", "appointLiquidator"]:
create_relationships(relationships, business, filing_rec)
update_or_create_offices(business, offices)
business.in_liquidation = True
_init_liquidation(business, filing_meta)

elif filing_rec.filing_sub_type == "appointLiquidator":
create_relationships(relationships, business, filing_rec)

elif filing_rec.filing_sub_type == "ceaseLiquidator":
cease_relationships(relationships, business, [PartyRole.RoleTypes.LIQUIDATOR.value], filing_meta.application_date)

Expand All @@ -68,8 +83,7 @@ def process(business: Business, filing_rec: Filing, filing_meta: FilingMeta):
update_or_create_offices(business, offices)

elif filing_rec.filing_sub_type == "liquidationReport":
# FUTURE: updates for this will be made as part of #31714
pass
_update_last_lr_year(business)

# update court order, if any is present
if court_order := filing_json["filing"]["changeOfLiquidators"].get("courtOrder"):
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@
court_order,
dissolution,
incorporation_filing,
intent_to_liquidate,
notice_of_withdrawal,
put_back_off,
put_back_on,
Expand Down Expand Up @@ -222,9 +221,6 @@ def process_filing(filing_message: FilingMessage): # noqa: PLR0915, PLR0912
filing_submission.json,
filing_submission,
filing_meta)

case "intentToLiquidate":
intent_to_liquidate.process(business, filing, filing_submission, filing_meta)

case "noticeOfWithdrawal":
notice_of_withdrawal.process(filing_submission, filing, filing_meta)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@
return

def _assert_office_addresses(offices, expected_office):
# Should have registered office and liquidations office
assert len(offices) == 2

has_liquidation_office = False
Expand All @@ -140,24 +141,38 @@
assert address.street == expected_mailing_street
assert has_liquidation_office

def test_process_col_filing(app, session, mocker):
"""Assert that all COL filings can be applied to the model correctly."""
payment_id = str(random.SystemRandom().getrandbits(0x58))
effective_date = datetime(2023, 10, 10, 10, 0, 0, tzinfo=timezone.utc)
identifier = f'BC{random.randint(1000000, 9999999)}'
drs_publish_mock = mocker.patch('business_filer.services.gcp_queue.publish', return_value=None)

business = create_business(identifier)
def _assert_common_data(business: Business, filing: Filing, expected_date, expected_lr_year, expected_next_lr_yr):
"""Assert the expected common data was updated by the liquidation filing processing."""
assert filing.transaction_id
assert filing.business_id == business.id
assert filing.status == Filing.Status.COMPLETED.value
assert business.in_liquidation == True
assert business.in_liquidation_date == expected_date
assert business.last_lr_year == expected_lr_year
assert business.next_lr_min_date.year == expected_next_lr_yr

def _get_liquidation_filing(sub_type: str, effective_date: datetime, identifier = 'BC1234567'):
"""Return a valid change of liquidators filing for the sub type."""
payment_id = str(random.SystemRandom().getrandbits(0x58))
filing = copy.deepcopy(FILING_TEMPLATE)
filing['filing']['header']['name'] = 'changeOfLiquidators'
filing['filing']['header']['effectiveDate'] = effective_date.isoformat()
filing['filing']['business']['identifier'] = identifier
filing['filing']['business']['legalType'] = 'BC'
filing['filing']['changeOfLiquidators'] = copy.deepcopy(CHANGE_OF_LIQUIDATORS_INTENT)
return filing, payment_id, identifier


def test_process_col_filing(app, session, mocker):
"""Assert that all COL filings can be applied to the model correctly."""
# NOTE: this is actually in 2023 pacific time
expected_in_liquidation_date = datetime(2024, 1, 1, 1, 0, 0, tzinfo=timezone.utc)
drs_publish_mock = mocker.patch('business_filer.services.gcp_queue.publish', return_value=None)
filing, payment_id, identifier = _get_liquidation_filing('intentToLiquidate', expected_in_liquidation_date)
business = create_business(identifier)

filing_rec = create_filing(payment_id, filing, business.id)
filing_rec.effective_date = effective_date
filing_rec.effective_date = expected_in_liquidation_date
filing_rec.save()

# setup
Expand All @@ -171,10 +186,7 @@
business: Business = Business.find_by_internal_id(business.id)

# assert changes
assert intent_filing.transaction_id
assert intent_filing.business_id == business.id
assert intent_filing.status == Filing.Status.COMPLETED.value
assert business.in_liquidation == True
_assert_common_data(business, intent_filing, expected_in_liquidation_date, None, 2024)
check_drs_publish(drs_publish_mock, app, business, intent_filing, '')
drs_publish_mock.reset_mock()

Expand All @@ -186,23 +198,7 @@
assert role.role == PartyRole.RoleTypes.LIQUIDATOR.value

offices: list[Office] = business.offices.all()
# NOTE: will have a registered office too
assert len(offices) == 2
has_liquidation_office = False
for office in offices:
if office.office_type == OfficeType.LIQUIDATION:
has_liquidation_office = True
officeAddresses: list[Address] = office.addresses.all()
assert len(officeAddresses) == 2
expected_delivery_street = filing['filing']['changeOfLiquidators']['offices']['liquidationRecordsOffice']['deliveryAddress']['streetAddress']
expected_mailing_street = filing['filing']['changeOfLiquidators']['offices']['liquidationRecordsOffice']['mailingAddress']['streetAddress']
for address in officeAddresses:
if address.address_type == Address.DELIVERY:
assert address.street == expected_delivery_street
else:
assert address.address_type == Address.MAILING
assert address.street == expected_mailing_street
assert has_liquidation_office
_assert_office_addresses(offices, filing['filing']['changeOfLiquidators']['offices']['liquidationRecordsOffice'])

# Test cease liquidator

Expand Down Expand Up @@ -241,9 +237,7 @@
business: Business = Business.find_by_internal_id(business.id)

# assert changes
assert cease_filing.transaction_id
assert cease_filing.business_id == business.id
assert cease_filing.status == Filing.Status.COMPLETED.value
_assert_common_data(business, cease_filing, expected_in_liquidation_date, None, 2024)
check_drs_publish(drs_publish_mock, app, business, cease_filing, '')
drs_publish_mock.reset_mock()

Expand Down Expand Up @@ -305,9 +299,7 @@
business: Business = Business.find_by_internal_id(business.id)

# assert changes
assert change_address_filing.transaction_id
assert change_address_filing.business_id == business.id
assert change_address_filing.status == Filing.Status.COMPLETED.value
_assert_common_data(business, change_address_filing, expected_in_liquidation_date, None, 2024)
check_drs_publish(drs_publish_mock, app, business, change_address_filing, '')
drs_publish_mock.reset_mock()

Expand Down Expand Up @@ -353,9 +345,7 @@
business: Business = Business.find_by_internal_id(business.id)

# assert changes
assert change_address_filing.transaction_id
assert change_address_filing.business_id == business.id
assert change_address_filing.status == Filing.Status.COMPLETED.value
_assert_common_data(business, change_address_filing, expected_in_liquidation_date, None, 2024)
check_drs_publish(drs_publish_mock, app, business, change_address_filing, '')
drs_publish_mock.reset_mock()

Expand Down Expand Up @@ -398,9 +388,7 @@
business: Business = Business.find_by_internal_id(business.id)

# assert changes
assert change_address_filing.transaction_id
assert change_address_filing.business_id == business.id
assert change_address_filing.status == Filing.Status.COMPLETED.value
_assert_common_data(business, change_address_filing, expected_in_liquidation_date, None, 2024)
check_drs_publish(drs_publish_mock, app, business, change_address_filing, '')
drs_publish_mock.reset_mock()

Expand Down Expand Up @@ -462,9 +450,7 @@
business: Business = Business.find_by_internal_id(business.id)

# assert changes
assert appoint_filing.transaction_id
assert appoint_filing.business_id == business.id
assert appoint_filing.status == Filing.Status.COMPLETED.value
_assert_common_data(business, appoint_filing, expected_in_liquidation_date, None, 2024)
check_drs_publish(drs_publish_mock, app, business, appoint_filing, new_document_id)
drs_publish_mock.reset_mock()

Expand All @@ -486,4 +472,93 @@
assert mailing_address.address_type == 'mailing'
assert mailing_address.street == new_relationship['mailingAddress']['streetAddress']

# FUTURE: liquidation report - will be done in #31714
# liquidation report
expected_last_lr_year = 2024

filing['filing']['changeOfLiquidators'] = {
'type': 'liquidationReport',
}
payment_id = str(random.SystemRandom().getrandbits(0x58))
effective_date = datetime(2025, 11, 10, 10, 0, 0, tzinfo=timezone.utc)

filing_rec = create_filing(payment_id, filing, business.id)
filing_rec.effective_date = effective_date
filing_rec.save()
filing_msg = FilingMessage(filing_identifier=filing_rec.id)

# TEST
process_filing(filing_msg)

# Get modified data
lr_filing_1: Filing = Filing.find_by_id(filing_rec.id)
business: Business = Business.find_by_internal_id(business.id)

# assert changes

Check warning on line 496 in queue_services/business-filer/tests/unit/test_filer/test_change_of_liquidators.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this commented out code.

See more on https://sonarcloud.io/project/issues?id=bcgov_lear&issues=AZzTqDZk-AVnfe6IhysX&open=AZzTqDZk-AVnfe6IhysX&pullRequest=4142
_assert_common_data(business, lr_filing_1, expected_in_liquidation_date, expected_last_lr_year, 2025)
check_drs_publish(drs_publish_mock, app, business, lr_filing_1, '')
drs_publish_mock.reset_mock()

# 2nd liquidation report
second_expected_last_lr_year = expected_last_lr_year + 1
filing['filing']['changeOfLiquidators'] = {
'type': 'liquidationReport',
}
payment_id = str(random.SystemRandom().getrandbits(0x58))
effective_date = datetime(2025, 11, 10, 10, 0, 0, tzinfo=timezone.utc)

filing_rec = create_filing(payment_id, filing, business.id)
filing_rec.effective_date = effective_date
filing_rec.save()
filing_msg = FilingMessage(filing_identifier=filing_rec.id)

# TEST
process_filing(filing_msg)

# Get modified data
lr_filing_2: Filing = Filing.find_by_id(filing_rec.id)
business: Business = Business.find_by_internal_id(business.id)

# assert changes

Check warning on line 521 in queue_services/business-filer/tests/unit/test_filer/test_change_of_liquidators.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this commented out code.

See more on https://sonarcloud.io/project/issues?id=bcgov_lear&issues=AZzTqDZk-AVnfe6IhysY&open=AZzTqDZk-AVnfe6IhysY&pullRequest=4142
_assert_common_data(business, lr_filing_2, expected_in_liquidation_date, second_expected_last_lr_year, 2026)
check_drs_publish(drs_publish_mock, app, business, lr_filing_2, '')
drs_publish_mock.reset_mock()


def test_process_col_filing_initiated_with_appoint(app, session, mocker):
"""Assert that appointLiquidator filings can put the business into liquidation and can include liquidation office."""
expected_in_liquidation_date = datetime(2023, 10, 10, 10, 0, 0, tzinfo=timezone.utc)
filing, payment_id, identifier = _get_liquidation_filing('appointLiquidator', expected_in_liquidation_date)
drs_publish_mock = mocker.patch('business_filer.services.gcp_queue.publish', return_value=None)

business = create_business(identifier)

filing_rec = create_filing(payment_id, filing, business.id)
filing_rec.effective_date = expected_in_liquidation_date
filing_rec.save()

# setup
filing_msg = FilingMessage(filing_identifier=filing_rec.id)

# TEST
process_filing(filing_msg)

# Get modified data
appoint_filing: Filing = Filing.find_by_id(filing_rec.id)
business: Business = Business.find_by_internal_id(business.id)

# assert changes

Check warning on line 549 in queue_services/business-filer/tests/unit/test_filer/test_change_of_liquidators.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this commented out code.

See more on https://sonarcloud.io/project/issues?id=bcgov_lear&issues=AZzTqDZk-AVnfe6Ihysb&open=AZzTqDZk-AVnfe6Ihysb&pullRequest=4142
_assert_common_data(business, appoint_filing, expected_in_liquidation_date, None, 2024)
check_drs_publish(drs_publish_mock, app, business, appoint_filing, '')
drs_publish_mock.reset_mock()

party_roles: list[PartyRole] = business.party_roles.all()
assert len(party_roles) == 2
for role in party_roles:
assert role.appointment_date
assert not role.cessation_date
assert role.role == PartyRole.RoleTypes.LIQUIDATOR.value

offices: list[Office] = business.offices.all()
# NOTE: will have a registered office too
assert len(offices) == 2
_assert_office_addresses(offices, filing['filing']['changeOfLiquidators']['offices']['liquidationRecordsOffice'])