Skip to content

Commit

Permalink
Merge pull request #2934 from bcgov/feat/daniel-sync-compliance-reports
Browse files Browse the repository at this point in the history
feat: Sync Reports TFRS -> LCFS
  • Loading branch information
dhaselhan authored Dec 17, 2024
2 parents 5828db8 + 40bed3d commit 80bebb9
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 23 deletions.
24 changes: 22 additions & 2 deletions backend/api/serializers/ComplianceReport.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
ExclusionAgreementRecord
from api.models.Organization import Organization
from api.permissions.ComplianceReport import ComplianceReportPermissions
from api.serializers import CreditTradeMinSerializer
from api.serializers.CompliancePeriod import CompliancePeriodSerializer
from api.serializers.ComplianceReportSchedules import \
ScheduleCDetailSerializer, ScheduleADetailSerializer, \
Expand All @@ -51,6 +50,7 @@
from api.serializers.Organization import OrganizationMinSerializer, \
OrganizationDisplaySerializer
from api.serializers.constants import ComplianceReportValidation
from api.services import TransactionMessageService
from api.services.ComplianceReportService import ComplianceReportService
from api.services.OrganizationService import OrganizationService
from api.services.ComplianceReportSummaryService import ComplianceReportSummaryService
Expand Down Expand Up @@ -1161,6 +1161,16 @@ def create(self, validated_data):
new_compliance_report.root_report = new_compliance_report
new_compliance_report.latest_report = new_compliance_report
new_compliance_report.save()

# Send a transaction message to the LCFS/TFRS message queue
request = self.context['request']
TransactionMessageService.TransactionMessageService.sync_compliance_report_to_lcfs(
new_compliance_report,
"Created",
request.user,
None
)

return new_compliance_report

def save(self, **kwargs):
Expand Down Expand Up @@ -1633,6 +1643,10 @@ def update(self, instance, validated_data):
create_timestamp=datetime.now(),
snapshot=snap
)
# Send a transaction message to the LCFS/TFRS message queue
TransactionMessageService.TransactionMessageService.sync_compliance_report_to_lcfs(
instance, "Submitted", request.user, snap["summary"]["lines"]["25"]
)

if previous_director_status not in ['Accepted'] and \
instance.status.director_status.status in ['Accepted']:
Expand All @@ -1641,9 +1655,15 @@ def update(self, instance, validated_data):
instance, request.user
)

# Send a transaction message to the LCFS/TFRS message queue
TransactionMessageService.TransactionMessageService.sync_compliance_report_to_lcfs(
instance, "Approved", request.user, None
)


instance.update_user = request.user
instance.save()

# all other fields are read-only
return instance

Expand Down
15 changes: 0 additions & 15 deletions backend/api/services/ComplianceReportService.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
from api.models.CreditTradeType import CreditTradeType
from api.models.Organization import Organization
from api.services.CreditTradeService import CreditTradeService
from api.services.TransactionMessageService import TransactionMessageService

from api.notifications.notification_types import NotificationType
from api.async_tasks import async_send_notifications
Expand Down Expand Up @@ -331,13 +330,6 @@ def create_director_transactions(compliance_report, creating_user):
compliance_report.credit_transaction = credit_transaction
compliance_report.save()
CreditTradeService.pvr_notification(None, credit_transaction)

# **Send a transaction message to the LCFS/TFRS message queue**
TransactionMessageService.send_transaction_message(
tfrs_id=compliance_report.id,
organization_id=compliance_report.organization.id,
compliance_units_amount=required_credit_transaction,
)
else:
if required_credit_transaction < Decimal(0):
if COMPLIANCE_PERIOD_2023_AND_ABOVE:
Expand Down Expand Up @@ -372,13 +364,6 @@ def create_director_transactions(compliance_report, creating_user):
compliance_report.save()
CreditTradeService.pvr_notification(None, credit_transaction)

# **Send a transaction message to the LCFS/TFRS message queue**
TransactionMessageService.send_transaction_message(
tfrs_id=compliance_report.id,
organization_id=compliance_report.organization.id,
compliance_units_amount=required_credit_transaction,
)

@staticmethod
def dispatch_notifications(
previous_status,
Expand Down
24 changes: 18 additions & 6 deletions backend/api/services/TransactionMessageService.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import json
from decimal import Decimal
from typing import Optional

import pika
from pika.exceptions import AMQPError

from api.models.ComplianceReport import ComplianceReport
from api.models.User import User
from tfrs.settings import AMQP_CONNECTION_PARAMETERS


Expand All @@ -14,10 +18,12 @@ class TransactionDeliveryFailure(Exception):

class TransactionMessageService:
@staticmethod
def send_transaction_message(
tfrs_id: int, organization_id: int, compliance_units_amount: Decimal
def sync_compliance_report_to_lcfs(
compliance_report: ComplianceReport,
action: str,
user: User,
credits: Optional[Decimal],
):

try:
# Use existing AMQP connection parameters from settings
parameters = AMQP_CONNECTION_PARAMETERS
Expand All @@ -29,11 +35,17 @@ def send_transaction_message(

# Create the message body
message = {
"tfrs_id": tfrs_id,
"organization_id": organization_id,
"compliance_units_amount": int(compliance_units_amount.to_integral_value()),
"tfrs_id": compliance_report.original_report_id,
"organization_id": compliance_report.organization_id,
"compliance_period": compliance_report.compliance_period.description,
"nickname": compliance_report.nickname,
"action": action,
"user_id": user.id,
}

if credits is not None:
message["credits"] = int(credits.to_integral_value())

# Publish the message to the queue
channel.basic_publish(
exchange="",
Expand Down

0 comments on commit 80bebb9

Please sign in to comment.