from django.db import transaction from core.serializers import BaseSerializer from rest_framework import serializers from .models import Invoice, InvoiceItem, InvoiceTransaction from .services import InvoiceService # class InvoiceItemSerializer(serializers.ModelSerializer): class Meta: model = InvoiceItem fields = ['description', 'quantity', 'unit_price'] class InvoiceSerializer(serializers.ModelSerializer): items = InvoiceItemSerializer(many=True) # Nested lista stavki class Meta: model = Invoice fields = ['invoice_number', 'client', 'due_date', 'status', 'items', 'amount'] read_only_fields = ['invoice_number', 'creator', 'status', 'amount'] extra_kwargs = { 'invoice_number': {'required': False, 'allow_null': True}, 'creator': {'required': False, 'allow_null': True} } def create(self, validated_data): """ Delegiramo stvaranje servisu i vraćamo instancu Invoice. """ items = validated_data.pop('items', []) # Servisu šaljemo items u validated_data kao što servis očekuje validated_data['items'] = items # Pokušavamo dohvatiti korisnika iz contexta (ako postoji) request = self.context.get('request') user = getattr(request, 'user', None) # Pozivamo servis unutar transaction.atomic (servis već radi atomic, ali dodatno osiguranje nije štetno) invoice = InvoiceService.create_full_invoice(user=user, **validated_data) return invoice class InvoiceTransactionSerializer(BaseSerializer): invoice = serializers.PrimaryKeyRelatedField(queryset=Invoice.objects.all()) def validate_amount(self, value): request = self.context.get('request') # Ako request ne postoji (npr. unit test), tretiramo ga kao običnog korisnika (sigurnost prvo) user = getattr(request, 'user', None) # Ako user ne postoji ili nije staff, i iznos je <= 0 -> greška if value <= 0 and (not user or not user.is_staff): raise serializers.ValidationError("Iznos računa mora biti veći od 0.") return value class Meta: model = InvoiceTransaction fields = ['invoice', 'work_order', 'invoice_number', 'amount', 'payment_date', 'is_active'] read_only_fields = ['id', 'created_at', 'updated_at']