57 lines
2.3 KiB
Python
57 lines
2.3 KiB
Python
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'] |