Wiki Técnica · Desarrolladores

Módulo Banco de Sangre

Referencia consolidada de arquitectura, modelos de datos, API REST, flujos y estado actual del código del módulo de Banco de Sangre / CENSUR del sistema Centro Horizonte. Construida a partir de ANALISIS.md, BANCO_DE_SANGRE.md y banco-sangre-analisis.md.

38 Componentes
122 Endpoints
13+ Modelos
7 Roles / carpetas
2 Flujos principales
📋
Sección 01

Visión General

El módulo vive en src/app/pages/BancoSangre/ y modela el flujo completo de un banco de sangre: desde el registro de un disponente (donador) hasta la liberación de productos sanguíneos y su entrega a un receptor (paciente que requiere transfusión), más la administración de sedes por la Jefatura de Banco de Sangre (JefeBS).

Todas las rutas son hijas planas de PageComponent (page.routes.ts, líneas 595-653, 801, 828-829, 875). El identificador :id que viaja en casi todas las rutas es el _id del registro de banco de sangre del paciente (referido en el código como idCensur / idbancosangre / idBanco), no el _id del paciente.

🩸 Flujo Disponente Donador

Proceso completo desde el registro inicial hasta el almacenamiento de hemocomponentes procesados y disponibles para surtido.

BancoSangre

🏥 Flujo Receptor CENSUR

Solicitud de productos sanguíneos, tipar y cruzar, pedido a sede, cobro y vigilancia de reacciones transfusionales.

BancoSangreSocios

Distribución de componentes por carpeta / rol

CarpetaRol / actor# Componentes
rolRecepcionRecepción (registro, disponentes, receptores, almacén)14
rolLaboratorioLaboratorio (estudios disponentes + tipar/cruzar receptores)8
rolJefeBSJefatura Banco de Sangre (sedes)7
rolEnfermeriaEnfermería (signos vitales)2
rolFlebotomiaFlebotomía (extracción)3
rolDoctorDoctor (historia clínica / evolución)3
AlmacenAlmacén (salidas/desechos)1

Servicios backend principales (frontend)

ServicioUbicaciónUso
BancoServicesrc/app/services/bancodeSangre/banco.service.tsServicio principal del módulo, usado por la mayoría de los componentes del flujo Disponente
LaboratorioServicesrc/app/services/bancodeSangre/Estudios de laboratorio (biometría, grupo y RH, serología, tipar/cruzar)
FlebotomiaServicesrc/app/services/bancodeSangre/Registro de extracciones
SedesServicesrc/app/services/bancodeSangre/Sedes de Banco de Sangre (poco usado dentro del módulo)
PedidosSedesServicesrc/app/services/bancodeSangre/Pedidos a sedes (poco usado dentro del módulo)
BancodesangreServicesrc/app/services/bancodeSangre/Usado por el flujo CENSUR alterno (receptor.js): documentos, carrito, reacciones transfusionales
PacientesServicesrc/app/services/pacientes/Listado/búsqueda de pacientes, usado como puente entre módulos
ℹ️

Modelo de datos en una línea: un Paciente puede ser disponente y/o receptor. Cada proceso de donación genera un registro BancoSangre (1:1 por proceso, campo idbancosangre / idCensur) y cada solicitud de transfusión genera un registro BancoSangreSocios. Ver Modelos de Datos.

⚠️

Duplicidad de flujo CENSUR: existen dos implementaciones paralelas del flujo de receptor: una dentro de BancoSangre/rolRecepcion (receptoreshojaservicios/receptor/:id) y otra fuera del módulo (banco/sangreReceptoresComponent en src/app/pages/receptores/, documentos/paciente/:id, productos, reacciones/adversas/:id, reacciones/transfucionales). Ver detalle en Flujo Receptor / CENSUR y Estado del Código.

🧩
Sección 02

Arquitectura Frontend — Componentes por Rol

🩸 Flujo del DISPONENTE (donador)

#ComponenteRutaQué hace
1BitacoraDisponentesComponentbitacora/disponentesLista de pacientes/disponentes (Recepción), buscador, alta y acceso a ficha
2RegistroDisponentesComponentregistro/disponentesAlta de un nuevo disponente (envuelve app-registrar-disponente)
3VerDisponenteComponentver/disponente/:idFicha del paciente; selecciona servicio "Donaciones" + sede de origen; valida si puede donar
4AutoexclusionComponentautoexclusion/:idCuestionario de 12 preguntas SI/NO; decide DIFERIDO o pasa a Enfermería
5DisponentesBitacoraComponent (Enfermería)disponentes/bitacoraLista de disponentes en etapa Enfermería
6FichaDisponenteComponentficha/disponente/:idCaptura signos vitales; decide DIFERIDO o pasa a Doctor + pide laboratorios
7BitacoraConsultaDisponentesComponent (Doctor)bitacora/consulta/disponentesLista de disponentes en espera de consulta médica
8HistoriaClinicaComponenthistoria/clinica/doctor/:idCuestionario extenso de historia clínica por secciones
9HojaEvolucionDisponenteComponenthoja/evolucion/disponente/:idExploración física + diagnóstico final; decide APTO→Flebotomía o DIFERIDO
10BitacoraFlebotomiaComponentbitacora/flebotomiaLista de disponentes listos para extracción
11DocumentosDonanteFlebotomiaComponentdocumentos/flebotomia/:idCaptura datos de extracción + sube consentimientos firmados; decide pasa a Serología o autoexclusión
12BitacoraLaboratorioComponentbitacora/laboratorios/disponentesLista de disponentes con procesos de laboratorio
13HojaServiciosLabDisponenteComponenthoja/servicios/laboratorio/disponentes/:id"Hub" que muestra estudios pendientes: Grupo y RH/BHC, Serología
14BiometriaLabDisponenteComponent (fuera de BancoSangre)grupo/rh/biometria/hematica/completa/:idCaptura Biometría Hemática Completa + Grupo y RH
15SerologiaLabDisponenteComponentserologia/laboratorio/disponente/:idCaptura resultados serológicos; decide LIBERADO (genera etiquetas QR) o DIFERIDO permanente
16ReaccionesDerivadasComponent ⚠️ incompletoreacciones/adversasFormulario de reacciones adversas a la donación — sin persistencia
17BitacoraSalidasComponent (Almacén)bitacora/salidas/almacenLista de productos del almacén; permite marcar como DESECHADO
BitacoraDiferidosComponentbitacora/diferidosVista de solo lectura de todos los disponentes diferidos
HistoricoDisponenteBSComponenthistorico/disponente/bs/:idHistórico de donaciones de un disponente (desde ver-disponente)
BitacoraAlmacenComponent ⚠️ placeholderbitacora/almacenTabla hardcodeada, sin lógica

🏥 Flujo del RECEPTOR (transfusión, dentro de BancoSangre)

#ComponenteRutaQué hace
1ReceptoresComponentreceptoresLista de pedidos/hojas de servicio de receptores
2HojaServicioReceptorComponenthojaservicios/receptor/:id"Hub" del pedido: estado de 4 subprocesos (documentos, tipar/cruzar, histórico, entrega)
3DocumentosReceptorComponentdocumentos/receptorSube/consulta documentos médicos del receptor
4TiparCruzarComponent (rolLaboratorio)tiparcruzaPrueba de compatibilidad ABO/Rh + cruce con disponentes/bolsas guardado deshabilitado
5EntregaProductosComponentproductos/receptorCatálogo de hemoderivados → carrito de compra
6OrdenCompraComponentorden/productosCheckout/pago (envuelve app-pagos-censur)
7DocumentosReceptorFirmadosComponentagregar/docuemtos/recpetor/firmadosSube documentos/consentimientos firmados tras el pago
EntregaProductosSanguineosComponententrega/productos/sanguineosGenera PDFs de etiqueta de urgencia + carta responsiva (sin backend)

🏥 Flujo CENSUR alterno (fuera de BancoSangre)

Conjunto de rutas planas, hijas también de PageComponent, que cubren un recorrido equivalente para el receptor pero con componentes y carpetas distintas:

RutaComponenteUbicaciónQué hace
banco/sangreReceptoresComponentsrc/app/pages/receptores/Lista pacientes/receptores de la sede actual (localStorage.cede)
documentos/paciente/:idDocspacienteComponentsrc/app/pages/docspaciente/Sube los 4 documentos obligatorios del receptor; genera idCensur
productosProductosComponentPedidosComponentcensur-productos/productos/components/censur-pedido/pedidos/Catálogo + carrito (CarritoCensur); genera tipo y cruce + orden de pedido
reacciones/adversas/:idReaccionesAdversasComponentsrc/app/pages/reacciones-adversas/Registro post-transfusión; marca receptor como FINALIZADO
reacciones/transfucionalesReaccionesTransfucionalesComponentsrc/app/pages/admin/reacciones-transfucionales/Bitácora de todas las reacciones transfusionales registradas

🏢 Jefatura Banco de Sangre / Sedes

ComponenteRutaEstado
SedesbsComponentlistado/sedes/banco/sangre✅ Funcional — lista sedes
DetalleSedeComponentdetalle/sede/:id⚠️ Parcial — datos de sede OK, tabla de pedidos hardcodeada
AgregarSedeComponentagregar/sede/bs⚠️ Parcial — formulario completo pero el guardado al backend está comentado
FISedeComponentficha/identificacion/sede⚠️ Placeholder vacío
BitacoraNoAptosODiferidosComponentbitacora/no-aptos⚠️ Placeholder, tabla estática
HojaServicioReceptorBSComponenthoja/servicio/receptor⚠️ Placeholder, tabla estática
OrdenreceptoresComponentorden/servicio/receptores⚠️ Placeholder, tabla estática

🧪 Otros / catálogo

ComponenteRutaEstado
NuevoEstudioLabComponentnuevo/estudios/lab✅ Funcional — alta de tipos de estudio de laboratorio
HistoricoEstudiosDisponenteComponenthistorico/estudios/disponente⚠️ Placeholder estático
BitacoraPedidosComponentbitacora/hoja/de/servicios⚠️ Parcial — datos reales del paciente pero columnas de estatus hardcodeadas
HojaServiciosLabsComponent (hoja-servicios)sin ruta❌ Código muerto — no referenciado en ninguna parte

Servicios y dependencias compartidas (flujo CENSUR alterno)

ElementoUbicaciónUsado por
PacientesServicesrc/app/services/pacientes/ReceptoresComponent, DocspacienteComponent
BancodesangreServicesrc/app/services/bancodeSangre/DocspacienteComponent, PedidosComponent, ReaccionesAdversasComponent, ReaccionesTransfucionalesComponent
ficha-info-usercomponents/ficha-identificacion/ficha-info-user/DocspacienteComponent, ReaccionesAdversasComponent
app-tituloscomponents/ficha-identificacion/titulos/ReceptoresComponent, ReaccionesTransfucionalesComponent
app-pedidos (PedidosComponent)components/censur-pedido/pedidos/ProductosComponent
CarritoCensurclases/carrito-censur/censur-carritoPedidosComponent
buscarReceptorhelpers/filterReceptor.tsReaccionesTransfucionalesComponent
NgxSpinnerServicelibrería ngx-spinnertodos los componentes
sweetalert / sweetalert2librerías externasDocspacienteComponent, PedidosComponent
🗂️
Sección 03

Modelos de Datos

El backend opera con dos tablas principales que actúan como "expediente": BancoSangre → expediente del disponente (donador) y BancoSangreSocios → expediente del receptor (CENSUR). El resto de los modelos cuelgan de estas dos por referencia.

1. BancoSangre — Expediente del Disponente

models/bancoDeSangre/modelBancoSangre.js
CampoTipoReferenciaDescripción
pacienteObjectIdPacientePaciente/donador
cuestionarioautoexclusionObjectIdmodelCuestioExclusionCuestionario de autoexclusión
signosvitalesObjectIdSignosVitalesBSTalla, peso, IMC, T/A
historiaclinicaObjectIdHistoriaClinicaBSHistoria clínica completa
hojaevolucionObjectIdhojaEvolucionBSExploración física del médico
reaccionesderivadasObjectIdReaccionesDerivadasBSReacciones durante la donación
flebotomiaObjectIdFlebotomiaBSDatos de la extracción de sangre
laboratorio[ObjectId]LaboratorioBSEstudios de laboratorio
almacen[ObjectId]productosAlmacenStockHemocomponentes generados
procesoStringNUEVO · ENFERMERIA · DOCTOR · FLEBOTOMIA · SEROLOGIA · FINALIZADO
estatusStringDISPONIBLE · DIFERIDO · EN PROCESO
motivoStringMotivo de diferimiento
tiempo_rechazoStringFecha de diferimiento
fecha_terminoDateFecha en que termina el periodo de diferimiento

2. BancoSangreSocios — Expediente del Receptor (CENSUR)

models/bancoDeSangre/modelBancoSangreTercero.js
CampoTipoReferenciaDescripción
pacienteObjectIdPacientePaciente receptor
receptorObjectIdDocumentosBSDocumentos del receptor
pedidoObjectIdpedidosSedesBancoOrden de pedido de hemocomponentes
tiparycruzar[ObjectId]LaboratorioBSEstudios de tipo y cruce
proceso_censurObjectIdBancoSangreSociosProcesosSeguimiento de procesos (4 etapas)
ventaCensur[ObjectId]carritoCensurVenta/cobro de productos
tipo_productoStringTipo de producto solicitado
estatusStringRECEPTOR · REACCIONES TRANSFUCIONALES
huboReaccionAdversaStringSI / NO

Modelos secundarios

modelCuestioExclusion

modelCuestioExclusion.js
CampoDescripción
autoexclusion0autoexclusion1213 preguntas SI/NO de autoexclusión
bancodesangreRef a BancoSangre

SignosVitalesBS

modelSignosVitales.js
CampoTipoDescripción
tallaNumberAltura en cm
pesoNumberPeso en kg
imcNumberÍndice de masa corporal
tempNumberTemperatura
sistolicaNumberPresión sistólica
diastolicaNumberPresión diastólica
huellasMultiplesStringHuellas venopunción múltiples
huellasRecientesStringHuellas venopunción recientes

FlebotomiaBS

modelFlebotomia.js
CampoDescripción
bancodesangreRef a BancoSangre
disponenteRef a DocumentosBS (archivos)
tipo_de_sangreadoTipo de extracción
tipo_de_donadorAltruista, reposición, etc.
volumenVolumen extraído
tiempoTiempo de extracción

LaboratorioBS

modelLaboratorio.js · polimórfico
UsoCampo ref
Biometría Hemáticalaboratorio → BancoSangre
Grupo y RHlaboratorio → BancoSangre
Serologíalaboratorio → BancoSangre
Tipo y Crucetiparycruzar → BancoSangreSocios

Otros campos: obtenidos (resultados), pedido (estudios pedidos), metodo, quimico/tecnico/cedula (responsable), proceso (EN PROCESO · FINALIZADO).

hojaEvolucionBS

modelHojaEvolucion.js
CampoDescripción
piel, mucosas, toraxHallazgos por aparato
abdomen, higado, bazoHallazgos por aparato
gangliosHallazgos ganglionares
candidato_donacionAprobación médica (SI/NO)
cie10Diagnóstico CIE-10

ReaccionesDerivadasBS

modelReaccionesDerivadas.js
CampoDescripción
Reacción vasovagalNiveles: leve, moderado, severo
Reacción de venopunciónNiveles: leve, moderado, severo
Toxicidad por citratoNiveles: leve, moderado, severo

BancoSangreSociosProcesos

modelBancoSangreTerceroProcesos.js
EtapaEstados
1. Documentos MédicosEN ESPERA · COMPLETADO
2. Tipar y CruzarEN ESPERA · COMPLETADO
3. Consulta de HistóricoEN ESPERA · COMPLETADO
4. Entrega de ProductosEN ESPERA · COMPLETADO

pedidosSedesBanco

modelPedidosBanco.js
CampoDescripción
pedidoRef a BancoSangreSocios
vendedorQuien genera el pedido
estudiosEstudios solicitados
sede_bancoSede que surtirá
totalCompraCosto total

Sedesbs

modelSedes.js
Grupo de datosContenido
Datos fiscalesRazón social, RFC, etc.
Datos de contactoResponsable, teléfono, correo
DirecciónDomicilio de la sede
CredencialesAcceso de cada sede proveedora

5. HistoriaClinicaBS — Historia Clínica

models/bancoDeSangre/modelHistoriaClinica.js

Más de 80 campos cubriendo todas las áreas clínicas relevantes para la donación de sangre:

ÁreaContenido
InfecciososHepatitis, VIH, COVID, paludismo, Chagas, sífilis, brucelosis
Quirúrgicos / MédicosCirugías, transfusiones previas, enfermedades crónicas
MedicamentosAnticoagulantes, retinoides, hormonas, antibióticos
Conductas de riesgoTatuajes recientes, perforaciones, uso de drogas
GinecobstétricosEmbarazo, lactancia, menstruación, fecha última regla

13. Modelos Auxiliares

ModeloArchivoDescripción
almacenProductosmodels/warehouse/modelProductos.jsCatálogo admin de productos/materiales
productosAlmacenStockmodels/almacen/stock/modelProductosStock.jsUnidades individuales en stock (con QR)
carritoCensurmodels/almacen/stock/carritoCensur.jsCobro/venta de productos a receptores
DocumentosBSmodels/bancoDeSangre/modelDocumentos.jsArchivos digitales del disponente/receptor
EstudiosLabBSmodels/bancoDeSangre/modelEstudios.jsCatálogo de estudios de laboratorio
TipeyCruceBSmodels/bancoDeSangre/modelTipeyCruce.jsResultados de tipo y cruce
proveedoresBSmodels/almacen/proveedores/porveedorModel.jsProveedores de insumos
cSeguimientomodels/almacen/modelSeguimiento.jsSeguimientos interdepartamentales
serviciosCensurmodels/almacen/modelServicios.jsCatálogo de servicios de CENSUR

Diagrama de relaciones entre modelos

┌──────────────┐ │ Paciente │ │ (nuevoPaciente) │ └──────┬───────┘ │ 1:N ┌──────────────────┴──────────────────┐ │ │ ▼ ▼ ┌───────────────┐ ┌───────────────────┐ │ BancoSangre │ │ BancoSangreSocios │ │ (Disponente) │ │ (Receptor/CENSUR) │ └───────┬───────┘ └─────────┬──────────┘ │ │ ┌────────┼─────────────────────┐ ┌──────────┼─────────────────┐ ▼ ▼ ▼ ▼ ▼ ▼ modelCuestio SignosVitalesBS LaboratorioBS BancoSangreSocios pedidosSedesBanco carritoCensur Exclusion HistoriaClinicaBS (polimórfico, Procesos (sede_banco, (cobro/venta) (13 preguntas) hojaEvolucionBS doble uso: (4 etapas) estudios) ReaccionesDerivadasBS laboratorio→BancoSangre FlebotomiaBS tiparycruzar→BancoSangreSocios) │ ▼ productosAlmacenStock ──1:N──► almacenProductos (Hemocomponentes, QR) (Catálogo admin) Catálogo / soporte: EstudiosLabBS · Sedesbs · proveedoresBS DocumentosBS · TipeyCruceBS · cSeguimiento · serviciosCensur
Sección 04

Referencia de API por Módulo

122 endpoints distribuidos en 18 archivos de rutas del backend (centro-horizonte-back).

📁

bancosangre.js — Expediente Principal del Disponente

18 endpoints
MétodoEndpointDescripción
POST/bancodesangreCrear nuevo expediente de banco de sangre para un paciente
PUT/agregar/procesobancodesangreActualizar proceso, estatus, motivo y fecha_termino
GET/getdisponente/:idObtener expediente completo por ID de banco de sangre
GET/getdisponente/por/paciente/:idObtener expediente completo por ID de paciente
GET/disponentesListar todos los disponentes con todos sus datos
POST/diferir/disponenteMarcar disponente como DIFERIDO con motivo
GET/orden/receptoresListar órdenes con estatus RECEPTOR
GET/orden/receptor/:idObtener una orden de receptor por ID
GET/disponentes/contarConteo total de expedientes
POST/disponente/visitasContar donaciones FINALIZADAS de un paciente
POST/getdisponente/visitasContar todas las visitas de un paciente
POST/disponentes/grupoyrhBuscar disponentes por tipo de sangre, agrupados por hemocomponente
POST/disponentes/diferidosListar diferidos de un paciente
GET/historico/disponentes/diferidosHistórico global de diferidos
POST/historico/banco/disponenteHistórico de donaciones de un paciente con flebotomía
GET/historico/disponente/bs/:idDetalle de un expediente histórico
POST/verificar/disponenteVerificar si un paciente tiene expedientes previos
GET/bancosListar todos los expedientes (sin populate)
POST/bancos/usuario/nodonacionVerificar si el disponente tiene proceso FINALIZADO o es primera vez
📁

receptor.js — Flujo del Receptor (CENSUR)

24 endpoints
MétodoEndpointDescripción
POST/censurCrear expediente de receptor y proceso de seguimiento
POST/receptor/documentosAgregar documentos al expediente del receptor
PUT/actualizar/receptor/documentos/:idActualizar documentos del receptor
POST/documentos/censurGuardar documentos y vincular a CENSUR
POST/cargar/documentos/censurSubir documentos a AWS S3
POST/ordenarpedido/censurCrear orden de pedido de hemocomponentes a sede
GET/productos/censurObtener stock de los 4 productos principales de BS
POST/receptoresListar receptores por sede
POST/informacion/receptor/pedidoDetalle de productos en tipo y cruce
POST/informacion/receptorInformación completa de un expediente CENSUR
POST/ordenar/tipeycruceCrear orden de tipo y cruce para receptor
POST/procesos/orden/censurVer procesos de seguimiento de una orden
POST/procesos/documentos/receptorVer proceso de documentos
POST/procesos/tipar/cruzarVer proceso de tipar y cruzar
POST/procesos/historico/documentoVer proceso de histórico
POST/procesos/entrega/productosVer proceso de entrega
GET/productos/materiales/servicios/censurListar productos con laboratorio CENSUR
PUT/actulizar/estado/pedido/censur/:idActualizar estatus de pedido
PUT/actulizar/estado/recpetor/censur/:idActualizar estatus del receptor
GET/ver/pedidos/detalle/:idVer detalle de un pedido y datos del paciente
GET/reacciones/transfucionalesListar receptores con reacciones transfusionales
PUT/agregar/documentos/banco/sangres/socios/:idActualizar datos del expediente CENSUR
POST/agregar/documentos/receptorGuardar documentos de reacciones del receptor
GET/ver/documentos/receptor/:idCensurObtener documentos de un receptor
📁

almacen.js — Almacén de Productos y Materiales

21 endpoints
MétodoEndpointDescripción
GET/minialmacenListar productos activos
GET/count/total/productosContar total de productos en catálogo
GET/actualizar/status/etiqueta/:idMarcar etiqueta como descargada
POST/agregar/productos/almacenCrear producto en catálogo admin
GET/ver/todos/productos/almacenListar productos activos tipo PRODUCTO
GET/ver/producto/almacen/por/id/:idObtener producto del catálogo por ID
PUT/actualizar/productos/costo/:idActualizar costo de un proveedor en producto
PUT/actualizar/productos/stock/almacen/:idActualizar unidad de stock por ID
GET/ver/productos/almacen/por/id/:idObtener unidades en stock de un producto
GET/ver/productos/salidasListar unidades marcadas para desecho
PUT/actualizar/productos/almacen/:idActualizar datos de producto en catálogo
POST/agregar/productos/almacen/stockIngresar N unidades al stock con QR automático
GET/vender/producto/stock/:idMarcar unidad como VENDIDA (vía QR)
POST/vender/producto/stock/:idMarcar unidad como VENDIDA (vía API)
GET/obtener/todos/produtos/stockListar todo el stock ordenado por caducidad
GET/desactivar/producto/almacen/:idDesactivar producto del catálogo
POST/agregar/nuevo/material/banco/sangreCrear nuevo material en catálogo
GET/ver/materiales/allListar todos los materiales
POST/buscar/nombre/productos/materialesBuscar por nombre en productos y materiales
GET/buscar/materiales/banco/sangre/:idBuscar material por ID
GET/materiales/banco/sangreListar materiales activos
GET/count/all/materiales/:tokenContar materiales activos
📁

laboratorio.js — Estudios de Laboratorio

16 endpoints
MétodoEndpointDescripción
POST/nuevo/estudio/bancoCrear tipo de estudio en el catálogo
GET/obtener/estudio/banco/:idObtener un tipo de estudio por ID
PUT/actualizar/estudiosActualizar valores de referencia de un estudio
PUT/proceso/laboratorioCambiar estatus del proceso de laboratorio
GET/todos/estudioListar todos los estudios del catálogo
POST/analisis/estudiosRegistrar biometría hemática y vincular al expediente
POST/analisis/grupoRegistrar grupo y RH, actualizar tipo de sangre del paciente
POST/analisis/serologiaRegistrar serología y generar hemocomponentes en stock con QR
POST/analisis/tipeycruceRegistrar tipo y cruce para un receptor (CENSUR)
POST/pedido/laboratorio/:idObtener pedido de laboratorio por ID
GET/obtener/banco/banco/:idObtener expediente bancario con datos del paciente
GET/hoja/servicio/laboratorio/:idHoja de servicio con paciente, laboratorio y flebotomía
POST/laboratorios/doctorListar laboratorios de un expediente con resultados
POST/laboratorios/servicios/procesoObtener estatus de estudios de un expediente
PUT/actualizar/analisis/estudiosActualizar resultados de biometría por el médico
POST/pedido/laboratorioListar laboratorios de un expediente
GET/labListar todos los expedientes bancarios

Otros módulos

📁

flebotomia.js

4 endpoints
MétodoEndpointDescripción
GET/flebotomia/:idObtener datos del expediente con signosvitales y laboratorio
GET/flebotomia/prueba/algoActualizar disponentes cuyo tiempo de diferimiento terminó
GET/ver/lista/disponentes/disponiblesListar disponentes con estatus DISPONIBLE
POST/flebotomiaRegistrar extracción de sangre, crear documentos y vincular al expediente
📁

bitacoras.js — Bitácoras por Área

5 endpoints
MétodoEndpointDescripción
GET/bitacora/enfermeriaDisponentes en proceso de enfermería
GET/bitacora/doctorDisponentes en proceso de médico
GET/bitacora/flebotomiaDisponentes en proceso de flebotomía
GET/bitacora/laboratorioDisponentes en proceso de laboratorio o serología
GET/bitacora/almacenTodos los disponentes con sus hemocomponentes
📁

signosvitales.js

3 endpoints
MétodoEndpointDescripción
POST/agregar/signosvitalesRegistrar talla, peso, IMC, T/A y huellas de venopunción
PUT/actualizar/religionActualizar religión del paciente
PUT/actualizar/tipoSangre/pacienteActualizar tipo de sangre del paciente
📁

disponente.js

3 endpoints
MétodoEndpointDescripción
PUT/agregar/lugardeorigenActualizar lugar de origen del paciente
PUT/agregar/productodeorigenActualizar tipo de donante
POST/ordenar/laboratoriosCrear orden de laboratorio y vincular al expediente
📁

carritoCensur.js — Cobro a Receptores

5 endpoints
MétodoEndpointDescripción
POST/agergar/carrito/censurCrear venta con métodos de pago mixtos y folio automático
GET/ver/carritos/cesnurListar todas las ventas
GET/carrito/censur/unico/:idObtener una venta por ID
DELETE/eliminar/carrito/censur/:idEliminar una venta
PUT/actualizar/carrito/products/:idActualizar datos de una venta
📁

proveedores.js

5 endpoints
MétodoEndpointDescripción
POST/registro/proveedorRegistrar nuevo proveedor
GET/ver/proveedoresListar proveedores activos
GET/ver/proveedor/por/id/:idObtener proveedor por ID
PUT/actualizar/proveedor/:idActualizar datos de proveedor
GET/desactivar/proveedor/por/id/:idDesactivar proveedor
📁

sedes.js

5 endpoints
MétodoEndpointDescripción
POST/crear/sede/bsRegistrar nueva sede proveedora
GET/listado/sedes/banco/sangre/Listar todas las sedes
GET/detalle/sede/:idDetalle de una sede
GET/ver/sedeListar sedes ordenadas por responsable
GET/ver/sedes/:idVer pedidos de una sede por carrito
📁

routesSeguimientos.js — Seguimientos Interdepartamentales

4 endpoints
MétodoEndpointDescripción
POST/crear/nuevo/seguimientoCrear seguimiento entre departamentos
GET/ver/seguimientos/creadosListar todos los seguimientos
PUT/actualizar/seguimiento/:idActualizar un seguimiento
DELETE/eliminar/seguimiento/:idEliminar un seguimiento
📁

ServiciosBS/serviciosBS.js — Servicios de CENSUR

4 endpoints
MétodoEndpointDescripción
POST/agregar/servicio/censurCrear nuevo servicio en catálogo CENSUR
GET/ver/servicios/censurListar todos los servicios
GET/ver/folio/serviciosObtener número de folio (contador)
GET/ver/servicio/banco/sangre/:idObtener servicio activo por ID

autoexclusion.js

1 endpoint
POST/cuestionario/autoexclusionGuardar las 13 preguntas de autoexclusión y vincular al expediente

historiaclinica.js

1 endpoint
POST/agregar/historiaclinicaGuardar historia clínica completa (80+ campos) y vincular al expediente

hojaevolucion.js

1 endpoint
POST/agregar/hojadeevolucionRegistrar exploración física del médico y candidatura a donación

reaccionesderivadas.js

1 endpoint
POST/agregar/reaccionesderivadasRegistrar reacciones vasovagales, venopunción o toxicidad durante la donación

jefeabanco.js

1 endpoint
GET/gethistorico/:idHistórico completo de donaciones de un paciente

Resumen de endpoints por módulo

receptor.js
24
almacen.js
21
bancosangre.js
18
laboratorio.js
16
carritoCensur.js
5
proveedores.js
5
sedes.js
5
bitacoras.js
5
flebotomia.js
4
routesSeguimientos.js
4
ServiciosBS/serviciosBS.js
4
signosvitales.js
3
disponente.js
3
historiaclinica.js
1
hojaevolucion.js
1
autoexclusion.js
1
reaccionesderivadas.js
1
jefeabanco.js
1
Total de endpoints documentados 122
🩸
Sección 05

Flujo del Disponente (donador)

Vista por capas (rol → endpoint)

PACIENTE │ ▼ [ENFERMERÍA] ├── POST /bancodesangre ← Crear expediente ├── POST /cuestionario/autoexclusion ← 13 preguntas └── POST /agregar/signosvitales ← Talla, peso, T/A │ ▼ (proceso: DOCTOR) [MÉDICO] ├── POST /agregar/historiaclinica ← 80+ campos clínicos ├── POST /agregar/hojadeevolucion ← Exploración física └── Decisión: ├── APTO → PUT /agregar/procesobancodesangre (FLEBOTOMIA) └── NO APTO → POST /diferir/disponente (DIFERIDO + tiempo_rechazo) │ ▼ (proceso: FLEBOTOMIA) [TÉCNICO DE FLEBOTOMÍA] └── POST /flebotomia ← Registrar extracción │ ▼ (proceso: LABORATORIO) [LABORATORISTA] ├── POST /analisis/estudios ← Biometría hemática ├── POST /analisis/grupo ← Grupo y RH → actualiza tipoDeSangre del paciente └── POST /analisis/serologia ← Serología + genera hemocomponentes en STOCK con QR │ ▼ (estatus: DISPONIBLE) [ALMACÉN] └── Hemocomponentes disponibles para surtir a receptores CE → Concentrado Eritrocitario CP → Concentrado Plaquetario PL → Plasma PT → Plaquetas

Vista por pantalla (componente → ruta)

bitacora/disponentes (Lista de pacientes) │ AGREGAR ▼ registro/disponentes (Alta disponente) bitacora/disponentes │ ver paciente ▼ ver/disponente/:id (Selecciona "Donaciones" + sede de origen) ├─ validacionDonacion = NUEVO/DISPONIBLE ──► autoexclusion/:id (12 preguntas) ├─ proceso = FINALIZADO ──────────────────► ❌ NO APTO (fin) └─ tiene donaciones previas ──────────────► historico/disponente/bs/:id autoexclusion/:id ├─ alguna respuesta = riesgo ─► 🚫 DIFERIDO (fin) └─ todo OK → proceso=enfermeria ─► disponentes/bitacora (Enfermería) disponentes/bitacora ▼ ficha/disponente/:id (Signos vitales) ├─ fuera de rango ─► 🚫 DIFERIDO └─ OK → proceso=doctor + pide laboratorios ─► bitacora/consulta/disponentes (Doctor) bitacora/consulta/disponentes ▼ historia/clinica/doctor/:id (Historia clínica por secciones) ├─ sección de riesgo ─► 🚫 DIFERIDO └─ OK ─► hoja/evolucion/disponente/:id (Exploración física + diagnóstico) hoja/evolucion/disponente/:id ├─ candidato_donacion = NO ─► 🚫 DIFERIDO └─ APTO → proceso=FLEBOTOMIA ─► bitacora/flebotomia bitacora/flebotomia ▼ documentos/flebotomia/:id (Datos de extracción + consentimiento firmado) ├─ no firma ─► 🚫 Autoexclusión / diferido └─ firma → proceso=serologia, imprime etiqueta "NO LIBERADO" ─► bitacora/laboratorios/disponentes bitacora/laboratorios/disponentes ▼ hoja/servicios/laboratorio/disponentes/:id (Hub de estudios pendientes) ├─► grupo/rh/biometria/hematica/completa/:id (Biometría + Grupo y RH) └─► serologia/laboratorio/disponente/:id (Serología, 7 pruebas) ├─ alguna prueba REACTIVA ─────────► 🚫 DIFERIDO 100 años (producto se desecha) └─ 7/7 NO REACTIVO, proceso=FINALIZADO ─► ✅ LIBERADO (etiqueta QR → inventario) │ ▼ bitacora/salidas/almacen (Almacén: salida/desecho)
⚠️

reacciones/adversas (ReaccionesDerivadasComponent) debería poder dispararse en cualquier punto durante/después de la flebotomía, pero hoy no está conectado al backend (solo UI, enviar() y getDisponente() comentados).

ℹ️

Cálculo del diferimiento: en cada punto de control (autoexclusión, signos vitales, historia clínica, evolución/diagnóstico, serología) que detecta riesgo se calcula un motivo y tiempo_rechazo. Si hay varias causas, fechaMayor toma el plazo más largo entre todas, y se marca estatus: 'DIFERIDO'. Una donación LIBERADA también difiere automáticamente al disponente 3 meses (regla estándar post-donación).

Bitácoras por área

ÁreaEndpointFiltra por
EnfermeríaGET /bitacora/enfermeriaproceso: 'enfermeria'
MédicoGET /bitacora/doctorproceso: 'doctor'
FlebotomíaGET /bitacora/flebotomiaproceso: 'FLEBOTOMIA'
LaboratorioGET /bitacora/laboratorioproceso: 'DOCTOR' | 'SEROLOGIA'
AlmacénGET /bitacora/almacentodos (con almacén)
🏥
Sección 06

Flujo del Receptor / CENSUR

Como se documenta en Arquitectura Frontend, este flujo existe en dos implementaciones: la del módulo BancoSangre/rolRecepcion (hub hojaservicios/receptor/:id) y la "alterna" fuera del módulo (banco/sangredocumentos/paciente/:idproductosreacciones/*). Ambas consumen receptor.js / BancoSangreSocios en el backend.

A. Flujo dentro de BancoSangre (hub de pedido)

receptores (Lista de pedidos) ▼ hojaservicios/receptor/:id (Hub del pedido — 4 subprocesos) ├─► documentos/receptor (Documentos médicos) ├─► tiparcruza (Lab) — Tipar y Cruzar vs disponentes/bolsas compatibles │ ⚠️ búsqueda funciona, pero guardar() (POST /analisis/tipeycruce) está comentado ├─► historico/... (Histórico) └─► productos/receptor (Catálogo de hemoderivados → carrito) └─► orden/productos (Pago — app-pagos-censur) └─ carrito.total = 0 cambioEstadoCensur → 'reacciones transfucionales' └─► agregar/docuemtos/recpetor/firmados (Sube consentimientos firmados) └─► ✅ Fin del proceso → / entrega/productos/sanguineos (standalone, sin :id) └─ Genera PDFs de etiqueta de urgencia + carta responsiva (sin backend)

B. Por capas (rol → endpoint) — modelo CENSUR

RECEPTOR │ ▼ [PERSONAL CENSUR] ├── POST /censur ← Crear expediente + proceso de seguimiento ├── POST /receptor/documentos ← Documentos médicos └── POST /ordenar/tipeycruce ← Solicitar tipo y cruce │ ▼ [LABORATORIO] └── POST /analisis/tipeycruce ← Procesar tipo y cruce │ ▼ [PERSONAL CENSUR] └── POST /ordenarpedido/censur ← Generar pedido a sede proveedora │ ▼ [SEDE BANCO DE SANGRE] └── Procesa y entrega hemocomponentes │ ▼ [CAJA / COBRO] └── POST /agergar/carrito/censur ← Cobrar con métodos mixtos GET /vender/producto/stock/:id ← Marcar unidades como VENDIDAS │ ▼ [MONITOREO] └── GET /reacciones/transfucionales ← Vigilancia de reacciones adversas

C. Flujo CENSUR alterno (fuera de BancoSangre) — camino feliz

ReceptoresComponent (banco/sangre — lista de receptores de la sede) │ click en un paciente → /paciente/:id (detalle, fuera de este análisis) │ ... o navegación directa a documentos → ▼ DocspacienteComponent (/documentos/paciente/:id) - Sube 4 documentos obligatorios (consentimiento, resumen médico, últimos laboratorios, solicitud de componentes sanguíneos) - Genera receptor en CENSUR → guarda idCensur en localStorage │ navega a /productos ▼ ProductosComponent → PedidosComponent (/productos) - Selección de productos / carrito (CarritoCensur) - Genera orden de pedido + tipo y cruce │ navega a /dashboard ▼ (tiempo después, tras la transfusión) │ ReaccionesTransfucionalesComponent (/reacciones/transfucionales) - Bitácora de todos los pedidos pendientes/realizados │ click en una fila → /reacciones/adversas/:id ▼ ReaccionesAdversasComponent (/reacciones/adversas/:id) - Registra si hubo reacción adversa - Sube documento de "Reacción Transfusional" - Marca receptor como FINALIZADO │ navega a /dashboard ▼ (fin del ciclo del receptor)

Estado compartido vía localStorage

En el flujo CENSUR alterno, en lugar de pasar datos entre rutas mediante un servicio o estado de Angular, el flujo se apoya en localStorage:

ClaveEscrita enLeída en
cede(login / sesión)ReceptoresComponent
idCensurDocspacienteComponent (generaridCensur)PedidosComponent (enviarSolicitud), luego se elimina
censur-carritoPedidosComponent (CarritoCensur)PedidosComponent, luego se elimina
usuario(login / sesión)PedidosComponent (setPedido)
⚠️

Si el usuario navega fuera del flujo o abre otra pestaña, el estado guardado en localStorage puede quedar inconsistente o perderse (ver Estado del Código).

🏢
Sección 07

Flujo de Sedes / Jefatura Banco de Sangre

listado/sedes/banco/sangre (SedesbsComponent ✅ funcional — lista sedes) ├─ tarjeta de sede ──► detalle/sede/:id (DetalleSedeComponent ⚠️ tabla de pedidos hardcodeada) └─ AGREGAR SEDE ─────► agregar/sede/bs (AgregarSedeComponent ⚠️ POST /crear/sede/bs comentado) └─ (debería regresar a) listado/sedes/banco/sangre ficha/identificacion/sede ⚠️ placeholder vacío (FISedeComponent) bitacora/no-aptos ⚠️ placeholder, tabla estática (BitacoraNoAptosODiferidosComponent) hoja/servicio/receptor (BS) ⚠️ placeholder, tabla estática (HojaServicioReceptorBSComponent) orden/servicio/receptores ⚠️ placeholder, tabla estática (OrdenreceptoresComponent)

Backend disponible para este flujo (sedes.js, 5 endpoints): POST /crear/sede/bs, GET /listado/sedes/banco/sangre/, GET /detalle/sede/:id, GET /ver/sede, GET /ver/sedes/:id. Ver Otros módulos.

📌
Sección 08

Casos de Uso

CU-01

Registro y Proceso de Donación

👤 Enfermera · Médico · Flebotomista · Laboratorista
  1. 1 Paciente llega al banco de sangre
  2. 2 Enfermería crea el expediente POST /bancodesangre
  3. 3 Registra autoexclusión POST /cuestionario/autoexclusion
  4. 4 Toma signos vitales POST /agregar/signosvitales
  5. 5 Médico revisa historia clínica POST /agregar/historiaclinica
  6. 6 Médico realiza exploración física POST /agregar/hojadeevolucion
  7. 7 Médico aprueba candidato a donación
  8. 8 Técnico registra extracción POST /flebotomia
  9. 9 Laboratorio procesa biometría POST /analisis/estudios
  10. 10 Determina grupo y RH POST /analisis/grupo
  11. 11 Serología → genera hemocomponentes con QR POST /analisis/serologia
  12. 12 Proceso FINALIZADO, estatus DISPONIBLE
CU-02

Diferimiento de Disponente

👤 Médico
  1. 1 Médico evalúa al disponente
  2. 2 Decide diferir con motivo clínico POST /diferir/disponente
  3. 3 El disponente queda inactivo (DIFERIDO)
  4. 4 Se consulta histórico GET /historico/disponentes/diferidos
  5. 5 Job revisa fecha_termino y reactiva GET /flebotomia/prueba/algo
CU-03

Búsqueda de Hemocomponentes por Tipo de Sangre

👤 Laboratorista · Jefe de Banco
  1. 1 Se solicita sangre compatible POST /disponentes/grupoyrh {tiposangre: "O+"}
  2. 2 Sistema busca pacientes con ese tipo
  3. 3 Filtra solo los que tienen almacén
  4. 4 Clasifica por hemocomponente: CE, CP, PL, PT
  5. 5 Ordena por fecha de caducidad (PEPS)
  6. 6 Retorna el más próximo a caducar primero
CU-04

Solicitud de Sangre para Receptor (CENSUR)

👤 Personal CENSUR · Laboratorista
  1. 1 Paciente receptor llega con solicitud
  2. 2 Personal crea expediente de receptor POST /censur
  3. 3 Personal carga documentos médicos POST /receptor/documentos
  4. 4 Personal ordena tipo y cruce POST /ordenar/tipeycruce
  5. 5 Laboratorista registra tipo y cruce POST /analisis/tipeycruce
  6. 6 Personal genera pedido a sede POST /ordenarpedido/censur
  7. 7 Sede surtidora procesa el pedido
  8. 8 Personal registra cobro mixto POST /agergar/carrito/censur
  9. 9 Hemocomponentes → VENDIDO GET /vender/producto/stock/:id
  10. 10 Actualiza estatus del receptor PUT /actulizar/estado/recpetor/censur/:id
CU-05

Gestión de Almacén de Hemocomponentes

👤 Almacenista · Laboratorista
  1. 1 Laboratorista crea serología POST /analisis/serologia → genera unidades con QR
  2. 2 Almacenista ve el stock GET /obtener/todos/produtos/stock
  3. 3 Stock ordenado por caducidad (PEPS)
  4. 4 Almacenista gestiona desechos GET /ver/productos/salidas
  5. 5 Almacenista ingresa materiales POST /agregar/nuevo/material/banco/sangre
CU-06

Registro de Reacciones Adversas

👤 Técnico de Flebotomía · Médico

Durante la donación:

  1. 1 Ocurre reacción durante la extracción
  2. 2 Técnico registra POST /agregar/reaccionesderivadas (vasovagal / venopunción / toxicidad por citrato)
  3. 3 Médico registra tratamiento

Reacción transfusional (receptor):

  1. 1 Receptor presenta reacción post-transfusión
  2. 2 Estatus → REACCIONES TRANSFUCIONALES PUT /actulizar/estado/recpetor/censur/:id
  3. 3 Sistema lista todos los casos GET /reacciones/transfucionales
CU-07

Gestión de Sedes Proveedoras

👤 Administrador / Jefe de Banco de Sangre
  1. 1 Registrar nueva sede POST /crear/sede/bs
  2. 2 Ver listado de sedes GET /listado/sedes/banco/sangre/
  3. 3 Ver pedidos de una sede GET /ver/sedes/:id (vía carrito)
  4. 4 Gestionar proveedores de insumos POST /registro/proveedor
CU-08

Flujo CENSUR alterno: documentos → pedido → reacciones

👤 Personal de Banco de Sangre
  1. 1 Entra a banco/sangre y busca/selecciona al paciente
  2. 2 En documentos/paciente/:id sube los 4 documentos obligatorios
  3. 2a Alterno: si hay < 4 archivos → alerta con los faltantes, no avanza
  4. 3 Se genera idCensur (agregarReceptor) y se suben documentos
  5. 4 Redirige a /productos; carga catálogo y carrito
  6. 4a Alterno: carrito vacío → alerta "Necesitas agregar un producto al carrito"
  7. 5 Genera tipo y cruce + orden de pedido CENSUR; limpia localStorage
  8. 6 Más tarde: /reacciones/transfucionales/reacciones/adversas/:id → marca receptor FINALIZADO
🚧
Sección 09

Estado del Código / Pendientes

Hallazgos por componente

ComponenteProblemaTipo
BitacoraAlmacenComponent
(bitacora/almacen)
Tabla 100% hardcodeada, sin servicio conectadoHardcodeado
HojaServiciosLabsComponent
(hoja-servicios)
Código muerto, no referenciado en ninguna ruta ni plantillaCódigo muerto
HistoricoEstudiosDisponenteComponentPlaceholder estático con una fila de ejemploPlaceholder
BitacoraPedidosComponent
(bitacora/hoja/de/servicios)
Carga pacientes reales, pero columnas de estatus/proceso/motivo están hardcodeadasParcial
ReaccionesDerivadasComponentUI completa pero enviar() y getDisponente() están comentados — no persisteSin backend
TiparCruzarComponentBúsqueda de compatibles funciona, pero guardar() (POST /analisis/tipeycruce) está comentado; método/técnico/cédula hardcodeadosSin backend
FISedeComponent, HojaServicioReceptorBSComponent, OrdenreceptoresComponent, BitacoraNoAptosODiferidosComponentPlaceholders vacíos o con datos de ejemplo, sin servicioPlaceholder
AgregarSedeComponentFormulario completo y validado, pero POST /crear/sede/bs está comentadoSin backend
DetalleSedeComponentTabla de "pedidos de sede" hardcodeada; getVenSede() se llama pero el resultado no se asignaHardcodeado
EntregaProductosComponentgetProductosAlmacen() se llama pero su resultado no se usa (solo console.log)Bug menor

Riesgos del flujo CENSUR alterno

  • Estado compartido vía localStorage (idCensur, censur-carrito, usuario, cede): si el usuario navega fuera del flujo o abre otra pestaña, el estado puede quedar inconsistente o perderse.
  • ReaccionesTransfucionalesComponent no pagina resultados (TODO pendiente en el código), lo que puede impactar el rendimiento con bitácoras grandes.
  • ReceptoresComponent: paginaAnterior/siguentePagina llaman a PacientesService.getPacientes(intervalo), un endpoint distinto al usado en la carga inicial (getPacientesSede); esto podría producir resultados inconsistentes con la sede filtrada.
  • ReaccionesAdversasComponent.guardarDocumentos no valida que se haya subido un documento antes de enviar (this.imagenes[0] puede ser undefined).
  • Código comentado / bloques muertos presentes en DocspacienteComponent (agregarDocumentos, sección de "Documentos Adjuntos" en el HTML) que podrían limpiarse.
📌

Prioridad arquitectónica: el hallazgo más relevante para el roadmap sigue siendo la duplicidad del flujo CENSUR descrita en Arquitectura Frontend y Flujo Receptor / CENSUR — dos UIs distintas (hojaservicios/receptor/:id vs. banco/sangre → documentos/paciente/:id → productos → reacciones/*) escriben sobre el mismo modelo BancoSangreSocios / receptor.js, con lógicas y validaciones que pueden divergir.

🔧
Sección 10

Notas Técnicas

🔳 Generación de QR

Al ingresar productos al stock (POST /agregar/productos/almacen/stock) y al finalizar serología (POST /analisis/serologia), el sistema genera automáticamente un código QR por unidad apuntando a GET /vender/producto/stock/:id. Esto permite marcar unidades como vendidas escaneando el código.

🏷️ Lote Unitario

Cada unidad de stock recibe un lote_unitario secuencial calculado contando cuántos documentos del mismo producto existen antes de guardar.

🩸 Clasificación de Hemocomponentes

Los hemocomponentes se identifican por el patrón en lote_unitario mediante expresiones regulares:

  • /CE/i → Concentrado Eritrocitario
  • /CP/i → Concentrado Plaquetario
  • /PL/i → Plasma
  • /PT/i → Plaquetas

💲 Precios Unificados

Al agregar nuevas unidades al stock, el sistema compara el precio con las unidades existentes del mismo producto y actualiza TODAS las unidades al precio más alto (lógica en POST /agregar/productos/almacen/stock).

⏱️ Disponibilidad Automática

El endpoint GET /flebotomia/prueba/algo actúa como job de revisión: compara fecha_termino con la fecha actual y regresa a DISPONIBLE a los disponentes diferidos cuyo tiempo expiró.

🧬 Modelo Polimórfico de Laboratorio

LaboratorioBS (models/bancoDeSangre/modelLaboratorio.js) es una tabla polimórfica reutilizada para Biometría Hemática, Grupo y RH y Serología (todas referencian BancoSangre vía laboratorio) y para Tipo y Cruce (referencia BancoSangreSocios vía tiparycruzar). Su campo proceso distingue EN PROCESO / FINALIZADO.

☁️ Documentos en AWS S3

Los documentos del receptor (consentimientos, resúmenes médicos, laboratorios, solicitudes de componentes) se suben a AWS S3 vía POST /cargar/documentos/censur y se referencian por URL en BancoSangreSocios.

📄 PDFs generados en cliente

Las etiquetas QR ("LIBERADO" / "NO LIBERADO"), la etiqueta de urgencia y la carta responsiva se generan en el navegador con jsPDF, no por el backend — el servidor solo provee los datos crudos.

📖
Sección 11

Glosario de Estados y Términos

Campo proceso (BancoSangre — disponente)

NUEVO / DISPONIBLE
Disponente recién registrado, listo para iniciar autoexclusión.
enfermeria
Pasó la autoexclusión; pendiente de signos vitales.
doctor
Pendiente de historia clínica y exploración médica.
FLEBOTOMIA
Aprobado por el médico; pendiente de extracción.
serologia / SEROLOGIA
Extracción realizada; pendiente de estudios de laboratorio (biometría, grupo/RH, serología).
FINALIZADO
Ciclo de donación completo; hemocomponentes generados en stock.
DIFERIDO
Donación rechazada/pospuesta en cualquier punto del proceso (autoexclusión, signos vitales, historia clínica, evolución o serología reactiva).

Campo estatus (disponibilidad de hemocomponentes)

DISPONIBLE
Unidad en stock, lista para ser asignada a un receptor.
EN PROCESO
Estudio de laboratorio en curso, aún sin resultado final.
DIFERIDO
Disponente fuera de circulación temporal o permanentemente (ver diferido[]: motivo, tiempoDiferir, fecha_final).
VENDIDO
Unidad entregada/cobrada a un receptor (GET /vender/producto/stock/:id).

Hemocomponentes

CE
Concentrado Eritrocitario (glóbulos rojos).
CP
Concentrado Plaquetario.
PL
Plasma.
PT
Plaquetas.

Términos generales

Disponente
Persona donadora de sangre. Modelo principal: BancoSangre.
Receptor / CENSUR
Paciente que recibe hemocomponentes. Modelo principal: BancoSangreSocios.
Autoexclusión
Cuestionario de 12-13 preguntas de riesgo aplicado antes de aceptar la donación (modelCuestioExclusion).
PEPS / FIFO
"Primeras Entradas, Primeras Salidas": el stock se ordena por fecha_caducidad ascendente para usar primero lo que vence antes.
Lote unitario
Identificador secuencial por unidad de producto, usado además para clasificar el hemocomponente por regex.
Tipar y Cruzar
Prueba de compatibilidad sanguínea entre la sangre del receptor y las unidades candidatas (LaboratorioBS.tiparycruzar).
Hoja de Servicios
Vista "hub" que agrupa los subprocesos pendientes de un disponente o receptor (estudios de laboratorio, documentos, productos).
Carrito CENSUR
Carrito de compra de hemoderivados para un receptor, persistido temporalmente en localStorage (censur-carrito).
Sede
Ubicación física del banco de sangre (Sedesbs) que puede surtir pedidos a otras sedes (pedidosSedesBanco).
Bitácora
Listado/tablero de pacientes filtrado por área y estado de proceso (enfermería, médico, flebotomía, laboratorio, almacén).