Skip to content

Commit

Permalink
24988 now documents temp business (bcgov#3182)
Browse files Browse the repository at this point in the history
* 24988 now_documents_temp_business

* add unit test

* clean up

* fix lint issue

* clean up

* fix lint issue

* update busines name

* 25418 show withdrawn filing outputs

* fix lint issue

* fix typo
  • Loading branch information
kzdev420 authored Jan 29, 2025
1 parent f7a217b commit 48550e2
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 13 deletions.
24 changes: 20 additions & 4 deletions legal-api/src/legal_api/core/filing.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@


# @dataclass(init=False, repr=False)
class Filing:
class Filing: # pylint: disable=too-many-public-methods
"""Domain class for Filings."""

class Status(str, Enum):
Expand Down Expand Up @@ -284,6 +284,18 @@ def get(identifier, filing_id=None) -> Optional[Filing]:

return None

@staticmethod
def get_by_withdrawn_filing_id(filing_id, withdrawn_filing_id, filing_type: str = None) -> Optional[Filing]:
"""Return a Filing domain by the id, withdrawn_filing_id and filing_type."""
storage = FilingStorage.get_temp_reg_filing_by_withdrawn_filing(filing_id, withdrawn_filing_id, filing_type)

if storage:
filing = Filing()
filing._storage = storage # pylint: disable=protected-access
return filing

return None

@staticmethod
def find_by_id(filing_id) -> Optional[Filing]:
"""Return a Filing domain by the id."""
Expand Down Expand Up @@ -487,6 +499,10 @@ def get_document_list(business, # pylint: disable=too-many-locals disable=too-m
base_url = current_app.config.get('LEGAL_API_BASE_URL')
base_url = base_url[:base_url.find('/api')]
identifier = business.identifier if business else filing.storage.temp_reg
if not identifier and filing.storage.withdrawn_filing_id:
withdrawn_filing = Filing.find_by_id(filing.storage.withdrawn_filing_id)
identifier = withdrawn_filing.storage.temp_reg

doc_url = url_for('API2.get_documents', **{'identifier': identifier,
'filing_id': filing.id,
'legal_filing_name': None})
Expand All @@ -508,15 +524,15 @@ def get_document_list(business, # pylint: disable=too-many-locals disable=too-m
if filing.storage and filing.storage.payment_completion_date:
documents['documents']['receipt'] = f'{base_url}{doc_url}/receipt'

no_legal_filings_in_paid_status = [
no_legal_filings_in_paid_withdrawn_status = [
Filing.FilingTypes.REGISTRATION.value,
Filing.FilingTypes.CONSENTCONTINUATIONOUT.value,
Filing.FilingTypes.CONTINUATIONOUT.value,
Filing.FilingTypes.AGMEXTENSION.value,
Filing.FilingTypes.AGMLOCATIONCHANGE.value,
]
if filing.status == Filing.Status.PAID and \
not (filing.filing_type in no_legal_filings_in_paid_status
if filing.status in (Filing.Status.PAID, Filing.Status.WITHDRAWN) and \
not (filing.filing_type in no_legal_filings_in_paid_withdrawn_status
or (filing.filing_type == Filing.FilingTypes.DISSOLUTION.value and
business.legal_type in [
Business.LegalTypes.SOLE_PROP.value,
Expand Down
13 changes: 13 additions & 0 deletions legal-api/src/legal_api/models/filing.py
Original file line number Diff line number Diff line change
Expand Up @@ -882,6 +882,19 @@ def get_temp_reg_filing(temp_reg_id: str, filing_id: str = None):
)
).one_or_none())

@staticmethod
def get_temp_reg_filing_by_withdrawn_filing(filing_id: str, withdrawn_filing_id: str, filing_type: str = None):
"""Return an temp reg Filing by withdrawn filing."""
q = db.session.query(Filing). \
filter(Filing.withdrawn_filing_id == withdrawn_filing_id). \
filter(Filing.id == filing_id)

if filing_type:
q = q.filter(Filing._filing_type == filing_type)

filing = q.one_or_none()
return filing

@staticmethod
def get_filing_by_payment_token(token: str):
"""Return a Filing by it's payment token."""
Expand Down
3 changes: 3 additions & 0 deletions legal-api/src/legal_api/reports/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,9 @@ def _set_description(self, filing):
if not legal_type and self._business:
legal_type = self._business.legal_type

if not legal_type and self._filing.filing_type == 'noticeOfWithdrawal':
legal_type = self._filing.filing_json.get('filing').get('business', {}).get('legalType')

filing['numberedDescription'] = Business.BUSINESSES.get(legal_type, {}).get('numberedDescription')
filing['numberedLegalNameSuffix'] = Business.BUSINESSES.get(legal_type, {}).get('numberedLegalNameSuffix')

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
@cross_origin(origin='*')
@jwt.requires_auth
def get_documents(identifier: str, filing_id: int, legal_filing_name: str = None, file_key: str = None):
# pylint: disable=too-many-branches
"""Return a JSON object with meta information about the Service."""
# basic checks
if not authorized(identifier, jwt, ['view', ]):
Expand All @@ -63,7 +64,15 @@ def get_documents(identifier: str, filing_id: int, legal_filing_name: str = None
message=get_error_message(ErrorCode.MISSING_BUSINESS, **{'identifier': identifier})
), HTTPStatus.NOT_FOUND

if not (filing := Filing.get(identifier, filing_id)):
filing = Filing.get(identifier, filing_id)
if filing and identifier.startswith('T') and filing.id != filing_id:
withdrawn_filing = Filing.get_by_withdrawn_filing_id(filing_id=filing_id,
withdrawn_filing_id=filing.id,
filing_type=Filing.FilingTypes.NOTICEOFWITHDRAWAL)
if withdrawn_filing:
filing = withdrawn_filing

if not filing:
return jsonify(
message=get_error_message(ErrorCode.FILING_NOT_FOUND,
**{'filing_id': filing_id, 'identifier': identifier})
Expand Down Expand Up @@ -106,6 +115,7 @@ def _get_receipt(business: Business, filing: Filing, token):
Filing.Status.COMPLETED,
Filing.Status.CORRECTED,
Filing.Status.PAID,
Filing.Status.WITHDRAWN
):
return {}, HTTPStatus.BAD_REQUEST

Expand Down Expand Up @@ -142,15 +152,15 @@ def _get_corp_name(business, filing):
if business:
return business.legal_name

name_request = (filing.filing_json
.get('filing')
.get(filing.filing_type)
.get('nameRequest', {}))
if name_request.get('legalName'):
return name_request.get('legalName')
filing_json = filing.filing_json.get('filing', {})
name_request = filing_json.get(filing.filing_type, {}).get('nameRequest', {})

legal_name = name_request.get('legalName') or filing_json.get('business', {}).get('legalName')
if legal_name:
return legal_name

legal_type = name_request.get('legalType')
legal_type = name_request.get('legalType') or filing_json.get('business', {}).get('legal_type')
if legal_type:
return Business.BUSINESSES.get(legal_type, {}).get('numberedDescription')
return Business.BUSINESSES.get(legal_type, {}).get('numberedDescription', '')

return ''
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,17 @@ def test_unpaid_filing(session, client, jwt):
},
HTTPStatus.OK, '2017-10-01'
),
('bc_ia_completed', 'BC7654321', Business.LegalTypes.COMP.value,
'incorporationApplication', INCORPORATION, None, None, Filing.Status.WITHDRAWN,
{'documents': {'receipt': f'{base_url}/api/v2/businesses/BC7654321/filings/1/documents/receipt',
'legalFilings': [
{'incorporationApplication':
f'{base_url}/api/v2/businesses/BC7654321/filings/1/documents/incorporationApplication'},
]
}
},
HTTPStatus.OK, '2017-10-01'
),
('bc_annual_report_completed', 'BC7654321', Business.LegalTypes.COMP.value,
'annualReport', ANNUAL_REPORT, None, None, Filing.Status.COMPLETED,
{'documents': {'receipt': f'{base_url}/api/v2/businesses/BC7654321/filings/1/documents/receipt',
Expand Down Expand Up @@ -1468,6 +1479,14 @@ def filer_action(filing_name, filing_json, meta_data, business):
]}},
HTTPStatus.OK
),
('ben_ia_paid', 'Tb31yQIuBw', None, Business.LegalTypes.BCOMP.value,
'incorporationApplication', INCORPORATION, Filing.Status.WITHDRAWN,
{'documents': {'receipt': f'{base_url}/api/v2/businesses/Tb31yQIuBw/filings/1/documents/receipt',
'legalFilings': [
{'incorporationApplication': f'{base_url}/api/v2/businesses/Tb31yQIuBw/filings/1/documents/incorporationApplication'},
]}},
HTTPStatus.OK
),
('ben_ia_completed', 'Tb31yQIuBw', 'BC7654321', Business.LegalTypes.BCOMP.value,
'incorporationApplication', INCORPORATION, Filing.Status.COMPLETED,
{'documents': {}}, HTTPStatus.OK
Expand Down Expand Up @@ -1627,3 +1646,60 @@ def test_get_receipt_request_mock(session, client, jwt, requests_mock):

assert rv.status_code == HTTPStatus.CREATED
assert requests_mock.called_once


@pytest.mark.parametrize('test_name, temp_identifier, entity_type, expected_msg, expected_http_code', [
('now_ia_paid', 'Tb31yQIuBw', Business.LegalTypes.BCOMP.value,
{'documents': {'receipt': f'{base_url}/api/v2/businesses/Tb31yQIuBw/filings/1/documents/receipt',
'legalFilings': [
{'noticeOfWithdrawal': f'{base_url}/api/v2/businesses/Tb31yQIuBw/filings/1/documents/noticeOfWithdrawal'},
]}},
HTTPStatus.OK
)
])
def test_temp_document_list_for_now(mocker, session, client, jwt,
test_name,
temp_identifier,
entity_type,
expected_msg, expected_http_code):
"""Test document list for noticeOfWithdrawal states with temp identifier."""
# Setup

withdrawn_filing_json = copy.deepcopy(FILING_HEADER)
withdrawn_filing_json['filing']['header']['name'] = 'incorporationApplication'
withdrawn_filing_json['filing']['business']['legalType'] = entity_type
withdrawn_filing_json['filing']['incorporationApplication'] = INCORPORATION

filing_json = copy.deepcopy(FILING_HEADER)
filing_json['filing']['header']['name'] = 'noticeOfWithdrawal'
filing_json['filing']['business']['legalType'] = entity_type
filing_json['filing']['noticeOfWithdrawal'] = MOCK_NOTICE_OF_WITHDRAWAL

filing_date = datetime.utcnow()

temp_reg = RegistrationBootstrap()
temp_reg._identifier = temp_identifier
temp_reg.save()

business = None
withdrawn_filing = factory_filing(business, withdrawn_filing_json, filing_date=filing_date)
withdrawn_filing.temp_reg = temp_identifier
withdrawn_filing.save()
filing = factory_filing(business, filing_json, filing_date=filing_date)
filing.skip_status_listener = True
filing._status = Filing.Status.PAID
filing._payment_completion_date = '2017-10-01'
filing.temp_reg = None
filing.withdrawn_filing_id = withdrawn_filing.id
filing.save()

mocker.patch('legal_api.core.filing.has_roles', return_value=True)
rv = client.get(f'/api/v2/businesses/{temp_identifier}/filings/{filing.id}/documents',
headers=create_header(jwt, [STAFF_ROLE], temp_identifier))

# remove the filing ID
rv_data = json.loads(re.sub("/\d+/", "/", rv.data.decode("utf-8")).replace("\n", ""))
expected = json.loads(re.sub("/\d+/", "/", json.dumps(expected_msg)))

assert rv.status_code == expected_http_code
assert rv_data == expected

0 comments on commit 48550e2

Please sign in to comment.