Skip to content

Commit a7f32a8

Browse files
authored
Merge pull request #45 from iJosueeh/feature/panales-operaciones-refactoring
Feature/panales operaciones refactoring
2 parents 1db1a63 + 8137069 commit a7f32a8

19 files changed

Lines changed: 711 additions & 131 deletions

File tree

REQUERIMIENTOS.md

Lines changed: 134 additions & 53 deletions
Large diffs are not rendered by default.

database/meditrack_init.sql

Lines changed: 86 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99
-- =====================================================================
1010
-- CREDENCIALES DE ACCESO (contraseña: admin123 para todos)
1111
-- =====================================================================
12-
-- ROL | DNI | USUARIO | CONTRASEÑA
13-
-- ------------------------|-----------|-----------|------------
14-
-- Administrador | 12345678 | USR-001 | admin123
15-
-- Químico Farmacéutico | 22222222 | USR-002 | admin123
16-
-- Técnico de Farmacia | 33333333 | USR-003 | admin123
12+
-- ROL | DNI | USUARIO | CONTRASEÑA
13+
-- ------------------------|-----------|-----------------|------------
14+
-- Administrador global | 12345678 | USR-001-0002 | admin123
15+
-- Jefe de Sede | 22222222 | USR-002-0001 | admin123
16+
-- Técnico de Farmacia | 33333333 | USR-001-0001 | admin123
1717
-- =====================================================================
1818
-- NOTAS:
19-
-- - El Administrador tiene acceso global a todas las sedes
20-
-- - El Químico Farmacéutico tiene acceso de gestión a su sede
21-
-- - El Técnico de Farmacia solo tiene acceso operativo a su sede
19+
-- - El Administrador global tiene acceso total sin restricción de sede
20+
-- - El Jefe de Sede gestiona su posta: entradas, lotes, pacientes, reportes
21+
-- - El Técnico de Farmacia opera diariamente: atenciones, dispensación, salidas
2222
-- - Las sedes bloqueadas impiden a sus usuarios realizar operaciones
2323
-- =====================================================================
2424

@@ -610,25 +610,23 @@ END
610610
GO
611611

612612
-- Asignar permisos al Administrador Global: acceso total sin restricción de sede
613-
IF NOT EXISTS (SELECT 1 FROM [rol_permisos] WHERE [rol_id] = 'ROL-001')
614-
BEGIN
615-
INSERT INTO [rol_permisos] ([rol_id], [permiso_id]) VALUES
616-
('ROL-001', 'PERM-001'), -- M1_LOGIN
617-
('ROL-001', 'PERM-007'), -- M2_SEDES (crear/editar sedes)
618-
('ROL-001', 'PERM-008'), -- M3_PRODUCTOS (catálogo de productos)
619-
('ROL-001', 'PERM-002'), -- M4_LOTES
620-
('ROL-001', 'PERM-003'), -- M5_ENTRADAS
621-
('ROL-001', 'PERM-004'), -- M6_SALIDAS
622-
('ROL-001', 'PERM-005'), -- M8_ATENCIONES
623-
('ROL-001', 'PERM-006'), -- M9_DISPENSACION
624-
('ROL-001', 'PERM-009'), -- M7_PACIENTES
625-
('ROL-001', 'PERM-010'), -- USUARIOS
626-
('ROL-001', 'PERM-011'), -- CATEGORIAS
627-
('ROL-001', 'PERM-012'), -- MOV_CATALOGOS
628-
('ROL-001', 'PERM-013'), -- M10_REPORTES (reportes consolidados)
629-
('ROL-001', 'PERM-014'); -- ROLES
630-
PRINT 'Permisos asignados al Administrador Global.';
631-
END
613+
DELETE FROM [rol_permisos] WHERE [rol_id] = 'ROL-001';
614+
INSERT INTO [rol_permisos] ([rol_id], [permiso_id]) VALUES
615+
('ROL-001', 'PERM-001'),
616+
('ROL-001', 'PERM-007'),
617+
('ROL-001', 'PERM-008'),
618+
('ROL-001', 'PERM-002'),
619+
('ROL-001', 'PERM-003'),
620+
('ROL-001', 'PERM-004'),
621+
('ROL-001', 'PERM-005'),
622+
('ROL-001', 'PERM-006'),
623+
('ROL-001', 'PERM-009'),
624+
('ROL-001', 'PERM-010'),
625+
('ROL-001', 'PERM-011'),
626+
('ROL-001', 'PERM-012'),
627+
('ROL-001', 'PERM-013'),
628+
('ROL-001', 'PERM-014');
629+
PRINT 'Permisos asignados al Administrador Global.';
632630
GO
633631

634632
-- Asignar permisos al Jefe de Sede: supervisa inventario, registra entradas, gestiona usuarios, reportes de sede
@@ -678,7 +676,9 @@ PRINT 'Catálogos de movimiento verificados.';
678676
GO
679677

680678
-- =====================================================================
681-
-- FASE 5: DATOS DE PRUEBA (siempre reconstruir IDs consistentes)
679+
-- FASE 5: DATOS DE PRUEBA
680+
-- AVISO: Este fase ELIMINA y REINSERTA datos de prueba.
681+
-- Para producción, comentar o eliminar esta fase después del primer despliegue.
682682
-- =====================================================================
683683

684684
-- Limpiar datos de prueba existentes para re-insertar con IDs correctos
@@ -726,30 +726,74 @@ UPDATE [sedes] SET [administrador_id] = 'USR-001-0002' WHERE [id] = 'SED-001';
726726
UPDATE [sedes] SET [administrador_id] = 'USR-002-0001' WHERE [id] = 'SED-002';
727727

728728
-- Pacientes
729+
-- Formato real: PAC-[SEDE_NUM]-[SEQ 6 DIGITOS]
729730
INSERT INTO [pacientes] ([id], [tipo_documento], [numero_documento], [nombres], [apellidos], [telefono]) VALUES
730-
('PAC-001-001', 'DNI', '44556677', 'Juan', 'Perez Garcia', '988777666'),
731-
('PAC-001-002', 'CE', '22334455', 'Maria', 'Lopez Sosa', '911222333'),
732-
('PAC-002-001', 'DNI', '55443322', 'Carlos', 'Mendez Ruiz', '987654321');
731+
('PAC-001-000001', 'DNI', '44556677', 'Juan', 'Perez Garcia', '988777666'),
732+
('PAC-001-000002', 'CE', '22334455', 'Maria', 'Lopez Sosa', '911222333'),
733+
('PAC-002-000001', 'DNI', '55443322', 'Carlos', 'Mendez Ruiz', '987654321');
733734

734735
-- Lotes
736+
-- Formato real: LOT-[SEDE_NUM]-[SEQ 5 DIGITOS]
735737
INSERT INTO [lotes] ([id], [producto_id], [sede_id], [numero_lote], [fecha_fabricacion], [fecha_vencimiento], [cantidad]) VALUES
736-
('LT-001-001', 'PRD-001-001', 'SED-001', 'L2024-001', '2024-01-01', '2027-06-01', 150),
737-
('LT-001-002', 'PRD-001-004', 'SED-001', 'L2024-002', '2024-02-15', '2027-08-20', 80),
738-
('LT-001-003', 'PRD-001-002', 'SED-001', 'L2024-CRIT', '2024-01-10', '2027-05-15', 3),
739-
('LT-001-004', 'PRD-001-006', 'SED-001', 'L2024-LOW', '2024-03-01', '2027-04-10', 5),
740-
('LT-001-005', 'PRD-001-003', 'SED-001', 'L-VENC-1', '2024-05-01', '2026-07-15', 45),
741-
('LT-001-006', 'PRD-001-005', 'SED-001', 'L-VENC-2', '2024-06-01', '2026-06-25', 20);
738+
('LOT-001-00001', 'PRD-001-001', 'SED-001', 'L2024-001', '2024-01-01', '2027-06-01', 150),
739+
('LOT-001-00002', 'PRD-001-004', 'SED-001', 'L2024-002', '2024-02-15', '2027-08-20', 50),
740+
('LOT-001-00003', 'PRD-001-002', 'SED-001', 'L2024-CRIT', '2024-01-10', '2027-05-15', 3),
741+
('LOT-001-00004', 'PRD-001-006', 'SED-001', 'L2024-LOW', '2024-03-01', '2027-04-10', 5),
742+
('LOT-001-00005', 'PRD-001-003', 'SED-001', 'L-VENC-1', '2024-05-01', '2026-07-15', 45),
743+
('LOT-001-00006', 'PRD-001-005', 'SED-001', 'L-VENC-2', '2024-06-01', '2026-06-25', 20),
744+
('LOT-002-00001', 'PRD-001-004', 'SED-002', 'L2024-S2-001', '2024-02-01', '2027-09-01', 30);
742745

743746
-- Atenciones
747+
-- Formato real: ATE-[SEDE_NUM]-[SEQ 6 DIGITOS]
744748
INSERT INTO [atenciones] ([id], [sede_id], [paciente_id], [usuario_id], [numero_receta], [medico], [fecha_atencion]) VALUES
745-
('ATN-001-001', 'SED-001', 'PAC-001-001', 'USR-001-0001', 'REC-001', 'Dr. Garcia', '2026-06-15 10:30:00'),
746-
('ATN-001-002', 'SED-001', 'PAC-001-002', 'USR-001-0001', 'REC-002', 'Dra. Lopez', '2026-06-16 14:00:00');
749+
('ATE-001-000001', 'SED-001', 'PAC-001-000001', 'USR-001-0001', 'REC-2026-0001', 'Dr. Garcia', '2026-06-15 10:30:00'),
750+
('ATE-001-000002', 'SED-001', 'PAC-001-000002', 'USR-001-0001', 'REC-2026-0002', 'Dra. Lopez', '2026-06-16 14:00:00');
747751

748752
-- Detalles de atención
753+
-- Formato real: ATD-[SEDE_NUM]-[SEQ 8 DIGITOS]
749754
INSERT INTO [atencion_detalles] ([id], [atencion_id], [lote_id], [cantidad_entregada]) VALUES
750-
('ATN-D-001-001', 'ATN-001-001', 'LT-001-001', 2),
751-
('ATN-D-001-002', 'ATN-001-001', 'LT-001-002', 1),
752-
('ATN-D-001-003', 'ATN-001-002', 'LT-001-003', 3);
755+
('ATD-001-00000001', 'ATE-001-000001', 'LOT-001-00001', 2),
756+
('ATD-001-00000002', 'ATE-001-000001', 'LOT-001-00002', 1),
757+
('ATD-001-00000003', 'ATE-001-000002', 'LOT-001-00003', 3);
758+
759+
-- Movimientos de inventario (historial para dashboard y reportes)
760+
-- Formato real: MOV-[SEDE_NUM]-[SEQ 6 DIGITOS]
761+
-- Incluye movimientos de hace 6 meses para que el dashboard tenga datos de tendencia
762+
INSERT INTO [movimientos] ([id], [tipo_id], [motivo_id], [sede_id], [usuario_id], [lote_id], [cantidad], [observacion], [fecha_registro]) VALUES
763+
-- Entradas mes actual
764+
('MOV-001-000001', 'MOV-T-01', 'MOV-M-01', 'SED-001', 'USR-001-0001', 'LOT-001-00001', 100, 'Entrada inicial de paracetamol', '2026-06-01 09:00:00'),
765+
('MOV-001-000002', 'MOV-T-01', 'MOV-M-02', 'SED-001', 'USR-001-0001', 'LOT-001-00002', 50, 'Transferencia de almacén central', '2026-06-02 10:30:00'),
766+
('MOV-001-000003', 'MOV-T-01', 'MOV-M-01', 'SED-001', 'USR-002-0001', 'LOT-001-00005', 60, 'Compra directa ibuprofen', '2026-06-05 14:00:00'),
767+
-- Salidas mes actual
768+
('MOV-001-000004', 'MOV-T-02', 'MOV-M-03', 'SED-001', 'USR-001-0001', 'LOT-001-00001', 2, 'Dispensación atención REC-2026-0001', '2026-06-15 10:35:00'),
769+
('MOV-001-000005', 'MOV-T-02', 'MOV-M-03', 'SED-001', 'USR-001-0001', 'LOT-001-00002', 1, 'Dispensación atención REC-2026-0001', '2026-06-15 10:40:00'),
770+
('MOV-001-000006', 'MOV-T-02', 'MOV-M-03', 'SED-001', 'USR-001-0001', 'LOT-001-00003', 3, 'Dispensación atención REC-2026-0002', '2026-06-16 14:05:00'),
771+
('MOV-001-000007', 'MOV-T-02', 'MOV-M-04', 'SED-001', 'USR-001-0001', 'LOT-001-00006', 5, 'Merma por deterioro', '2026-06-20 11:00:00'),
772+
-- Entradas mes anterior
773+
('MOV-001-000008', 'MOV-T-01', 'MOV-M-01', 'SED-001', 'USR-001-0001', 'LOT-001-00001', 80, 'Rececpción de proveedor DIGEMID', '2026-05-10 09:00:00'),
774+
('MOV-001-000009', 'MOV-T-01', 'MOV-M-01', 'SED-001', 'USR-002-0001', 'LOT-001-00002', 40, 'Donación municipio', '2026-05-15 10:00:00'),
775+
('MOV-001-000010', 'MOV-T-01', 'MOV-M-02', 'SED-001', 'USR-001-0001', 'LOT-001-00004', 20, 'Transferencia entrante SED-002', '2026-05-20 14:00:00'),
776+
-- Salidas mes anterior
777+
('MOV-001-000011', 'MOV-T-02', 'MOV-M-04', 'SED-001', 'USR-001-0001', 'LOT-001-00001', 10, 'Merma por expiración próxima', '2026-05-25 11:00:00'),
778+
('MOV-001-000012', 'MOV-T-02', 'MOV-M-03', 'SED-001', 'USR-001-0001', 'LOT-001-00002', 5, 'Dispensaciones varias', '2026-05-28 16:00:00'),
779+
-- Mes 2 meses atrás
780+
('MOV-001-000013', 'MOV-T-01', 'MOV-M-01', 'SED-001', 'USR-002-0001', 'LOT-001-00001', 120, 'Compra mayorista paracetamol', '2026-04-05 09:00:00'),
781+
('MOV-001-000014', 'MOV-T-01', 'MOV-M-01', 'SED-001', 'USR-001-0001', 'LOT-001-00005', 50, 'Compra ibuprofen proveedores', '2026-04-10 10:00:00'),
782+
('MOV-001-000015', 'MOV-T-02', 'MOV-M-03', 'SED-001', 'USR-001-0001', 'LOT-001-00001', 8, 'Dispensaciones varias', '2026-04-20 15:00:00'),
783+
-- Mes 3 meses atrás
784+
('MOV-001-000016', 'MOV-T-01', 'MOV-M-02', 'SED-001', 'USR-001-0001', 'LOT-001-00002', 30, 'Transferencia central', '2026-03-08 09:00:00'),
785+
('MOV-001-000017', 'MOV-T-01', 'MOV-M-01', 'SED-001', 'USR-002-0001', 'LOT-001-00006', 25, 'Compra aspirina', '2026-03-12 11:00:00'),
786+
('MOV-001-000018', 'MOV-T-02', 'MOV-M-04', 'SED-001', 'USR-001-0001', 'LOT-001-00004', 3, 'Ajuste de inventario', '2026-03-25 14:00:00'),
787+
-- Mes 4 meses atrás
788+
('MOV-001-000019', 'MOV-T-01', 'MOV-M-01', 'SED-001', 'USR-001-0001', 'LOT-001-00001', 90, 'Rececpción DIGEMID', '2026-02-10 09:00:00'),
789+
('MOV-001-000020', 'MOV-T-02', 'MOV-M-03', 'SED-001', 'USR-001-0001', 'LOT-001-00001', 12, 'Dispensaciones春节期间', '2026-02-15 10:00:00'),
790+
-- Mes 5 meses atrás
791+
('MOV-001-000021', 'MOV-T-01', 'MOV-M-02', 'SED-001', 'USR-002-0001', 'LOT-001-00002', 25, 'Transferencia almacén central', '2026-01-10 09:00:00'),
792+
('MOV-001-000022', 'MOV-T-01', 'MOV-M-01', 'SED-001', 'USR-001-0001', 'LOT-001-00006', 20, 'Compra aspirina inicial', '2026-01-15 11:00:00'),
793+
('MOV-001-000023', 'MOV-T-02', 'MOV-M-03', 'SED-001', 'USR-001-0001', 'LOT-001-00005', 5, 'Primeras dispensaciones', '2026-01-28 15:00:00'),
794+
-- SED-002 movimientos
795+
('MOV-002-000001', 'MOV-T-01', 'MOV-M-01', 'SED-002', 'USR-002-0001', 'LOT-002-00001', 30, 'Entrada inicial alcohol gel', '2026-06-01 09:00:00'),
796+
('MOV-002-000002', 'MOV-T-02', 'MOV-M-04', 'SED-002', 'USR-002-0001', 'LOT-002-00001', 5, 'Merma por evaporación', '2026-06-15 11:00:00');
753797

754798
PRINT 'Datos de prueba reconstruidos con IDs consistentes.';
755799
GO

docs/FUNCTIONAL_REQUIREMENTS.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Este documento enumera los requerimientos funcionales del sistema MediTrack seg
88
| RF-02 | M1 – Inicio de Sesión | Técnico, Jefe de Sede, Administrador | Restringir el acceso a vistas y operaciones según el rol autenticado; ocultar funcionalidades no permitidas en la interfaz. | **Implementado** |
99
| RF-03 | M1 – Inicio de Sesión | Técnico, Jefe de Sede, Administrador | Segmentar la información por sede: cada usuario solo visualiza y modifica datos de la posta a la que pertenece (sede_id). | **Implementado** |
1010
| RF-04 | M2 – Gestión de Sedes | Administrador | Registrar nuevas sedes con nombre, dirección y estado activo/inactivo. | **Implementado** |
11-
| RF-05 | M2 – Gestión de Sedes | Administrador | Editar datos de una sede existente y aplicar borrado lógico (is_activa = 0) sin eliminar su historial o borrado físico (total) únicamente cuando no posea información asociada | **Implementado** |
11+
| RF-05 | M2 – Gestión de Sedes | Administrador | Permitir al administrador editar los datos de una sede existente (nombre, dirección, teléfono, ubigeo, tipo). Respecto a la eliminación: si la sede NO tiene usuarios, lotes, movimientos ni atenciones asociados, se elimina permanentemente (borrado físico). Si SÍ tiene historial asociado, el sistema muestra un mensaje de advertencia y no permite eliminar — en ese caso se debe usar la opción "Desactivar" en su lugar, que mantiene todos los datos pero impide el uso de la sede. | **Implementado** |
1212
| RF-06 | M3 – Gestión de Productos | Administrador | Registrar productos con código DIGEMID, nombre,detalle, unidad de medida, categoría y estado activo/inactivo. | **Implementado** |
1313
| RF-07 | M3 – Gestión de Productos | Administrador | Gestionar categorías de productos: crear, editar y listar categorías disponibles. | **Implementado** |
1414
| RF-08 | M4 – Gestión Lotes | Jefe de Sede, Administrador | Registrar lotes vinculados a producto y sede, con número de lote del proveedor, fechas de fabricación y vencimiento, y cantidad inicial. | **Implementado** |
@@ -20,12 +20,13 @@ Este documento enumera los requerimientos funcionales del sistema MediTrack seg
2020
| RF-14 | M6 – Salidas y Ajustes | Técnico, Jefe de Sede | Aplicar lógica FEFO en salidas manuales: El sistema sugiere el lote con fecha de vencimiento más próxima y lo resalta en la interfaz. | **Implementado** |
2121
| RF-15 | M6 – Salidas y Ajustes | Técnico, Jefe de Sede | Descontar automáticamente la cantidad del lote al confirmar la salida, dentro de una transacción ACID. | **Implementado** |
2222
| RF-16 | M7 – Gestión de Pacientes | Técnico, Jefe de Sede | Registrar pacientes con tipo de documento, número de documento, nombres, apellidos y teléfono. | **Implementado** |
23-
| RF-17 | M7 – Gestión de Pacientes | Técnico, Jefe de Sede | Editar datos de un paciente existente y aplicar borrado lógico (is_activo = 0) para preservar su historial de atenciones o borrado físico (total) únicamente cuando no posea información asociada. | **Implementado** |
23+
| RF-17 | M7 – Gestión de Pacientes | Técnico, Jefe de Sede | Permitir editar los datos de un paciente existente (tipo y número de documento, nombres, apellidos). Respecto a la eliminación: si el paciente NO tiene movimientos de inventario ni atenciones registradas, se elimina permanentemente (borrado físico). Si SÍ tiene historial asociado, el sistema muestra un mensaje de advertencia y no permite eliminar — en ese caso se debe contactar al administrador para evaluar la desactivación, que mantiene todos los datos pero oculta el paciente del listado activo. | **Implementado** |
2424
| RF-18 | M8 – Registro de Atenciones | Técnico | Registrar la cabecera de una atención vinculando paciente, sede, usuario responsable, número de receta y fecha de atención. | **Implementado** |
2525
| RF-19 | M8 – Registro de Atenciones | Técnico | Buscar atenciones previas por paciente o número de receta para consulta o modificación del registro. | **Implementado** |
2626
| RF-20 | M9 – Dispensación | Técnico | Registrar el detalle de medicamentos entregados por atención: lote dispensado y cantidad entregada. | **Implementado** |
2727
| RF-21 | M9 – Dispensación | Técnico | Aplicar FEFO automáticamente durante la dispensación: mostrar explícitamente el lote sugerido y su fecha de vencimiento antes de confirmar. | **Implementado** |
2828
| RF-22 | M9 – Dispensación | Técnico | Descontar el stock del lote correspondiente únicamente tras la confirmación explícita del usuario, dentro de una transacción ACID. | **Implementado** |
2929
| RF-23 | M10 – Reportes y Dashboard | Jefe de Sede, Administrador | Mostrar dashboard con indicadores: stock crítico, lotes por vencer, movimientos recientes y resumen de atenciones del día. | **Implementado** |
30-
| RF-24 | M10 – Reportes y Dashboard | Jefe de Sede, Administrador | Generar reporte PDF de movimientos de inventario filtrado por sede, rango de fechas y tipo de movimiento. | **Implementado** |
31-
| RF-25 | M10 – Reportes y Dashboard | Jefe de Sede, Administrador | Generar reporte PDF de dispensaciones filtrado por paciente, sede y rango de fechas. | **Implementado** |
30+
| RF-24 | M10 – Reportes y Dashboard | Jefe de Sede, Administrador, Técnico | Generar reporte PDF de movimientos de inventario filtrado por sede (una o todas), rango de fechas (inicio y fin) y tipo de movimiento (Entrada, Salida o Todos). El PDF exporta una tabla con: Fecha y hora, Tipo, Motivo, Producto, Lote, Cantidad, Usuario responsable, Sede y Observación. Si no hay movimientos en el periodo, muestra mensaje de "Sin registros". | **Implementado** |
31+
| RF-25 | M10 – Reportes y Dashboard | Jefe de Sede, Administrador, Técnico | Generar reporte PDF de dispensaciones filtrado por paciente (opcional, todas si está en blanco), sede (una o todas) y rango de fechas. El PDF exporta una tabla con: Fecha y hora, Número de Receta, Paciente, Sede, Producto dispensado, Lote, Fecha de vencimiento del lote, Cantidad dispensada, Usuario responsable y Observación. Al final incluye un resumen con: total de atenciones, total de productos dispensados y total de unidades entregadas. | **Implementado** |
32+
| RF-26 | M – Gestión de Usuarios | Administrador | Permitir al administrador eliminar un usuario del sistema. Si el usuario NO tiene movimientos de inventario ni atenciones registradas, se elimina permanentemente (borrado físico de la fila). Si SÍ tiene historial asociado, el sistema muestra un mensaje de advertencia indicando que tiene movimientos o atenciones y no permite eliminar — se debe usar "Desactivar" para bloquearlo sin perder historial. La eliminación requiere confirmación explícita (botón Eliminar + diálogo Aceptar/Cancelar). | **Implementado** |

0 commit comments

Comments
 (0)