{"openapi":"3.1.0","info":{"title":"Dr. Fumigaciones • PDF REST API","version":"1.0.0","description":"\nAPI REST de alto rendimiento en Node.js para la generación, renderizado y exportación de certificados oficiales (CABA, GBA, Tanques, Desinfección, COVID-19) y avisos para consorcios y cronogramas de operadores en formato PDF.\n\n### Características:\n- 🚀 **Motor Server-Side**: Generación instantánea mediante `pdfmake` y `pdf-lib`.\n- 🔐 **Seguridad**: Soporte Bearer JWT y aislamiento de puertos.\n- 📦 **Formato de Respuesta**: Salida binaria directa (`application/pdf`).\n- 🤖 **Integración n8n / Frontend**: Compatible con automatizaciones n8n y consumo desde aplicaciones React / Vue / Angular.\n      ","contact":{"name":"Soporte Dr Fumigaciones","url":"https://drfumigaciones.com.ar"}},"servers":[{"url":"/","description":"Servidor Actual (Local / Producción)"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Cabecera Authorization: Bearer <API_KEY>"},"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"Clave de acceso API Key. Valor por defecto: drfumiga_sec_k98m2q7v4x1"}},"schemas":{"TanquesCABA":{"type":"object","properties":{"idCertificado":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Número de Oblea o ID único del certificado","example":31514},"domicilio":{"type":"string","description":"Dirección completa del cliente / inmueble","example":"Cuba 1761, Belgrano, CABA"},"fechaTratamiento":{"type":"string","description":"Fecha de realización del servicio (YYYY-MM-DD o ISO string)","example":"2026-08-24"},"fechaVencimiento":{"type":"string","description":"Fecha de vencimiento del certificado (YYYY-MM-DD o ISO string)","example":"2027-02-20"},"fechaLarga":{"type":"string","description":"Fecha formateada en texto largo en español (opcional, calculada si se omite)","example":"24 de Agosto de 2026"},"protocolo":{"type":"string","default":"","description":"Número de protocolo de análisis bacteriológico","example":"175234"},"imprimirFechaVencimiento":{"anyOf":[{"type":"boolean"},{"type":"string"}],"default":true,"description":"Indica si se imprime el recuadro con la fecha de vencimiento","example":true},"url":{"type":"string","default":"","description":"URL de validación embebida en el código QR","example":"https://sistema.drfumigaciones.com.ar/app/obleas/31514"},"cantidad":{"anyOf":[{"type":"number"},{"type":"string"}],"default":1,"description":"Cantidad de tanques tratados","example":3},"pdfLaboratorioBase64":{"type":"string","description":"Anexo en PDF de análisis de laboratorio en Base64 para unirlo al documento final","example":""}},"required":["idCertificado","domicilio","fechaTratamiento","fechaVencimiento"],"description":"Parámetros para Certificado de Tanques CABA"},"TanquesGBA":{"type":"object","properties":{"idCertificado":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Número de Oblea o ID del certificado","example":31515},"domicilio":{"type":"string","description":"Dirección del inmueble en Provincia de Buenos Aires","example":"Avenida San Martín 2450, Vicente López"},"fechaTratamiento":{"type":"string","description":"Fecha del tratamiento (YYYY-MM-DD o ISO string)","example":"2026-08-24"},"fechaVencimiento":{"type":"string","description":"Fecha de vencimiento (YYYY-MM-DD o ISO string)","example":"2027-02-20"},"protocolo":{"type":"string","description":"Número de protocolo de análisis","example":"8155-b"},"url":{"type":"string","default":"","description":"URL para QR de validación","example":"https://sistema.drfumigaciones.com.ar/app/obleas/31515"},"pdfLaboratorioBase64":{"type":"string","description":"Anexo en PDF de laboratorio en Base64 para unir (opcional)","example":""}},"required":["idCertificado","domicilio","fechaTratamiento","fechaVencimiento","protocolo"],"description":"Parámetros para Certificado de Tanques GBA"},"DesinfeccionCABA":{"type":"object","properties":{"idCertificado":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Número de Oblea o ID del certificado","example":31547},"domicilio":{"type":"string","description":"Dirección del cliente en CABA","example":"Yerbal 3570, Floresta, CABA"},"fechaTratamiento":{"type":"string","description":"Fecha de tratamiento (YYYY-MM-DD o ISO string)","example":"2026-08-24"},"fechaVencimiento":{"type":"string","description":"Fecha de vencimiento (YYYY-MM-DD o ISO string)","example":"2026-09-22"},"imprimirFechaVencimiento":{"anyOf":[{"type":"boolean"},{"type":"string"}],"default":true,"description":"Indica si se imprime el recuadro de fecha de vencimiento","example":true},"url":{"type":"string","default":"","description":"URL de validación embebida en QR","example":"https://sistema.drfumigaciones.com.ar/app/obleas/31547"}},"required":["idCertificado","domicilio","fechaTratamiento","fechaVencimiento"],"description":"Parámetros para Certificado de Desinfección CABA"},"DesinfeccionGBA":{"type":"object","properties":{"idCertificado":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Número de Oblea o ID del certificado","example":31545},"domicilio":{"type":"string","description":"Dirección del establecimiento en GBA","example":"Gobernador Castro 3107, Vicente López"},"fechaTratamiento":{"type":"string","description":"Fecha del tratamiento (YYYY-MM-DD o ISO string)","example":"2026-08-24"},"url":{"type":"string","default":"","description":"URL para QR de validación","example":"https://sistema.drfumigaciones.com.ar/app/obleas/31545"},"drogasUtilizadas":{"type":"string","default":"","description":"Drogas y productos químicos utilizados según Dec. 8151/80","example":"KEEPTRIN GLEBA S.A (Cipermetrina 2,0%), TERMIXAN BP (Na Cl O 0.16%)"}},"required":["idCertificado","domicilio","fechaTratamiento"],"description":"Parámetros para Certificado de Desinfección GBA"},"DesinfeccionCovid":{"type":"object","properties":{"idCertificado":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Número de Oblea o ID del certificado","example":31544},"domicilio":{"type":"string","description":"Dirección del establecimiento","example":"Avenida Corrientes 1234, CABA"},"fechaTratamiento":{"type":"string","description":"Fecha de tratamiento (YYYY-MM-DD o ISO string)","example":"2026-08-24"},"fechaVencimiento":{"type":"string","description":"Fecha de vencimiento (YYYY-MM-DD o ISO string)","example":"2026-09-22"},"imprimirFechaVencimiento":{"anyOf":[{"type":"boolean"},{"type":"string"}],"default":true,"description":"Imprimir recuadro de fecha de vencimiento","example":true},"url":{"type":"string","default":"","description":"URL de validación en QR","example":"https://sistema.drfumigaciones.com.ar/app/obleas/31544"}},"required":["idCertificado","domicilio","fechaTratamiento","fechaVencimiento"],"description":"Parámetros para Certificado COVID-19"},"AvisosConsorcio":{"type":"object","properties":{"avisos":{"type":"array","items":{"type":"object","properties":{"cliente":{"type":"object","properties":{"domicilio":{"type":"string","example":"Av. Cabildo 1500, Belgrano, CABA"}},"required":["domicilio"]},"servicio":{"type":"object","properties":{"key":{"type":"string","example":"tanques"}},"required":["key"]},"evento":{"type":"object","properties":{"nombreDia":{"type":"string","example":"Lunes"},"dia":{"anyOf":[{"type":"string"},{"type":"number"}],"example":"24"},"mes":{"anyOf":[{"type":"string"},{"type":"number"}],"example":"08"},"momentoDia":{"type":"string","example":"Mañana"},"horario":{"type":"string","example":"09:00"}},"required":["nombreDia","dia","mes"]}},"required":["cliente","servicio","evento"]},"description":"Lista de avisos para consorcios a generar en el PDF"}},"required":["avisos"],"description":"Payload para avisos de consorcio"},"OperadorSemana":{"type":"object","properties":{"operador":{"type":"string","description":"Nombre del operador asignado","example":"Juan Pérez (Operador Oficial)"},"servicios":{"type":"array","items":{"type":"object","properties":{"startDate":{"anyOf":[{"type":"string"},{"type":"string"}],"example":"2026-08-24T08:30:00"},"summary":{"type":"string","example":"Consorcio Yerbal 3570"},"comprobante":{"type":"boolean","example":true},"precio":{"anyOf":[{"type":"string"},{"type":"number"}],"example":"$35.000"},"comentario":{"type":"string","example":"Limpieza de tanques de agua"}},"required":["startDate","summary"]},"description":"Lista de servicios del cronograma semanal"}},"required":["operador","servicios"],"description":"Payload para cronograma semanal de operador"}},"parameters":{}},"paths":{"/api/health":{"get":{"summary":"Estado de Salud de la API","description":"Devuelve el estado operativo del microservicio y la lista de tipos de certificados soportados.","tags":["Sistema y Salud"],"responses":{"200":{"description":"API funcionando correctamente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"service":{"type":"string","example":"dr-fumigaciones-nodejs-api"},"status":{"type":"string","example":"ONLINE"},"timestamp":{"type":"string","example":"2026-08-25T01:00:00.000Z"},"supportedTypes":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"description":{"type":"string"},"endpoint":{"type":"string"}},"required":["key","description","endpoint"]}}},"required":["success","service","status","timestamp","supportedTypes"]}}}}}}},"/api/db/certificados":{"get":{"summary":"Consultar Certificados Recientes de la Base de Datos","description":"Consulta en tiempo real los últimos certificados emitidos almacenados en MySQL para facilitar pruebas e integraciones.","tags":["Base de Datos"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":30,"example":10},"description":"Cantidad máxima de registros a retornar"},{"name":"tipo","in":"query","required":false,"schema":{"type":"string","example":"tanquesCABA"},"description":"Filtrar por tipo de certificado específico"}],"responses":{"200":{"description":"Lista de certificados recuperados exitosamente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"count":{"type":"number","example":10},"data":{"type":"array","items":{}}},"required":["success","count","data"]}}}},"401":{"description":"Acceso no autorizado: API Key inválida o ausente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Acceso no autorizado: API Key inválida o ausente"}},"required":["success","error"]}}}}}}},"/api/certificados/tanques-caba":{"post":{"summary":"Certificado de Limpieza de Tanques (CABA)","description":"Genera el PDF del certificado oficial de limpieza y desinfección de tanques de agua para CABA, con posibilidad de adjuntar análisis de laboratorio.","tags":["Certificados"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TanquesCABA"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TanquesCABA"}}}},"responses":{"200":{"description":"Documento PDF generado exitosamente en formato binario","content":{"application/pdf":{"schema":{"type":"string","description":"Buffer binario del archivo PDF generado","format":"binary"}}}},"400":{"description":"Error de validación en los parámetros enviados","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error de validación"},"details":{"type":"array","items":{}}},"required":["success","error"]}}}},"401":{"description":"Acceso no autorizado: API Key inválida o ausente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Acceso no autorizado: API Key inválida o ausente"},"message":{"type":"string","example":"Debe proporcionar una API Key válida en la cabecera x-api-key o Authorization: Bearer <token>"}},"required":["success","error","message"]}}}},"500":{"description":"Error interno del servidor al generar el PDF","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error al generar el certificado PDF"}},"required":["success","error"]}}}}}}},"/api/certificados/tanques-gba":{"post":{"summary":"Certificado de Limpieza de Tanques (GBA)","description":"Genera el PDF del certificado oficial de limpieza y desinfección de tanques para Provincia de Buenos Aires.","tags":["Certificados"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TanquesGBA"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TanquesGBA"}}}},"responses":{"200":{"description":"Documento PDF generado exitosamente en formato binario","content":{"application/pdf":{"schema":{"type":"string","description":"Buffer binario del archivo PDF generado","format":"binary"}}}},"400":{"description":"Error de validación en los parámetros enviados","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error de validación"},"details":{"type":"array","items":{}}},"required":["success","error"]}}}},"401":{"description":"Acceso no autorizado: API Key inválida o ausente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Acceso no autorizado: API Key inválida o ausente"},"message":{"type":"string","example":"Debe proporcionar una API Key válida en la cabecera x-api-key o Authorization: Bearer <token>"}},"required":["success","error","message"]}}}},"500":{"description":"Error interno del servidor al generar el PDF","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error al generar el certificado PDF"}},"required":["success","error"]}}}}}}},"/api/certificados/desinfeccion-caba":{"post":{"summary":"Certificado de Desinsectación y Desinfestación (CABA)","description":"Genera el PDF oficial de desinfección para Ciudad Autónoma de Buenos Aires.","tags":["Certificados"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesinfeccionCABA"}}}},"responses":{"200":{"description":"Documento PDF generado exitosamente en formato binario","content":{"application/pdf":{"schema":{"type":"string","description":"Buffer binario del archivo PDF generado","format":"binary"}}}},"400":{"description":"Error de validación en los parámetros enviados","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error de validación"},"details":{"type":"array","items":{}}},"required":["success","error"]}}}},"401":{"description":"Acceso no autorizado: API Key inválida o ausente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Acceso no autorizado: API Key inválida o ausente"},"message":{"type":"string","example":"Debe proporcionar una API Key válida en la cabecera x-api-key o Authorization: Bearer <token>"}},"required":["success","error","message"]}}}},"500":{"description":"Error interno del servidor al generar el PDF","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error al generar el certificado PDF"}},"required":["success","error"]}}}}}}},"/api/certificados/desinfeccion-gba":{"post":{"summary":"Certificado de Desinfección y Desinfestación (GBA)","description":"Genera el PDF del certificado oficial de desinfección para GBA según Dec. 8151/80.","tags":["Certificados"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesinfeccionGBA"}}}},"responses":{"200":{"description":"Documento PDF generado exitosamente en formato binario","content":{"application/pdf":{"schema":{"type":"string","description":"Buffer binario del archivo PDF generado","format":"binary"}}}},"400":{"description":"Error de validación en los parámetros enviados","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error de validación"},"details":{"type":"array","items":{}}},"required":["success","error"]}}}},"401":{"description":"Acceso no autorizado: API Key inválida o ausente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Acceso no autorizado: API Key inválida o ausente"},"message":{"type":"string","example":"Debe proporcionar una API Key válida en la cabecera x-api-key o Authorization: Bearer <token>"}},"required":["success","error","message"]}}}},"500":{"description":"Error interno del servidor al generar el PDF","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error al generar el certificado PDF"}},"required":["success","error"]}}}}}}},"/api/certificados/desinfeccion-covid":{"post":{"summary":"Certificado de Desinfección COVID-19 (CABA)","description":"Genera el certificado oficial de desinfección preventiva COVID-19 para CABA.","tags":["Certificados"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesinfeccionCovid"}}}},"responses":{"200":{"description":"Documento PDF generado exitosamente en formato binario","content":{"application/pdf":{"schema":{"type":"string","description":"Buffer binario del archivo PDF generado","format":"binary"}}}},"400":{"description":"Error de validación en los parámetros enviados","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error de validación"},"details":{"type":"array","items":{}}},"required":["success","error"]}}}},"401":{"description":"Acceso no autorizado: API Key inválida o ausente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Acceso no autorizado: API Key inválida o ausente"},"message":{"type":"string","example":"Debe proporcionar una API Key válida en la cabecera x-api-key o Authorization: Bearer <token>"}},"required":["success","error","message"]}}}},"500":{"description":"Error interno del servidor al generar el PDF","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error al generar el certificado PDF"}},"required":["success","error"]}}}}}}},"/api/avisos/consorcio":{"post":{"summary":"Generar Avisos para Consorcio","description":"Genera el documento PDF con avisos para colocar en pasillos o entradas de consorcios (tanques o desinsectación).","tags":["Avisos y Cronogramas"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvisosConsorcio"}}}},"responses":{"200":{"description":"Documento PDF generado exitosamente en formato binario","content":{"application/pdf":{"schema":{"type":"string","description":"Buffer binario del archivo PDF generado","format":"binary"}}}},"400":{"description":"Error de validación en los parámetros enviados","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error de validación"},"details":{"type":"array","items":{}}},"required":["success","error"]}}}},"401":{"description":"Acceso no autorizado: API Key inválida o ausente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Acceso no autorizado: API Key inválida o ausente"},"message":{"type":"string","example":"Debe proporcionar una API Key válida en la cabecera x-api-key o Authorization: Bearer <token>"}},"required":["success","error","message"]}}}},"500":{"description":"Error interno del servidor al generar el PDF","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error al generar el certificado PDF"}},"required":["success","error"]}}}}}}},"/api/avisos/operador-semana":{"post":{"summary":"Generar Cronograma Semanal de Operador","description":"Genera la hoja de ruta y servicios semanales para un operador en PDF.","tags":["Avisos y Cronogramas"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperadorSemana"}}}},"responses":{"200":{"description":"Documento PDF generado exitosamente en formato binario","content":{"application/pdf":{"schema":{"type":"string","description":"Buffer binario del archivo PDF generado","format":"binary"}}}},"400":{"description":"Error de validación en los parámetros enviados","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error de validación"},"details":{"type":"array","items":{}}},"required":["success","error"]}}}},"401":{"description":"Acceso no autorizado: API Key inválida o ausente","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Acceso no autorizado: API Key inválida o ausente"},"message":{"type":"string","example":"Debe proporcionar una API Key válida en la cabecera x-api-key o Authorization: Bearer <token>"}},"required":["success","error","message"]}}}},"500":{"description":"Error interno del servidor al generar el PDF","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Error al generar el certificado PDF"}},"required":["success","error"]}}}}}}}},"webhooks":{}}