75 lines
2.9 KiB
Python
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}") |