This commit is contained in:
Iliyan Angelov
2025-12-04 15:10:07 +02:00
parent 3d634b4fce
commit 9f1aeb32da
78 changed files with 7204 additions and 114 deletions

View File

@@ -12,6 +12,8 @@ from ..services.invoice_service import InvoiceService
from ...shared.utils.role_helpers import can_access_all_invoices, can_create_invoices
from ...shared.utils.response_helpers import success_response
from ...shared.utils.request_helpers import get_request_id
from ..services.financial_audit_service import financial_audit_service
from ..models.financial_audit_trail import FinancialActionType
from ..schemas.invoice import (
CreateInvoiceRequest,
UpdateInvoiceRequest,
@@ -96,6 +98,25 @@ async def create_invoice(request: Request, invoice_data: CreateInvoiceRequest, c
request_id=request_id,
**invoice_kwargs
)
# Financial audit: invoice created
try:
financial_audit_service.log_financial_action(
db=db,
action_type=FinancialActionType.invoice_created,
performed_by=current_user.id,
action_description=f'Invoice {invoice.get("invoice_number")} created from booking {booking_id}',
invoice_id=invoice.get('id'),
booking_id=booking_id,
amount=invoice.get('total_amount'),
currency=None,
metadata={
'request_id': request_id,
'role': getattr(current_user.role, 'name', None),
},
)
except Exception:
# Do not block main flow on audit logging failure
logger.warning('Failed to log financial audit for invoice creation', exc_info=True)
return success_response(data={'invoice': invoice}, message='Invoice created successfully')
except HTTPException:
raise
@@ -117,6 +138,26 @@ async def update_invoice(request: Request, id: int, invoice_data: UpdateInvoiceR
request_id = get_request_id(request)
invoice_dict = invoice_data.model_dump(exclude_unset=True)
updated_invoice = InvoiceService.update_invoice(invoice_id=id, db=db, updated_by_id=current_user.id, request_id=request_id, **invoice_dict)
# Financial audit: invoice updated
try:
financial_audit_service.log_financial_action(
db=db,
action_type=FinancialActionType.invoice_updated,
performed_by=current_user.id,
action_description=f'Invoice {updated_invoice.get("invoice_number")} updated',
invoice_id=id,
booking_id=updated_invoice.get('booking_id'),
amount=updated_invoice.get('total_amount'),
previous_amount=float(invoice.total_amount) if getattr(invoice, 'total_amount', None) is not None else None,
currency=None,
metadata={
'request_id': request_id,
'updated_fields': list(invoice_dict.keys()),
'role': getattr(current_user.role, 'name', None),
},
)
except Exception:
logger.warning('Failed to log financial audit for invoice update', exc_info=True)
return success_response(data={'invoice': updated_invoice}, message='Invoice updated successfully')
except HTTPException:
raise
@@ -135,6 +176,24 @@ async def mark_invoice_as_paid(request: Request, id: int, payment_data: MarkInvo
request_id = get_request_id(request)
amount = payment_data.amount
updated_invoice = InvoiceService.mark_invoice_as_paid(invoice_id=id, db=db, amount=amount, updated_by_id=current_user.id, request_id=request_id)
# Financial audit: invoice marked as paid
try:
financial_audit_service.log_financial_action(
db=db,
action_type=FinancialActionType.invoice_paid,
performed_by=current_user.id,
action_description=f'Invoice {updated_invoice.get("invoice_number")} marked as paid',
invoice_id=id,
booking_id=updated_invoice.get('booking_id'),
amount=amount if amount is not None else updated_invoice.get('total_amount'),
currency=None,
metadata={
'request_id': request_id,
'role': getattr(current_user.role, 'name', None),
},
)
except Exception:
logger.warning('Failed to log financial audit for mark-as-paid', exc_info=True)
return success_response(data={'invoice': updated_invoice}, message='Invoice marked as paid successfully')
except HTTPException:
raise