Files
mariomitte 5d39e048ba
Some checks failed
ERP CI Pipeline / test (push) Has been cancelled
prvi kod za live uporabu
2026-07-09 21:21:17 +02:00

75 lines
2.9 KiB
Python

# 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}")