Files
004.erp.generic/backend/modules/invoicing/tasks.py
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

81 lines
3.1 KiB
Python

import uuid
from celery import shared_task
from datetime import date, timedelta
from infrastructure.paperless_client import PaperlessGateway
from core.utils import format_currency, parse_iso_date
from django.contrib.auth import get_user_model
import logging
from decimal import Decimal
from modules.crm.models import Client
logger = logging.getLogger(__name__)
@shared_task(bind=True, max_retries=3)
def process_paperless_document_task(self, document_id):
"""
Celery zadatak koji povezuje infrastrukturu i poslovnu logiku.
"""
gateway = PaperlessGateway() # rename so we don't overwrite 'client'
try:
User = get_user_model()
# 1. Dohvat iz infrastrukture
raw_data = gateway.get_document_metadata(document_id)
raw_created = parse_iso_date(raw_data.get("created"))
correspondent_name = raw_data.get("correspondent")
# pokušaj dohvatiti crm klijenta
try:
crm_client = Client.objects.get(name=correspondent_name)
except Client.DoesNotExist:
logger.error(f"Klijent {correspondent_name} nije pronađen!")
# Kreiramo fallback klijenta ali popunimo UNIQUE polja jedinstvenim vrijednostima
unique_email = f"client+{uuid.uuid4()}@example.test"
unique_tax_id = str(uuid.uuid4())
crm_client, created = Client.objects.get_or_create(
name=correspondent_name,
defaults={
"email": unique_email,
"tax_id": unique_tax_id,
}
)
if created:
logger.info(f"Fallback klijent kreiran za '{correspondent_name}' (id={crm_client.id}).")
# 2. Transformacija i čišćenje podataka
total_raw = raw_data.get("total_amount", "0")
try:
amount_decimal = Decimal(str(total_raw))
except Exception:
amount_decimal = Decimal("0")
processed_data = {
"client": crm_client,
"invoice_number": raw_data.get("invoice_number") or raw_data.get("correspondent"),
"due_date": (raw_created or date.today()) + timedelta(days=30),
"amount": amount_decimal,
"created_at": raw_created,
}
from modules.invoicing.services import InvoiceService
lookup_field = User.USERNAME_FIELD
system_user = User.objects.filter(**{lookup_field: "bot@erp.hr"}).first()
if not system_user:
system_user = User(**{lookup_field: "bot@erp.hr"})
system_user.email = "bot@erp.hr"
system_user.first_name = "Paperless"
system_user.last_name = "Bot"
system_user.set_unusable_password()
system_user.save()
# Pozovi servis uvijek nakon što garantujemo da system_user postoji
InvoiceService.create_full_invoice(user=system_user, **processed_data)
logger.info(f"Dokument {document_id} uspješno obrađen.")
except Exception as exc:
logger.error(f"Greška pri obradi dokumenta {document_id}: {exc}")
# Automatski retry ako padne
raise self.retry(exc=exc, countdown=60)