Merge pull request 'feature/table-celery-tasks' (#247) from feature/table-celery-tasks into development
Reviewed-on: ADUANASOFT/anexo76#247
This commit is contained in:
@@ -6,6 +6,7 @@ from sqlalchemy.orm import Session
|
||||
from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from .task import process_export_invoice_task
|
||||
|
||||
@@ -25,8 +26,16 @@ def trigger_invoice_process(
|
||||
"""
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
|
||||
task = process_export_invoice_task.apply_async(
|
||||
args=[invoice_id, str(tenant_id), str(company_id)]
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=process_export_invoice_task,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="process_export_invoice_task",
|
||||
task_group="invoices",
|
||||
task_origin="a76/invoices/exports/process",
|
||||
args=[invoice_id, str(tenant_id), str(company_id)],
|
||||
)
|
||||
|
||||
return {"task_id": task.id}
|
||||
|
||||
@@ -6,6 +6,7 @@ from sqlalchemy.orm import Session
|
||||
from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from .task import revert_invoice_task
|
||||
|
||||
@@ -33,8 +34,16 @@ def trigger_invoice_revert(
|
||||
or "system"
|
||||
)
|
||||
|
||||
task = revert_invoice_task.apply_async(
|
||||
args=[invoice_id, str(tenant_id), str(company_id), str(cancelled_by)]
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=revert_invoice_task,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=str(cancelled_by),
|
||||
task_name="revert_export_invoice_task",
|
||||
task_group="invoices",
|
||||
task_origin="a76/invoices/exports/revert",
|
||||
args=[invoice_id, str(tenant_id), str(company_id), str(cancelled_by)],
|
||||
)
|
||||
|
||||
return {"task_id": task.id}
|
||||
|
||||
@@ -6,6 +6,7 @@ from sqlalchemy.orm import Session
|
||||
from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from api.v1.modules.a76.invoices.models import InvoiceHeader, OperationType
|
||||
from .task import process_invoice_task
|
||||
@@ -34,12 +35,28 @@ def trigger_invoice_process(
|
||||
raise HTTPException(status_code=404, detail=f"Factura {invoice_id} no encontrada.")
|
||||
|
||||
if invoice.operation_type == OperationType.EXP:
|
||||
task = process_export_invoice_task.apply_async(
|
||||
args=[invoice_id, str(tenant_id), str(company_id)]
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=process_export_invoice_task,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="process_export_invoice_task",
|
||||
task_group="invoices",
|
||||
task_origin="a76/invoices/exports/process",
|
||||
args=[invoice_id, str(tenant_id), str(company_id)],
|
||||
)
|
||||
else:
|
||||
task = process_invoice_task.apply_async(
|
||||
args=[invoice_id, str(tenant_id), str(company_id)]
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=process_invoice_task,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="process_invoice_task",
|
||||
task_group="invoices",
|
||||
task_origin="a76/invoices/imports/process",
|
||||
args=[invoice_id, str(tenant_id), str(company_id)],
|
||||
)
|
||||
|
||||
return {"task_id": task.id}
|
||||
|
||||
@@ -6,6 +6,7 @@ from sqlalchemy.orm import Session
|
||||
from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from api.v1.modules.a76.invoices.models import InvoiceHeader, OperationType
|
||||
from .task import revert_invoice_task as revert_import_invoice_task
|
||||
@@ -40,12 +41,28 @@ def trigger_invoice_revert(
|
||||
raise HTTPException(status_code=404, detail=f"Factura {invoice_id} no encontrada.")
|
||||
|
||||
if invoice.operation_type == OperationType.EXP:
|
||||
task = revert_export_invoice_task.apply_async(
|
||||
args=[invoice_id, str(tenant_id), str(company_id), str(cancelled_by)]
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=revert_export_invoice_task,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=str(cancelled_by),
|
||||
task_name="revert_export_invoice_task",
|
||||
task_group="invoices",
|
||||
task_origin="a76/invoices/exports/revert",
|
||||
args=[invoice_id, str(tenant_id), str(company_id), str(cancelled_by)],
|
||||
)
|
||||
else:
|
||||
task = revert_import_invoice_task.apply_async(
|
||||
args=[invoice_id, str(tenant_id), str(company_id), str(cancelled_by)]
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=revert_import_invoice_task,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=str(cancelled_by),
|
||||
task_name="revert_invoice_task",
|
||||
task_group="invoices",
|
||||
task_origin="a76/invoices/imports/revert",
|
||||
args=[invoice_id, str(tenant_id), str(company_id), str(cancelled_by)],
|
||||
)
|
||||
|
||||
return {"task_id": task.id}
|
||||
|
||||
@@ -16,6 +16,7 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
@@ -26,6 +27,7 @@ from .tasks import (
|
||||
BOM_IMPORT_REDIS_TTL,
|
||||
)
|
||||
from ..common.error_csv import download_scan_errors_csv_stream
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
|
||||
router = APIRouter()
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -89,7 +91,18 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"BOMs import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="boms_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/boms/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -144,12 +157,26 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str):
|
||||
task = insert_valid_rows.delay(job_id)
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=f"{BOM_IMPORT_META_PREFIX}{job_id}",
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="boms_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/boms/commit",
|
||||
args=[job_id],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Inserción iniciada.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,9 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
from .schemas import ImportJobResponse, CommitRequest
|
||||
from .tasks import scan_file, insert_valid_rows, JOB_TYPE, CRREG_IMPORT_REDIS_TTL
|
||||
from ..common import storage as common_storage
|
||||
@@ -92,7 +94,20 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning("Cambio régimen/Regularización import: local file save failed: %s", e)
|
||||
|
||||
scan_file.apply_async(args=[job_id, model_target, footer_config], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name="cambio_regimen_regularizacion_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/cambio_regimen_regularizacion/upload",
|
||||
args=[job_id, model_target, footer_config],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -148,13 +163,29 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str, body: CommitRequest):
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
body: CommitRequest,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
"""Usuario confirma; se encola la tarea de commit (por ahora sin inserción real)."""
|
||||
task = insert_valid_rows.delay(job_id, body.model_target)
|
||||
_, meta_key, _ = common_storage.storage_keys(JOB_TYPE, job_id)
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=meta_key,
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="cambio_regimen_regularizacion_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/cambio_regimen_regularizacion/commit",
|
||||
args=[job_id, body.model_target],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Proceso de commit iniciado.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,9 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
scan_file,
|
||||
@@ -93,7 +95,20 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"Classes import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name="classes_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/classes/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -169,12 +184,26 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str):
|
||||
task = insert_valid_rows.delay(job_id)
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=f"{CLS_IMPORT_META_PREFIX}{job_id}",
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="classes_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/classes/commit",
|
||||
args=[job_id],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Inserción iniciada.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,9 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
scan_file,
|
||||
@@ -92,7 +94,20 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"CP import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name="clients_and_providers_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/clients_and_providers/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -151,15 +166,29 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str):
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
"""
|
||||
Fase 2: Usuario confirma; se encola la inserción de filas válidas.
|
||||
"""
|
||||
task = insert_valid_rows.delay(job_id)
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=f"{CP_IMPORT_META_PREFIX}{job_id}",
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="clients_and_providers_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/clients_and_providers/commit",
|
||||
args=[job_id],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Inserción iniciada.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
"""Encolar `insert_valid_rows` con registro en core.task_runs y validación de acceso."""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from typing import Any
|
||||
from uuid import uuid4
|
||||
|
||||
from celery import Task
|
||||
from fastapi import HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from core.security import validate_access_to_resource
|
||||
|
||||
|
||||
def dispatch_tracked_layouts_csv_commit(
|
||||
*,
|
||||
db: Session,
|
||||
current_user: dict[str, Any],
|
||||
redis_client: Any,
|
||||
meta_redis_key: str,
|
||||
celery_task: Task,
|
||||
task_name: str,
|
||||
task_origin: str,
|
||||
args: list[Any],
|
||||
) -> str:
|
||||
"""
|
||||
Lee tenant_id / company_id del meta en Redis, valida acceso y despacha la tarea Celery
|
||||
con un task_id nuevo (commit) para que el polling use commit_job_id.
|
||||
"""
|
||||
raw = redis_client.get(meta_redis_key)
|
||||
if not raw:
|
||||
raise HTTPException(status_code=404, detail="Job no encontrado o expiró")
|
||||
meta = json.loads(raw.decode("utf-8"))
|
||||
tenant_id = int(meta["tenant_id"])
|
||||
company_id = meta.get("company_id")
|
||||
if company_id is not None:
|
||||
try:
|
||||
validate_access_to_resource(db, int(company_id), current_user)
|
||||
except Exception:
|
||||
raise HTTPException(status_code=403, detail="Sin acceso a este job") from None
|
||||
|
||||
commit_id = str(uuid4())
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=celery_task,
|
||||
tenant_id=tenant_id,
|
||||
company_id=int(company_id) if company_id is not None else None,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name=task_name,
|
||||
task_group="layouts_csv",
|
||||
task_origin=task_origin,
|
||||
args=args,
|
||||
task_id=commit_id,
|
||||
)
|
||||
return commit_id
|
||||
@@ -16,7 +16,9 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
scan_file,
|
||||
@@ -92,7 +94,20 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"CB import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name="customs_brokers_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/customs_brokers/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -151,15 +166,29 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str):
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
"""
|
||||
Fase 2: Usuario confirma; se encola la inserción de filas válidas.
|
||||
"""
|
||||
task = insert_valid_rows.delay(job_id)
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=f"{CB_IMPORT_META_PREFIX}{job_id}",
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="customs_brokers_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/customs_brokers/commit",
|
||||
args=[job_id],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Inserción iniciada.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,9 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
scan_file,
|
||||
@@ -103,7 +105,20 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"ER import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name="exchange_rate_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/exchange_rate/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -161,15 +176,29 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str):
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
"""
|
||||
Fase 2: Usuario confirma; se encola la inserción de filas válidas.
|
||||
"""
|
||||
task = insert_valid_rows.delay(job_id)
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=f"{ER_IMPORT_META_PREFIX}{job_id}",
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="exchange_rate_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/exchange_rate/commit",
|
||||
args=[job_id],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Inserción iniciada.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -19,10 +19,12 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from .schemas import ImportJobResponse, CommitRequest
|
||||
from .tasks import scan_file, insert_valid_rows, JOB_TYPE, EXP_IMPORT_REDIS_TTL
|
||||
from ..common import storage as common_storage
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
|
||||
router = APIRouter()
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -99,7 +101,18 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning("Exportación import: local file save failed: %s", e)
|
||||
|
||||
scan_file.apply_async(args=[job_id, model_target, footer_config], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="exportacion_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/exportacion/upload",
|
||||
args=[job_id, model_target, footer_config],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -155,13 +168,29 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str, body: CommitRequest):
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
body: CommitRequest,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
"""Usuario confirma; se encola la tarea de commit (por ahora sin inserción real)."""
|
||||
task = insert_valid_rows.delay(job_id, body.model_target)
|
||||
_, meta_key, _ = common_storage.storage_keys(JOB_TYPE, job_id)
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=meta_key,
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="exportacion_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/exportacion/commit",
|
||||
args=[job_id, body.model_target],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Proceso de commit iniciado.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ from core.config import settings
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from .tasks import (
|
||||
scan_file,
|
||||
@@ -26,6 +27,7 @@ from .tasks import (
|
||||
)
|
||||
from .schemas import ImportJobResponse, ImportJobStatus, CommitRequest
|
||||
from ..common import storage as common_storage
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
|
||||
router = APIRouter()
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -111,7 +113,18 @@ async def upload_import_file(
|
||||
logger.warning(f"Local file save failed (worker will use Redis): {e}")
|
||||
|
||||
# Trigger Celery Task (Async). Worker loads file from Redis.
|
||||
scan_file.apply_async(args=[job_id, model_target, footer_config], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="facturas_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/facturas/upload",
|
||||
args=[job_id, model_target, footer_config],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -229,14 +242,29 @@ async def download_scan_errors_csv(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str, body: CommitRequest):
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
body: CommitRequest,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
"""
|
||||
Step 2: User confirms import. Trigger bulk insert.
|
||||
"""
|
||||
task = insert_valid_rows.delay(job_id, body.model_target)
|
||||
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=f"{IMPORT_META_KEY_PREFIX}{job_id}",
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="facturas_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/facturas/commit",
|
||||
args=[job_id, body.model_target],
|
||||
)
|
||||
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Bulk insert started.",
|
||||
"commit_job_id": task.id
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
@@ -26,6 +27,7 @@ from .tasks import (
|
||||
PART_IMPORT_REDIS_TTL,
|
||||
)
|
||||
from ..common.error_csv import download_scan_errors_csv_stream
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
|
||||
router = APIRouter()
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -93,7 +95,18 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"Parts import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="parts_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/parts/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -169,12 +182,26 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str):
|
||||
task = insert_valid_rows.delay(job_id)
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=f"{PART_IMPORT_META_PREFIX}{job_id}",
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="parts_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/parts/commit",
|
||||
args=[job_id],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Inserción iniciada.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,9 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
scan_file,
|
||||
@@ -100,7 +102,20 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"Pedimentos import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name="pedmientos_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/pedmientos/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -158,15 +173,30 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str):
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
"""
|
||||
Fase 2: Usuario confirma; se encola la inserción de filas válidas.
|
||||
"""
|
||||
task = insert_valid_rows.delay(job_id)
|
||||
_, meta_key, _ = common_storage.storage_keys(PED_JOB_TYPE, job_id)
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=meta_key,
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="pedmientos_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/pedmientos/commit",
|
||||
args=[job_id],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Inserción iniciada.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
@@ -94,7 +95,20 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"Trailers import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name="trailers_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/trailers/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
def run_scan_background():
|
||||
try:
|
||||
|
||||
@@ -17,6 +17,7 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
@@ -94,7 +95,21 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning("Transportistas import: local file save failed: %s", e)
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name="transportistas_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/transportistas/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
def run_scan_background():
|
||||
try:
|
||||
run_scan_sync(job_id)
|
||||
|
||||
@@ -16,7 +16,9 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from ..common.track_commit_dispatch import dispatch_tracked_layouts_csv_commit
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
scan_file,
|
||||
@@ -95,7 +97,20 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"FA import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username")
|
||||
or current_user.get("email")
|
||||
or current_user.get("sub"),
|
||||
task_name="us_tariff_fractions_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/us_tariff_fractions/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
|
||||
return ImportJobResponse(
|
||||
job_id=job_id,
|
||||
@@ -153,15 +168,29 @@ async def get_import_status(job_id: str):
|
||||
|
||||
|
||||
@router.post("/{job_id}/commit")
|
||||
async def commit_import_job(job_id: str):
|
||||
async def commit_import_job(
|
||||
job_id: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
"""
|
||||
Fase 2: Usuario confirma; se encola la inserción de filas válidas.
|
||||
"""
|
||||
task = insert_valid_rows.delay(job_id)
|
||||
r = _get_redis()
|
||||
commit_id = dispatch_tracked_layouts_csv_commit(
|
||||
db=db,
|
||||
current_user=current_user,
|
||||
redis_client=r,
|
||||
meta_redis_key=f"{FA_IMPORT_META_PREFIX}{job_id}",
|
||||
celery_task=insert_valid_rows,
|
||||
task_name="us_tariff_fractions_insert_valid_rows",
|
||||
task_origin="a76/layouts_csv/us_tariff_fractions/commit",
|
||||
args=[job_id],
|
||||
)
|
||||
return {
|
||||
"status": "committing",
|
||||
"message": "Inserción iniciada.",
|
||||
"commit_job_id": task.id,
|
||||
"commit_job_id": commit_id,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.paths import layout_path
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
from .schemas import ImportJobResponse
|
||||
from .tasks import (
|
||||
@@ -94,7 +95,18 @@ async def upload_import_file(
|
||||
except Exception as e:
|
||||
logger.warning(f"Vehicles import: local file save failed: {e}")
|
||||
|
||||
scan_file.apply_async(args=[job_id], task_id=job_id)
|
||||
track_and_dispatch(
|
||||
db=db,
|
||||
task=scan_file,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="vehicles_scan_file",
|
||||
task_group="layouts_csv",
|
||||
task_origin="a76/layouts_csv/vehicles/upload",
|
||||
args=[job_id],
|
||||
task_id=job_id,
|
||||
)
|
||||
# Fallback sin worker: ejecutar scan en un hilo y guardar resultado en Redis
|
||||
def run_scan_background():
|
||||
try:
|
||||
|
||||
@@ -6,6 +6,7 @@ from celery.result import AsyncResult
|
||||
from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .task import generar_pdf_aviso_consolidado_exp_async
|
||||
|
||||
router = APIRouter()
|
||||
@@ -41,6 +42,16 @@ async def trigger_descarga_aviso_consolidado_exp(
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
db: Session = Depends(get_core_db)
|
||||
):
|
||||
validate_access_to_resource(db, company_id, current_user)
|
||||
task = generar_pdf_aviso_consolidado_exp_async.delay(invoice_id, company_id)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generar_pdf_aviso_consolidado_exp_async,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generar_pdf_aviso_consolidado_exp_async",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/exportacion/aviso_consolidado",
|
||||
args=[invoice_id, company_id],
|
||||
)
|
||||
return {"task_id": task.id, "message": "Generación iniciada"}
|
||||
|
||||
@@ -5,7 +5,8 @@ from sqlalchemy.orm import Session
|
||||
from typing import Dict, Any
|
||||
|
||||
from core.database import get_core_db as get_db
|
||||
from core.security import get_current_user
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .service import FIFOAssignmentService
|
||||
from .task import generate_descarga_pdf_task # FORCE RELOAD
|
||||
from celery.result import AsyncResult
|
||||
@@ -40,6 +41,7 @@ def run_fifo_assignment(
|
||||
async def trigger_descarga_generation(
|
||||
invoice_id: int,
|
||||
company_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: Any = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
@@ -47,8 +49,18 @@ async def trigger_descarga_generation(
|
||||
Retorna el task_id para polling.
|
||||
"""
|
||||
try:
|
||||
# Lanza la tarea de Celery
|
||||
task = generate_descarga_pdf_task.delay(invoice_id, company_id)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generate_descarga_pdf_task,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generate_descarga_pdf_task",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/exportacion/descargo",
|
||||
args=[invoice_id, company_id],
|
||||
)
|
||||
return {"task_id": task.id, "status": "processing"}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
from typing import Dict, Any
|
||||
from fastapi import APIRouter, Depends, Body
|
||||
from sqlalchemy.orm import Session
|
||||
from celery.result import AsyncResult
|
||||
from core.celery_app import celery_app
|
||||
from core.security import get_current_user
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, get_tenant_from_token
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .task import generar_transmission_file_async
|
||||
from .schemas import Mainx30GenerationRequest
|
||||
|
||||
@@ -35,9 +38,19 @@ async def get_task_status(
|
||||
@router.post("/generate")
|
||||
async def trigger_generation(
|
||||
request: Mainx30GenerationRequest,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = current_user.get("tenant_id")
|
||||
# Pass request as dict to Celery task
|
||||
task = generar_transmission_file_async.delay(request.model_dump(), tenant_id)
|
||||
tenant_id = get_tenant_from_token(current_user) or current_user.get("tenant_id")
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generar_transmission_file_async,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=getattr(request, "company_id", None),
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generar_transmission_file_async",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/exportacion/transmission/MAINX30",
|
||||
args=[request.model_dump(), tenant_id],
|
||||
)
|
||||
return {"task_id": task.id, "message": "Generación iniciada"}
|
||||
|
||||
@@ -6,6 +6,7 @@ from celery.result import AsyncResult
|
||||
from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .mex.service import ConsolidadoImportacionMexService
|
||||
from .task import generar_pdf_consolidado_async
|
||||
|
||||
@@ -43,6 +44,16 @@ async def trigger_descarga_consolidado(
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
db: Session = Depends(get_core_db)
|
||||
):
|
||||
validate_access_to_resource(db, company_id, current_user)
|
||||
task = generar_pdf_consolidado_async.delay(invoice_id, company_id)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generar_pdf_consolidado_async,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generar_pdf_consolidado_async",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/importacion/consolidados",
|
||||
args=[invoice_id, company_id],
|
||||
)
|
||||
return {"task_id": task.id, "message": "Generación iniciada"}
|
||||
|
||||
@@ -6,6 +6,7 @@ from celery.result import AsyncResult
|
||||
from core.celery_app import celery_app
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .mex.service import FacturaImportacionMexService
|
||||
from .task import generar_pdf_factura_async
|
||||
|
||||
@@ -45,6 +46,16 @@ async def trigger_descarga_factura(
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
db: Session = Depends(get_core_db)
|
||||
):
|
||||
validate_access_to_resource(db, company_id, current_user)
|
||||
task = generar_pdf_factura_async.delay(invoice_id, company_id, invoice_type, currency_code)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generar_pdf_factura_async,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generar_pdf_factura_async",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/importacion/facturas",
|
||||
args=[invoice_id, company_id, invoice_type, currency_code],
|
||||
)
|
||||
return {"task_id": task.id, "message": "Generación iniciada"}
|
||||
@@ -3,6 +3,7 @@ from fastapi import APIRouter, Depends, Query, Response, HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .service import PackingListService
|
||||
|
||||
router = APIRouter()
|
||||
@@ -43,7 +44,16 @@ async def trigger_download_packing_list(
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
db: Session = Depends(get_core_db)
|
||||
):
|
||||
validate_access_to_resource(db, company_id, current_user)
|
||||
|
||||
task = generar_packing_list_async.delay(invoice_id, company_id)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generar_packing_list_async,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generar_packing_list_async",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/importacion/packing_list",
|
||||
args=[invoice_id, company_id],
|
||||
)
|
||||
return {"task_id": task.id, "message": "Generación iniciada"}
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
from typing import Dict, Any
|
||||
from fastapi import APIRouter, Depends, Body
|
||||
from sqlalchemy.orm import Session
|
||||
from celery.result import AsyncResult
|
||||
from core.celery_app import celery_app
|
||||
from core.security import get_current_user
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, get_tenant_from_token
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .task import generar_transmission_definitiva_async
|
||||
from .schemas import Mainx30GenerationRequest
|
||||
|
||||
@@ -34,8 +37,19 @@ async def get_task_status(
|
||||
@router.post("/generate")
|
||||
async def trigger_generation(
|
||||
request: Mainx30GenerationRequest,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = current_user.get("tenant_id")
|
||||
task = generar_transmission_definitiva_async.delay(request.model_dump(), tenant_id)
|
||||
tenant_id = get_tenant_from_token(current_user) or current_user.get("tenant_id")
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generar_transmission_definitiva_async,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=getattr(request, "company_id", None),
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generar_transmission_definitiva_async",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/importacion/transmission/definitive/MAINX30",
|
||||
args=[request.model_dump(), tenant_id],
|
||||
)
|
||||
return {"task_id": task.id, "message": "Generación Definitiva iniciada"}
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
from typing import Dict, Any
|
||||
from fastapi import APIRouter, Depends, Body
|
||||
from sqlalchemy.orm import Session
|
||||
from celery.result import AsyncResult
|
||||
from core.celery_app import celery_app
|
||||
from core.security import get_current_user
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, get_tenant_from_token
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .task import generar_transmission_temporal_async
|
||||
from .schemas import Mainx30GenerationRequest
|
||||
|
||||
@@ -35,9 +38,19 @@ async def get_task_status(
|
||||
@router.post("/generate")
|
||||
async def trigger_generation(
|
||||
request: Mainx30GenerationRequest,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = current_user.get("tenant_id")
|
||||
# Pass request as dict to Celery task
|
||||
task = generar_transmission_temporal_async.delay(request.model_dump(), tenant_id)
|
||||
tenant_id = get_tenant_from_token(current_user) or current_user.get("tenant_id")
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generar_transmission_temporal_async,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=getattr(request, "company_id", None),
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generar_transmission_temporal_async",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/importacion/transmission/temporal/MAINX30",
|
||||
args=[request.model_dump(), tenant_id],
|
||||
)
|
||||
return {"task_id": task.id, "message": "Generación Temporal iniciada"}
|
||||
|
||||
@@ -7,6 +7,8 @@ from core.celery_app import celery_app
|
||||
from celery.result import AsyncResult
|
||||
from typing import Dict, Any
|
||||
import logging
|
||||
from core.security import get_current_user, get_tenant_from_token
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -15,9 +17,20 @@ router = APIRouter(tags=["WINSAAI"])
|
||||
@router.post("/generate", response_model=WinsaaiResponse)
|
||||
async def trigger_winsaai_generation(
|
||||
request: WinsaaiGenerationRequest,
|
||||
db: Session = Depends(get_core_db)
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
task = generate_winsaai_task.delay(request.invoice_ids, request.is_temporal)
|
||||
tenant_id = get_tenant_from_token(current_user) or current_user.get("tenant_id")
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generate_winsaai_task,
|
||||
tenant_id=int(tenant_id),
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generate_winsaai_task",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/importacion/winsaai/invoices",
|
||||
args=[request.invoice_ids, request.is_temporal],
|
||||
)
|
||||
return WinsaaiResponse(
|
||||
task_id=task.id,
|
||||
status="PENDING",
|
||||
|
||||
@@ -7,6 +7,8 @@ from core.celery_app import celery_app
|
||||
from celery.result import AsyncResult
|
||||
from typing import Dict, Any
|
||||
import logging
|
||||
from core.security import get_current_user, get_tenant_from_token
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -15,12 +17,19 @@ router = APIRouter(tags=["WINSAAI-Pedimentos"])
|
||||
@router.post("/generate", response_model=WinsaaiResponse)
|
||||
async def trigger_pedimentos_generation(
|
||||
request: PedimentosWinsaaiGenerationRequest,
|
||||
db: Session = Depends(get_core_db)
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
task = generate_pedimentos_winsaai_task.delay(
|
||||
request.pedimento_ids,
|
||||
request.is_temporal,
|
||||
request.is_by_class
|
||||
tenant_id = get_tenant_from_token(current_user) or current_user.get("tenant_id")
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generate_pedimentos_winsaai_task,
|
||||
tenant_id=int(tenant_id),
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generate_pedimentos_winsaai_task",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/importacion/winsaai/pedimentos",
|
||||
args=[request.pedimento_ids, request.is_temporal, request.is_by_class],
|
||||
)
|
||||
return WinsaaiResponse(
|
||||
task_id=task.id,
|
||||
|
||||
@@ -4,7 +4,8 @@ from sqlalchemy.orm import Session
|
||||
from typing import List, Union
|
||||
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user
|
||||
from core.security import get_current_user, get_tenant_from_token
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .schemas import (
|
||||
ImportTemporaryFilter,
|
||||
ImportDefinitiveFilter,
|
||||
@@ -700,6 +701,7 @@ async def get_all_movements(
|
||||
)
|
||||
def generate_invoice_report_async(
|
||||
filters: AllMovementsFilter,
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: dict = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
@@ -715,7 +717,25 @@ def generate_invoice_report_async(
|
||||
user_email = current_user.get('email')
|
||||
|
||||
# Trigger task
|
||||
task = generate_invoice_movements_async.delay(filter_data, user_email)
|
||||
tenant_id = get_tenant_from_token(current_user)
|
||||
if not tenant_id:
|
||||
tenant_id = current_user.get("tenant_id")
|
||||
if not tenant_id:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="Tenant ID not found in token",
|
||||
)
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generate_invoice_movements_async,
|
||||
tenant_id=int(tenant_id),
|
||||
company_id=filters.company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generate_invoice_movements_async",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/movements/invoices",
|
||||
args=[filter_data, user_email],
|
||||
)
|
||||
|
||||
return {"task_id": task.id}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user
|
||||
from api.v1.modules.core.tasks_tracking import track_and_dispatch
|
||||
from .schemas import SaldosFilter
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -51,7 +52,17 @@ def generate_saldos_report_async(
|
||||
filter_data = filters.model_dump()
|
||||
user_email = current_user.get("email")
|
||||
|
||||
task = generate_saldos_temporales_async.delay(filter_data, user_email)
|
||||
task = track_and_dispatch(
|
||||
db=db,
|
||||
task=generate_saldos_temporales_async,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
|
||||
task_name="generate_saldos_temporales_async",
|
||||
task_group="reports",
|
||||
task_origin="a76/reports/movements/saldos",
|
||||
args=[filter_data, user_email],
|
||||
)
|
||||
return {"task_id": task.id}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user