codigo0/dist/assets/page-material-Ck8ErBi1.js
planetazuzu 5d7a6500fe refactor: Fase 1 - Clean Architecture, refactorización modular y eliminación de duplicidades
-  Ticket 1.1: Estructura Clean Architecture en backend
-  Ticket 1.2: Schemas Zod compartidos
-  Ticket 1.3: Refactorización drugs.ts (1362 → 8 archivos modulares)
-  Ticket 1.4: Refactorización procedures.ts (3583 → 6 archivos modulares)
-  Ticket 1.5: Eliminación de duplicidades (~50 líneas)

Cambios principales:
- Creada estructura Clean Architecture en backend/src/
- Schemas Zod compartidos en backend/src/shared/schemas/
- Refactorización modular de drugs y procedures
- Utilidades genéricas en src/utils/ (filter, validation)
- Eliminados scripts obsoletos y documentación antigua
- Corregidos errores: QueryClient, import test-error-handling
- Build verificado y funcionando correctamente
2026-01-25 21:09:47 +01:00

2 lines
19 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{r as f,j as e,R as E,C as z,X as T,i as j,I,au as B}from"./0-vendor-react-DWOJpYrt.js";import{B as A}from"./page-ajustes-DgawOEJM.js";import{B as x,C as y,A as C,a as N}from"./page-comunicacion-DmHQUHoW.js";import"./1-vendor-utils-Delnuc0l.js";import"./2-vendor-markdown-BQlHAcA7.js";const O=({checklist:t,onReset:c})=>{const[o,d]=f.useState(new Set),[u,s]=f.useState(new Set([t.sections[0]?.id||""])),b=i=>{const a=new Set(o);a.has(i)?a.delete(i):a.add(i),d(a)},g=i=>{const a=new Set(u);a.has(i)?a.delete(i):a.add(i),s(a)},S=()=>{d(new Set),c&&c()},w=i=>{const a=i.items.length,n=i.items.filter(l=>o.has(l.id)).length;return{checked:n,total:a,percentage:a>0?Math.round(n/a*100):0}},P=()=>{const i=t.sections.flatMap(l=>l.items),a=i.length,n=i.filter(l=>o.has(l.id)).length;return{checked:n,total:a,percentage:a>0?Math.round(n/a*100):0}},M=()=>t.sections.flatMap(i=>i.items.filter(a=>a.critical)),_=()=>M().filter(i=>!o.has(i.id)),m=P(),h=_(),R=i=>{switch(i){case"inicio_turno":return"default";case"pre_escena":return"default";case"post_servicio":return"default";default:return"default"}},k=i=>{switch(i){case"inicio_turno":return"Inicio Turno";case"pre_escena":return"Pre-Escena";case"post_servicio":return"Post-Servicio";default:return i}};return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx("h3",{className:"font-bold text-foreground text-lg",children:t.title}),e.jsx(x,{variant:R(t.phase),children:k(t.phase)})]}),e.jsx("p",{className:"text-muted-foreground text-sm",children:t.description})]}),e.jsx(A,{variant:"ghost",size:"sm",onClick:S,className:"shrink-0",title:"Reiniciar checklist",children:e.jsx(E,{className:"w-4 h-4"})})]}),e.jsx(y,{className:"p-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-sm font-medium text-foreground",children:"Progreso general"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[m.checked," / ",m.total," (",m.percentage,"%)"]})]}),e.jsx("div",{className:"w-full bg-muted rounded-full h-2",children:e.jsx("div",{className:"bg-primary h-2 rounded-full transition-all",style:{width:`${m.percentage}%`}})})]})}),h.length>0&&e.jsxs(C,{variant:"destructive",children:[e.jsx(z,{className:"w-4 h-4"}),e.jsxs(N,{children:[e.jsx("strong",{children:"Items críticos pendientes:"})," ",h.length," item(s) crítico(s) sin verificar"]})]}),e.jsx("div",{className:"space-y-3",children:t.sections.map(i=>{const a=w(i),n=u.has(i.id),v=i.items.filter(r=>r.critical).filter(r=>!o.has(r.id));return e.jsxs(y,{className:"overflow-hidden",children:[e.jsxs("button",{onClick:()=>g(i.id),className:"w-full p-4 flex items-center justify-between hover:bg-accent transition-colors text-left",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("h4",{className:"font-semibold text-foreground",children:i.title}),v.length>0&&e.jsxs(x,{variant:"destructive",className:"text-xs",children:[v.length," crítico(s)"]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsxs("span",{children:[a.checked," / ",a.total," completado"]}),e.jsx("span",{children:"•"}),e.jsxs("span",{children:[a.percentage,"%"]})]})]}),e.jsx("div",{className:"ml-4",children:n?e.jsx(T,{className:"w-5 h-5 text-muted-foreground"}):e.jsx(j,{className:"w-5 h-5 text-muted-foreground"})})]}),n&&e.jsxs("div",{className:"px-4 pb-4 space-y-2 border-t border-border pt-4",children:[i.items.map(r=>{const p=o.has(r.id);return e.jsxs("button",{onClick:()=>b(r.id),className:`w-full flex items-start gap-3 p-3 rounded-lg bg-muted hover:bg-accent transition-colors text-left ${p?r.critical?"bg-destructive/15 ring-2 ring-destructive/40":"bg-success/15 ring-2 ring-success/40":""}`,children:[e.jsx("div",{className:`w-6 h-6 rounded border-2 flex items-center justify-center transition-colors shrink-0 mt-0.5 ${p?r.critical?"bg-destructive border-destructive":"bg-success border-success":r.critical?"border-destructive":"border-muted-foreground"}`,children:p&&e.jsx(j,{className:"w-4 h-4 text-background"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`text-foreground ${p?"line-through opacity-60":""}`,children:r.text}),r.critical&&e.jsx(x,{variant:"destructive",className:"text-xs",children:"Crítico"})]}),r.notes&&e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:r.notes})]})]},r.id)}),i.notes&&e.jsxs(C,{className:"mt-3",children:[e.jsx(I,{className:"w-4 h-4"}),e.jsx(N,{className:"text-xs",children:i.notes})]})]})]},i.id)})}),t.source&&e.jsxs("p",{className:"text-xs text-muted-foreground text-center",children:["Fuente: ",t.source]})]})},L={id:"inicio-turno-material",title:"Checklist Inicio de Turno - Material Sanitario",shortTitle:"Inicio Turno",phase:"inicio_turno",description:"Verificación completa de material sanitario y oxigenoterapia antes de iniciar servicio.",source:"BLOQUE_03_X5_CHECKLIST_MAESTRO.md",sections:[{id:"oxigeno",title:"O₂: presión, fijación, regulador, tubuladuras, prueba de flujo",category:"oxigeno",items:[{id:"botellas-disponibles",text:"Verificar que botellas están disponibles",critical:!0},{id:"presion-manometro",text:"Leer presión en manómetro (verificar que presión es adecuada)",critical:!0},{id:"botellas-caducadas",text:"Verificar que botellas no están caducadas (si aplica)"},{id:"valvulas-funcionan",text:"Verificar que válvulas funcionan",critical:!0},{id:"fijacion-segura",text:"Verificar que botellas están fijadas correctamente en ambulancia",critical:!0},{id:"regulador-disponible",text:"Verificar que regulador está disponible y bien conectado",critical:!0},{id:"caudalimetro-funciona",text:"Verificar que caudalímetro funciona (ajuste de flujo)",critical:!0},{id:"tubuladuras-disponibles",text:"Verificar que tubuladuras están disponibles y en buen estado",critical:!0},{id:"prueba-flujo",text:"Prueba de flujo: verificar que flujo se ajusta correctamente",critical:!0}],notes:"Registrar presión de botellas e incidencias (botella con poca presión, válvula que no funciona, etc.)"},{id:"dispositivos-oxigeno",title:"Dispositivos O₂: tallas, integridad",category:"dispositivos",items:[{id:"gafas-nasales",text:"Gafas nasales: disponibles y en buen estado"},{id:"mascarilla-simple",text:"Mascarilla simple: disponible y en buen estado"},{id:"mascarilla-reservorio",text:"Mascarilla con reservorio: disponible, buen estado, reservorio funciona",critical:!0},{id:"mascarilla-venturi",text:"Mascarilla Venturi: disponible, adaptadores/boquillas completos"},{id:"nebulizador",text:"Nebulizador (si aplica): disponible, cámara y mascarilla/boquilla en buen estado"},{id:"mascarillas-pediatricas",text:"Mascarillas pediátricas: verificar tallas disponibles y buen estado",critical:!0}],notes:"Registrar incidencias (dispositivo faltante, dañado, tallas incompletas, etc.)"},{id:"bvm",title:"BVM: válvula, reservorio, mascarillas, filtro si aplica",category:"bvm",items:[{id:"bolsa-estado",text:"Bolsa: verificar que está en buen estado (sin daños) y se expande/retorna correctamente",critical:!0},{id:"valvula-funciona",text:"Válvula: verificar que funciona correctamente y no está obstruida",critical:!0},{id:"reservorio-disponible",text:"Reservorio: disponible (si BVM lo lleva), buen estado, conexión correcta"},{id:"mascarillas-tallas",text:"Mascarillas: verificar por tallas (adulto, pediátrico, neonatal según dotación)",critical:!0},{id:"mascarillas-recambios",text:"Mascarillas: verificar que hay recambios disponibles"},{id:"valvula-peep",text:"Válvula PEEP (si existe): disponible y funciona"},{id:"filtros",text:"Filtros (si se usan): disponibles y no obstruidos"}],notes:"Registrar incidencias (BVM dañada, válvula que no funciona, mascarillas faltantes, etc.)"},{id:"aspiracion",title:"Aspiración: batería, frasco, tubuladuras, prueba de succión",category:"aspiracion",items:[{id:"aspirador-disponible",text:"Aspirador: disponible y enciende",critical:!0},{id:"bateria-cargada",text:"Batería: cargada (si aplica)",critical:!0},{id:"regulador-funciona",text:"Regulador/manómetro: funciona"},{id:"frasco-disponible",text:"Frasco: disponible, buen estado, tapas cierran correctamente",critical:!0},{id:"tubuladuras-aspiracion",text:"Tubuladuras: disponibles y en buen estado (sin daños)"},{id:"yankauer",text:"Cánula Yankauer: disponible y en buen estado"},{id:"sondas-flexibles",text:"Sondas flexibles: tamaños disponibles y en buen estado"},{id:"filtros-aspiracion",text:"Filtros: disponibles y no obstruidos"},{id:"prueba-succion",text:"Prueba de succión: verificar que se genera vacío correctamente",critical:!0}],notes:"Registrar incidencias (batería descargada, frasco dañado, vacío que no funciona, etc.)"},{id:"canulas",title:"Cánulas: tallas completas, lubricante si aplica",category:"canulas",items:[{id:"opa-tallas",text:"Cánulas orofaríngeas (OPA): verificar tallas disponibles (0-1, 2-3, 4, 5-6, 7-8 según dotación)",critical:!0},{id:"opa-estado",text:"OPA: verificar que están en buen estado"},{id:"npa-tallas",text:"Cánulas nasofaríngeas (NPA): verificar tallas disponibles (5-6, 7, 8 según dotación)"},{id:"npa-estado",text:"NPA: verificar que están en buen estado"},{id:"lubricante",text:"Lubricante (si aplica): disponible, no caducado, hidrosoluble"}],notes:"Registrar incidencias (tallas faltantes, cánulas dañadas, lubricante faltante, etc.)"},{id:"curas",title:"Curas/hemorragias: compresas/vendas/compresivos",category:"curas",items:[{id:"gasas-compresas",text:"Gasas/compresas/apósitos: disponibles, buen estado (no caducados, no dañados), cantidades suficientes"},{id:"vendas",text:"Vendas (crepé/elástica/cohesiva/triangular/tubular si existe): disponibles, buen estado, tamaños adecuados"},{id:"cinta-esparadrapo",text:"Cinta/esparadrapo: disponible y en buen estado"},{id:"apositos-compresivos",text:"Apósitos compresivos (si hay): disponibles y en buen estado"},{id:"hemostaticos",text:"Hemostáticos/torniquete (si dotación y protocolo): disponibles y en buen estado (no caducados)"}],notes:"Registrar incidencias (material faltante, dañado, caducado, etc.)"},{id:"monitorizacion",title:"Monitorización: SpO₂, manguitos, electrodos, tiras glucemia, fundas termómetro",category:"monitorizacion",items:[{id:"pulsioximetro",text:"Pulsioxímetro: disponible, pilas cargadas, sensor funciona",critical:!0},{id:"tensiometro-manual",text:"Tensiómetro manual: disponible, manguitos (diferentes tallas), pera y manómetro funcionan"},{id:"tensiometro-automatico",text:"Tensiómetro automático: disponible, manguitos (diferentes tallas), batería cargada"},{id:"ecg-monitor",text:"ECG básico/monitor (si dotación): disponible, cables en buen estado, electrodos disponibles, batería cargada"},{id:"glucometro",text:"Glucómetro: disponible, batería cargada, tiras reactivas disponibles y en fecha, lancetas disponibles",critical:!0},{id:"termometro",text:"Termómetro (IR frontal/timpánico/digital según dotación): disponible, batería cargada, fundas disponibles (si aplica)"}],notes:"Registrar incidencias (equipo que no funciona, batería baja, material faltante, etc.)"},{id:"epi",title:"EPI/residuos/punzantes",category:"epi",items:[{id:"guantes",text:"Guantes: diferentes tallas, no caducados (si aplica)",critical:!0},{id:"proteccion-ocular",text:"Protección ocular: disponible y en buen estado"},{id:"mascarillas-epi",text:"Mascarillas (quirúrgica/FFP según protocolo): no caducadas (si aplica)"},{id:"chaleco",text:"Chaleco alta visibilidad: disponible y en buen estado"},{id:"casco",text:"Casco (si aplica según protocolo): disponible y en buen estado"},{id:"bolsas-residuos",text:"Bolsas de residuos biológicos y no biológicos: disponibles"},{id:"contenedor-punzantes",text:"Contenedor de punzantes: disponible, no lleno, accesible",critical:!0}],notes:"Registrar incidencias (EPI faltante, caducado, contenedor de punzantes lleno, etc.)"}]},F={id:"pre-escena-rapido",title:"Checklist Pre-Escena Rápido",shortTitle:"Pre-Escena",phase:"pre_escena",description:"Verificación rápida de material crítico antes de intervención (2-5 minutos).",source:"BLOQUE_03_X5_CHECKLIST_MAESTRO.md",sections:[{id:"evaluar-situacion",title:"Evaluar situación y seleccionar módulos",category:"oxigeno",items:[{id:"tipo-situacion",text:"Evaluar tipo de situación (trauma, médico, etc.)"},{id:"material-critico",text:"Identificar material crítico necesario"},{id:"modulo-via-aerea",text:"Módulo Vía Aérea: Si hay riesgo de compromiso de vía aérea o necesidad de oxigenoterapia",critical:!0},{id:"modulo-curas",text:"Módulo Curas: Si hay heridas, hemorragias o quemaduras"},{id:"modulo-monitor",text:"Módulo Monitor: Si es necesario monitorizar constantes"},{id:"modulo-termico",text:"Módulo Térmico: Si hay riesgo de hipotermia o necesidad de control térmico"}]},{id:"verificacion-rapida",title:"Verificación rápida de material crítico",category:"oxigeno",items:[{id:"material-disponible",text:"Verificar que material crítico seleccionado está disponible",critical:!0},{id:"material-funciona",text:"Verificar que material crítico funciona (prueba rápida si es necesario)",critical:!0},{id:"material-accesible",text:"Verificar que material crítico está accesible"},{id:"preparacion-inmediata",text:"Preparar material crítico para uso inmediato"}],notes:"Tiempo estimado: 2-5 minutos aproximadamente"}]},G={id:"post-servicio-cierre",title:"Checklist Post-Servicio - Cierre y Reposición",shortTitle:"Post-Servicio",phase:"post_servicio",description:"Cierre, limpieza, reposición y documentación después del servicio.",source:"BLOQUE_03_X5_CHECKLIST_MAESTRO.md",sections:[{id:"desecho-punzantes",title:"Desecho y punzantes",category:"epi",items:[{id:"punzantes-contenedor",text:"Verificar que todos los punzantes están en contenedor",critical:!0},{id:"no-punzantes-fuera",text:"No dejar punzantes fuera del contenedor",critical:!0},{id:"cerrar-contenedor",text:"Cerrar contenedor si está lleno o al finalizar servicio"},{id:"residuos-biologicos",text:"Gestionar residuos biológicos en bolsas correspondientes"},{id:"residuos-no-biologicos",text:"Gestionar residuos no biológicos en bolsas correspondientes"},{id:"cerrar-bolsas",text:"Cerrar bolsas correctamente y gestionar según protocolo"}]},{id:"limpieza",title:"Limpieza y desinfección",category:"cierre",items:[{id:"limpieza-preliminar",text:"Limpieza preliminar: retirar suciedad visible con paños/toallitas"},{id:"desinfeccion",text:"Aplicar desinfectante según protocolo del servicio, respetar tiempos de contacto"},{id:"secado",text:"Secar material completamente (no guardar material húmedo)",critical:!0},{id:"verificar-seco",text:"Verificar que material está seco"}],notes:"Ver 3.14 Bioseguridad y Descontaminación del Material para procedimientos detallados"},{id:"reposicion",title:"Reposición",category:"cierre",items:[{id:"identificar-usado",text:"Identificar material consumido durante servicio"},{id:"identificar-danado",text:"Identificar material dañado"},{id:"reponer-consumido",text:"Reponer material consumido si es posible",critical:!0},{id:"reponer-danado",text:"Reponer material dañado si es posible"},{id:"verificar-reposicion",text:"Verificar que reposición es completa"},{id:"solicitar-reposicion",text:"Solicitar reposición de material faltante según protocolo si no es posible reponer"},{id:"comunicar-prioridad",text:"Comunicar prioridad si es necesario y documentar solicitud"}]},{id:"incidencias",title:"Registro de incidencias",category:"cierre",items:[{id:"consumos-criticos",text:"Registrar consumos críticos (O₂, mascarillas, BVM/filtros, aspiración, hemostáticos/torniquete si aplica)"},{id:"mediciones-equipos",text:"Registrar mediciones/equipos usados (electrodos, tiras glucemia, fundas termómetro si aplica)"},{id:"incidencias-equipo",text:"Registrar incidencias de equipo (batería baja, fugas, roturas, material caducado)"},{id:"observaciones-seguridad",text:"Registrar observaciones de seguridad (pinchazo, derrame, contaminación)"},{id:"comunicar-incidencias",text:"Comunicar incidencias según protocolo y necesidades de reposición"}],notes:"Ver 3.18 Documentación Operativa del Material Usado e Incidencias para procedimientos detallados"},{id:"cerrar-maletines",title:"Cerrar maletines",category:"cierre",items:[{id:"verificar-completos",text:"Verificar que maletines están completos (ver 3.5, 3.X2, 3.X3)",critical:!0},{id:"verificar-limpio-seco",text:"Verificar que material está limpio y seco"},{id:"verificar-no-falta",text:"Verificar que no falta material crítico"},{id:"cerrar-correctamente",text:"Cerrar maletines correctamente"},{id:"listos-siguiente",text:"Verificar que maletines están listos para siguiente servicio"}]}]},V=[L,F,G];function D(t){return V.filter(c=>c.phase===t)}const q={inicio_turno:"Inicio de Turno",pre_escena:"Pre-Escena",post_servicio:"Post-Servicio"},U={inicio_turno:"Verificación completa de material antes de iniciar servicio",pre_escena:"Verificación rápida de material crítico antes de intervención",post_servicio:"Cierre, limpieza, reposición y documentación después del servicio"},Y=()=>{const[t,c]=f.useState(null),[o,d]=f.useState("todos"),u=o==="todos"?V:D(o);return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground mb-1",children:"Checklists de Material"}),e.jsx("p",{className:"text-muted-foreground text-sm",children:"Verificación de material sanitario y oxigenoterapia"})]}),t?e.jsxs("div",{children:[e.jsx("button",{onClick:()=>c(null),className:"mb-4 text-sm text-muted-foreground hover:text-foreground flex items-center gap-2",children:"← Volver a lista de checklists"}),e.jsx(O,{checklist:t,onReset:()=>c(null)})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex gap-2 overflow-x-auto scrollbar-hide -mx-4 px-4",children:[e.jsx("button",{onClick:()=>d("todos"),className:`px-4 py-2 rounded-full text-sm font-medium whitespace-nowrap transition-colors ${o==="todos"?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-accent"}`,children:"Todos"}),["inicio_turno","pre_escena","post_servicio"].map(s=>e.jsx("button",{onClick:()=>d(s),className:`px-4 py-2 rounded-full text-sm font-medium whitespace-nowrap transition-colors ${o===s?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-accent"}`,children:q[s]},s))]}),e.jsx("div",{className:"space-y-3",children:u.map(s=>e.jsx("button",{onClick:()=>c(s),className:"w-full text-left card-procedure hover:bg-accent transition-colors",children:e.jsx("div",{className:"flex items-start justify-between gap-3",children:e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx(B,{className:"w-5 h-5 text-primary"}),e.jsx("h3",{className:"font-semibold text-foreground",children:s.shortTitle}),e.jsx(x,{variant:"default",children:q[s.phase]})]}),e.jsx("p",{className:"text-muted-foreground text-sm",children:U[s.phase]}),e.jsxs("p",{className:"text-muted-foreground text-xs mt-1",children:[s.sections.length," sección(es) •"," ",s.sections.reduce((b,g)=>b+g.items.length,0)," items"]})]})})},s.id))})]})]})};export{Y as default};