"""Logic for Payment Group Payment.""" from typing import List from abacus_common_logic.connectors.database import db from owsresponse import response from payment.constants.error import ( ERROR_PAYMENT_NOT_FOUND, ERROR_PAYMENT_UPDATE_INVALID_STATUS, ) from payment.logic.exceptions import LogicError from payment.models import Items from payment.models.payment_group import PaymentGroup from payment.models.payment_group_payment import PaymentGroupPayment from payment.models.payment_group_payment_account import PaymentGroupPaymentAccount from payment.models.payment_group_payment_account_detail import ( PaymentGroupPaymentAccountDetail, ) from payment.models.report_payment_group_payment import ReportPaymentGroupPayment from payment.models.worksheet_payable_balance_after_tax import ( WorksheetPayableBalanceAfterTax, ) from payment.repository import ( payment_allocation as payment_allocation_repository, payment_group_payment_account as repository, worksheet_account_contract_payable_details as payable_details_repository, ) from payment.schemas.payment_group_payment import ( PaymentGroupPaymentStatusOverviewSchema, ) from payment.utils.format_response import prepare_dataload_response def create_payment_group_payment( payment_group_id: int, payment_name: str ) -> PaymentGroupPayment: """Create payment_group_payment.""" PaymentGroup.get_by_id_or_error(payment_group_id) return PaymentGroupPayment.create( payment_group_id=payment_group_id, payment_name=payment_name ) def delete_payment_group_payment(payment_group_payment_id): """Soft delete the payment_group_payment instance.""" payment_group_payment = PaymentGroupPayment.get_by_id_or_error( payment_group_payment_id ) if payment_group_payment.is_sent(): raise LogicError(ERROR_PAYMENT_UPDATE_INVALID_STATUS) payment_group_payment_id = payment_group_payment.payment_group_payment_id try: payment_allocation_repository.reset_to_init_by_payment_group_payment( payment_group_payment_id, commit=False ) PaymentGroupPayment.delete_by_id_or_error( payment_group_payment_id, soft_delete=True ) PaymentGroupPaymentAccount.soft_delete_by_payment_group_payment( payment_group_payment_id, commit=False ) PaymentGroupPaymentAccountDetail.soft_delete_by_payment_group_payment( payment_group_payment_id, commit=False ) WorksheetPayableBalanceAfterTax.soft_delete_by_payment_group_payment( payment_group_payment_id, commit=False ) payable_details_repository.soft_delete_by_payment_group_payment( payment_group_payment_id, commit=False ) db.session.commit() except Exception: db.session.rollback() raise def irrevocable_revert_payment_group_payment(payment_group_payment_id) -> None: """Hard delete payment_group_payment related data for irrevocable revert. This function performs hard deletion of: - payment_group_payment_account_detail by payment_group_payment_id - payment_group_payment_account by payment_group_payment_id - report_payment_group_payment by payment_group_payment_id """ try: PaymentGroupPaymentAccountDetail.hard_delete_by_payment_group_payment( payment_group_payment_id, commit=False ) PaymentGroupPaymentAccount.hard_delete_by_payment_group_payment( payment_group_payment_id, commit=False ) ReportPaymentGroupPayment.hard_delete_by_payment_group_payment( payment_group_payment_id, commit=False ) db.session.commit() except Exception: db.session.rollback() raise def get_payment_status_overview(payment_group_payment_id: int) -> object: """Get the payment status overview for a specified payment_group_payment. Arg: payment_group_payment_id(int): id of the payment_group_payment Returns: A dict having fields that describes the total number of accounts payments failed because of batch failure, total number of payments rejected/failed/succeeded/pending for the accounts """ return PaymentGroupPaymentAccount.get_payment_group_payment_account_status_overview( payment_group_payment_id ) def dataload_payment_status_overviews(payment_group_payment_ids: List[int]) -> dict: instances = repository.get_payment_group_payment_account_status_overviews( payment_group_payment_ids ) result = prepare_dataload_response( payment_group_payment_ids, instances, 'payment_group_payment_id' ) return {'items': result} def get_payment_group_payment(payment_group_payment_id: int) -> PaymentGroupPayment: """Get payment group payment by id.""" obj = PaymentGroupPayment.get_by_id(payment_group_payment_id) if not obj or obj.deleted_at is not None: raise LogicError(ERROR_PAYMENT_NOT_FOUND) return obj def get_payment_group_payments(limit: int, offset: int) -> Items[PaymentGroupPayment]: """Get payment group payments with pagination.""" items, count = PaymentGroupPayment.get_paginated(limit, offset) return Items(items, count)