# backend/modules/invoicing/views.py import logging from rest_framework import viewsets, permissions, status from rest_framework.response import Response from rest_framework.exceptions import ValidationError from .models import InvoiceTransaction, Invoice from .serializers import InvoiceSerializer, InvoiceTransactionSerializer from .services import InvoiceService # Postavljanje loggera za modul logger = logging.getLogger(__name__) class InvoiceViewSet(viewsets.ModelViewSet): queryset = Invoice.objects.all().select_related('client', 'creator') serializer_class = InvoiceSerializer permission_classes = [permissions.IsAuthenticated] def perform_create(self, serializer): validated_data = serializer.validated_data # 2. Delegiraj SVE servisu from .services import InvoiceService invoice_instance = InvoiceService.create_full_invoice( user=self.request.user, **validated_data ) serializer.instance = invoice_instance def get_queryset(self): """ Filtriraj samo aktivne zapise """ # Korisnik vidi samo fakture koje je on kreirao # (ili koje su povezane s njegovim profilom, ako si klijent) if self.request.user.is_staff: return Invoice.objects.all() return Invoice.objects.filter(creator=self.request.user, is_active=True) class InvoiceTransactionEntryViewSet(viewsets.ModelViewSet): """ ViewSet za upravljanje financijskim zapisima. Korištenjem InvoiceService-a, ViewSet ostaje lagan i fokusiran samo na HTTP sloj. """ queryset = InvoiceTransaction.objects.filter(is_active=True).select_related('invoice', 'work_order').order_by('-created_at') serializer_class = InvoiceTransactionSerializer permission_classes = [permissions.IsAuthenticated] def perform_create(self, serializer): """ Presrećemo proces kreiranja kako bismo koristili InvoiceService. """ try: # Proslijeđujemo validirane podatke i korisnika u servis InvoiceService.create_invoice_entry( data=serializer.validated_data, user=self.request.user ) except ValidationError as e: # Ponovno podižemo iznimku kako bi DRF ispravno vratio 400 Bad Request logger.warning(f"Validacijska greška pri kreiranju računa od strane {self.request.user}: {e}") raise e except Exception as e: logger.error(f"Kritična greška pri kreiranju financijskog zapisa: {str(e)}", exc_info=True) raise ValidationError({"error": "Došlo je do greške prilikom spremanja zapisa."}) def perform_destroy(self, instance): """ Umjesto fizičkog brisanja, radimo soft-delete ako je potrebno. """ instance.is_active = False instance.save() logger.info(f"Financijski zapis {instance.id} je deaktiviran od strane {self.request.user}")