feat: Update docker-compose configuration to use environment variables for sensitive data, enhance testing documentation with new LaTeX files for capacity planning, and refine README for clarity on compilation and testing processes.

This commit is contained in:
erik
2026-07-17 08:32:00 -05:00
parent e47ef4f8c6
commit dc3fcc2280
89 changed files with 5331 additions and 1210 deletions
+15 -1
View File
@@ -1107,12 +1107,16 @@ class CountJobFileCreate(BaseModel):
services: list[dict[str, Any]] = Field(default_factory=list)
status: str = "ok"
error: str | None = None
nit: str | None = None
object_key: str | None = None
class CreateCountJobRequest(BaseModel):
title: str | None = None
job_id: str | None = None # si se pasa, se usa el job existente
results: list[CountJobFileCreate]
download_job_id: str | None = None
source: str | None = None
class CountJobFileRead(BaseModel):
@@ -1128,6 +1132,8 @@ class CountJobFileRead(BaseModel):
is_valid: bool | None
error: str | None
created_at: str
nit: str | None = None
object_key: str | None = None
class UpdateCountJobFileRequest(BaseModel):
@@ -1163,6 +1169,8 @@ def serialize_count_file(f: CountJobFile) -> dict[str, Any]:
"is_valid": f.is_valid,
"error": f.error,
"created_at": f.created_at.isoformat(),
"nit": getattr(f, "nit", None),
"object_key": getattr(f, "object_key", None),
}
@@ -1193,12 +1201,16 @@ def create_count_job(request: CreateCountJobRequest) -> dict[str, Any]:
type="counting",
status="completed",
title=default_title,
request={},
request={
"source": request.source or ("from-download" if request.download_job_id else "desktop"),
"download_job_id": request.download_job_id,
},
result={
"total": total,
"processed": total,
"ok": sum(1 for r in request.results if r.status == "ok"),
"failed": sum(1 for r in request.results if r.status != "ok"),
"nits": sorted({r.nit for r in request.results if r.nit}),
},
started_at=utcnow(),
finished_at=utcnow(),
@@ -1215,6 +1227,8 @@ def create_count_job(request: CreateCountJobRequest) -> dict[str, Any]:
filename=r.filename,
file_path=r.file_path,
doc_type=r.doc_type,
nit=r.nit,
object_key=r.object_key,
service_count=r.service_count,
services=r.services,
status=r.status,
@@ -111,6 +111,8 @@ class CountJobFile(Base):
filename: Mapped[str] = mapped_column(String(512))
file_path: Mapped[str | None] = mapped_column(Text, nullable=True)
doc_type: Mapped[str | None] = mapped_column(String(128), nullable=True)
nit: Mapped[str | None] = mapped_column(String(255), nullable=True, index=True)
object_key: Mapped[str | None] = mapped_column(Text, nullable=True)
service_count: Mapped[int | None] = mapped_column(Integer, nullable=True)
services: Mapped[list[Any]] = mapped_column(JSON, default=list)
status: Mapped[str] = mapped_column(String(32), default="ok", index=True)
+6 -2
View File
@@ -11,6 +11,7 @@ import logging
import os
from typing import Any
from sqlalchemy.orm.attributes import flag_modified
from infrastructure.database import ExtractionRow, Task, session_scope, utcnow
from infrastructure.serialization import flatten_extraction_result
from api.desktop_ingest import (
@@ -128,7 +129,8 @@ async def process_document(
# Persistir resultado en BD
def _persist() -> dict[str, Any]:
with session_scope() as session:
task = session.get(Task, task_id)
# Lock evita lost-update en result.processed con N workers concurrentes.
task = session.get(Task, task_id, with_for_update=True)
if task is None:
return {"skipped": True, "reason": "task_not_found"}
@@ -185,6 +187,7 @@ async def process_document(
result["row_count"] = row_index
result["processed"] = int(result.get("processed") or 0) + 1
task.result = result
flag_modified(task, "result")
task.updated_at = utcnow()
session.flush()
mark_task_completed_if_done(session, task, batch_id)
@@ -206,7 +209,7 @@ async def process_document(
def _record_error() -> None:
try:
with session_scope() as session:
task = session.get(Task, task_id)
task = session.get(Task, task_id, with_for_update=True)
if task is None:
return
result = dict(task.result or {})
@@ -219,6 +222,7 @@ async def process_document(
result["errors"] = errors
result["processed"] = int(result.get("processed") or 0) + 1
task.result = result
flag_modified(task, "result")
task.updated_at = utcnow()
mark_task_completed_if_done(session, task, batch_id)
except Exception as inner: