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'); + + + diff --git a/lab_domicilios.php b/lab_domicilios.php index 6885998..4edd4f3 100644 --- a/lab_domicilios.php +++ b/lab_domicilios.php @@ -251,7 +251,16 @@ async function cargarLista(pag = 1) { ${esc(dom.barrio||'')} ${dom.enfermera_nombre ? `${esc(dom.enfermera_nombre)}` : 'Sin asignar'} - ${esc(dom.estado)} + + ${esc(dom.estado)} + ${(dom.pago_estado === 'pagado') + ? '✅ Pagado' + : (dom.pago_estado === 'exento' + ? '🔵 Exento' + : ((parseFloat(dom.valor_domicilio)||0)+(parseFloat(dom.valor_copago)||0) > 0 + ? '⏳ Cobro' + : ''))} + `).join(''); @@ -371,17 +380,39 @@ async function verDomicilio(id) {
${esc(dom.examenes_solicitados||'—')}
- ${(dom.valor_domicilio || dom.valor_copago) ? ` -
-
-
- Cobro al cliente: - ${dom.valor_domicilio ? `Domicilio: $${Number(dom.valor_domicilio).toLocaleString('es-CO')}` : ''} - ${dom.valor_copago ? `Copago: $${Number(dom.valor_copago).toLocaleString('es-CO')}` : ''} - ${ (dom.valor_domicilio && dom.valor_copago) ? `Total: $${(Number(dom.valor_domicilio)+Number(dom.valor_copago)).toLocaleString('es-CO')}` : ''} + ${(dom.valor_domicilio || dom.valor_copago) ? (() => { + const totalC = (parseFloat(dom.valor_domicilio)||0)+(parseFloat(dom.valor_copago)||0); + const PAGO_INFO = { + pendiente: { bg:'#fff3cd', color:'#664d03', border:'#ffc107', icon:'⏳', txt:'Pago pendiente' }, + pagado: { bg:'#d1fae5', color:'#065f46', border:'#34d399', icon:'✅', txt:'Pagado' }, + exento: { bg:'#e0e7ff', color:'#3730a3', border:'#818cf8', icon:'🔵', txt:'Exento' }, + }; + const pEst = dom.pago_estado || 'pendiente'; + const pInfo = PAGO_INFO[pEst] || PAGO_INFO.pendiente; + const MODO_LABEL = { efectivo:'💵 Efectivo', transferencia:'📲 Transferencia', otro:'📋 Otro' }; + return ` +
+
+
+
+ Cobro al cliente + ${pInfo.icon} ${pInfo.txt} +
+
+ ${dom.valor_domicilio ? `Domicilio: $${Number(dom.valor_domicilio).toLocaleString('es-CO')}` : ''} + ${dom.valor_copago ? `Copago: $${Number(dom.valor_copago).toLocaleString('es-CO')}` : ''} + ${totalC > 0 ? `Total: $${totalC.toLocaleString('es-CO')}` : ''} +
+ ${dom.pago_estado === 'pagado' ? ` +
+ ${MODO_LABEL[dom.pago_modo] || (dom.pago_modo||'')} + ${dom.pago_monto ? ` · $${Number(dom.pago_monto).toLocaleString('es-CO')} cobrado` : ''} + ${dom.pago_notas ? ` · ${esc(dom.pago_notas)}` : ''} +
` : ''} +
-
-
` : ''} +
`; + })() : ''} ${dom.notas_admin ? `