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

77 lines
2.7 KiB
Python

from django.utils import timezone
from modules.invoicing.models import Invoice, InvoiceItem
from modules.invoicing.utils import generate_invoice_number
from django.db import transaction
from django.contrib.auth import get_user_model
from rest_framework.exceptions import ValidationError
import logging
from decimal import Decimal
from modules.invoicing import tasks # premještamo ovdje ako treba
logger = logging.getLogger(__name__)
class InvoiceService:
@staticmethod
def create_full_invoice(user=None, **validated_data):
# 1. Obavezno dohvati stavke
items_data = validated_data.pop('items', [])
fields_to_remove = ['amount', 'creator', 'invoice_number']
for field in fields_to_remove:
validated_data.pop(field, None)
# 2. Sigurna provjera korisnika
if not user:
User = get_user_model()
try:
user = User.objects.get(username="paperless_bot")
except User.DoesNotExist:
raise ValidationError("Sistemski korisnik 'paperless_bot' ne postoji.")
with transaction.atomic():
# 3. Računanje iznosa (sigurno rukovanje s items_data)
total = sum(Decimal(item['quantity']) * Decimal(item['unit_price']) for item in items_data)
# 4. Kreiraj fakturu
invoice = Invoice.objects.create(
**validated_data,
amount=total,
creator=user,
invoice_number=generate_invoice_number()
)
# 5. Kreiraj stavke
for item_data in items_data:
InvoiceItem.objects.create(invoice=invoice, **item_data)
# 6. Pokreni task nakon commit-a
transaction.on_commit(lambda: tasks.process_paperless_document_task.delay(invoice.id))
return invoice
@staticmethod
def create_invoice_entry(data, user=None):
"""
Kreira financijski zapis (transaction) na temelju validated data.
Očekuje se da data['invoice'] može biti instanca ili PK.
"""
from modules.invoicing.models import InvoiceTransaction, Invoice
invoice = data.get("invoice")
if isinstance(invoice, int):
invoice = Invoice.objects.get(pk=invoice)
elif hasattr(invoice, "pk") is False:
raise ValidationError("Nevažeći invoice.")
amount = data.get("amount")
payment_date = data.get("payment_date", None)
work_order = data.get("work_order")
tx = InvoiceTransaction.objects.create(
invoice=invoice,
work_order=work_order,
invoice_number=invoice.invoice_number,
amount=amount,
payment_date=payment_date or timezone.now()
)
return tx