{"openapi":"3.0.3","info":{"title":"demoRendiciones API","version":"1.2.0","description":"API-first multiempresa de rendiciones de gastos.\n\n**Contrato único** para front propio e integradores (JWT usuario y/o API Key por empresa).\n\n### Circuitos\n- **standard** (estados 0–3): create → PENDING → workflow → firma → PENDING_PAYMENT → PAID\n- **viaticos_apsv** (estados 4–10): DRAFT → SUBMITTED → APPROVED → PENDING_SETTLEMENT → SETTLED/OBSERVED → LIQUIDATED\n- **Gastos / missions** (circuito aparte): DRAFT → PENDING → liquidación por persona → cantidades → LIQUIDATED\n\n### Envelope de respuesta JSON\n```json\n{ \"success\": true, \"message\": \"OK\", \"data\": {}, \"meta\": { \"page\": 1, \"pageSize\": 20, \"total\": 0 } }\n```\n\nErrores: `{ \"success\": false, \"message\": \"...\" }` con HTTP 4xx/5xx.\n\nDocumentación humana: `docs/api/API.md` · Wiki: `docs/wiki.html` · UI: `/api-docs`.","contact":{"name":"demoRendiciones"}},"servers":[{"url":"/api/v1","description":"Prefijo versionado (relativo al host de la app)"},{"url":"http://127.0.0.1:3010/api/v1","description":"Local tipico"}],"tags":[{"name":"Auth","description":"Login JWT (sin auth previa)"},{"name":"Companies","description":"Multiempresa y subempresas (árbol parentId)"},{"name":"FormConfig","description":"Formularios custom por empresa (standard | viaticos_apsv)"},{"name":"Users","description":"Personas/usuarios e import masivo scoped al tenant"},{"name":"Menu","description":"Catálogo y menú por usuario (admin)"},{"name":"Reimbursements","description":"Rendiciones standard + circuito APSV"},{"name":"WorkflowTemplates","description":"Plantillas de aprobación N niveles por empresa"},{"name":"PersonWorkflows","description":"Override de workflow por persona"},{"name":"Notifications","description":"Bandeja in-app (§10)"},{"name":"Reports","description":"Reportes Excel §11 + person-month"},{"name":"AI","description":"Análisis OCR / IA vía AiAnalysisService"},{"name":"ExpenseTypes","description":"Tipos de gasto y tarifas mensuales (circuito Gastos)"},{"name":"Missions","description":"Solicitudes de gasto / misiones (expense claims)"},{"name":"PersonSettlements","description":"Liquidación por persona del circuito Gastos"},{"name":"Signatures","description":"Certificación de firma (stub)"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Token de POST /auth/login. Header: Authorization: Bearer <token>"},"apiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API Key de integración ligada a una empresa (seed demo no-prod)."}},"parameters":{"IdPath":{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"},"Page":{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},"PageSize":{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}}},"schemas":{"SuccessEnvelope":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"OK"},"data":{},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}},"ErrorResponse":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string"}}},"PaginationMeta":{"type":"object","properties":{"page":{"type":"integer"},"pageSize":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"}}},"StatusPayload":{"type":"object","properties":{"id":{"type":"integer","description":"0–10 según circuito"},"name":{"type":"string","example":"PENDING"},"label":{"type":"string","example":"Pendiente de aprobación"}}},"LoginRequest":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email","example":"empleado@sur.demo"},"password":{"type":"string","format":"password","example":"Demo123!"}}},"LoginResponse":{"type":"object","properties":{"token":{"type":"string"},"user":{"type":"object","properties":{"id":{"type":"integer"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"role":{"type":"string","enum":["admin","employee","approver","administrative"]},"companyId":{"type":"integer"},"scopeCompanyIds":{"type":"array","items":{"type":"integer"}}}}}},"Company":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"code":{"type":"string"},"parentId":{"type":"integer","nullable":true},"active":{"type":"boolean"},"aiScanEnabled":{"type":"boolean"},"nitroAuthEnabled":{"type":"boolean","default":false},"nitroAuthUrl":{"type":"string","nullable":true,"example":"http://core-auth"},"nitroAuthClientId":{"type":"string","nullable":true},"nitroAuthHasApiKey":{"type":"boolean","description":"true si hay API key configurada; el valor nunca se devuelve"},"currency":{"type":"string","example":"ARS"}}},"CompanyCreate":{"type":"object","required":["name","code"],"properties":{"name":{"type":"string"},"code":{"type":"string"},"parentId":{"type":"integer","nullable":true,"description":"NULL = raíz; FK a companies.id"},"active":{"type":"boolean","default":true},"aiScanEnabled":{"type":"boolean"},"nitroAuthEnabled":{"type":"boolean","default":false},"nitroAuthUrl":{"type":"string","nullable":true},"nitroAuthClientId":{"type":"string","nullable":true},"nitroAuthApiKey":{"type":"string","nullable":true,"description":"Write-only. Vacío en PATCH no cambia el valor guardado."},"currency":{"type":"string"}}},"FormConfig":{"type":"object","properties":{"companyId":{"type":"integer"},"formCode":{"type":"string","enum":["standard","viaticos_apsv"]},"schemaJson":{"type":"object","additionalProperties":true},"viaticoRulesJson":{"type":"object","additionalProperties":true,"nullable":true},"active":{"type":"boolean"}}},"FormConfigUpsert":{"type":"object","properties":{"formCode":{"type":"string","enum":["standard","viaticos_apsv"]},"schemaJson":{"type":"object"},"viaticoRulesJson":{"type":"object","nullable":true},"active":{"type":"boolean"}}},"User":{"type":"object","properties":{"id":{"type":"integer"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"documentId":{"type":"string","nullable":true},"docket":{"type":"string","nullable":true},"role":{"type":"string"},"companyId":{"type":"integer"},"active":{"type":"boolean"},"area":{"type":"string","nullable":true},"jobTitle":{"type":"string","nullable":true}}},"UserCreate":{"type":"object","required":["email","firstName","lastName","role","companyId","password"],"properties":{"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"documentId":{"type":"string"},"docket":{"type":"string"},"role":{"type":"string","enum":["admin","employee","approver","administrative"]},"companyId":{"type":"integer"},"password":{"type":"string"},"active":{"type":"boolean","default":true},"area":{"type":"string"},"jobTitle":{"type":"string"}}},"ImportResult":{"type":"object","properties":{"created":{"type":"integer"},"updated":{"type":"integer"},"skipped":{"type":"integer"},"errors":{"type":"array","items":{"type":"object","properties":{"line":{"type":"integer"},"reason":{"type":"string"}}}}}},"ExpenseLineInput":{"type":"object","properties":{"date":{"type":"string","format":"date"},"amount":{"type":"number"},"observation":{"type":"string"},"merchantName":{"type":"string","nullable":true},"concept":{"type":"string"},"type":{"type":"string"},"number":{"type":"string"}}},"ViaticoLineInput":{"type":"object","properties":{"direction":{"type":"string","description":"ida | regreso"},"days":{"type":"number"},"quota":{"type":"number"},"amount":{"type":"number"}}},"Reimbursement":{"type":"object","properties":{"id":{"type":"integer"},"date":{"type":"string","format":"date-time"},"amount":{"type":"number","nullable":true},"observation":{"type":"string","nullable":true},"statusId":{"type":"integer"},"status":{"$ref":"#/components/schemas/StatusPayload"},"formCode":{"type":"string","enum":["standard","viaticos_apsv"]},"companyId":{"type":"integer"},"userId":{"type":"integer"},"currency":{"type":"string"},"merchantName":{"type":"string","nullable":true},"destination":{"type":"string","nullable":true},"motive":{"type":"string","nullable":true},"startAt":{"type":"string","nullable":true},"endAt":{"type":"string","nullable":true},"externalId":{"type":"string","nullable":true},"attachments":{"type":"array","items":{"type":"object"}},"workflow":{"type":"object","nullable":true},"expenseLines":{"type":"array","items":{"type":"object"}},"viaticoLines":{"type":"array","items":{"type":"object"}}}},"ApproveRequest":{"type":"object","properties":{"approve":{"type":"boolean","default":true,"description":"false = rechazar → DISMISSED"},"motive":{"type":"string","description":"Obligatorio en rechazo"},"level":{"type":"integer","description":"Admin/nivel superior: decidir nivel concreto"},"detailId":{"type":"integer","description":"Admin: detalle de workflow concreto"}}},"SettlementRequest":{"type":"object","properties":{"viaticoLines":{"type":"array","items":{"$ref":"#/components/schemas/ViaticoLineInput"}},"expenseLines":{"type":"array","items":{"$ref":"#/components/schemas/ExpenseLineInput"}}}},"WorkflowTemplate":{"type":"object","properties":{"id":{"type":"integer"},"companyId":{"type":"integer"},"name":{"type":"string"},"active":{"type":"boolean"},"levels":{"type":"array","items":{"type":"object","properties":{"level":{"type":"integer"},"userId":{"type":"integer"},"label":{"type":"string"}}}}}},"Notification":{"type":"object","properties":{"id":{"type":"integer"},"userId":{"type":"integer"},"companyId":{"type":"integer"},"title":{"type":"string"},"body":{"type":"string"},"readAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"emailStatus":{"type":"string","nullable":true}}},"ReportCatalogItem":{"type":"object","properties":{"code":{"type":"string","example":"solicitudes_pendientes"},"name":{"type":"string"},"description":{"type":"string"}}},"AiSuggestion":{"type":"object","properties":{"date":{"type":"string","format":"date"},"amount":{"type":"number"},"observation":{"type":"string"},"currency":{"type":"string","example":"ARS"},"merchant":{"type":"string","nullable":true},"confidence":{"type":"number","minimum":0,"maximum":1},"rawText":{"type":"string","nullable":true},"partial":{"type":"boolean"},"retry_suggested":{"type":"boolean"}}},"ExpenseType":{"type":"object","properties":{"id":{"type":"integer"},"companyId":{"type":"integer"},"code":{"type":"string"},"slug":{"type":"string"},"label":{"type":"string"},"active":{"type":"boolean"},"sortOrder":{"type":"integer"},"allowsDecimalQty":{"type":"boolean"}}},"MissionCreate":{"type":"object","required":["agents","selectedTypeIds"],"properties":{"destination":{"type":"string"},"delegationId":{"type":"integer","nullable":true},"motive":{"type":"string"},"startAt":{"type":"string"},"endAt":{"type":"string"},"officialMobility":{"type":"string","enum":["si","no"],"default":"no"},"vehicleDomain":{"type":"string"},"observations":{"type":"string"},"agents":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"userId":{"type":"integer"}}}},"selectedTypeIds":{"type":"array","items":{"type":"integer"}},"signature":{"type":"object","nullable":true}}},"PersonApprove":{"type":"object","properties":{"approve":{"type":"boolean","default":true},"motive":{"type":"string"}}},"PersonQuantities":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"object","properties":{"expenseTypeId":{"type":"integer"},"quantity":{"type":"number","nullable":true}}}}}},"MonthlyRatesPut":{"type":"object","required":["year","month","rates"],"properties":{"year":{"type":"integer","example":2026},"month":{"type":"integer","minimum":1,"maximum":12},"rates":{"type":"array","items":{"type":"object","properties":{"expenseTypeId":{"type":"integer"},"unitRate":{"type":"number"}}}}}}},"responses":{"Unauthorized":{"description":"No autenticado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Forbidden":{"description":"Sin permiso / fuera de scope tenant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"NotFound":{"description":"No encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"BadRequest":{"description":"Validación / regla de negocio","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"paths":{"/auth/login":{"post":{"summary":"Login email/password → JWT","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}}},"responses":{"200":{"description":"Login OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LoginResponse"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[],"operationId":"login"}},"/companies":{"get":{"summary":"Listar empresas del scope","tags":["Companies"],"parameters":[{"name":"tree","in":"query","schema":{"type":"string","enum":["0","1"]},"description":"1 = estructura árbol"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Company"}},{"type":"object"}]}}}]}}}}},"operationId":"listCompanies"},"post":{"summary":"Crear empresa o subempresa","tags":["Companies"],"description":"Rol **admin**. `parentId` opcional; no puede crear ciclos.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyCreate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Company"}}}]}}}},"403":{"$ref":"#/components/responses/Forbidden"}},"operationId":"createCompany"}},"/companies/{id}":{"get":{"summary":"Detalle de empresa","tags":["Companies"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Company"}}}]}}}},"404":{"$ref":"#/components/responses/NotFound"}},"operationId":"getCompany"},"patch":{"summary":"Actualizar empresa","tags":["Companies"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyCreate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Company"}}}]}}}},"403":{"$ref":"#/components/responses/Forbidden"}},"operationId":"updateCompany"},"delete":{"summary":"Desactivar empresa (soft delete)","tags":["Companies"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}},"403":{"$ref":"#/components/responses/Forbidden"}},"operationId":"deleteCompany"}},"/companies/{id}/tree":{"get":{"summary":"Subárbol desde la empresa","tags":["Companies"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"getCompanyTree"}},"/companies/{id}/form-config":{"get":{"summary":"Leer form-config de la empresa","tags":["FormConfig"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/FormConfig"}}}]}}}}},"operationId":"getFormConfig"},"put":{"summary":"Upsert form-config (admin)","tags":["FormConfig"],"description":"`formCode=standard` sin regresión; `viaticos_apsv` habilita estados 4–10 y endpoints settlement/observe/liquidate.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormConfigUpsert"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/FormConfig"}}}]}}}},"403":{"$ref":"#/components/responses/Forbidden"}},"operationId":"putFormConfig"}},"/users":{"get":{"summary":"Listar usuarios del scope","tags":["Users"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}},{"name":"companyId","in":"query","schema":{"type":"integer"}},{"name":"role","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Búsqueda texto"}],"responses":{"200":{"description":"Usuarios + meta paginación","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}]}}}}},"operationId":"listUsers"},"post":{"summary":"Alta unitaria de persona","tags":["Users"],"description":"Admin. `companyId` obligatorio y dentro del scope.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"201":{"description":"Usuario creado","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"}}}]}}}},"403":{"$ref":"#/components/responses/Forbidden"}},"operationId":"createUser"}},"/users/import":{"post":{"summary":"Import JSON de personas","tags":["Users"],"description":"Body: array de usuarios **o** `{ users: [], continueOnError, upsert }`. Respuesta con created/updated/skipped/errors[].","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/UserCreate"}},{"type":"object","properties":{"users":{"type":"array","items":{"$ref":"#/components/schemas/UserCreate"}},"continueOnError":{"type":"boolean","default":true},"upsert":{"type":"boolean","default":true}}}]}}}},"responses":{"200":{"description":"Importación finalizada","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ImportResult"}}}]}}}}},"operationId":"importUsersJson"}},"/users/import/file":{"post":{"summary":"Import CSV/XLSX de personas","tags":["Users"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"},"continueOnError":{"type":"string","enum":["true","false"],"default":"true"},"upsert":{"type":"string","enum":["true","false"],"default":"true"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ImportResult"}}}]}}}}},"operationId":"importUsersFile"}},"/users/{id}/deactivate":{"post":{"summary":"Desactivar usuario (baja lógica APSV + Auth si Nitro está on)","tags":["Users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Usuario desactivado"},"403":{"description":"Fuera de alcance"},"404":{"description":"No encontrado"}}}},"/users/{id}/activate":{"post":{"summary":"Reactivar usuario (APSV + Auth si Nitro está on)","tags":["Users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Usuario activado"},"403":{"description":"Fuera de alcance"},"404":{"description":"No encontrado"}}}},"/users/{id}/menu":{"get":{"summary":"Menú configurado del usuario","tags":["Menu"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"getUserMenu"},"put":{"summary":"Actualizar menú del usuario","tags":["Menu"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"putUserMenu"}},"/menu-catalog":{"get":{"summary":"Catálogo de ítems de menú","tags":["Menu"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object","properties":{"items":{"type":"array"}}}}}]}}}}},"operationId":"getMenuCatalog"}},"/notifications":{"get":{"summary":"Listar notificaciones in-app","tags":["Notifications"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}},{"name":"unreadOnly","in":"query","schema":{"type":"string","enum":["0","1"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object","properties":{"rows":{"type":"array","items":{"$ref":"#/components/schemas/Notification"}},"unreadCount":{"type":"integer"}}}}}]}}}}},"operationId":"listNotifications"}},"/notifications/read-all":{"post":{"summary":"Marcar todas como leídas","tags":["Notifications"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"readAllNotifications"}},"/notifications/{id}/read":{"post":{"summary":"Marcar una notificación como leída","tags":["Notifications"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Notification"}}}]}}}}},"operationId":"readNotification"}},"/reports":{"get":{"summary":"Catálogo de reportes §11","tags":["Reports"],"description":"Roles admin/approver. Códigos: solicitudes_aprobadas, solicitudes_rechazadas, solicitudes_pendientes, rendiciones_pendientes, rendiciones_liquidadas, etc.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ReportCatalogItem"}}}}]}}}}},"operationId":"listReports"}},"/reports/person-month":{"get":{"summary":"Reporte persona/mes (JSON, circuito Gastos)","tags":["Reports"],"parameters":[{"name":"year","in":"query","schema":{"type":"integer"}},{"name":"month","in":"query","schema":{"type":"integer"}},{"name":"userId","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"personMonthReport"}},"/reports/person-month/export":{"get":{"summary":"Export Excel persona/mes","tags":["Reports"],"parameters":[{"name":"year","in":"query","schema":{"type":"integer"}},{"name":"month","in":"query","schema":{"type":"integer"}},{"name":"userId","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"xlsx","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}}},"operationId":"exportPersonMonthReport"}},"/reports/{code}/export":{"get":{"summary":"Export Excel de reporte §11","tags":["Reports"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","schema":{"type":"string","format":"date"}},{"name":"companyId","in":"query","schema":{"type":"integer"}},{"name":"area","in":"query","schema":{"type":"string"}},{"name":"destination","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"xlsx scoped tenant","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}}},"operationId":"exportReport"}},"/reimbursements":{"get":{"summary":"Listar rendiciones con proceso","tags":["Reimbursements"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}},{"name":"statusId","in":"query","schema":{"type":"integer"}},{"name":"userId","in":"query","schema":{"type":"integer"}},{"name":"companyId","in":"query","schema":{"type":"integer"}},{"name":"from","in":"query","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","schema":{"type":"string","format":"date"}},{"name":"inbox","in":"query","schema":{"type":"string","enum":["0","1"]},"description":"1 = bandeja de aprobación del usuario"}],"responses":{"200":{"description":"Listado + meta","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Reimbursement"}}}}]}}}}},"operationId":"listReimbursements"},"post":{"summary":"Crear rendición (multipart)","tags":["Reimbursements"],"description":"**standard:** crea en PENDING + workflow. Requiere al menos 1 adjunto (salvo reglas APSV borrador).\n\n**viaticos_apsv:** crea en DRAFT (amount/observation pueden ser nullable).\n\nCon `lines` JSON + `files` 1:1 recalcula amount/date/merchant de cabecera.\n\nCon API Key, enviar `userId` del solicitante.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"companyId":{"type":"integer"},"userId":{"type":"integer","description":"Requerido con API Key"},"date":{"type":"string","format":"date"},"amount":{"type":"number"},"observation":{"type":"string"},"currency":{"type":"string","default":"ARS"},"merchantName":{"type":"string"},"lines":{"type":"string","description":"JSON array de líneas TKT"},"destination":{"type":"string"},"motive":{"type":"string"},"startAt":{"type":"string"},"endAt":{"type":"string"},"officialVehicle":{"type":"string"},"vehiclePlate":{"type":"string"},"agents":{"type":"string","description":"JSON"},"payload":{"type":"string","description":"JSON schema-driven"},"files":{"type":"array","items":{"type":"string","format":"binary"},"maxItems":10}}}}}},"responses":{"201":{"description":"Rendición creada","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}},"operationId":"createReimbursement"}},"/reimbursements/export":{"get":{"summary":"Export listado Excel/CSV (proceso completo)","tags":["Reimbursements"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}},{"name":"statusId","in":"query","schema":{"type":"integer"}},{"name":"userId","in":"query","schema":{"type":"integer"}},{"name":"companyId","in":"query","schema":{"type":"integer"}},{"name":"from","in":"query","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","schema":{"type":"string","format":"date"}},{"name":"inbox","in":"query","schema":{"type":"string","enum":["0","1"]},"description":"1 = bandeja de aprobación del usuario"},{"name":"format","in":"query","schema":{"type":"string","enum":["xlsx","csv"],"default":"xlsx"}}],"responses":{"200":{"description":"Archivo","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}},"text/csv":{"schema":{"type":"string","format":"binary"}}}}},"operationId":"exportReimbursements"}},"/reimbursements/{id}":{"get":{"summary":"Detalle completo (cabecera + adjuntos + workflow + líneas)","tags":["Reimbursements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}},"404":{"$ref":"#/components/responses/NotFound"}},"operationId":"getReimbursement"},"delete":{"summary":"Eliminar / cancelar según estado","tags":["Reimbursements"],"description":"Cancelar o borrar físico si DISMISSED (reglas en ReimbursementService).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}},"operationId":"deleteReimbursement"}},"/reimbursements/{id}/pdf":{"get":{"summary":"Descargar PDF planillas / comprobante","tags":["Reimbursements"],"description":"APSV: liquidación + viáticos/gastos + imágenes. Standard: comprobante + adjuntos.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"PDF","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}}},"operationId":"downloadReimbursementPdf"}},"/reimbursements/{id}/events":{"get":{"summary":"Historial de eventos","tags":["Reimbursements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}}}}]}}}}},"operationId":"listReimbursementEvents"}},"/reimbursements/{id}/attachments/{attachmentId}":{"get":{"summary":"Descargar adjunto","tags":["Reimbursements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Archivo (Content-Type según mime)","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}},"operationId":"downloadAttachment"}},"/reimbursements/{id}/update":{"post":{"summary":"Editar rendición","tags":["Reimbursements"],"description":"Standard: solo PENDING sin niveles revisados. APSV: DRAFT / OBSERVED según regla.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"date":{"type":"string"},"amount":{"type":"number"},"observation":{"type":"string"},"lines":{"type":"string"},"agents":{"type":"string"},"payload":{"type":"string"},"files":{"type":"array","items":{"type":"string","format":"binary"}}}}},"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}}},"operationId":"updateReimbursement"}},"/reimbursements/{id}/submit":{"post":{"summary":"APSV: confirmar borrador → SUBMITTED + workflow","tags":["Reimbursements"],"description":"Solo formCode=viaticos_apsv. Exige plantilla activa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}},"operationId":"submitReimbursement"}},"/reimbursements/{id}/settlement":{"post":{"summary":"APSV: cargar rendición de gastos","tags":["Reimbursements"],"description":"Desde PENDING_SETTLEMENT u OBSERVED → SETTLED.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"viaticoLines":{"type":"string","description":"JSON array"},"expenseLines":{"type":"string","description":"JSON array"},"files":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}}},"operationId":"settlementReimbursement"}},"/reimbursements/{id}/observe":{"post":{"summary":"APSV: observar rendición → OBSERVED","tags":["Reimbursements"],"description":"Rol admin.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"motive":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}}},"operationId":"observeReimbursement"}},"/reimbursements/{id}/liquidate":{"post":{"summary":"APSV: liquidar → LIQUIDATED","tags":["Reimbursements"],"description":"Solo desde SETTLED. Rol admin.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}}},"operationId":"liquidateReimbursement"}},"/reimbursements/{id}/cancel":{"post":{"summary":"Cancelar → DISMISSED","tags":["Reimbursements"],"description":"PENDING sin revisiones (standard) o DRAFT (APSV) según reglas.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}}},"operationId":"cancelReimbursement"}},"/reimbursements/{id}/approve":{"post":{"summary":"Decidir nivel de workflow","tags":["Reimbursements"],"description":"Roles approver/admin. Rechazo → DISMISSED. APSV: todos OK → APPROVED → PENDING_SETTLEMENT.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}},"403":{"$ref":"#/components/responses/Forbidden"}},"operationId":"approveReimbursement"}},"/reimbursements/{id}/pay":{"post":{"summary":"Marcar pagada (PENDING_PAYMENT → PAID)","tags":["Reimbursements"],"description":"Admin. Adjuntos opcionales tipo payment_proof.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"paymentReference":{"type":"string"},"motive":{"type":"string"},"files":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}}},"operationId":"payReimbursement"}},"/reimbursements/{id}/signature":{"post":{"summary":"Firmar → PENDING_PAYMENT (standard)","tags":["Reimbursements"],"description":"Niveles completos APPROVED; sin externalId previo.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["signature"],"properties":{"signature":{"type":"string","description":"Base64 o texto"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Reimbursement"}}}]}}}}},"operationId":"signatureReimbursement"}},"/workflow-templates":{"get":{"summary":"Listar plantillas del scope","tags":["WorkflowTemplates"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowTemplate"}}}}]}}}}},"operationId":"listTemplates"},"post":{"summary":"Crear plantilla (admin)","tags":["WorkflowTemplates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowTemplate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WorkflowTemplate"}}}]}}}}},"operationId":"createTemplate"}},"/workflow-templates/{id}":{"get":{"summary":"Detalle plantilla","tags":["WorkflowTemplates"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WorkflowTemplate"}}}]}}}}},"operationId":"getTemplate"},"patch":{"summary":"Actualizar plantilla (admin)","tags":["WorkflowTemplates"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowTemplate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WorkflowTemplate"}}}]}}}}},"operationId":"updateTemplate"},"delete":{"summary":"Eliminar plantilla (admin)","tags":["WorkflowTemplates"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"deleteTemplate"}},"/person-workflows":{"get":{"summary":"Listar overrides de workflow por persona","tags":["PersonWorkflows"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}}}}]}}}}},"operationId":"listPersonWorkflows"}},"/person-workflows/person/{userId}":{"get":{"summary":"Override de una persona","tags":["PersonWorkflows"],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer"}},{"name":"companyId","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"getPersonWorkflow"},"put":{"summary":"Upsert override por persona","tags":["PersonWorkflows"],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"companyId":{"type":"integer"},"levels":{"type":"array","items":{"type":"object"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"putPersonWorkflow"},"delete":{"summary":"Eliminar override (vuelve a plantilla global)","tags":["PersonWorkflows"],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer"}},{"name":"companyId","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"deletePersonWorkflow"}},"/ai/analyze":{"post":{"summary":"IA suggest — analizar comprobante","tags":["AI"],"description":"Requiere company.aiScanEnabled. Si retry_suggested=true, pedir nueva foto antes de guardar.","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"},"maxItems":1},"text":{"type":"string"},"companyId":{"type":"integer"},"mode":{"type":"string","enum":["suggest","auto_create","enrich"],"default":"suggest"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object","properties":{"suggestion":{"$ref":"#/components/schemas/AiSuggestion"}}}}}]}}}},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"description":"OCR ilegible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"AI_ENABLED=false o proveedor no configurado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"aiAnalyze"}},"/ai/analyze-and-create":{"post":{"summary":"IA auto_create — analiza y crea rendición","tags":["AI"],"description":"Si confidence < umbral o retry_suggested, no crea (created:false). Preferir analyze + confirmación UI.","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"},"maxItems":10},"companyId":{"type":"integer"},"observation":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object","properties":{"suggestion":{"$ref":"#/components/schemas/AiSuggestion"},"created":{"type":"boolean"},"reimbursement":{"$ref":"#/components/schemas/Reimbursement"},"retrySuggested":{"type":"boolean"}}}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}},"operationId":"aiAnalyzeAndCreate"}},"/expense-types":{"get":{"summary":"Listar tipos de gasto","tags":["ExpenseTypes"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ExpenseType"}}}}]}}}}},"operationId":"listExpenseTypes"},"post":{"summary":"Crear tipo de gasto (admin)","tags":["ExpenseTypes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseType"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ExpenseType"}}}]}}}}},"operationId":"createExpenseType"}},"/expense-types/monthly-rates":{"get":{"summary":"Listar tarifas mensuales","tags":["ExpenseTypes"],"parameters":[{"name":"year","in":"query","schema":{"type":"integer"}},{"name":"month","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}}}}]}}}}},"operationId":"listMonthlyRates"},"put":{"summary":"Reemplazar tarifas del mes","tags":["ExpenseTypes"],"description":"Roles admin/administrative.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthlyRatesPut"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}}}}]}}}}},"operationId":"putMonthlyRates"}},"/expense-types/{id}":{"put":{"summary":"Actualizar tipo de gasto (admin)","tags":["ExpenseTypes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseType"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ExpenseType"}}}]}}}}},"operationId":"updateExpenseType"}},"/delegations":{"get":{"summary":"Listar delegaciones (catálogo circuito Gastos)","tags":["Missions"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}}}}]}}}}},"operationId":"listDelegations"}},"/missions":{"get":{"summary":"Listar solicitudes de gasto","tags":["Missions"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}}}}}}]}}}}},"operationId":"listMissions"},"post":{"summary":"Crear gasto/misión (DRAFT)","tags":["Missions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionCreate"}}}},"responses":{"201":{"description":"Gasto creado","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"createMission"}},"/missions/{id}":{"get":{"summary":"Detalle de gasto/misión","tags":["Missions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"getMission"}},"/missions/{id}/update":{"post":{"summary":"Editar borrador de gasto","tags":["Missions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionCreate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"updateMission"}},"/missions/{id}/submit":{"post":{"summary":"Enviar gasto a aprobación","tags":["Missions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"submitMission"}},"/person-settlements":{"get":{"summary":"Listar liquidaciones por persona","tags":["PersonSettlements"],"parameters":[{"name":"status","in":"query","schema":{"type":"string"}},{"name":"year","in":"query","schema":{"type":"integer"}},{"name":"month","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}}}}]}}}}},"operationId":"listPersonSettlements"}},"/person-settlements/{id}":{"get":{"summary":"Detalle liquidación persona","tags":["PersonSettlements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"getPersonSettlement"}},"/person-settlements/{id}/approve":{"post":{"summary":"Aprobar/rechazar nivel (liquidación persona)","tags":["PersonSettlements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonApprove"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"approvePersonSettlement"}},"/person-settlements/{id}/quantities":{"patch":{"summary":"Cargar cantidades / tarifas snapshot","tags":["PersonSettlements"],"description":"Roles administrative/admin. Exige tarifas del mes.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonQuantities"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"patchPersonQuantities"}},"/person-settlements/{id}/attachments":{"post":{"summary":"Adjuntar archivos a liquidación persona","tags":["PersonSettlements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"addPersonAttachment"}},"/person-settlements/{id}/attachments/{attachmentId}":{"get":{"summary":"Descargar adjunto de liquidación persona","tags":["PersonSettlements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Archivo","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}},"operationId":"downloadPersonAttachment"}},"/person-settlements/{id}/observe":{"post":{"summary":"Observar liquidación persona","tags":["PersonSettlements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"motive":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"observePersonSettlement"}},"/person-settlements/{id}/liquidate":{"post":{"summary":"Liquidar persona","tags":["PersonSettlements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"liquidatePersonSettlement"}},"/person-settlements/{id}/unliquidate":{"post":{"summary":"Deshacer liquidación","tags":["PersonSettlements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"unliquidatePersonSettlement"}},"/person-settlements/{id}/pdf":{"get":{"summary":"PDF liquidación persona","tags":["PersonSettlements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identificador numérico"}],"responses":{"200":{"description":"PDF","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}}},"operationId":"downloadPersonPdf"}},"/persons":{"get":{"summary":"Listar personas del circuito Gastos","tags":["PersonSettlements"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}}}}]}}}}},"operationId":"listExpensePersons"}},"/signatures/certify":{"post":{"summary":"Certificar firma (stub)","tags":["Signatures"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"Firma registrada (stub)","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SuccessEnvelope"},{"type":"object","properties":{"data":{"type":"object"}}}]}}}}},"operationId":"certifySignature"}}}}