This commit is contained in:
57
backend/modules/invoicing/serializers.py
Normal file
57
backend/modules/invoicing/serializers.py
Normal file
@@ -0,0 +1,57 @@
|
||||
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']
|
||||
Reference in New Issue
Block a user