"""Accounting Period Report Logic.""" from owsresponse import response from royalties import models from royalties.connectors.s3 import create_presigned_url, get_s3_client from royalties.constants.constants import REPORT_TYPE from royalties.constants.error import ERROR_CODE_BAD_REQUEST, INVALID_REPORT_TYPE from royalties.schemas.accounting_period_report import AccountingPeriodReportSchema from royalties.utils.aws import parse_s3_url def get_acc_period_reports_by_acc_period_id(period_id): """Get accounting period reports by period id.""" period = models.AccountingPeriod.get_by_id_or_error(period_id) message = AccountingPeriodReportSchema(many=True).dump( period.accounting_period_reports ) return response.Response(message=message, status=200) def get_acc_period_report(period_id, report_type): """Get accounting period report by period id and report type.""" models.AccountingPeriod.get_by_id_or_error(period_id) if report_type not in [*REPORT_TYPE]: return response.create_error_response( code=ERROR_CODE_BAD_REQUEST, message=INVALID_REPORT_TYPE.format(report_type=', '.join([*REPORT_TYPE])), status=400, ) result = models.AccountingPeriodReport.get_acc_period_reports( period_id, report_type ).first() try: if result: bucket, key = parse_s3_url(result.report_export_url) client = get_s3_client() result.report_export_url = create_presigned_url(client, bucket, key) except Exception as e: return response.create_error_response( code=ERROR_CODE_BAD_REQUEST, message=str(e), status=400 ) message = AccountingPeriodReportSchema().dump(result) return response.Response(message=message, status=200) def create_or_update_accounting_period_report( accounting_period_id, report_type, report_export_url ): """Create accounting period report entry or update if exists.""" models.AccountingPeriod.get_by_id_or_error(accounting_period_id) exisiting_report = models.AccountingPeriodReport.get_acc_period_reports( accounting_period_id, report_type ).first() if exisiting_report: exisiting_report.update_attributes(report_export_url=report_export_url) models.AccountingPeriodReport.commit_changes() message = AccountingPeriodReportSchema().dump(exisiting_report) else: new_report = models.AccountingPeriodReport.create( accounting_period_id=accounting_period_id, report_type=report_type, report_export_url=report_export_url, ) message = AccountingPeriodReportSchema().dump(new_report) return response.Response(message=message, status=201)