Skip to content

Commit 7e35afe

Browse files
authored
Merge pull request #3891 from bcgov/366-decreased-credit-handler
feat: DecreasedCreditHandler can handle all statuses except approved
2 parents 509b576 + dec5e67 commit 7e35afe

2 files changed

Lines changed: 84 additions & 7 deletions

File tree

bc_obps/compliance/service/supplementary_version_service.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ def can_handle(new_summary: ReportComplianceSummary, previous_summary: ReportCom
500500
return (
501501
previous_summary.credited_emissions > ZERO_DECIMAL
502502
and new_summary.credited_emissions < previous_summary.credited_emissions
503-
and original_earned_credit_record.issuance_status == ComplianceEarnedCredit.IssuanceStatus.DECLINED
503+
and original_earned_credit_record.issuance_status != ComplianceEarnedCredit.IssuanceStatus.APPROVED
504504
)
505505

506506
@staticmethod
@@ -525,9 +525,21 @@ def handle(
525525
is_supplementary=True,
526526
previous_version=previous_compliance_version,
527527
)
528-
# Create new credits record
528+
# Get the previous earned_credit record
529+
previous_earned_credit = ComplianceEarnedCredit.objects.get(
530+
compliance_report_version=previous_compliance_version
531+
)
532+
529533
ComplianceEarnedCreditsService.create_earned_credits_record(compliance_report_version)
530534

535+
# If previously requested, mark it as declined
536+
if previous_earned_credit.issuance_status in (
537+
ComplianceEarnedCredit.IssuanceStatus.ISSUANCE_REQUESTED,
538+
ComplianceEarnedCredit.IssuanceStatus.CHANGES_REQUIRED,
539+
):
540+
previous_earned_credit.issuance_status = ComplianceEarnedCredit.IssuanceStatus.DECLINED
541+
previous_earned_credit.save()
542+
531543
return compliance_report_version
532544

533545

bc_obps/compliance/tests/service/test_supplementary_version_service.py

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,7 +1640,15 @@ def test_handle_increased_credits_success_when_credits_not_approved(self, issuan
16401640

16411641

16421642
class TestDecreasedCreditHandler(BaseSupplementaryVersionServiceTest):
1643-
def test_can_handle_decreased_credits(self):
1643+
@pytest.mark.parametrize(
1644+
"issuance_status",
1645+
[
1646+
ComplianceEarnedCredit.IssuanceStatus.DECLINED,
1647+
ComplianceEarnedCredit.IssuanceStatus.ISSUANCE_REQUESTED,
1648+
ComplianceEarnedCredit.IssuanceStatus.CHANGES_REQUIRED,
1649+
],
1650+
)
1651+
def test_can_handle_decreased_credits_no_previous_approval(self, issuance_status):
16441652
# Arrange
16451653
with pgtrigger.ignore('reporting.ReportComplianceSummary:immutable_report_version'):
16461654
self.previous_summary = baker.make_recipe(
@@ -1667,7 +1675,7 @@ def test_can_handle_decreased_credits(self):
16671675
'compliance.tests.utils.compliance_earned_credit',
16681676
compliance_report_version=self.original_report_version,
16691677
earned_credits_amount=500,
1670-
issuance_status=ComplianceEarnedCredit.IssuanceStatus.DECLINED,
1678+
issuance_status=issuance_status,
16711679
bccr_trading_name='Test Trading Name',
16721680
bccr_holding_account_id='123',
16731681
)
@@ -1678,6 +1686,52 @@ def test_can_handle_decreased_credits(self):
16781686
# Assert
16791687
assert result is True
16801688

1689+
def test_cannot_handle_decreased_credits_already_approved(self):
1690+
# Arrange
1691+
with pgtrigger.ignore('reporting.ReportComplianceSummary:immutable_report_version'):
1692+
self.previous_summary = baker.make_recipe(
1693+
'reporting.tests.utils.report_compliance_summary',
1694+
excess_emissions=0,
1695+
credited_emissions=Decimal('600'),
1696+
report_version=self.report_version_1,
1697+
)
1698+
self.new_summary = baker.make_recipe(
1699+
'reporting.tests.utils.report_compliance_summary',
1700+
excess_emissions=0,
1701+
credited_emissions=Decimal('500'),
1702+
report_version=self.report_version_2,
1703+
)
1704+
self.compliance_report = baker.make_recipe(
1705+
'compliance.tests.utils.compliance_report', report=self.report, compliance_period_id=1
1706+
)
1707+
self.original_report_version = baker.make_recipe(
1708+
'compliance.tests.utils.compliance_report_version',
1709+
report_compliance_summary=self.previous_summary,
1710+
is_supplementary=False,
1711+
)
1712+
baker.make_recipe(
1713+
'compliance.tests.utils.compliance_earned_credit',
1714+
compliance_report_version=self.original_report_version,
1715+
earned_credits_amount=500,
1716+
issuance_status=ComplianceEarnedCredit.IssuanceStatus.APPROVED,
1717+
bccr_trading_name='Test Trading Name',
1718+
bccr_holding_account_id='123',
1719+
)
1720+
1721+
# Act
1722+
result = DecreasedCreditHandler.can_handle(self.new_summary, self.previous_summary)
1723+
1724+
# Assert
1725+
assert result is False
1726+
1727+
@pytest.mark.parametrize(
1728+
"issuance_status",
1729+
[
1730+
ComplianceEarnedCredit.IssuanceStatus.DECLINED,
1731+
ComplianceEarnedCredit.IssuanceStatus.ISSUANCE_REQUESTED,
1732+
ComplianceEarnedCredit.IssuanceStatus.CHANGES_REQUIRED,
1733+
],
1734+
)
16811735
@patch('compliance.service.supplementary_version_service.DecreasedCreditHandler.handle')
16821736
@patch('compliance.service.supplementary_version_service.IncreasedCreditHandler.handle')
16831737
@patch('compliance.service.supplementary_version_service.NoChangeHandler.handle')
@@ -1690,6 +1744,7 @@ def test_correctly_calls_decreased_credit_handler(
16901744
mock_no_change_handler,
16911745
mock_increased_credit_handler,
16921746
mock_decreased_credit_handler,
1747+
issuance_status,
16931748
):
16941749
# Arrange
16951750
with pgtrigger.ignore('reporting.ReportComplianceSummary:immutable_report_version'):
@@ -1718,7 +1773,7 @@ def test_correctly_calls_decreased_credit_handler(
17181773
'compliance.tests.utils.compliance_earned_credit',
17191774
compliance_report_version=self.previous_compliance_report_version,
17201775
earned_credits_amount=800,
1721-
issuance_status=ComplianceEarnedCredit.IssuanceStatus.DECLINED,
1776+
issuance_status=issuance_status,
17221777
bccr_trading_name='Test Trading Name',
17231778
bccr_holding_account_id='123',
17241779
)
@@ -1743,7 +1798,15 @@ def test_correctly_calls_decreased_credit_handler(
17431798
mock_no_change_handler.assert_not_called()
17441799
mock_increased_credit_handler.assert_not_called()
17451800

1746-
def test_handle_decreased_credits_success(self):
1801+
@pytest.mark.parametrize(
1802+
"issuance_status",
1803+
[
1804+
ComplianceEarnedCredit.IssuanceStatus.DECLINED,
1805+
ComplianceEarnedCredit.IssuanceStatus.ISSUANCE_REQUESTED,
1806+
ComplianceEarnedCredit.IssuanceStatus.CHANGES_REQUIRED,
1807+
],
1808+
)
1809+
def test_handle_decreased_credits_success(self, issuance_status):
17471810
# Arrange
17481811
with pgtrigger.ignore('reporting.ReportComplianceSummary:immutable_report_version'):
17491812
self.previous_summary = baker.make_recipe(
@@ -1767,7 +1830,7 @@ def test_handle_decreased_credits_success(self):
17671830
'compliance.tests.utils.compliance_earned_credit',
17681831
compliance_report_version=self.original_report_version,
17691832
earned_credits_amount=800,
1770-
issuance_status=ComplianceEarnedCredit.IssuanceStatus.DECLINED,
1833+
issuance_status=issuance_status,
17711834
bccr_trading_name='Test Trading Name',
17721835
bccr_holding_account_id='123',
17731836
)
@@ -1787,8 +1850,10 @@ def test_handle_decreased_credits_success(self):
17871850
assert new_compliance_version.is_supplementary is True
17881851
assert new_compliance_version.previous_version == self.original_report_version
17891852
assert original_credit_record.earned_credits_amount == Decimal('800')
1853+
17901854
assert new_credit_record.earned_credits_amount == Decimal('500')
17911855
assert new_credit_record.issuance_status == ComplianceEarnedCredit.IssuanceStatus.CREDITS_NOT_ISSUED
1856+
assert original_credit_record.issuance_status == ComplianceEarnedCredit.IssuanceStatus.DECLINED
17921857

17931858

17941859
class TestSupercededHandler(BaseSupplementaryVersionServiceTest):

0 commit comments

Comments
 (0)