{"openapi":"3.1.0","info":{"title":"GdPresencia REST API","version":"1.0.0","description":"Contrato publico v1 de GdPresencia. Los endpoints disponibles se determinan por el dominio y la configuracion de programas."},"servers":[{"url":"https://api.gdpresencia.com/api/v1"}],"tags":[{"name":"Ausencias"},{"name":"Fichajes"}],"paths":{"/health":{"get":{"tags":["Sistema"],"summary":"Estado público de la API","operationId":"health","x-gdtaller-implementation-status":"implemented","security":[],"responses":{"200":{"description":"OK"}}}},"/auth/login":{"post":{"tags":["Autenticación"],"summary":"Obtener token temporal","operationId":"auth_login","x-gdtaller-implementation-status":"implemented","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthLogin"}}}},"responses":{"200":{"description":"Token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthToken"}}}},"401":{"description":"Credenciales inválidas"}}}},"/auth/me":{"get":{"tags":["Autenticación"],"summary":"Consultar credencial y permisos","operationId":"auth_me","x-gdtaller-implementation-status":"implemented","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Datos de sesión"}}}},"/auth/logout":{"post":{"tags":["Autenticación"],"summary":"Revocar token actual","operationId":"auth_logout","x-gdtaller-implementation-status":"implemented","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Token revocado"}}}},"/ausencias":{"get":{"tags":["Ausencias"],"summary":"Listar y buscar Ausencias","operationId":"ausencias_list","x-gdtaller-operation":"ausencias.list","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AusenciasList"}}}}},"security":[{"BearerAuth":[]}],"parameters":[{"name":"q","in":"query","required":false,"description":"Búsqueda general, combinada con los filtros mediante AND.","schema":{"type":"string","maxLength":120}},{"name":"limit","in":"query","required":false,"description":"Máximo de resultados.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"offset","in":"query","required":false,"description":"Desplazamiento de resultados.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sort","in":"query","required":false,"description":"Campo permitido para ordenar.","schema":{"type":"string","enum":["id","fecha","idEmpleado","idTipo"],"default":"id"}},{"name":"order","in":"query","required":false,"description":"Sentido de la ordenación.","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"idEmpleado","in":"query","required":false,"description":"idEmpleado","schema":{"type":"integer"}},{"name":"idTipo","in":"query","required":false,"description":"idTipo","schema":{"type":"integer"}},{"name":"fechaDesde","in":"query","required":false,"description":"fechaDesde","schema":{"type":"string","format":"date"}},{"name":"fechaHasta","in":"query","required":false,"description":"fechaHasta","schema":{"type":"string","format":"date"}}]},"post":{"tags":["Ausencias"],"summary":"Crear Ausencias","operationId":"ausencias_create","x-gdtaller-operation":"ausencias.create","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"201":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ausencias"}}}}},"security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AusenciasInput"}}}}}},"/ausencias/{id}":{"get":{"tags":["Ausencias"],"summary":"Consultar Ausencias","operationId":"ausencias_get","x-gdtaller-operation":"ausencias.get","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ausencias"}}}}},"security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identificador del recurso.","schema":{"type":"integer","minimum":1,"example":123},"example":123}]},"patch":{"tags":["Ausencias"],"summary":"Modificar Ausencias","operationId":"ausencias_update","x-gdtaller-operation":"ausencias.update","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ausencias"}}}}},"security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identificador del recurso.","schema":{"type":"integer","minimum":1,"example":123},"example":123}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AusenciasInput"}}}}},"delete":{"tags":["Ausencias"],"summary":"Eliminar si GdPresencia lo autoriza (documento en borrador)","operationId":"ausencias_delete","x-gdtaller-operation":"ausencias.delete","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"type":"object","properties":{"eliminado":{"type":"boolean"}}}}}}},"security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identificador del recurso.","schema":{"type":"integer","minimum":1,"example":123},"example":123}]}},"/fichajes":{"get":{"tags":["Fichajes"],"summary":"Listar y buscar Fichajes","operationId":"fichajes_list","x-gdtaller-operation":"fichajes.list","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FichajesList"}}}}},"security":[{"BearerAuth":[]}],"parameters":[{"name":"q","in":"query","required":false,"description":"Búsqueda general, combinada con los filtros mediante AND.","schema":{"type":"string","maxLength":120}},{"name":"limit","in":"query","required":false,"description":"Máximo de resultados.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"offset","in":"query","required":false,"description":"Desplazamiento de resultados.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sort","in":"query","required":false,"description":"Campo permitido para ordenar.","schema":{"type":"string","enum":["id","fechaInicio","fechaFin","idEmpleado"],"default":"id"}},{"name":"order","in":"query","required":false,"description":"Sentido de la ordenación.","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"idEmpleado","in":"query","required":false,"description":"idEmpleado","schema":{"type":"integer"}},{"name":"idOrdenReparacion","in":"query","required":false,"description":"idOrdenReparacion","schema":{"type":"integer"}},{"name":"fechaDesde","in":"query","required":false,"description":"fechaDesde","schema":{"type":"string","format":"date"}},{"name":"fechaHasta","in":"query","required":false,"description":"fechaHasta","schema":{"type":"string","format":"date"}},{"name":"abierto","in":"query","required":false,"description":"abierto","schema":{"type":"boolean"}}]},"post":{"tags":["Fichajes"],"summary":"Crear Fichajes","operationId":"fichajes_create","x-gdtaller-operation":"fichajes.create","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"201":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fichajes"}}}}},"security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FichajesInput"}}}}}},"/fichajes/{id}":{"get":{"tags":["Fichajes"],"summary":"Consultar Fichajes","operationId":"fichajes_get","x-gdtaller-operation":"fichajes.get","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fichajes"}}}}},"security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identificador del recurso.","schema":{"type":"integer","minimum":1,"example":123},"example":123}]},"patch":{"tags":["Fichajes"],"summary":"Modificar Fichajes","operationId":"fichajes_update","x-gdtaller-operation":"fichajes.update","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fichajes"}}}}},"security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identificador del recurso.","schema":{"type":"integer","minimum":1,"example":123},"example":123}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FichajesInput"}}}}},"delete":{"tags":["Fichajes"],"summary":"Eliminar si GdPresencia lo autoriza (documento en borrador)","operationId":"fichajes_delete","x-gdtaller-operation":"fichajes.delete","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"type":"object","properties":{"eliminado":{"type":"boolean"}}}}}}},"security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identificador del recurso.","schema":{"type":"integer","minimum":1,"example":123},"example":123}]}},"/fichajes/{id}/cerrar":{"post":{"tags":["Fichajes"],"summary":"Cerrar fichaje","operationId":"fichajes_close","x-gdtaller-operation":"fichajes.close","x-gdtaller-implementation-status":"not_implemented","description":"Pendiente: responderá HTTP 501 mientras no se active en endpoint-status.local.php.","responses":{"400":{"description":"Parámetro no reconocido"},"401":{"description":"Token inválido o ausente"},"403":{"description":"Permiso denegado"},"404":{"description":"No encontrado"},"422":{"description":"Datos inválidos"},"429":{"description":"Límite de llamadas"},"501":{"description":"Endpoint pendiente de implementar"},"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fichajes"}}}}},"security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Identificador del recurso.","schema":{"type":"integer","minimum":1,"example":123},"example":123}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"fechaFin":{"type":"string","format":"date-time"}}}}}}}}},"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"Pagination":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"total":{"type":"integer"},"hasMore":{"type":"boolean"}}},"AuthLogin":{"type":"object","required":["client_id","client_secret"],"properties":{"client_id":{"type":"integer","example":123},"client_secret":{"type":"string","writeOnly":true,"example":"SUSTITUIR_POR_CLIENT_SECRET"}}},"AuthToken":{"type":"object","properties":{"access_token":{"type":"string"},"token_type":{"type":"string"},"expires_in":{"type":"integer"},"idInstalacion":{"type":"integer"},"idEmpresa":{"type":"integer"}}},"Ausencias":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"integer","description":"Identificador único del registro"},"idEmpleado":{"type":"integer","description":"Identificador del empleado"},"idTipo":{"type":"integer","description":"Identificador del tipo de ausencia"},"fechaDesde":{"type":"string","description":"Fecha Desde","format":"date"},"fechaHasta":{"type":"string","description":"Fecha Hasta","format":"date"},"observaciones":{"type":"string","description":"Observaciones adicionales"},"fecha":{"type":"string","description":"Fecha del documento","format":"date"},"idPeticion":{"type":"integer","description":"Identificador de la petición"},"aprobada":{"type":"boolean","description":"Indica si la ausencia está aprobada"},"minutos":{"type":"number","description":"Duración en minutos"},"dias":{"type":"number","description":"Duración en días"}},"required":["id"]},"AusenciasInput":{"type":"object","additionalProperties":false,"properties":{"idEmpleado":{"type":"integer","description":"Empleado","example":123,"minimum":1},"idTipo":{"type":"integer","description":"Tipo de ausencia","example":123,"minimum":1},"fecha":{"type":"string","description":"Día de ausencia","example":"2026-10-31","format":"date"},"observaciones":{"type":"string","description":"Observaciones","maxLength":255}},"example":{"idEmpleado":123,"idTipo":123,"fecha":"2026-10-31"}},"AusenciasList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AusenciasListItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"Fichajes":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"integer","description":"Identificador único del registro"},"idEmpleado":{"type":"integer","description":"Identificador del empleado"},"idOrdenReparacion":{"type":"integer","description":"Identificador de la orden de reparación"},"fechaInicio":{"type":"string","description":"Fecha y hora de inicio","format":"date-time"},"fechaFin":{"type":"string","description":"Fecha y hora de finalización","format":"date-time"},"abierto":{"type":"boolean","description":"Indica si el fichaje permanece abierto"},"observaciones":{"type":"string","description":"Observaciones adicionales"},"duracionMinutos":{"type":"number","description":"Duración en minutos"}},"required":["id"]},"FichajesInput":{"type":"object","additionalProperties":false,"properties":{"idEmpleado":{"type":"integer","description":"Empleado","example":123,"minimum":1},"idOrdenReparacion":{"type":"integer","description":"OR asociada opcional","example":123,"minimum":1},"fechaInicio":{"type":"string","description":"Comienzo del fichaje","example":"2026-10-31T09:30:00+01:00","format":"date-time"},"fechaFin":{"type":"string","description":"Finalización del fichaje","example":"2026-10-31T09:30:00+01:00","format":"date-time"},"observaciones":{"type":"string","description":"Observaciones","maxLength":255}},"example":{"idEmpleado":123,"idOrdenReparacion":123,"fechaInicio":"2026-10-31T09:30:00+01:00","fechaFin":"2026-10-31T09:30:00+01:00"}},"FichajesList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FichajesListItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"AusenciasListItem":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"integer","description":"Identificador único del registro"},"idEmpleado":{"type":"integer","description":"Identificador del empleado"},"idTipo":{"type":"integer","description":"Identificador del tipo de ausencia"},"fechaDesde":{"type":"string","description":"Fecha Desde","format":"date"},"fechaHasta":{"type":"string","description":"Fecha Hasta","format":"date"},"observaciones":{"type":"string","description":"Observaciones adicionales"},"fecha":{"type":"string","description":"Fecha del documento","format":"date"}},"required":["id"]},"FichajesListItem":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"integer","description":"Identificador único del registro"},"idEmpleado":{"type":"integer","description":"Identificador del empleado"},"idOrdenReparacion":{"type":"integer","description":"Identificador de la orden de reparación"},"fechaInicio":{"type":"string","description":"Fecha y hora de inicio","format":"date-time"},"fechaFin":{"type":"string","description":"Fecha y hora de finalización","format":"date-time"},"abierto":{"type":"boolean","description":"Indica si el fichaje permanece abierto"}},"required":["id"]}}},"x-gd-aplicacion-id":6,"x-gd-aplicacion-nombre":"GdPresencia"}