From beb1bbe1d49339739a8d8af3831fa228d785832e Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 12 Mar 2026 22:53:24 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20sistema=20de=20pagos=20domicilios=20?= =?UTF-8?q?=E2=80=94=20cobro=20enfermero=20y=20estado=20pago=20admin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - database/07_add_pago_domicilio.sql: 6 columnas nuevas en lab_domicilios (pago_estado ENUM, pago_modo, pago_monto, pago_fecha, pago_notas, pago_registrado_por) - Domicilio::filtrarCampos(): permite guardar campos de pago vΓa actualizar() - Enfermera::agenda(): incluye valor_domicilio, valor_copago, pago_estado, pago_modo, pago_monto, pago_notas - api/lab/registrar_pago.php: endpoint POST para registrar/actualizar pago del domicilio - enfermero_portal.php: bloque cobro en card, modal registrar pago (efectivo/transferencia/exento), objeto pagoModal JS - lab_domicilios.php: badge pago β³/β /π΅ en fila tabla, secciΓ³n pago detallada en panel lateral --- api/lab/registrar_pago.php | 65 ++++++++++ classes/lab/Domicilio.php | 3 + classes/lab/Enfermera.php | 8 ++ database/07_add_pago_domicilio.sql | 33 +++++ enfermero_portal.php | 202 +++++++++++++++++++++++++++++ lab_domicilios.php | 53 ++++++-- 6 files changed, 353 insertions(+), 11 deletions(-) create mode 100644 api/lab/registrar_pago.php create mode 100644 database/07_add_pago_domicilio.sql diff --git a/api/lab/registrar_pago.php b/api/lab/registrar_pago.php new file mode 100644 index 0000000..efbc945 --- /dev/null +++ b/api/lab/registrar_pago.php @@ -0,0 +1,65 @@ +fetch( + 'SELECT id, pago_estado FROM lab_domicilios WHERE id = ?', [$domId] + ); + if (!$exist) jsonError("Domicilio #$domId no encontrado"); + + $campos = [ + 'pago_estado' => $estado, + 'pago_modo' => ($estado === 'pagado') ? ($datos['pago_modo'] ?? null) : null, + 'pago_monto' => ($estado === 'pagado') ? ((float)$datos['pago_monto']) : null, + 'pago_fecha' => ($estado === 'pagado') ? date('Y-m-d H:i:s') : null, + 'pago_notas' => !empty($datos['pago_notas']) ? trim($datos['pago_notas']) : null, + 'pago_registrado_por' => $adminId, + ]; + + $dom->actualizar($domId, $campos, $adminId); + + jsonOk([ + 'domicilio_id' => $domId, + 'pago_estado' => $estado, + ], 'Pago registrado correctamente'); + +} catch (InvalidArgumentException $e) { + jsonError($e->getMessage()); +} catch (Exception $e) { + jsonError($e->getMessage(), 500); +} diff --git a/classes/lab/Domicilio.php b/classes/lab/Domicilio.php index 78179f0..410fdb6 100644 --- a/classes/lab/Domicilio.php +++ b/classes/lab/Domicilio.php @@ -246,6 +246,9 @@ class Domicilio { 'observaciones', 'muestras_tomadas', 'notas_admin', 'seguro_nombre', 'autorizacion', 'copago_laboratorio', 'valor_domicilio', 'valor_copago', + // pago + 'pago_estado', 'pago_modo', 'pago_monto', 'pago_fecha', + 'pago_notas', 'pago_registrado_por', ]; $campos = array_intersect_key($datos, array_flip($permitidos)); diff --git a/classes/lab/Enfermera.php b/classes/lab/Enfermera.php index ccd2b9f..1ab0d37 100644 --- a/classes/lab/Enfermera.php +++ b/classes/lab/Enfermera.php @@ -107,6 +107,14 @@ class Enfermera { d.tipo_cliente, d.seguro_nombre, d.orden_id, + d.valor_domicilio, + d.valor_copago, + d.copago_laboratorio, + d.autorizacion, + d.pago_estado, + d.pago_modo, + d.pago_monto, + d.pago_notas, p.id AS paciente_id, p.nombre_completo AS paciente_nombre, p.telefono AS paciente_telefono, diff --git a/database/07_add_pago_domicilio.sql b/database/07_add_pago_domicilio.sql new file mode 100644 index 0000000..4ae84ea --- /dev/null +++ b/database/07_add_pago_domicilio.sql @@ -0,0 +1,33 @@ +-- ============================================================ +-- Migration: 07_add_pago_domicilio +-- Agrega campos de pago del cliente a lab_domicilios +-- ============================================================ + +ALTER TABLE `lab_domicilios` + ADD COLUMN IF NOT EXISTS `pago_estado` ENUM('pendiente','pagado','exento') NOT NULL DEFAULT 'pendiente' + COMMENT 'Estado del pago del cliente: pendiente / pagado / exento' + AFTER `valor_copago`, + + ADD COLUMN IF NOT EXISTS `pago_modo` ENUM('efectivo','transferencia','otro') DEFAULT NULL + COMMENT 'Medio de pago usado por el cliente' + AFTER `pago_estado`, + + ADD COLUMN IF NOT EXISTS `pago_monto` DECIMAL(12,2) DEFAULT NULL + COMMENT 'Monto efectivamente cobrado al cliente' + AFTER `pago_modo`, + + ADD COLUMN IF NOT EXISTS `pago_fecha` DATETIME DEFAULT NULL + COMMENT 'Fecha y hora en que se registrΓ³ el pago' + AFTER `pago_monto`, + + ADD COLUMN IF NOT EXISTS `pago_notas` VARCHAR(255) DEFAULT NULL + COMMENT 'Observaciones del pago (referencia transferencia, etc.)' + AFTER `pago_fecha`, + + ADD COLUMN IF NOT EXISTS `pago_registrado_por` INT DEFAULT NULL + COMMENT 'FK al enfermero/admin que registrΓ³ el pago' + AFTER `pago_notas`; + +-- Γndice para consultas rΓ‘pidas por estado de pago +ALTER TABLE `lab_domicilios` + ADD INDEX IF NOT EXISTS `idx_pago_estado` (`pago_estado`); diff --git a/enfermero_portal.php b/enfermero_portal.php index 7f498e7..62b9d66 100644 --- a/enfermero_portal.php +++ b/enfermero_portal.php @@ -110,6 +110,13 @@ $hoy = date('Y-m-d'); border-bottom:1px solid #f0f0f0; } .sugerencias-pac .item:hover { background:#f0f4ff; } .sugerencias-pac .item:last-child { border-bottom:none; } + + /* ββ Pago ββ */ + .pago-badge-pendiente { background:#fff3cd; color:#664d03; border:1px solid #ffc107; } + .pago-badge-pagado { background:#d1fae5; color:#065f46; border:1px solid #34d399; } + .pago-badge-exento { background:#e0e7ff; color:#3730a3; border:1px solid #818cf8; } + .cobro-box { background:#f0fdf4; border:1px solid #86efac; border-radius:8px; padding:.6rem .9rem; } + .cobro-box.sin-cobro { background:#f9fafb; border-color:#e5e7eb; color:#9ca3af; }
@@ -242,6 +249,74 @@ $hoy = date('Y-m-d'); + +