{"openapi":"3.1.0","info":{"title":"API Xubio Sueldos","description":"API para la descarga de archivos de sueldos de Xubio","version":"0.1.0"},"paths":{"/api/v1/crypto/clave-publica":{"get":{"tags":["Cifrado"],"summary":"Obtener la clave pública RSA","description":"Devuelve la clave pública RSA de la API.\n\nLos clientes deben cifrar con ella (RSA-OAEP, SHA-256) los campos\n``usuario`` y ``clave`` del endpoint de descarga de sueldos\n(``POST /api/v1/sueldos/descargar``) y enviarlos en base64.","operationId":"obtener_clave_publica_api_v1_crypto_clave_publica_get","responses":{"200":{"description":"Clave pública en formato PEM para cifrar credenciales.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClavePublicaResponse"}}}}}}},"/api/v1/jobs/descarga_sueldos":{"post":{"tags":["Jobs"],"summary":"Disparar el bot de sueldos y crear un job de descarga","description":"Crea un job pendiente y dispara el bot en background.\n\nLos archivos se persisten en disco (``descargas/jobs/{job_id}/``) y se\nentregan como URLs de MinIO (regeneradas al consultar) cuando\n``minio=True`` (default).","operationId":"crear_job_api_v1_jobs_descarga_sueldos_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SueldosDescargaRequest"}}},"required":true},"responses":{"202":{"description":"Job creado; consultar GET /jobs/{job_id} para el estado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/descarga_sueldos_fast":{"post":{"tags":["Jobs"],"summary":"Disparar el bot rápido de sueldos y crear un job","description":"Crea un job que ejecutará el bot rápido vía APIs de payroll.","operationId":"crear_job_fast_api_v1_jobs_descarga_sueldos_fast_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SueldosDescargaRequest"}}},"required":true},"responses":{"202":{"description":"Job rápido creado; consultar GET /jobs/{job_id} para el estado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/{job_id}":{"get":{"tags":["Jobs"],"summary":"Consultar el estado de un job","description":"Devuelve el estado del job y sus archivos.\n\nLas URLs de MinIO se generan en el momento de la consulta (las URLs\npresignadas expiran) para los archivos que existan en el resultado.","operationId":"obtener_job_api_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Estado actual y archivos descargados (URLs de MinIO si existen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs":{"get":{"tags":["Jobs"],"summary":"Listar jobs","description":"Lista los jobs existentes, con filtros opcionales y paginación.\n\nEl filtro ``contribuyentes`` es de intersección: devuelve los jobs que\nconsultaron al menos uno de los contribuyentes indicados (comparación\nnormalizada, case-insensitive). ``total`` y ``pages`` reflejan los jobs\nque matchean los filtros (antes de paginar).","operationId":"listar_jobs_api_v1_jobs_get","parameters":[{"name":"contribuyentes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filtra por contribuyentes consultados (repetible; matchea cualquiera de la lista, case-insensitive)","title":"Contribuyentes"},"description":"Filtra por contribuyentes consultados (repetible; matchea cualquiera de la lista, case-insensitive)"},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtra por estado: pending, running, completed, failed","title":"Estado"},"description":"Filtra por estado: pending, running, completed, failed"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Número de página (1-indexed)","default":1,"title":"Page"},"description":"Número de página (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Cantidad máxima de resultados por página (max 200)","default":50,"title":"Page Size"},"description":"Cantidad máxima de resultados por página (max 200)"}],"responses":{"200":{"description":"Lista paginada de jobs ordenada por fecha de creación descendente.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sueldos/descargar":{"post":{"tags":["Sueldos Xubio"],"summary":"Descargar archivos de sueldos de Xubio","description":"Ejecuta el bot de Xubio para descargar los archivos de sueldos.\n\nLas credenciales (``usuario_cifrado`` y ``clave_cifrado``) deben venir\ncifradas con RSA-OAEP usando la clave pública del endpoint\n``GET /api/v1/crypto/clave-publica``.\n\n``minio`` es ``True`` por default: los archivos se suben a MinIO y se\ndevuelven sus URLs. ``b64`` fue eliminado como formato de salida.","operationId":"descargar_sueldos_api_v1_sueldos_descargar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SueldosDescargaRequest"}}},"required":true},"responses":{"200":{"description":"Archivos descargados subidos a MinIO con sus URLs de descarga.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SueldosDescargaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/descarga_sueldos_fast":{"post":{"tags":["Sueldos Xubio"],"summary":"Descargar rápidamente archivos de sueldos de Xubio","description":"Ejecuta el bot rápido de Xubio mediante sus APIs internas de payroll.","operationId":"descargar_sueldos_fast_api_v1_descarga_sueldos_fast_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SueldosDescargaRequest"}}},"required":true},"responses":{"200":{"description":"Archivos descargados por las APIs de payroll y subidos a MinIO.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SueldosDescargaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/carga_931":{"post":{"tags":["Carga 931"],"summary":"Crear un job de carga y control del F931","description":"Crea un job asíncrono que carga TXT de liquidación en **Libros Sueldos Digital (ARCA)**, hace scrap del borrador F931 y ejecuta controles contra los Excels.\n\n**Content-Type:** `multipart/form-data` (igual que `POST /jobs/descarga_sueldos` pero sumando archivos).\n\n**Partes:**\n- `manifest` (Form, JSON string) — período, `nro_liquidacion`, `overwrite` y lista de contribuyentes. Cada contribuyente lleva `cuit_inicio_cifrado` y `clave_afip_cifrado` cifrados con RSA-OAEP-SHA256 usando `GET /api/v1/crypto/clave-publica` (base64), `jurisdiccion`, y los nombres de archivo que deben coincidir exactamente con los `files` enviados.\n- `files` (File, repetible) — archivos referenciados por el manifest. `liquidacion` (.txt) es **obligatorio**; `conceptos` (.txt) + `control` (.xlsx) + `reporte` (.xlsx) son opcionales pero el control solo se ejecuta si los 3 están presentes.\n\n**Ejemplo `manifest`:**\n```json\n{\n  \"periodo\": \"2026-08\",\n  \"nro_liquidacion\": 1,\n  \"overwrite\": false,\n  \"contribuyentes\": [\n    {\n      \"razon_social\": \"EMPRESA EJEMPLO SRL\",\n      \"cuit_representado\": \"30717289639\",\n      \"jurisdiccion\": \"mendoza\",\n      \"cuit_inicio_cifrado\": \"q3B7V2hJdX...BASE64...==\",\n      \"clave_afip_cifrado\": \"Xy9pL0mN...BASE64...==\",\n      \"liquidacion\": \"TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt\",\n      \"conceptos\": \"TXT_conceptos_202608_EMPRESA_EJEMPLO_SRL.txt\",\n      \"control\": \"Excel_control_liquidacion_202608_EMPRESA_EJEMPLO_SRL.xlsx\",\n      \"reporte\": \"Excel_reporte_sueldos_202608_EMPRESA_EJEMPLO_SRL.xlsx\"\n    }\n  ]\n}\n```\n\n**`curl` ejemplo:**\n```bash\nPUB=$(curl -s http://localhost:8000/api/v1/crypto/clave-publica | jq -r .clave_publica)\n# cifrar cuit y clave con RSA-OAEP-SHA256 + base64 (ver scripts/armar_request_body.py)\ncurl -X POST http://localhost:8000/api/v1/jobs/carga_931 \\\n  -F 'manifest={\"periodo\":\"2026-08\",\"nro_liquidacion\":1,\"overwrite\":false,\"contribuyentes\":[{\"razon_social\":\"EMPRESA EJEMPLO SRL\",\"cuit_representado\":\"30717289639\",\"jurisdiccion\":\"mendoza\",\"cuit_inicio_cifrado\":\"...\",\"clave_afip_cifrado\":\"...\",\"liquidacion\":\"TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt\"}]}' \\\n  -F files=@TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt \\\n  -F files=@TXT_conceptos_202608_EMPRESA_EJEMPLO_SRL.txt \\\n  -F files=@Excel_control_liquidacion_202608_EMPRESA_EJEMPLO_SRL.xlsx \\\n  -F files=@Excel_reporte_sueldos_202608_EMPRESA_EJEMPLO_SRL.xlsx\n```\n\n**Respuesta `202`:**\n```json\n{\n  \"job_id\": \"0198b4e2-1234-7abc-9012-3456789abcde\",\n  \"tipo\": \"carga_931\",\n  \"estado\": \"pending\",\n  \"periodo\": \"2026-08\",\n  \"nro_liquidacion\": 1,\n  \"contribuyentes\": [\"EMPRESA EJEMPLO SRL\"],\n  \"created_at\": \"2026-08-19T12:00:00\",\n  \"status_url\": \"/api/v1/jobs/carga_931/0198b4e2-1234-7abc-9012-3456789abcde\"\n}\n```\nConsultar `GET /jobs/carga_931/{job_id}` para progreso/scrap/control/artefactos.","operationId":"crear_job_carga_931_api_v1_jobs_carga_931_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_crear_job_carga_931_api_v1_jobs_carga_931_post"},"examples":{"carga_completa_con_control":{"summary":"1 contribuyente con control (4 archivos)","value":{"manifest":"{\"periodo\":\"2026-08\",\"nro_liquidacion\":1,\"overwrite\":false,\"contribuyentes\":[{\"razon_social\":\"EMPRESA EJEMPLO SRL\",\"cuit_representado\":\"30717289639\",\"jurisdiccion\":\"mendoza\",\"cuit_inicio_cifrado\":\"q3B7...==\",\"clave_afip_cifrado\":\"Xy9...==\",\"liquidacion\":\"TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt\",\"conceptos\":\"TXT_conceptos_202608_EMPRESA_EJEMPLO_SRL.txt\",\"control\":\"Excel_control_liquidacion_202608_EMPRESA_EJEMPLO_SRL.xlsx\",\"reporte\":\"Excel_reporte_sueldos_202608_EMPRESA_EJEMPLO_SRL.xlsx\"}]}"}},"solo_liquidacion_sin_control":{"summary":"1 contribuyente solo TXT liquidación","value":{"manifest":"{\"periodo\":\"2026-08\",\"nro_liquidacion\":1,\"overwrite\":false,\"contribuyentes\":[{\"razon_social\":\"THE TYPESETTER S.R.L\",\"cuit_representado\":\"30715167642\",\"jurisdiccion\":\"cordoba\",\"cuit_inicio_cifrado\":\"AbCd...==\",\"clave_afip_cifrado\":\"EfGh...==\",\"liquidacion\":\"TXT_liquidaciones_202608_THE_TYPESETTER_S.R.L.txt\"}]}"}}}}},"required":true},"responses":{"202":{"description":"Job 931 creado (pending) — consultar status_url","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Carga931CreatedResponse"},"example":{"job_id":"0198b4e2-1234-7abc-9012-3456789abcde","tipo":"carga_931","estado":"pending","periodo":"2026-08","nro_liquidacion":1,"contribuyentes":["EMPRESA EJEMPLO SRL"],"created_at":"2026-08-19T12:00:00","status_url":"/api/v1/jobs/carga_931/0198b4e2-1234-7abc-9012-3456789abcde"}}}},"400":{"description":"Manifest inválido, archivos faltantes o extensión incorrecta","content":{"application/json":{"example":{"message":"Faltan archivos referenciados por el manifest: TXT_liquidaciones_...txt","error_code":"CARGA_931_FILES_400","success":false}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/carga_931/{job_id}":{"get":{"tags":["Carga 931"],"summary":"Consultar estado y archivos de una carga 931","description":"Consulta dedicada para jobs creados por `POST /jobs/carga_931` (mismo payload que `GET /jobs/{job_id}` pero filtrado a `tipo=carga_931`).\n\n**Estados:** `pending` → `running` → `completed` / `failed` (ver `fase` y `progreso` para granularidad: `recepcion`, `cargando`, `controlando`, `reportando`, `finalizado`).\n\n**Campos clave (solo carga_931):**\n- `resultados[]`: por contribuyente `estado_carga: VALIDA/INVALIDA/ERROR/PERIODO_EXISTENTE`, `scrap: {estado, datos{trabajadores, remunerativos, no_remunerativos, descuentos}}`, `control: {estado: OK/ERROR/NO_EJECUTADO}`, `tiempo_seg`.\n- `control`: global `{estado, errores[]}`.\n- `estado_global`: `OK` (carga+control OK), `OK_SIN_CONTROL` (carga OK sin Excels), `PARCIAL`, `ERROR`.\n- `exito_100`: `true` solo si `OK`.\n- `artefactos[]`: `control_individual`, `reporte_consolidado`, `resultado_json`, `log` con `url` presignada MinIO (7 días), `sha256`, `size`.\n\n**Ejemplo `completed`/`OK`:**\nVer schema `JobStatusResponse` — ejemplo 1.\n\n**Ejemplo sin control:**\nVer schema `JobStatusResponse` — ejemplo 2 (`OK_SIN_CONTROL`).\n\nEquivalente a `GET /jobs/{job_id}` pero retorna `404` si el job no es `carga_931`.","operationId":"obtener_estado_carga_931_api_v1_jobs_carga_931__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Estado del job 931","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"},"examples":{"ok_completo":{"summary":"completed / OK con control y artefactos","value":{"job_id":"0198b4e2-1234-7abc-9012-3456789abcde","estado":"completed","contribuyentes":["EMPRESA EJEMPLO SRL"],"periodo":"2026-08","nro_liquidacion":1,"created_at":"2026-08-19T12:00:00","started_at":"2026-08-19T12:00:05","finished_at":"2026-08-19T12:03:45","minio":true,"archivos":[],"tipo":"carga_931","fase":"finalizado","progreso":{"total":1,"procesados":1},"resultados":[{"razon_social":"EMPRESA EJEMPLO SRL","cuit_representado":"30717289639","jurisdiccion":"mendoza","estado_carga":"VALIDA","estado":"OK","scrap":{"estado":"OK","datos":{"trabajadores":2,"remunerativos":"1334885.18","no_remunerativos":"158250.22","descuentos":"311675.40","formato":"lsd_tabla"}},"control":{"estado":"OK","errores":[]},"tiempo_seg":57.85}],"control":{"estado":"OK","errores":[]},"artefactos":[{"artefacto_id":"0198b4e3-aaaa-7abc-9012-3456789abcde","tipo":"control_individual","nombre_archivo":"Control_EMPRESA_EJEMPLO_SRL_202608.xlsx","url":"https://s3.../Control_EMPRESA_EJEMPLO_SRL_202608.xlsx?X-Amz-...","sha256":"d802c5d7...","size":48057}],"exito_100":true,"estado_global":"OK"}},"ok_sin_control":{"summary":"completed / OK_SIN_CONTROL (solo liquidación)","value":{"job_id":"0198b4e2-aaaa-7abc-9012-3456789abcde","estado":"completed","contribuyentes":["EMPRESA EJEMPLO SRL"],"periodo":"2026-08","nro_liquidacion":1,"created_at":"2026-08-19T12:00:00","started_at":"2026-08-19T12:00:05","finished_at":"2026-08-19T12:01:10","minio":true,"archivos":[],"tipo":"carga_931","fase":"finalizado","progreso":{"total":1,"procesados":1},"resultados":[{"razon_social":"EMPRESA EJEMPLO SRL","estado_carga":"VALIDA","control":{"estado":"NO_EJECUTADO","faltantes":["conceptos","control","reporte"]},"scrap":{"estado":"OK"}}],"control":{"estado":"NO_EJECUTADO","errores":[]},"artefactos":[],"exito_100":false,"estado_global":"OK_SIN_CONTROL"}}}}}},"404":{"description":"Job no existe o no es carga_931","content":{"application/json":{"example":{"message":"No existe la carga 931 0198b4e2-...","error_code":"CARGA_931_JOB_404","success":false}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/carga_931_individual":{"post":{"tags":["Carga 931"],"summary":"Crear un job de carga 931 individual (1 contribuyente)","description":"Crea un job asíncrono para **un único contribuyente** que carga TXT de liquidación en **Libros Sueldos Digital (ARCA)**, hace scrap del borrador F931 y ejecuta controles contra los Excels.\n\nEs la variante de `POST /jobs/carga_931` limitada a 1 contribuyente para simplificar integraciones que procesan de a uno.\n\n**Content-Type:** `multipart/form-data`\n\n**Partes:**\n- `manifest` (Form, JSON string) — `periodo`, `nro_liquidacion`, `overwrite` y **un único** `contribuyente` con `cuit_inicio_cifrado` y `clave_afip_cifrado` cifrados con RSA-OAEP-SHA256 usando `GET /api/v1/crypto/clave-publica` (base64), `jurisdiccion`, y los nombres de archivo que deben coincidir exactamente con los `files` enviados.\n- `files` (File, repetible) — archivos referenciados por el manifest. `liquidacion` (.txt) es **obligatorio**; `conceptos` (.txt) + `control` (.xlsx) + `reporte` (.xlsx) son opcionales pero el control solo se ejecuta si los 3 están presentes.\n\n**Ejemplo `manifest`:**\n```json\n{\n  \"periodo\": \"2026-08\",\n  \"nro_liquidacion\": 1,\n  \"overwrite\": false,\n  \"contribuyente\": {\n    \"razon_social\": \"EMPRESA EJEMPLO SRL\",\n    \"cuit_representado\": \"30717289639\",\n    \"jurisdiccion\": \"mendoza\",\n    \"cuit_inicio_cifrado\": \"q3B7V2hJdX...BASE64...==\",\n    \"clave_afip_cifrado\": \"Xy9pL0mN...BASE64...==\",\n    \"liquidacion\": \"TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt\",\n    \"conceptos\": \"TXT_conceptos_202608_EMPRESA_EJEMPLO_SRL.txt\",\n    \"control\": \"Excel_control_liquidacion_202608_EMPRESA_EJEMPLO_SRL.xlsx\",\n    \"reporte\": \"Excel_reporte_sueldos_202608_EMPRESA_EJEMPLO_SRL.xlsx\"\n  }\n}\n```\n\n**`curl` ejemplo (solo liquidación):**\n```bash\nPUB=$(curl -s http://localhost:8000/api/v1/crypto/clave-publica | jq -r .clave_publica)\n# cifrar cuit y clave con RSA-OAEP-SHA256 + base64 (ver scripts/armar_request_body.py)\ncurl -X POST http://localhost:8000/api/v1/jobs/carga_931_individual \\\n  -F 'manifest={\"periodo\":\"2026-08\",\"nro_liquidacion\":1,\"overwrite\":false,\"contribuyente\":{\"razon_social\":\"EMPRESA EJEMPLO SRL\",\"cuit_representado\":\"30717289639\",\"jurisdiccion\":\"mendoza\",\"cuit_inicio_cifrado\":\"...\",\"clave_afip_cifrado\":\"...\",\"liquidacion\":\"TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt\"}}' \\\n  -F files=@TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt\n```\n\n**Respuesta `202`:**\n```json\n{\n  \"job_id\": \"0198b4e2-1234-7abc-9012-3456789abcde\",\n  \"tipo\": \"carga_931_individual\",\n  \"estado\": \"pending\",\n  \"periodo\": \"2026-08\",\n  \"nro_liquidacion\": 1,\n  \"contribuyente\": \"EMPRESA EJEMPLO SRL\",\n  \"created_at\": \"2026-08-19T12:00:00\",\n  \"status_url\": \"/api/v1/jobs/carga_931_individual/0198b4e2-1234-7abc-9012-3456789abcde\"\n}\n```\nConsultar `GET /jobs/carga_931_individual/{job_id}` o `GET /jobs/{job_id}` para progreso/scrap/control/artefactos.","operationId":"crear_job_carga_931_individual_api_v1_jobs_carga_931_individual_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_crear_job_carga_931_individual_api_v1_jobs_carga_931_individual_post"},"examples":{"individual_completo_con_control":{"summary":"1 contribuyente con control (4 archivos)","value":{"manifest":"{\"periodo\":\"2026-08\",\"nro_liquidacion\":1,\"overwrite\":false,\"contribuyente\":{\"razon_social\":\"EMPRESA EJEMPLO SRL\",\"cuit_representado\":\"30717289639\",\"jurisdiccion\":\"mendoza\",\"cuit_inicio_cifrado\":\"q3B7...==\",\"clave_afip_cifrado\":\"Xy9...==\",\"liquidacion\":\"TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt\",\"conceptos\":\"TXT_conceptos_202608_EMPRESA_EJEMPLO_SRL.txt\",\"control\":\"Excel_control_liquidacion_202608_EMPRESA_EJEMPLO_SRL.xlsx\",\"reporte\":\"Excel_reporte_sueldos_202608_EMPRESA_EJEMPLO_SRL.xlsx\"}}"}},"individual_solo_liquidacion":{"summary":"1 contribuyente solo TXT liquidación","value":{"manifest":"{\"periodo\":\"2026-08\",\"nro_liquidacion\":1,\"overwrite\":false,\"contribuyente\":{\"razon_social\":\"THE TYPESETTER S.R.L\",\"cuit_representado\":\"30715167642\",\"jurisdiccion\":\"cordoba\",\"cuit_inicio_cifrado\":\"AbCd...==\",\"clave_afip_cifrado\":\"EfGh...==\",\"liquidacion\":\"TXT_liquidaciones_202608_THE_TYPESETTER_S.R.L.txt\"}}"}}}}},"required":true},"responses":{"202":{"description":"Job 931 individual creado (pending) — consultar status_url","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Carga931IndividualCreatedResponse"},"example":{"job_id":"0198b4e2-1234-7abc-9012-3456789abcde","tipo":"carga_931_individual","estado":"pending","periodo":"2026-08","nro_liquidacion":1,"contribuyente":"EMPRESA EJEMPLO SRL","created_at":"2026-08-19T12:00:00","status_url":"/api/v1/jobs/carga_931_individual/0198b4e2-1234-7abc-9012-3456789abcde"}}}},"400":{"description":"Manifest inválido, archivos faltantes o extensión incorrecta","content":{"application/json":{"example":{"message":"Faltan archivos referenciados por el manifest: TXT_liquidaciones_...txt","error_code":"CARGA_931_INDIVIDUAL_FILES_400","success":false}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/carga_931_individual/{job_id}":{"get":{"tags":["Carga 931"],"summary":"Consultar estado y archivos de una carga 931 individual","description":"Consulta dedicada para jobs creados por `POST /jobs/carga_931_individual` (mismo payload que `GET /jobs/{job_id}` pero filtrado a `tipo=carga_931_individual`).\n\n**Estados:** `pending` → `running` → `completed` / `failed` (ver `fase` y `progreso` para granularidad: `recepcion`, `cargando`, `controlando`, `reportando`, `finalizado`).\n\n**Campos clave (solo carga_931_individual, idéntico a carga_931 pero con un único contribuyente):**\n- `resultados[]`: un único elemento con `estado_carga: VALIDA/INVALIDA/ERROR/PERIODO_EXISTENTE`, `scrap: {estado, datos{trabajadores, remunerativos, no_remunerativos, descuentos}}`, `control: {estado: OK/ERROR/NO_EJECUTADO}`, `tiempo_seg`.\n- `control`: global `{estado, errores[]}`.\n- `estado_global`: `OK` (carga+control OK), `OK_SIN_CONTROL` (carga OK sin Excels), `PARCIAL`, `ERROR`.\n- `exito_100`: `true` solo si `OK`.\n- `artefactos[]`: `control_individual`, `reporte_consolidado`, `resultado_json`, `log` con `url` presignada MinIO (7 días), `sha256`, `size`.\n\nEquivalente a `GET /jobs/{job_id}` pero retorna `404` si el job no es `carga_931_individual`.","operationId":"obtener_estado_carga_931_individual_api_v1_jobs_carga_931_individual__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Estado del job 931 individual","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"},"examples":{"ok_completo":{"summary":"completed / OK con control y artefactos","value":{"job_id":"0198b4e2-1234-7abc-9012-3456789abcde","estado":"completed","contribuyentes":["EMPRESA EJEMPLO SRL"],"periodo":"2026-08","nro_liquidacion":1,"created_at":"2026-08-19T12:00:00","started_at":"2026-08-19T12:00:05","finished_at":"2026-08-19T12:03:45","minio":true,"archivos":[],"tipo":"carga_931_individual","fase":"finalizado","progreso":{"total":1,"procesados":1},"resultados":[{"razon_social":"EMPRESA EJEMPLO SRL","cuit_representado":"30717289639","jurisdiccion":"mendoza","estado_carga":"VALIDA","estado":"OK","scrap":{"estado":"OK","datos":{"trabajadores":2,"remunerativos":"1334885.18","no_remunerativos":"158250.22","descuentos":"311675.40","formato":"lsd_tabla"}},"control":{"estado":"OK","errores":[]},"tiempo_seg":57.85}],"control":{"estado":"OK","errores":[]},"artefactos":[{"artefacto_id":"0198b4e3-aaaa-7abc-9012-3456789abcde","tipo":"control_individual","nombre_archivo":"Control_EMPRESA_EJEMPLO_SRL_202608.xlsx","url":"https://s3.../Control_EMPRESA_EJEMPLO_SRL_202608.xlsx?X-Amz-...","sha256":"d802c5d7...","size":48057}],"exito_100":true,"estado_global":"OK"}},"ok_sin_control":{"summary":"completed / OK_SIN_CONTROL (solo liquidación)","value":{"job_id":"0198b4e2-aaaa-7abc-9012-3456789abcde","estado":"completed","contribuyentes":["EMPRESA EJEMPLO SRL"],"periodo":"2026-08","nro_liquidacion":1,"created_at":"2026-08-19T12:00:00","started_at":"2026-08-19T12:00:05","finished_at":"2026-08-19T12:01:10","minio":true,"archivos":[],"tipo":"carga_931_individual","fase":"finalizado","progreso":{"total":1,"procesados":1},"resultados":[{"razon_social":"EMPRESA EJEMPLO SRL","estado_carga":"VALIDA","control":{"estado":"NO_EJECUTADO","faltantes":["conceptos","control","reporte"]},"scrap":{"estado":"OK"}}],"control":{"estado":"NO_EJECUTADO","errores":[]},"artefactos":[],"exito_100":false,"estado_global":"OK_SIN_CONTROL"}}}}}},"404":{"description":"Job no existe o no es carga_931_individual","content":{"application/json":{"example":{"message":"No existe la carga 931 individual 0198b4e2-...","error_code":"CARGA_931_INDIVIDUAL_JOB_404","success":false}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Verificar el estado de la API","description":"Endpoint de Health Check.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ArchivoDescargado":{"properties":{"tipo":{"type":"string","title":"Tipo","description":"Tipo de archivo: liquidaciones, conceptos, reporte, control"},"nombre_archivo":{"type":"string","title":"Nombre Archivo","description":"Nombre del archivo descargado"},"url_minio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Minio","description":"URL de descarga en MinIO (si minio=True)"}},"type":"object","required":["tipo","nombre_archivo"],"title":"ArchivoDescargado","description":"Archivo descargado por el bot."},"Body_crear_job_carga_931_api_v1_jobs_carga_931_post":{"properties":{"manifest":{"type":"string","title":"Manifest","description":"JSON string del manifest (ver ejemplos). Obtener clave pública en GET /api/v1/crypto/clave-publica y cifrar cuit_inicio/clave con RSA-OAEP-SHA256 + base64.","examples":["{\"periodo\":\"2026-08\",\"nro_liquidacion\":1,\"overwrite\":false,\"contribuyentes\":[{\"razon_social\":\"EMPRESA EJEMPLO SRL\",\"cuit_representado\":\"30717289639\",\"jurisdiccion\":\"mendoza\",\"cuit_inicio_cifrado\":\"q3B7...==\",\"clave_afip_cifrado\":\"Xy9...==\",\"liquidacion\":\"TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt\"}]}"]},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"Archivos referenciados en manifest. Nombres deben coincidir exactamente. .txt para liquidación/conceptos, .xlsx/.xlsm para control/reporte."}},"type":"object","required":["manifest","files"],"title":"Body_crear_job_carga_931_api_v1_jobs_carga_931_post"},"Body_crear_job_carga_931_individual_api_v1_jobs_carga_931_individual_post":{"properties":{"manifest":{"type":"string","title":"Manifest","description":"JSON string del manifest individual (ver ejemplos). Obtener clave pública en GET /api/v1/crypto/clave-publica y cifrar cuit_inicio/clave con RSA-OAEP-SHA256 + base64.","examples":["{\"periodo\":\"2026-08\",\"nro_liquidacion\":1,\"overwrite\":false,\"contribuyente\":{\"razon_social\":\"EMPRESA EJEMPLO SRL\",\"cuit_representado\":\"30717289639\",\"jurisdiccion\":\"mendoza\",\"cuit_inicio_cifrado\":\"q3B7...==\",\"clave_afip_cifrado\":\"Xy9...==\",\"liquidacion\":\"TXT_liquidaciones_202608_EMPRESA_EJEMPLO_SRL.txt\"}}"]},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"Archivos referenciados en manifest. Nombres deben coincidir exactamente. .txt para liquidación/conceptos, .xlsx/.xlsm para control/reporte."}},"type":"object","required":["manifest","files"],"title":"Body_crear_job_carga_931_individual_api_v1_jobs_carga_931_individual_post"},"Carga931CreatedResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"ID del job (UUID v7)","examples":["0198b4e2-1234-7abc-9012-3456789abcde"]},"tipo":{"type":"string","title":"Tipo","description":"Tipo de job","default":"carga_931","examples":["carga_931"]},"estado":{"type":"string","title":"Estado","description":"Estado inicial: pending","examples":["pending"]},"periodo":{"type":"string","title":"Periodo","description":"Período normalizado YYYY-MM","examples":["2026-08"]},"nro_liquidacion":{"type":"integer","title":"Nro Liquidacion","description":"Nro. liquidación","examples":[1]},"contribuyentes":{"items":{"type":"string"},"type":"array","title":"Contribuyentes","description":"Razones sociales del manifest","examples":[["EMPRESA EJEMPLO SRL"]]},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Timestamp de creación","examples":["2026-08-19T12:00:00"]},"status_url":{"type":"string","title":"Status Url","description":"URL para consultar el job","examples":["/api/v1/jobs/carga_931/0198b4e2-1234-7abc-9012-3456789abcde"]}},"type":"object","required":["job_id","estado","periodo","nro_liquidacion","created_at","status_url"],"title":"Carga931CreatedResponse","examples":[{"contribuyentes":["EMPRESA EJEMPLO SRL","THE TYPESETTER S.R.L"],"created_at":"2026-08-19T12:00:00","estado":"pending","job_id":"0198b4e2-1234-7abc-9012-3456789abcde","nro_liquidacion":1,"periodo":"2026-08","status_url":"/api/v1/jobs/carga_931/0198b4e2-1234-7abc-9012-3456789abcde","tipo":"carga_931"}]},"Carga931IndividualCreatedResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"ID del job (UUID v7)","examples":["0198b4e2-1234-7abc-9012-3456789abcde"]},"tipo":{"type":"string","title":"Tipo","description":"Tipo de job","default":"carga_931_individual","examples":["carga_931_individual"]},"estado":{"type":"string","title":"Estado","description":"Estado inicial: pending","examples":["pending"]},"periodo":{"type":"string","title":"Periodo","description":"Período normalizado YYYY-MM","examples":["2026-08"]},"nro_liquidacion":{"type":"integer","title":"Nro Liquidacion","description":"Nro. liquidación","examples":[1]},"contribuyente":{"type":"string","title":"Contribuyente","description":"Razón social del contribuyente","examples":["EMPRESA EJEMPLO SRL"]},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Timestamp de creación","examples":["2026-08-19T12:00:00"]},"status_url":{"type":"string","title":"Status Url","description":"URL para consultar el job individual","examples":["/api/v1/jobs/carga_931_individual/0198b4e2-1234-7abc-9012-3456789abcde"]}},"type":"object","required":["job_id","estado","periodo","nro_liquidacion","contribuyente","created_at","status_url"],"title":"Carga931IndividualCreatedResponse","examples":[{"contribuyente":"EMPRESA EJEMPLO SRL","created_at":"2026-08-19T12:00:00","estado":"pending","job_id":"0198b4e2-1234-7abc-9012-3456789abcde","nro_liquidacion":1,"periodo":"2026-08","status_url":"/api/v1/jobs/carga_931_individual/0198b4e2-1234-7abc-9012-3456789abcde","tipo":"carga_931_individual"}]},"ClavePublicaResponse":{"properties":{"clave_publica":{"type":"string","title":"Clave Publica","description":"Clave pública RSA en formato PEM (X.509 SubjectPublicKeyInfo)"}},"type":"object","required":["clave_publica"],"title":"ClavePublicaResponse","description":"Respuesta del endpoint que expone la clave pública RSA."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JobArchivo":{"properties":{"empresa":{"type":"string","title":"Empresa","description":"Empresa a la que pertenece el archivo"},"tipo":{"type":"string","title":"Tipo","description":"Tipo de archivo: liquidaciones, conceptos, reporte, control"},"nombre_archivo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nombre Archivo","description":"Nombre del archivo descargado"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL presignada de MinIO (si minio=True y el archivo existe)"}},"type":"object","required":["empresa","tipo"],"title":"JobArchivo","description":"Archivo descargado por un job (nombre + URL de MinIO si existe)."},"JobArtefacto":{"properties":{"artefacto_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artefacto Id","description":"ID del artefacto (UUID v7)","examples":["0198b4e3-aaaa-7abc-9012-3456789abcde"]},"contribuyente":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contribuyente","description":"Contribuyente asociado (null para consolidado/log)","examples":["Control_EMPRESA_EJEMPLO_SRL_202608"]},"tipo":{"type":"string","title":"Tipo","description":"Tipo: control_individual, reporte_consolidado, log, resultado_json, f931_borrador","examples":["control_individual"]},"nombre_archivo":{"type":"string","title":"Nombre Archivo","description":"Nombre del archivo","examples":["Control_EMPRESA_EJEMPLO_SRL_202608.xlsx"]},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL presignada de MinIO (expira en 7 días)","examples":["https://s3.ca-central-1.s4.mega.io/xubio-sueldos/.../Control_EMPRESA_EJEMPLO_SRL_202608.xlsx?X-Amz-..."]},"sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sha256","description":"SHA256 del archivo","examples":["d802c5d7a3ef6394206762334685dec77d3dcf74bf8c6fb5cba7c0923fd756ed"]},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size","description":"Tamaño en bytes","examples":[48057]}},"type":"object","required":["tipo","nombre_archivo"],"title":"JobArtefacto","description":"Archivo de entrada, evidencia o reporte asociado a un job 931.","examples":[{"artefacto_id":"0198b4e3-aaaa-7abc-9012-3456789abcde","contribuyente":"Control_EMPRESA_EJEMPLO_SRL_202608","nombre_archivo":"Control_EMPRESA_EJEMPLO_SRL_202608.xlsx","sha256":"d802c5d7a3ef6394206762334685dec77d3dcf74bf8c6fb5cba7c0923fd756ed","size":48057,"tipo":"control_individual","url":"https://s3.ca-central-1.s4.mega.io/xubio-sueldos/xubio/carga-931/0198b4e2-1234-7abc-9012-3456789abcde/Control_EMPRESA_EJEMPLO_SRL_202608.xlsx?X-Amz-Algorithm=..."},{"artefacto_id":"0198b4e3-bbbb-7abc-9012-3456789abcde","nombre_archivo":"Reporte_Consolidado_931_202608_0198b4e2-1234-7abc-9012-3456789abcde.xlsx","sha256":"10dc8bd930eced201e32554fea71898c88d8d3419aa09bdf8bf67c8b5d5458b3","size":7653,"tipo":"reporte_consolidado","url":"https://s3.ca-central-1.s4.mega.io/xubio-sueldos/xubio/carga-931/0198b4e2-1234-7abc-9012-3456789abcde/Reporte_Consolidado_931_202608_...xlsx?X-Amz-..."}]},"JobCreatedResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"ID del job creado (UUID v7)"},"estado":{"type":"string","title":"Estado","description":"Estado inicial del job (pending)"},"contribuyentes":{"items":{"type":"string"},"type":"array","title":"Contribuyentes","description":"Lista de contribuyentes a procesar"},"periodo":{"type":"string","title":"Periodo","description":"Período de liquidación","default":""},"nro_liquidacion":{"type":"integer","title":"Nro Liquidacion","description":"Número de Liquidación AFIP","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Fecha de creación del job"},"tipo":{"type":"string","title":"Tipo","description":"Tipo de job","default":"descarga_sueldos"},"status_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Url","description":"URL para consultar el job"}},"type":"object","required":["job_id","estado","created_at"],"title":"JobCreatedResponse","description":"Respuesta del endpoint que crea un job."},"JobListItem":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"ID del job (UUID v7)"},"estado":{"type":"string","title":"Estado","description":"Estado: pending, running, completed, failed"},"contribuyentes":{"items":{"type":"string"},"type":"array","title":"Contribuyentes","description":"Lista de contribuyentes consultados"},"periodo":{"type":"string","title":"Periodo","description":"Período de liquidación","default":""},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Fecha de creación del job"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At","description":"Fecha de finalización"},"tipo":{"type":"string","title":"Tipo","description":"Tipo de job","default":"descarga_sueldos"}},"type":"object","required":["job_id","estado","created_at"],"title":"JobListItem","description":"Resumen de un job para la lista."},"JobListResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Cantidad total de jobs que matchean los filtros"},"page":{"type":"integer","title":"Page","description":"Número de página actual (1-indexed)"},"page_size":{"type":"integer","title":"Page Size","description":"Cantidad máxima de items por página"},"pages":{"type":"integer","title":"Pages","description":"Cantidad total de páginas"},"items":{"items":{"$ref":"#/components/schemas/JobListItem"},"type":"array","title":"Items","description":"Jobs de la página actual"}},"type":"object","required":["total","page","page_size","pages"],"title":"JobListResponse","description":"Respuesta paginada del listado de jobs."},"JobStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"ID del job (UUID v7)","examples":["0198b4e2-1234-7abc-9012-3456789abcde"]},"estado":{"type":"string","title":"Estado","description":"Estado: pending, running, completed, failed","examples":["completed"]},"contribuyentes":{"items":{"type":"string"},"type":"array","title":"Contribuyentes","description":"Lista de contribuyentes a procesar","examples":[["EMPRESA EJEMPLO SRL"]]},"periodo":{"type":"string","title":"Periodo","description":"Período de liquidación","default":"","examples":["2026-08"]},"nro_liquidacion":{"type":"integer","title":"Nro Liquidacion","description":"Número de Liquidación AFIP","default":0,"examples":[1]},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Fecha de creación del job","examples":["2026-08-19T12:00:00"]},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At","description":"Fecha de inicio de ejecución","examples":["2026-08-19T12:00:05"]},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At","description":"Fecha de finalización","examples":["2026-08-19T12:03:45"]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Mensaje de error (si falló)","examples":[null]},"minio":{"type":"boolean","title":"Minio","description":"Si el job subió los archivos a MinIO","default":true,"examples":[true]},"archivos":{"items":{"$ref":"#/components/schemas/JobArchivo"},"type":"array","title":"Archivos","description":"Archivos descargados por el job (solo descarga_sueldos)"},"tipo":{"type":"string","title":"Tipo","description":"Tipo de job","default":"descarga_sueldos","examples":["carga_931"]},"fase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fase","description":"Fase actual: recepcion, cargando, controlando, reportando, finalizado","examples":["finalizado"]},"progreso":{"type":"object","title":"Progreso","description":"Progreso: {total, procesados, actual}","examples":[{"procesados":2,"total":2}]},"resultados":{"items":{"type":"object"},"type":"array","title":"Resultados","description":"Resultados detallados por contribuyente (solo carga_931)"},"control":{"type":"object","title":"Control","description":"Resultado global del control (solo carga_931)"},"artefactos":{"items":{"$ref":"#/components/schemas/JobArtefacto"},"type":"array","title":"Artefactos","description":"Reportes y evidencias con URLs presignadas (solo carga_931)"},"exito_100":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exito 100","description":"True solo si carga VALIDA + control OK para todos (solo carga_931)","examples":[true]},"estado_global":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estado Global","description":"OK, OK_SIN_CONTROL, PARCIAL, ERROR (solo carga_931)","examples":["OK"]}},"type":"object","required":["job_id","estado","created_at"],"title":"JobStatusResponse","description":"Estado completo de un job.","examples":[{"archivos":[],"artefactos":[{"artefacto_id":"0198b4e3-aaaa-7abc-9012-3456789abcde","contribuyente":"Control_EMPRESA_EJEMPLO_SRL_202608","nombre_archivo":"Control_EMPRESA_EJEMPLO_SRL_202608.xlsx","sha256":"d802c5d7a3ef6394206762334685dec77d3dcf74bf8c6fb5cba7c0923fd756ed","size":48057,"tipo":"control_individual","url":"https://s3.ca-central-1.s4.mega.io/xubio-sueldos/xubio/carga-931/0198b4e2-1234-7abc-9012-3456789abcde/Control_EMPRESA_EJEMPLO_SRL_202608.xlsx?X-Amz-..."},{"artefacto_id":"0198b4e3-bbbb-7abc-9012-3456789abcde","nombre_archivo":"Reporte_Consolidado_931_202608_0198b4e2-1234-7abc-9012-3456789abcde.xlsx","sha256":"10dc8bd930eced201e32554fea71898c88d8d3419aa09bdf8bf67c8b5d5458b3","size":7653,"tipo":"reporte_consolidado","url":"https://s3.ca-central-1.s4.mega.io/xubio-sueldos/xubio/carga-931/0198b4e2-1234-7abc-9012-3456789abcde/Reporte_Consolidado_931_202608_...xlsx?X-Amz-..."}],"contribuyentes":["EMPRESA EJEMPLO SRL","THE TYPESETTER S.R.L"],"control":{"errores":[],"estado":"OK"},"created_at":"2026-08-19T12:00:00","estado":"completed","estado_global":"OK","exito_100":true,"fase":"finalizado","finished_at":"2026-08-19T12:03:45","job_id":"0198b4e2-1234-7abc-9012-3456789abcde","minio":true,"nro_liquidacion":1,"periodo":"2026-08","progreso":{"procesados":2,"total":2},"resultados":[{"control":{"errores":[],"estado":"OK"},"cuit_representado":"30717289639","estado":"OK","estado_carga":"VALIDA","jurisdiccion":"mendoza","razon_social":"EMPRESA EJEMPLO SRL","scrap":{"datos":{"descuentos":"311675.40","formato":"lsd_tabla","no_remunerativos":"158250.22","nomina":2,"remunerativos":"1334885.18","trabajadores":2},"estado":"OK"},"tiempo_seg":57.85}],"started_at":"2026-08-19T12:00:05","tipo":"carga_931"},{"archivos":[],"artefactos":[],"contribuyentes":["EMPRESA EJEMPLO SRL"],"control":{"errores":[],"estado":"NO_EJECUTADO"},"created_at":"2026-08-19T12:00:00","estado":"completed","estado_global":"OK_SIN_CONTROL","exito_100":false,"fase":"finalizado","finished_at":"2026-08-19T12:01:10","job_id":"0198b4e2-aaaa-7abc-9012-3456789abcde","minio":true,"nro_liquidacion":1,"periodo":"2026-08","progreso":{"procesados":1,"total":1},"resultados":[{"control":{"errores":[],"estado":"NO_EJECUTADO","faltantes":["conceptos","control","reporte"]},"cuit_representado":"30717289639","estado":"OK","estado_carga":"VALIDA","jurisdiccion":"mendoza","razon_social":"EMPRESA EJEMPLO SRL","scrap":{"datos":{"descuentos":"311675.40","formato":"lsd_tabla","no_remunerativos":"158250.22","remunerativos":"1334885.18","trabajadores":2},"estado":"OK"}}],"started_at":"2026-08-19T12:00:05","tipo":"carga_931"}]},"SueldosDescargaRequest":{"properties":{"usuario_cifrado":{"type":"string","title":"Usuario Cifrado","description":"Usuario de Xubio (Visma Connect) cifrado con RSA-OAEP + base64"},"clave_cifrado":{"type":"string","title":"Clave Cifrado","description":"Contraseña de Xubio (Visma Connect) cifrada con RSA-OAEP + base64"},"contribuyentes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Contribuyentes","description":"Lista de empresas a procesar (si se setea, se itera sobre todas; si se omite, usa la empresa activa)"},"periodo":{"type":"string","title":"Periodo","description":"Período de liquidación, ej. 202607 o 2026-07","default":""},"nro_liquidacion":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Nro Liquidacion","description":"Número de Liquidación AFIP (0-10)","default":0},"proxy":{"type":"boolean","title":"Proxy","description":"Usa la configuración de proxy del servidor","default":false},"minio":{"type":"boolean","title":"Minio","description":"Sube los archivos a MinIO y devuelve las URLs (default True)","default":true}},"type":"object","required":["usuario_cifrado","clave_cifrado"],"title":"SueldosDescargaRequest","description":"Modelo de entrada para la descarga de sueldos Xubio.\n\nLos campos ``usuario_cifrado`` y ``clave_cifrado`` son las credenciales\nde Xubio (usuario/contraseña de Visma Connect) cifradas con RSA-OAEP\n(SHA-256) usando la clave pública expuesta en ``GET /api/v1/clave-publica``\ny codificadas en base64."},"SueldosDescargaResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Indica si la descarga fue exitosa"},"message":{"type":"string","title":"Message","description":"Mensaje descriptivo del resultado"},"empresa":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Empresa","description":"Empresa efectivamente procesada"},"archivos":{"items":{"$ref":"#/components/schemas/ArchivoDescargado"},"type":"array","title":"Archivos","description":"Archivos descargados"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"Errores ocurridos durante la ejecución"}},"type":"object","required":["success","message"],"title":"SueldosDescargaResponse","description":"Respuesta de la descarga de sueldos Xubio."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}