From f389caab3f5d6716822508709672ded3708382ab Mon Sep 17 00:00:00 2001 From: Kyle O'Brien <65071578+TawneeOwl@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:31:03 +0000 Subject: [PATCH 1/7] Update the property logic to use payload --- app/means_test/api.py | 66 +++++++++---------- app/means_test/forms/property.py | 11 ++++ .../means_test/payload/test_payload.py | 41 +----------- 3 files changed, 44 insertions(+), 74 deletions(-) diff --git a/app/means_test/api.py b/app/means_test/api.py index 7c52e6f23..cfd1d4da5 100644 --- a/app/means_test/api.py +++ b/app/means_test/api.py @@ -1,28 +1,12 @@ from app.api import cla_backend from flask import session from app.means_test.forms.income import IncomeForm -from app.means_test.forms.property import PropertiesPayload +from app.means_test.forms.property import MultiplePropertiesForm from app.means_test.money_interval import MoneyInterval from tests.unit_tests.means_test.payload.test_cases import EligibilityData from app.means_test.data import BenefitsData, AdditionalBenefitData -def deep_update(original, updates): - """ - Recursively updates a nested dictionary with values from another dictionary. - Only updates keys present in the `updates` dictionary. - """ - for key, value in updates.items(): - if ( - isinstance(value, dict) - and key in original - and isinstance(original[key], dict) - ): - deep_update(original[key], value) # Recursive call for nested dict - else: - original[key] = value - - def update_means_test(payload): means_test_endpoint = "checker/api/v1/eligibility_check/" @@ -49,7 +33,9 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: about = eligibility_data.forms.get("about-you", {}) income_form = eligibility_data.forms.get("income", {}) - property_form = eligibility_data.forms.get("property", {}) + property_data = MultiplePropertiesForm.get_payload( + eligibility_data.forms.get("property", {}) + ) benefits = BenefitsData(**eligibility_data.forms.get("benefits", {})).to_payload() additional_benefits = AdditionalBenefitData( @@ -86,19 +72,38 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: } ) - # Remove rent field from property set and setup payload - if eligibility_data.forms.get("about-you", {}).get("own_property"): - property_payload = PropertiesPayload(property_form) - for property_item in property_payload.get("property_set", []): - property_item.pop("rent", None) - payload = { "category": eligibility_data.category, "your_problem_notes": "", "notes": "", - "property_set": [], + "property_set": property_data.get("property_set"), "you": { - "income": you_income, + "income": { + "earnings": { + "per_interval_value": 0, + "interval_period": "per_month", + }, + "self_employment_drawings": { + "per_interval_value": None, + "interval_period": None, + }, + "tax_credits": { + "per_interval_value": 0, + "interval_period": "per_month", + }, + "maintenance_received": { + "per_interval_value": None, + "interval_period": None, + }, + "pension": { + "per_interval_value": None, + "interval_period": None, + }, + "other_income": property_data.get("you") + .get("income", {}) + .get("other_income", {}), + "self_employed": "0", + }, "savings": { "bank_balance": None, "investment_balance": None, @@ -121,10 +126,7 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: "per_interval_value": None, "interval_period": "per_month", }, - "mortgage": { - "per_interval_value": None, - "interval_period": "per_month", - }, + "mortgage": property_data.get("deductions", {}).get("mortgage", {}), "rent": { "per_interval_value": None, "interval_period": "per_month", @@ -180,10 +182,6 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: "disregards": [], } - # Add in the property payload - if eligibility_data.forms.get("about-you", {}).get("own_property"): - deep_update(payload, property_payload) - if not has_partner: del payload["partner"] diff --git a/app/means_test/forms/property.py b/app/means_test/forms/property.py index 3d5d1c372..88b076b01 100644 --- a/app/means_test/forms/property.py +++ b/app/means_test/forms/property.py @@ -238,3 +238,14 @@ def should_show(cls) -> bool: ) template = "means_test/property.html" + + def get_payload( + self, + has_property: bool | None = False, + ) -> dict: + """Returns the property payload for the user and the partner. + If a field can not be found the default of MoneyField(0) will be used. + """ + payload = PropertiesPayload(self) + + return payload diff --git a/tests/unit_tests/means_test/payload/test_payload.py b/tests/unit_tests/means_test/payload/test_payload.py index 496e97213..f1f87c6d1 100644 --- a/tests/unit_tests/means_test/payload/test_payload.py +++ b/tests/unit_tests/means_test/payload/test_payload.py @@ -1,5 +1,5 @@ import pytest -from app.means_test.api import get_means_test_payload, deep_update +from app.means_test.api import get_means_test_payload from .test_cases import ABOUT_YOU_TEST_CASES, INCOME_TEST_CASES @@ -42,42 +42,3 @@ def test_get_means_test_payload(test_case: dict, app) -> None: with app.app_context(): result = get_means_test_payload(test_case["input"]) assert_partial_dict_match(test_case["expected"], result) - - -def test_deep_update(): - original = { - "a": 1, - "b": { - "c": 2, - "d": {"e": 3}, - }, - "f": 4, - } - - updates = { - "b": { - "c": 20, - "d": { - "e": 30, - "f": 40, - }, - }, - "g": 5, - } - - expected = { - "a": 1, - "b": { - "c": 20, - "d": { - "e": 30, - "f": 40, - }, - }, - "f": 4, - "g": 5, - } - - deep_update(original, updates) - - assert original == expected From b908eb6da287682db76773ccf5057069385305c3 Mon Sep 17 00:00:00 2001 From: Kyle O'Brien <65071578+TawneeOwl@users.noreply.github.com> Date: Fri, 31 Jan 2025 11:22:05 +0000 Subject: [PATCH 2/7] Update benefits payload --- app/means_test/api.py | 115 ++++++++++++++++--------------- app/means_test/data.py | 68 ------------------ app/means_test/forms/benefits.py | 34 +++++++++ 3 files changed, 93 insertions(+), 124 deletions(-) delete mode 100644 app/means_test/data.py diff --git a/app/means_test/api.py b/app/means_test/api.py index cfd1d4da5..14743a3a4 100644 --- a/app/means_test/api.py +++ b/app/means_test/api.py @@ -1,10 +1,10 @@ from app.api import cla_backend from flask import session from app.means_test.forms.income import IncomeForm +from app.means_test.forms.benefits import BenefitsForm, AdditionalBenefitsForm from app.means_test.forms.property import MultiplePropertiesForm from app.means_test.money_interval import MoneyInterval from tests.unit_tests.means_test.payload.test_cases import EligibilityData -from app.means_test.data import BenefitsData, AdditionalBenefitData def update_means_test(payload): @@ -32,16 +32,6 @@ def is_eligible(reference): def get_means_test_payload(eligibility_data: EligibilityData) -> dict: about = eligibility_data.forms.get("about-you", {}) - income_form = eligibility_data.forms.get("income", {}) - property_data = MultiplePropertiesForm.get_payload( - eligibility_data.forms.get("property", {}) - ) - benefits = BenefitsData(**eligibility_data.forms.get("benefits", {})).to_payload() - - additional_benefits = AdditionalBenefitData( - **eligibility_data.forms.get("additional-benefits", {}) - ).to_payload() - has_partner = eligibility_data.forms.get("about-you", {}).get( "has_partner", False ) and not eligibility_data.forms.get("about-you", {}).get("in_dispute", False) @@ -50,26 +40,18 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: is_partner_employed = about.get("is_partner_employed", None) is_partner_self_employed = about.get("is_partner_self_employed", None) - income_data: dict[str, dict] = IncomeForm(**income_form).get_payload( + benefits_data = BenefitsForm.get_payload(eligibility_data.forms.get("benefits", {})) + additional_benefits_data = AdditionalBenefitsForm.get_payload( + eligibility_data.forms.get("additional-benefits", {}) + ) + income_data = IncomeForm(eligibility_data.forms.get("income", {})).get_payload( employed=is_employed, self_employed=is_self_employed, partner_employed=is_partner_employed, partner_self_employed=is_partner_self_employed, ) - - you_income = income_data.get("you", {}).get("income", {}) - you_income.update( - { - "benefits": additional_benefits["benefits"], - "child_benefits": benefits["child_benefits"], - } - ) - partner_income = income_data.get("partner", {}).get("income", {}) - partner_income.update( - { - "benefits": additional_benefits["benefits"], - "child_benefits": benefits["child_benefits"], - } + property_data = MultiplePropertiesForm.get_payload( + eligibility_data.forms.get("property", {}) ) payload = { @@ -78,32 +60,25 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: "notes": "", "property_set": property_data.get("property_set"), "you": { - "income": { - "earnings": { - "per_interval_value": 0, - "interval_period": "per_month", - }, - "self_employment_drawings": { - "per_interval_value": None, - "interval_period": None, - }, - "tax_credits": { - "per_interval_value": 0, - "interval_period": "per_month", - }, - "maintenance_received": { - "per_interval_value": None, - "interval_period": None, - }, - "pension": { - "per_interval_value": None, - "interval_period": None, - }, - "other_income": property_data.get("you") - .get("income", {}) - .get("other_income", {}), - "self_employed": "0", - }, + "earnings": income_data.get("you", {}) + .get("income", {}) + .get("earnings", {}), + "self_employment_drawings": income_data.get("you", {}) + .get("income", {}) + .get("self_employment_drawings", {}), + "tax_credits": income_data.get("you", {}) + .get("income", {}) + .get("tax_credits", {}), + "maintenance_received": income_data.get("you", {}) + .get("income", {}) + .get("maintenance_received", {}), + "pension": income_data.get("you", {}).get("income", {}).get("pension", {}), + "other_income": property_data.get("you") + .get("income", {}) + .get("other_income", {}), + "self_employed": is_self_employed, + "benefits": additional_benefits_data.get("benefits", {}), + "child_benefits": benefits_data.get("child_benefits", {}), "savings": { "bank_balance": None, "investment_balance": None, @@ -135,7 +110,35 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: }, }, "partner": { - "income": partner_income, + "earnings": income_data.get("partner", {}) + .get("income", {}) + .get("earnings", {}), + "self_employment_drawings": income_data.get("partner", {}) + .get("income", {}) + .get("self_employment_drawings", {}), + "tax_credits": income_data.get("partner", {}) + .get("income", {}) + .get("tax_credits", {}), + "maintenance_received": income_data.get("partner", {}) + .get("income", {}) + .get("maintenance_received", {}), + "pension": income_data.get("partner", {}) + .get("income", {}) + .get("pension", {}), + "other_income": property_data.get("you") + .get("income", {}) + .get("other_income", {}), + "self_employed": "0", + "benefits": { + "per_interval_value": 0, + "per_interval_value_pounds": None, + "interval_period": "per_month", + }, + "child_benefits": { + "per_interval_value": 0, + "per_interval_value_pounds": None, + "interval_period": "per_month", + }, "savings": { "bank_balance": None, "investment_balance": None, @@ -176,9 +179,9 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: else 0, "is_you_or_your_partner_over_60": about.get("aged_60_or_over", False), "has_partner": has_partner, - "on_passported_benefits": benefits["on_passported_benefits"], - "on_nass_benefits": additional_benefits["on_nass_benefits"], - "specific_benefits": benefits["specific_benefits"], + "on_passported_benefits": benefits_data["on_passported_benefits"], + "on_nass_benefits": additional_benefits_data["on_nass_benefits"], + "specific_benefits": benefits_data["specific_benefits"], "disregards": [], } diff --git a/app/means_test/data.py b/app/means_test/data.py deleted file mode 100644 index c0624a024..000000000 --- a/app/means_test/data.py +++ /dev/null @@ -1,68 +0,0 @@ -from dataclasses import dataclass, field -from flask_babel import lazy_gettext as _ -from app.means_test.money_interval import MoneyInterval -from app.means_test import is_yes - - -@dataclass -class BenefitsData: - BENEFITS_CHOICES = [ - ("child_benefit", _("Child Benefit")), - ("pension_credit", _("Guarantee Credit")), - ("income_support", _("Income Support")), - ("job_seekers_allowance", _("Income-based Jobseeker's Allowance")), - ("employment_support", _("Income-related Employment and Support Allowance")), - ("universal_credit", _("Universal Credit")), - ("other-benefit", _("Any other benefits")), - ] - benefits: list = field(default_factory=list) - child_benefits: dict = field(default_factory=dict) - - @property - def passported_benefits(self): - others = ["child_benefit", "other-benefit"] - return [name for name, label in self.BENEFITS_CHOICES if name not in others] - - @property - def specific_benefits(self): - return { - "pension_credit": "pension_credit" in self.benefits, - "job_seekers_allowance": "job_seekers_allowance" in self.benefits, - "employment_support": "employment_support" in self.benefits, - "universal_credit": "universal_credit" in self.benefits, - "income_support": "income_support" in self.benefits, - } - - @property - def is_passported(self) -> bool: - return bool(set(self.benefits).intersection(self.passported_benefits)) - - def to_payload(self): - payload = { - "specific_benefits": self.specific_benefits, - "on_passported_benefits": self.is_passported, - } - child_benefits = MoneyInterval(0) - if "child_benefit" in self.benefits and not self.is_passported: - child_benefits = MoneyInterval(self.child_benefits) - - payload["child_benefits"] = child_benefits.to_json() - return payload - - -@dataclass -class AdditionalBenefitData: - benefits: list = field(default_factory=list) - other_benefits: list = field(default_factory=list) - total_other_benefit: dict = field(default_factory=dict) - - def to_payload(self): - other_benefits_total = MoneyInterval(0) - if is_yes(self.other_benefits): - other_benefits_total = MoneyInterval(self.total_other_benefit) - - payload = { - "on_nass_benefits": False, # Always False, asylum-support is no longer a benefit selection - "benefits": other_benefits_total.to_json(), - } - return payload diff --git a/app/means_test/forms/benefits.py b/app/means_test/forms/benefits.py index a7caed4b2..ada475a20 100644 --- a/app/means_test/forms/benefits.py +++ b/app/means_test/forms/benefits.py @@ -81,6 +81,27 @@ def data(self): def should_show(cls) -> bool: return session.get("eligibility").on_benefits + def get_payload(self) -> dict: + """Returns the benefits payload for the user and the partner. + If a field can not be found the default of MoneyField(0) will be used. + """ + payload = { + "specific_benefits": { + "pension_credit": "pension_credit" in self.get("benefits", []), + "job_seekers_allowance": "job_seekers_allowance" + in self.get("benefits", []), + "employment_support": "employment_support" in self.get("benefits", []), + "universal_credit": "universal_credit" in self.get("benefits", []), + "income_support": "income_support" in self.get("benefits", []), + }, + "on_passported_benefits": session.get( + "eligibility" + ).has_passported_benefits, + "child_benefits": self.get("child_benefits", {}), + } + + return payload + class AdditionalBenefitsForm(BaseMeansTestForm): title = _("Your additional benefits") @@ -164,3 +185,16 @@ def data(self): def should_show(cls) -> bool: data = session.get("eligibility").forms.get("benefits") return data and "other-benefit" in data["benefits"] + + def get_payload( + self, + ) -> dict: + """Returns the additional benefits payload for the user and the partner. + If a field can not be found the default of MoneyField(0) will be used. + """ + payload = { + "on_nass_benefits": False, + "benefits": self.get("total_other_benefit"), + } + + return payload From b4c7224f2b5ff8aa34f147c71df3467f605deb13 Mon Sep 17 00:00:00 2001 From: Kyle O'Brien <65071578+TawneeOwl@users.noreply.github.com> Date: Fri, 31 Jan 2025 11:43:53 +0000 Subject: [PATCH 3/7] move benefits data --- app/means_test/forms/benefits.py | 44 +++++++++- tests/unit_tests/means_test/data/__init__.py | 0 .../means_test/data/test_benefits_data.py | 83 ------------------- 3 files changed, 43 insertions(+), 84 deletions(-) delete mode 100644 tests/unit_tests/means_test/data/__init__.py delete mode 100644 tests/unit_tests/means_test/data/test_benefits_data.py diff --git a/app/means_test/forms/benefits.py b/app/means_test/forms/benefits.py index ada475a20..b500cbc65 100644 --- a/app/means_test/forms/benefits.py +++ b/app/means_test/forms/benefits.py @@ -11,9 +11,51 @@ ValidateIf, ValidateIfType, ) -from app.means_test.data import BenefitsData from app.means_test import YES, NO +from dataclasses import dataclass, field + + +@dataclass +class BenefitsData: + BENEFITS_CHOICES = [ + ("child_benefit", _("Child Benefit")), + ("pension_credit", _("Guarantee Credit")), + ("income_support", _("Income Support")), + ("job_seekers_allowance", _("Income-based Jobseeker's Allowance")), + ("employment_support", _("Income-related Employment and Support Allowance")), + ("universal_credit", _("Universal Credit")), + ("other-benefit", _("Any other benefits")), + ] + benefits: list = field(default_factory=list) + child_benefits: dict = field(default_factory=dict) + + @property + def passported_benefits(self): + others = ["child_benefit", "other-benefit"] + return [name for name, label in self.BENEFITS_CHOICES if name not in others] + + @property + def specific_benefits(self): + return { + "pension_credit": "pension_credit" in self.benefits, + "job_seekers_allowance": "job_seekers_allowance" in self.benefits, + "employment_support": "employment_support" in self.benefits, + "universal_credit": "universal_credit" in self.benefits, + "income_support": "income_support" in self.benefits, + } + + @property + def is_passported(self) -> bool: + return bool(set(self.benefits).intersection(self.passported_benefits)) + + +@dataclass +class AdditionalBenefitData: + benefits: list = field(default_factory=list) + other_benefits: list = field(default_factory=list) + total_other_benefit: dict = field(default_factory=dict) + def get_benefits_choices(): choices = BenefitsData.BENEFITS_CHOICES.copy() diff --git a/tests/unit_tests/means_test/data/__init__.py b/tests/unit_tests/means_test/data/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/unit_tests/means_test/data/test_benefits_data.py b/tests/unit_tests/means_test/data/test_benefits_data.py deleted file mode 100644 index 7fa969b4d..000000000 --- a/tests/unit_tests/means_test/data/test_benefits_data.py +++ /dev/null @@ -1,83 +0,0 @@ -from app.means_test.data import BenefitsData, MoneyInterval - - -def test_benefits_data_passported_benefits(): - benefits_data = BenefitsData(**{"benefits": ["universal_credit", "income_support"]}) - expected_payload = { - "specific_benefits": { - "pension_credit": False, - "job_seekers_allowance": False, - "employment_support": False, - "universal_credit": True, - "income_support": True, - }, - "on_passported_benefits": True, - "child_benefits": MoneyInterval(0).to_json(), - } - actual_payload = benefits_data.to_payload() - assert actual_payload == expected_payload - - -def test_benefits_data_passported_benefits_with_child_benefits(): - """When on passported benefits then child_benefits payload is always 0""" - child_benefits = MoneyInterval(["200", "per_week"]) - benefits_data = BenefitsData( - **{ - "benefits": ["universal_credit", "income_support"], - "child_benefits": child_benefits, - } - ) - expected_payload = { - "specific_benefits": { - "pension_credit": False, - "job_seekers_allowance": False, - "employment_support": False, - "universal_credit": True, - "income_support": True, - }, - "on_passported_benefits": True, - "child_benefits": MoneyInterval(0).to_json(), - } - actual_payload = benefits_data.to_payload() - assert actual_payload == expected_payload - - -def test_benefits_data_no_benefits(): - benefits_data = BenefitsData(**{"benefits": []}) - expected_payload = { - "specific_benefits": { - "pension_credit": False, - "job_seekers_allowance": False, - "employment_support": False, - "universal_credit": False, - "income_support": False, - }, - "on_passported_benefits": False, - "child_benefits": MoneyInterval(0).to_json(), - } - actual_payload = benefits_data.to_payload() - assert actual_payload == expected_payload - - -def test_benefits_data_child_benefits(): - child_benefits = MoneyInterval(["200", "per_week"]) - benefits_data = BenefitsData( - **{"benefits": ["child_benefit"], "child_benefits": child_benefits} - ) - expected_payload = { - "specific_benefits": { - "pension_credit": False, - "job_seekers_allowance": False, - "employment_support": False, - "universal_credit": False, - "income_support": False, - }, - "on_passported_benefits": False, - "child_benefits": { - "per_interval_value": 20000, - "interval_period": "per_week", - "per_interval_value_pounds": 200, - }, - } - actual_payload = benefits_data.to_payload() - assert actual_payload == expected_payload From c7a227f244a0e58565b8ec409e205e24aa3771dc Mon Sep 17 00:00:00 2001 From: Kyle O'Brien <65071578+TawneeOwl@users.noreply.github.com> Date: Fri, 31 Jan 2025 13:11:58 +0000 Subject: [PATCH 4/7] Amend the payload to include income --- app/means_test/api.py | 105 ++++++++++-------- app/means_test/forms/income.py | 4 +- .../means_test/payload/test_cases.py | 10 +- 3 files changed, 60 insertions(+), 59 deletions(-) diff --git a/app/means_test/api.py b/app/means_test/api.py index 14743a3a4..56ae09322 100644 --- a/app/means_test/api.py +++ b/app/means_test/api.py @@ -44,7 +44,7 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: additional_benefits_data = AdditionalBenefitsForm.get_payload( eligibility_data.forms.get("additional-benefits", {}) ) - income_data = IncomeForm(eligibility_data.forms.get("income", {})).get_payload( + income_data = IncomeForm(**eligibility_data.forms.get("income", {})).get_payload( employed=is_employed, self_employed=is_self_employed, partner_employed=is_partner_employed, @@ -54,31 +54,38 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: eligibility_data.forms.get("property", {}) ) + # Sums rent to the other income field for you + other_income = MoneyInterval( + property_data.get("you").get("income", {}).get("other_income", 0) + ) + income_data.get("you").get("income", {}).get("other_income", 0) + payload = { "category": eligibility_data.category, "your_problem_notes": "", "notes": "", "property_set": property_data.get("property_set"), "you": { - "earnings": income_data.get("you", {}) - .get("income", {}) - .get("earnings", {}), - "self_employment_drawings": income_data.get("you", {}) - .get("income", {}) - .get("self_employment_drawings", {}), - "tax_credits": income_data.get("you", {}) - .get("income", {}) - .get("tax_credits", {}), - "maintenance_received": income_data.get("you", {}) - .get("income", {}) - .get("maintenance_received", {}), - "pension": income_data.get("you", {}).get("income", {}).get("pension", {}), - "other_income": property_data.get("you") - .get("income", {}) - .get("other_income", {}), - "self_employed": is_self_employed, - "benefits": additional_benefits_data.get("benefits", {}), - "child_benefits": benefits_data.get("child_benefits", {}), + "income": { + "earnings": income_data.get("you", {}) + .get("income", {}) + .get("earnings", {}), + "self_employment_drawings": income_data.get("you", {}) + .get("income", {}) + .get("self_employment_drawings", {}), + "tax_credits": income_data.get("you", {}) + .get("income", {}) + .get("tax_credits", {}), + "maintenance_received": income_data.get("you", {}) + .get("income", {}) + .get("maintenance_received", {}), + "pension": income_data.get("you", {}) + .get("income", {}) + .get("pension", {}), + "other_income": other_income, + "self_employed": is_self_employed, + "benefits": additional_benefits_data.get("benefits", {}), + "child_benefits": benefits_data.get("child_benefits", {}), + }, "savings": { "bank_balance": None, "investment_balance": None, @@ -110,34 +117,36 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: }, }, "partner": { - "earnings": income_data.get("partner", {}) - .get("income", {}) - .get("earnings", {}), - "self_employment_drawings": income_data.get("partner", {}) - .get("income", {}) - .get("self_employment_drawings", {}), - "tax_credits": income_data.get("partner", {}) - .get("income", {}) - .get("tax_credits", {}), - "maintenance_received": income_data.get("partner", {}) - .get("income", {}) - .get("maintenance_received", {}), - "pension": income_data.get("partner", {}) - .get("income", {}) - .get("pension", {}), - "other_income": property_data.get("you") - .get("income", {}) - .get("other_income", {}), - "self_employed": "0", - "benefits": { - "per_interval_value": 0, - "per_interval_value_pounds": None, - "interval_period": "per_month", - }, - "child_benefits": { - "per_interval_value": 0, - "per_interval_value_pounds": None, - "interval_period": "per_month", + "income": { + "earnings": income_data.get("partner", {}) + .get("income", {}) + .get("earnings", {}), + "self_employment_drawings": income_data.get("partner", {}) + .get("income", {}) + .get("self_employment_drawings", {}), + "tax_credits": income_data.get("partner", {}) + .get("income", {}) + .get("tax_credits", {}), + "maintenance_received": income_data.get("partner", {}) + .get("income", {}) + .get("maintenance_received", {}), + "pension": income_data.get("partner", {}) + .get("income", {}) + .get("pension", {}), + "other_income": income_data.get("partner", {}) + .get("income", {}) + .get("other_income", {}), + "self_employed": "0", + "benefits": { + "per_interval_value": 0, + "per_interval_value_pounds": None, + "interval_period": "per_month", + }, + "child_benefits": { + "per_interval_value": 0, + "per_interval_value_pounds": None, + "interval_period": "per_month", + }, }, "savings": { "bank_balance": None, diff --git a/app/means_test/forms/income.py b/app/means_test/forms/income.py index f82b5f9f2..919ab6729 100644 --- a/app/means_test/forms/income.py +++ b/app/means_test/forms/income.py @@ -430,9 +430,7 @@ def get_payload( self.data.get("maintenance_received", 0) ), "pension": MoneyInterval(self.data.get("pension", 0)), - "other_income": MoneyInterval( - self.data.get("other_income", 0) - ), # TODO: Add income from rent here + "other_income": MoneyInterval(self.data.get("other_income", 0)), "self_employed": self_employed, }, "deductions": { diff --git a/tests/unit_tests/means_test/payload/test_cases.py b/tests/unit_tests/means_test/payload/test_cases.py index f538f8a13..9298f5f53 100644 --- a/tests/unit_tests/means_test/payload/test_cases.py +++ b/tests/unit_tests/means_test/payload/test_cases.py @@ -42,7 +42,6 @@ class EligibilityData: "universal_credit": False, "income_support": False, }, - "you": {"income": {"self_employed": False}}, }, }, { @@ -69,7 +68,6 @@ class EligibilityData: "dependants_young": 0, "dependants_old": 0, "is_you_or_your_partner_over_60": False, - "on_passported_benefits": True, "on_nass_benefits": False, "specific_benefits": { "pension_credit": True, @@ -78,8 +76,6 @@ class EligibilityData: "universal_credit": True, "income_support": False, }, - "you": {"income": {"self_employed": True}}, - "partner": {"income": {"self_employed": True}}, }, }, { @@ -108,7 +104,6 @@ class EligibilityData: "dependants_young": 2, "dependants_old": 1, "is_you_or_your_partner_over_60": False, - "on_passported_benefits": True, "on_nass_benefits": False, "specific_benefits": { "pension_credit": False, @@ -117,7 +112,6 @@ class EligibilityData: "universal_credit": False, "income_support": True, }, - "you": {"income": {"self_employed": False}}, }, }, { @@ -211,8 +205,8 @@ class EligibilityData: "interval_period": None, }, "other_income": { - "per_interval_value": None, - "interval_period": None, + "per_interval_value": 0, + "interval_period": "per_month", }, }, "deductions": { From 62342cbe67a4c19f13d4860990c6bd75bda69744 Mon Sep 17 00:00:00 2001 From: Kyle O'Brien <65071578+TawneeOwl@users.noreply.github.com> Date: Fri, 31 Jan 2025 13:14:52 +0000 Subject: [PATCH 5/7] Amend additional benefit ordering --- app/means_test/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/means_test/views.py b/app/means_test/views.py index ad1599c46..9ea262132 100644 --- a/app/means_test/views.py +++ b/app/means_test/views.py @@ -14,8 +14,8 @@ class MeansTest(View): forms = { "about-you": AboutYouForm, "benefits": BenefitsForm, - "property": MultiplePropertiesForm, "additional-benefits": AdditionalBenefitsForm, + "property": MultiplePropertiesForm, "income": IncomeForm, } From b517a2e751f3c90b7217a1c26c13b2bd52671cac Mon Sep 17 00:00:00 2001 From: Kyle O'Brien <65071578+TawneeOwl@users.noreply.github.com> Date: Fri, 31 Jan 2025 17:11:07 +0000 Subject: [PATCH 6/7] Default to none --- app/means_test/api.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/app/means_test/api.py b/app/means_test/api.py index 56ae09322..dd1dd6285 100644 --- a/app/means_test/api.py +++ b/app/means_test/api.py @@ -68,23 +68,21 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: "income": { "earnings": income_data.get("you", {}) .get("income", {}) - .get("earnings", {}), + .get("earnings"), "self_employment_drawings": income_data.get("you", {}) .get("income", {}) - .get("self_employment_drawings", {}), + .get("self_employment_drawings"), "tax_credits": income_data.get("you", {}) .get("income", {}) - .get("tax_credits", {}), + .get("tax_credits"), "maintenance_received": income_data.get("you", {}) .get("income", {}) - .get("maintenance_received", {}), - "pension": income_data.get("you", {}) - .get("income", {}) - .get("pension", {}), + .get("maintenance_received"), + "pension": income_data.get("you", {}).get("income", {}).get("pension"), "other_income": other_income, "self_employed": is_self_employed, - "benefits": additional_benefits_data.get("benefits", {}), - "child_benefits": benefits_data.get("child_benefits", {}), + "benefits": additional_benefits_data.get("benefits"), + "child_benefits": benefits_data.get("child_benefits"), }, "savings": { "bank_balance": None, @@ -120,22 +118,22 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: "income": { "earnings": income_data.get("partner", {}) .get("income", {}) - .get("earnings", {}), + .get("earnings"), "self_employment_drawings": income_data.get("partner", {}) .get("income", {}) - .get("self_employment_drawings", {}), + .get("self_employment_drawings"), "tax_credits": income_data.get("partner", {}) .get("income", {}) - .get("tax_credits", {}), + .get("tax_credits"), "maintenance_received": income_data.get("partner", {}) .get("income", {}) - .get("maintenance_received", {}), + .get("maintenance_received"), "pension": income_data.get("partner", {}) .get("income", {}) - .get("pension", {}), + .get("pension"), "other_income": income_data.get("partner", {}) .get("income", {}) - .get("other_income", {}), + .get("other_income"), "self_employed": "0", "benefits": { "per_interval_value": 0, From e99ca6f662d3206eddf49b399334c912bf64ce69 Mon Sep 17 00:00:00 2001 From: Kyle O'Brien <65071578+TawneeOwl@users.noreply.github.com> Date: Mon, 3 Feb 2025 13:36:39 +0000 Subject: [PATCH 7/7] Add refactoring comment --- app/means_test/api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/means_test/api.py b/app/means_test/api.py index 44c68f72d..f9011c7c4 100644 --- a/app/means_test/api.py +++ b/app/means_test/api.py @@ -41,6 +41,7 @@ def get_means_test_payload(eligibility_data: EligibilityData) -> dict: is_partner_employed = about.get("is_partner_employed", None) is_partner_self_employed = about.get("is_partner_self_employed", None) + # The below data code needs refactoring to only take in eligibility_data benefits_data = BenefitsForm.get_payload(eligibility_data.forms.get("benefits", {})) additional_benefits_data = AdditionalBenefitsForm.get_payload( eligibility_data.forms.get("additional-benefits", {})