Skip to content

Commit

Permalink
Hl 1067 ahjo update (#2798)
Browse files Browse the repository at this point in the history
* chore: tests for application and attachment record

* feat: update application records request
  • Loading branch information
rikuke authored Feb 6, 2024
1 parent 3fb2d26 commit a99de19
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 20 deletions.
1 change: 1 addition & 0 deletions backend/benefit/applications/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,3 +187,4 @@ class AhjoCallBackStatus(models.TextChoices):
class AhjoRequestType(models.TextChoices):
OPEN_CASE = "open_case", _("Open case in Ahjo")
DELETE_APPLICATION = "delete_application", _("Delete application in Ahjo")
UPDATE_APPLICATION = "update_application", _("Update application in Ahjo")
32 changes: 31 additions & 1 deletion backend/benefit/applications/services/ahjo_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@
)
from applications.models import AhjoSetting, AhjoStatus, Application, Attachment
from applications.services.ahjo_authentication import AhjoConnector, AhjoToken
from applications.services.ahjo_payload import prepare_open_case_payload
from applications.services.ahjo_payload import (
prepare_open_case_payload,
prepare_update_application_payload,
)
from applications.services.applications_csv_report import ApplicationsCsvService
from applications.services.generate_application_summary import (
generate_application_summary_file,
Expand Down Expand Up @@ -481,6 +484,11 @@ def send_request_to_ahjo(
method = "DELETE"
api_url = f"{url_base}/{application.ahjo_case_id}"

elif request_type == AhjoRequestType.UPDATE_APPLICATION:
method = "PUT"
data = json.dumps(data)
api_url = f"{url_base}/{application.ahjo_case_id}/records"

try:
response = requests.request(
method, api_url, headers=headers, timeout=timeout, data=data
Expand Down Expand Up @@ -552,3 +560,25 @@ def delete_application_in_ahjo(application_id: uuid.UUID):
LOGGER.error(f"Object not found: {e}")
except ImproperlyConfigured as e:
LOGGER.error(f"Improperly configured: {e}")


def update_application_in_ahjo(application: Application, ahjo_auth_token: str):
try:
headers = prepare_headers(
ahjo_auth_token, application, AhjoRequestType.UPDATE_APPLICATION
)

pdf_summary = generate_pdf_summary_as_attachment(application)
data = prepare_update_application_payload(application, pdf_summary)

result = send_request_to_ahjo(
AhjoRequestType.UPDATE_APPLICATION, headers, application, data
)
if result:
create_status_for_application(
application, AhjoStatusEnum.UPDATE_REQUEST_SENT
)
except ObjectDoesNotExist as e:
LOGGER.error(f"Object not found: {e}")
except ImproperlyConfigured as e:
LOGGER.error(f"Improperly configured: {e}")
26 changes: 24 additions & 2 deletions backend/benefit/applications/services/ahjo_payload.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ def _prepare_record(
documents: List[dict],
handler: User,
publicity_class: str = "Salassa pidettävä",
ahjo_version_series_id: str = None,
):
"""Prepare a single record dict for Ahjo."""

Expand All @@ -93,8 +94,10 @@ def _prepare_record(
"Language": "fi",
"PersonalData": "Sisältää erityisiä henkilötietoja",
}
if ahjo_version_series_id is not None:
record_dict["VersionSeriesId"] = ahjo_version_series_id

if record_title == "Hakemus":
elif ahjo_version_series_id is None and record_title == "Hakemus":
record_dict["MannerOfReceipt"] = MANNER_OF_RECEIPT

record_dict["Documents"] = documents
Expand All @@ -110,31 +113,42 @@ def _prepare_record(


def _prepare_case_records(
application: Application, pdf_summary: Attachment
application: Application, pdf_summary: Attachment, is_update: bool = False
) -> List[dict]:
"""Prepare the list of case records from application's attachments,
including the pdf summary of the application."""
case_records = []
handler = application.calculation.handler

pdf_summary_version_series_id = (
pdf_summary.ahjo_version_series_id if is_update else None
)

main_document_record = _prepare_record(
"Hakemus",
"hakemus",
application.created_at.isoformat(),
[_prepare_record_document_dict(pdf_summary)],
handler,
ahjo_version_series_id=pdf_summary_version_series_id,
)

case_records.append(main_document_record)

for attachment in application.attachments.exclude(
attachment_type=AttachmentType.PDF_SUMMARY
):
attachment_version_series_id = (
pdf_summary.ahjo_version_series_id if is_update else None
)

document_record = _prepare_record(
"Hakemuksen Liite",
"liite",
attachment.created_at.isoformat(),
[_prepare_record_document_dict(attachment)],
handler,
ahjo_version_series_id=attachment_version_series_id,
)
case_records.append(document_record)

Expand All @@ -148,3 +162,11 @@ def prepare_open_case_payload(
case_records = _prepare_case_records(application, pdf_summary)
payload = _prepare_top_level_dict(application, case_records)
return payload


def prepare_update_application_payload(
application: Application, pdf_summary: Attachment
) -> dict:
"""Prepare the payload that is sent to Ahjo when an application is updated, \
in this case it only contains a Records dict"""
return {"Records": _prepare_case_records(application, pdf_summary, is_update=True)}
68 changes: 55 additions & 13 deletions backend/benefit/applications/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,36 +282,78 @@ def set_debug_to_false(settings):


@pytest.fixture()
def ahjo_payload_record(decided_application):
def ahjo_payload_agents(decided_application):
application = decided_application
agent = application.calculation.handler
return [
{
"Role": "mainCreator",
"Name": f"{agent.last_name}, {agent.first_name}",
"ID": agent.ad_username,
}
]


record_title = "Hakemus"
record_type = "hakemus"
@pytest.fixture()
def ahjo_record(decided_application, ahjo_payload_agents):
application = decided_application
acquired = application.created_at.isoformat()
documents = []
agent = application.calculation.handler
publicity_class = "Salassa pidettävä"

return {
"Title": record_title,
"Type": record_type,
"Title": "",
"Type": "",
"Acquired": acquired,
"PublicityClass": publicity_class,
"SecurityReasons": ["JulkL (621/1999) 24.1 § 25 k"],
"Language": "fi",
"PersonalData": "Sisältää erityisiä henkilötietoja",
"MannerOfReceipt": "sähköinen asiointi",
"Documents": documents,
"Agents": [
{
"Role": "mainCreator",
"Name": f"{agent.last_name}, {agent.first_name}",
"ID": agent.ad_username,
}
],
"Agents": ahjo_payload_agents,
}


@pytest.fixture()
def ahjo_payload_record_for_application(ahjo_record):
record = {**ahjo_record, "Title": "Hakemus", "Type": "hakemus"}
return record


@pytest.fixture()
def ahjo_payload_record_for_attachment(ahjo_record):
record = {**ahjo_record, "Title": "Liite", "Type": "liite"}
record.pop("MannerOfReceipt", None)
return record


@pytest.fixture()
def dummy_version_series_id():
return "{12345678910}"


@pytest.fixture()
def ahjo_payload_record_for_attachment_update(
ahjo_record, dummy_version_series_id, ahjo_payload_agents
):
record = ahjo_record
record.pop("MannerOfReceipt", None)
record.pop("Documents", None)
record.pop("Agents", None)

record = {
**record,
"Title": "Liite",
"Type": "liite",
"VersionSeriesId": dummy_version_series_id,
"Documents": [],
"Agents": ahjo_payload_agents,
}

return record


@pytest.fixture()
def ahjo_open_case_top_level_dict(decided_application):
application = decided_application
Expand Down
45 changes: 41 additions & 4 deletions backend/benefit/applications/tests/test_ahjo_payload.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,55 @@
from common.utils import hash_file


def test_prepare_record(decided_application, ahjo_payload_record):
def test_prepare_application_record(
decided_application, ahjo_payload_record_for_application
):
application = decided_application

record = _prepare_record(
ahjo_payload_record["Title"],
ahjo_payload_record["Type"],
ahjo_payload_record_for_application["Title"],
ahjo_payload_record_for_application["Type"],
application.created_at.isoformat(),
[],
application.calculation.handler,
)

assert ahjo_payload_record == record
assert ahjo_payload_record_for_application == record


def test_prepare_attachment_record(
decided_application, ahjo_payload_record_for_attachment
):
application = decided_application

record = _prepare_record(
ahjo_payload_record_for_attachment["Title"],
ahjo_payload_record_for_attachment["Type"],
application.created_at.isoformat(),
[],
application.calculation.handler,
)

assert ahjo_payload_record_for_attachment == record


def test_prepare_attachment_update_record(
decided_application,
ahjo_payload_record_for_attachment_update,
dummy_version_series_id,
):
application = decided_application

record = _prepare_record(
ahjo_payload_record_for_attachment_update["Title"],
ahjo_payload_record_for_attachment_update["Type"],
application.created_at.isoformat(),
[],
application.calculation.handler,
ahjo_version_series_id=dummy_version_series_id,
)

assert ahjo_payload_record_for_attachment_update == record


def test_prepare_record_document_dict(decided_application, settings):
Expand Down

0 comments on commit a99de19

Please sign in to comment.