163 lines
5.6 KiB
PHP
163 lines
5.6 KiB
PHP
<?php
|
|
/**
|
|
* API: Reporte de pagos recibidos en domicilios.
|
|
*
|
|
* GET params:
|
|
* modo 'dia' | 'mes' | 'rango' (default: 'dia')
|
|
* fecha YYYY-MM-DD (para modo=dia)
|
|
* anio año 4 dígitos (para modo=mes)
|
|
* mes 1-12 (para modo=mes)
|
|
* desde YYYY-MM-DD (para modo=rango)
|
|
* hasta YYYY-MM-DD (para modo=rango)
|
|
* enfermera_id INT (opcional)
|
|
*/
|
|
require_once __DIR__ . '/../../config/config.php';
|
|
require_once __DIR__ . '/../../classes/Database.php';
|
|
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
header('X-Content-Type-Options: nosniff');
|
|
|
|
requireAuthentication();
|
|
|
|
$db = Database::getInstance();
|
|
$modo = in_array($_GET['modo'] ?? '', ['dia','mes','rango']) ? $_GET['modo'] : 'dia';
|
|
|
|
$wheres = [];
|
|
$params = [];
|
|
|
|
switch ($modo) {
|
|
|
|
case 'mes':
|
|
$anio = isset($_GET['anio']) && ctype_digit($_GET['anio']) ? (int)$_GET['anio'] : (int)date('Y');
|
|
$mes = isset($_GET['mes']) && ctype_digit($_GET['mes']) ? (int)$_GET['mes'] : (int)date('n');
|
|
if ($mes < 1 || $mes > 12) $mes = (int)date('n');
|
|
$wheres[] = 'YEAR(d.fecha_programada) = ?';
|
|
$params[] = $anio;
|
|
$wheres[] = 'MONTH(d.fecha_programada) = ?';
|
|
$params[] = $mes;
|
|
break;
|
|
|
|
case 'rango':
|
|
$desde = $_GET['desde'] ?? date('Y-m-01');
|
|
$hasta = $_GET['hasta'] ?? date('Y-m-d');
|
|
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $desde)) $desde = date('Y-m-01');
|
|
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $hasta)) $hasta = date('Y-m-d');
|
|
$wheres[] = 'DATE(d.fecha_programada) BETWEEN ? AND ?';
|
|
$params[] = $desde;
|
|
$params[] = $hasta;
|
|
break;
|
|
|
|
default: // dia
|
|
$fecha = $_GET['fecha'] ?? date('Y-m-d');
|
|
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $fecha)) $fecha = date('Y-m-d');
|
|
$wheres[] = 'DATE(d.fecha_programada) = ?';
|
|
$params[] = $fecha;
|
|
break;
|
|
}
|
|
|
|
// Filtro por enfermera
|
|
$enfermeraId = null;
|
|
if (!empty($_GET['enfermera_id']) && ctype_digit($_GET['enfermera_id'])) {
|
|
$enfermeraId = (int)$_GET['enfermera_id'];
|
|
$wheres[] = 'a.enfermera_id = ?';
|
|
$params[] = $enfermeraId;
|
|
}
|
|
|
|
$where = $wheres ? 'WHERE ' . implode(' AND ', $wheres) : '';
|
|
|
|
$filas = $db->fetchAll(
|
|
"SELECT
|
|
d.id,
|
|
d.fecha_programada,
|
|
d.pago_fecha,
|
|
p.nombre_completo AS paciente,
|
|
p.numero_documento,
|
|
COALESCE(e.nombre_completo,'Sin asignar') AS enfermera,
|
|
d.tipo_cliente,
|
|
COALESCE(d.seguro_nombre,'') AS seguro_nombre,
|
|
d.estado AS dom_estado,
|
|
COALESCE(d.valor_domicilio, 0) AS valor_domicilio,
|
|
COALESCE(d.valor_copago, 0) AS valor_copago,
|
|
d.pago_estado,
|
|
COALESCE(d.pago_modo,'') AS pago_modo,
|
|
COALESCE(d.pago_monto, 0) AS pago_monto,
|
|
COALESCE(d.pago_notas,'') AS pago_notas
|
|
FROM lab_domicilios d
|
|
JOIN lab_pacientes p ON p.id = d.paciente_id
|
|
LEFT JOIN lab_asignaciones a ON a.domicilio_id = d.id AND a.estado NOT IN ('liberada')
|
|
LEFT JOIN lab_enfermeras e ON e.id = a.enfermera_id
|
|
$where
|
|
ORDER BY d.fecha_programada ASC, d.id ASC",
|
|
$params
|
|
);
|
|
|
|
// Enriquecer con parcialidades de pago
|
|
$domIds = array_column($filas, 'id');
|
|
$parciales = [];
|
|
if ($domIds) {
|
|
$in = implode(',', array_map('intval', $domIds));
|
|
$rows = $db->fetchAll(
|
|
"SELECT domicilio_id, modo, monto, notas FROM lab_domicilio_pagos WHERE domicilio_id IN ($in) ORDER BY id ASC"
|
|
);
|
|
foreach ($rows as $row) {
|
|
$parciales[(int)$row['domicilio_id']][] = $row;
|
|
}
|
|
}
|
|
foreach ($filas as &$f) {
|
|
$f['pagos_detalle'] = $parciales[(int)$f['id']] ?? [];
|
|
}
|
|
unset($f);
|
|
|
|
// Resumen financiero — sumar desde parcialidades cuando existen
|
|
$resumen = [
|
|
'total' => count($filas),
|
|
'pagados' => 0,
|
|
'pendientes' => 0,
|
|
'exentos' => 0,
|
|
'monto_total' => 0.0,
|
|
'total_valor_dom' => 0.0, // suma valor_domicilio esperado
|
|
'total_valor_copago' => 0.0, // suma valor_copago esperado
|
|
'por_modo' => [],
|
|
];
|
|
|
|
foreach ($filas as $f) {
|
|
$est = $f['pago_estado'] ?? 'pendiente';
|
|
// Acumular valores esperados (siempre, no solo pagados)
|
|
$resumen['total_valor_dom'] += (float)($f['valor_domicilio'] ?? 0);
|
|
$resumen['total_valor_copago'] += (float)($f['valor_copago'] ?? 0);
|
|
if ($est === 'pagado') {
|
|
$resumen['pagados']++;
|
|
if (!empty($f['pagos_detalle'])) {
|
|
// Sumar desde parcialidades
|
|
foreach ($f['pagos_detalle'] as $p) {
|
|
$monto = (float)$p['monto'];
|
|
$key = $p['modo'] ?: 'sin_registrar';
|
|
$resumen['monto_total'] += $monto;
|
|
$resumen['por_modo'][$key] = ($resumen['por_modo'][$key] ?? 0.0) + $monto;
|
|
}
|
|
} else {
|
|
// Fallback registro legacy
|
|
$monto = (float)$f['pago_monto'];
|
|
$key = $f['pago_modo'] ?: 'sin_registrar';
|
|
$resumen['monto_total'] += $monto;
|
|
$resumen['por_modo'][$key] = ($resumen['por_modo'][$key] ?? 0.0) + $monto;
|
|
}
|
|
} elseif ($est === 'exento') {
|
|
$resumen['exentos']++;
|
|
} else {
|
|
$resumen['pendientes']++;
|
|
}
|
|
}
|
|
|
|
// Lista de enfermeras para poblar el selector
|
|
$enfermeras = $db->fetchAll(
|
|
"SELECT id, nombre_completo FROM lab_enfermeras WHERE is_active = 1 ORDER BY nombre_completo"
|
|
);
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'filas' => $filas,
|
|
'resumen' => $resumen,
|
|
'enfermeras' => $enfermeras,
|
|
], JSON_UNESCAPED_UNICODE);
|