Finalización del módulo Luz Cámara: Corrección de errores JS, exportación profesional a PDF y reportes de deudores

This commit is contained in:
2026-02-14 16:07:25 -06:00
parent 5f90790c7a
commit 9850f1a85e
13 changed files with 2849 additions and 536 deletions

View File

@@ -310,8 +310,7 @@ switch ($page) {
exit;
}
echo json_encode(['success' => false, 'message' => 'Acción no válida']);
exit;
break;
case 'pagos':
$matrix = Payment::getMatrix($year);
@@ -638,6 +637,15 @@ switch ($page) {
$conceptDebtors = Report::getConceptDebtorsFiltered($filteredHouses, $filteredConcepts);
}
elseif ($reportType == 'electricity-debtors') {
$filters = [
'year' => $_GET['filter_year'] ?? null,
'periods' => isset($_GET['filter_periods']) ? explode(',', $_GET['filter_periods']) : null,
'house_id' => $_GET['filter_house'] ?? null,
'accessible_house_ids' => $accessibleHouseIds
];
$electricityDebtors = Report::getElectricityDebtors($filters);
}
$view = 'reports/index';
break;
@@ -672,135 +680,7 @@ switch ($page) {
$concepts = CollectionConcept::all(true);
$view = 'import/index';
break;
case 'concept_view_actions': // Nuevo case para acciones AJAX de concept_view
if (isset($_GET['action'])) {
header('Content-Type: application/json');
$userId = Auth::id(); // Obtener el ID del usuario actual
switch ($_GET['action']) {
case 'initialize_concept_payments':
$conceptId = $_GET['concept_id'] ?? 0;
if (!$conceptId) {
echo json_encode(['success' => false, 'message' => 'ID de concepto no proporcionado']);
exit;
}
if (!Auth::isCapturist()) {
echo json_encode(['success' => false, 'message' => 'Permiso denegado']);
exit;
}
// Se requiere el modelo House para CollectionPayment::initializePayments
require_once __DIR__ . '/models/House.php';
$result = CollectionPayment::initializePayments($conceptId, $userId);
if ($result) {
Auth::logActivity('initialize_concept_payments', 'Pagos de concepto inicializados: ID ' . $conceptId);
echo json_encode(['success' => true, 'message' => 'Pagos inicializados exitosamente']);
}
else {
echo json_encode(['success' => false, 'message' => 'Error al inicializar pagos']);
}
exit;
case 'save_concept_payment':
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['success' => false, 'message' => 'Método no permitido']);
exit;
}
$input = json_decode(file_get_contents('php://input'), true);
if ($input) {
$conceptId = $input['concept_id'] ?? 0;
$houseId = $input['house_id'] ?? 0;
$amount = $input['amount'] ?? 0;
$paymentDate = $input['payment_date'] ?? null;
if (!$conceptId || !$houseId || !is_numeric($amount)) {
echo json_encode(['success' => false, 'message' => 'Datos de pago incompletos o inválidos']);
exit;
}
if (!Auth::isCapturist()) {
echo json_encode(['success' => false, 'message' => 'Permiso denegado']);
exit;
}
$result = CollectionPayment::update($conceptId, $houseId, $amount, $userId, 'Pago actualizado', $paymentDate);
if ($result) {
Auth::logActivity('save_concept_payment', 'Pago de concepto guardado: Concepto ' . $conceptId . ', Casa ' . $houseId . ', Monto ' . $amount);
echo json_encode(['success' => true, 'message' => 'Pago guardado exitosamente']);
}
else {
echo json_encode(['success' => false, 'message' => 'Error al guardar pago']);
}
}
else {
echo json_encode(['success' => false, 'message' => 'Datos inválidos']);
}
exit;
case 'save_all_concept_payments':
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['success' => false, 'message' => 'Método no permitido']);
exit;
}
$input = json_decode(file_get_contents('php://input'), true);
if ($input) {
$conceptId = $input['concept_id'] ?? 0;
$payments = $input['payments'] ?? [];
if (!$conceptId || !is_array($payments)) {
echo json_encode(['success' => false, 'message' => 'Datos de pago incompletos o inválidos']);
exit;
}
if (!Auth::isCapturist()) {
echo json_encode(['success' => false, 'message' => 'Permiso denegado']);
exit;
}
$savedCount = 0;
$errorCount = 0;
foreach ($payments as $payment) {
$houseId = $payment['house_id'] ?? 0;
$amount = $payment['amount'] ?? 0;
$paymentDate = $payment['payment_date'] ?? null;
if (!$houseId) {
$errorCount++;
continue;
}
$result = CollectionPayment::update($conceptId, $houseId, $amount, $userId, 'Pago actualizado', $paymentDate);
if ($result) {
$savedCount++;
}
else {
$errorCount++;
}
}
if ($savedCount > 0) {
Auth::logActivity('save_all_concept_payments', 'Múltiples pagos de concepto guardados: Concepto ' . $conceptId . ', ' . $savedCount . ' pagos guardados');
if ($errorCount > 0) {
echo json_encode(['success' => true, 'message' => 'Se guardaron ' . $savedCount . ' pagos. Hubo ' . $errorCount . ' errores.']);
}
else {
echo json_encode(['success' => true, 'message' => 'Se guardaron ' . $savedCount . ' pagos exitosamente']);
}
}
else {
echo json_encode(['success' => false, 'message' => 'No se pudo guardar ningún pago']);
}
}
else {
echo json_encode(['success' => false, 'message' => 'Datos inválidos']);
}
exit;
default:
echo json_encode(['success' => false, 'message' => 'Acción no válida para la vista de concepto']);
exit;
}
}
break;
case 'charts_export':
// Exportación de gráficos a PDF usando TCPDF (igual que otras exportaciones)
@@ -946,8 +826,8 @@ switch ($page) {
'balance' => 'Balance_General',
'expenses' => 'Gastos_por_Categoria',
'water-debtors' => 'Deudores_de_Agua',
'concept-debtors' => 'Deudores_de_Conceptos',
'concepts' => 'Conceptos_Especiales'
'concepts' => 'Conceptos_Especiales',
'electricity-debtors' => 'Deudores_de_Luz'
];
$reportName = $reportNames[$reportType] ?? ucfirst($reportType);
@@ -996,6 +876,20 @@ switch ($page) {
$waterDebtors = Report::getWaterDebtors($filters);
include __DIR__ . '/views/reports/pdf_water_debtors.php';
break;
case 'electricity-debtors':
$filters = [
'year' => $_GET['filter_year'] ?? null,
'periods' => $_GET['filter_periods'] ?? null,
'house_id' => $_GET['filter_house'] ?? null,
'accessible_house_ids' => $accessibleHouseIds
];
if ($filters['periods'] && !is_array($filters['periods'])) {
$filters['periods'] = explode(',', $filters['periods']);
}
require_once __DIR__ . '/models/Report.php';
$electricityDebtors = Report::getElectricityDebtors($filters);
include __DIR__ . '/views/reports/pdf_electricity_debtors.php';
break;
case 'concept-debtors':
// Requerimos el modelo Report
require_once __DIR__ . '/models/Report.php';
@@ -1293,7 +1187,8 @@ switch ($page) {
$targetUserId = $_GET['user_id'] ?? 0;
$userHouses = UserPermission::getUserHouseIds($targetUserId);
echo json_encode(['success' => true, 'houses' => array_map(function ($id) {
return ['id' => $id]; }, $userHouses)]);
return ['id' => $id];
}, $userHouses)]);
exit;
case 'create':
@@ -1538,6 +1433,141 @@ switch ($page) {
}
}
break;
case 'luz_camara':
$year = $_GET['year'] ?? date('Y');
require_once __DIR__ . '/models/ElectricityPayment.php';
require_once __DIR__ . '/models/ElectricityBill.php';
$matrix = ElectricityPayment::getMatrix($year);
$electricityBills = ElectricityBill::getYear($year);
if (isset($_GET['action']) && $_GET['action'] == 'export_electricity_pdf') {
date_default_timezone_set('America/Mexico_City');
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/vendor/tecnickcom/tcpdf/tcpdf.php';
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Ibiza Condominium');
$pdf->SetTitle('Reporte de Pagos Luz Cámara ' . $year);
$pdf->SetSubject('Pagos de Luz Cámara');
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, 'Condominio IBIZA - Reporte Luz Cámara ' . $year, 'Generado el ' . date('d/m/Y H:i'));
$pdf->setHeaderFont(array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
if (@file_exists(dirname(__FILE__) . '/lang/eng.php')) {
require_once(dirname(__FILE__) . '/lang/eng.php');
$pdf->setLanguageArray($l);
}
$pdf->SetFont('helvetica', '', 9);
$pdf->AddPage();
// Filtrar periodos seleccionados si existen
$periods = ElectricityBill::getPeriods();
$selectedPeriods = $_GET['periods'] ?? [];
if (!empty($selectedPeriods)) {
$filteredPeriods = [];
foreach ($periods as $p) {
if (in_array($p, $selectedPeriods)) {
$filteredPeriods[] = $p;
}
}
$periods = $filteredPeriods;
}
// Datos ya cargados arriba ($matrix, $electricityBills)
$houses = House::all();
ob_start();
include __DIR__ . '/views/electricity/pdf_template.php';
$html = ob_get_clean();
$pdf->writeHTML($html, true, false, true, false, '');
$pdf->Output('Pagos_Luz_Camara_' . $year . '.pdf', 'D');
exit;
}
$view = 'electricity/index';
break;
case 'luz_camara_actions':
header('Content-Type: application/json');
require_once __DIR__ . '/models/ElectricityPayment.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['success' => false, 'message' => 'Método no permitido']);
exit;
}
$input = json_decode(file_get_contents('php://input'), true);
if (!$input || !isset($input['changes'])) {
echo json_encode(['success' => false, 'message' => 'Datos inválidos']);
exit;
}
if (!Auth::isCapturist()) {
echo json_encode(['success' => false, 'message' => 'Permiso denegado']);
exit;
}
$userId = Auth::id();
$result = ElectricityPayment::updateBatch($input['changes'], $userId);
if ($result['success']) {
$details = "Actualización masiva de pagos luz: " . $result['count'] . " cambios";
Auth::logActivity('save_electricity_payment_batch', $details);
echo json_encode($result);
}
else {
echo json_encode($result);
}
exit;
case 'luz_camara_config':
header('Content-Type: application/json');
require_once __DIR__ . '/models/ElectricityBill.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['success' => false, 'message' => 'Método no permitido']);
exit;
}
$input = json_decode(file_get_contents('php://input'), true);
if (!$input) {
echo json_encode(['success' => false, 'message' => 'Datos inválidos']);
exit;
}
if (!Auth::isCapturist()) { // O isAdmin, dependiendo de la política
echo json_encode(['success' => false, 'message' => 'Permiso denegado']);
exit;
}
$userId = Auth::id();
$id = ElectricityBill::save($input, $userId);
if ($id) {
Auth::logActivity('save_electricity_config', "Configuración luz actualizada: " . $input['period'] . " " . $input['year']);
echo json_encode(['success' => true, 'id' => $id]);
}
else {
echo json_encode(['success' => false, 'message' => 'Error al guardar configuración']);
}
exit;
default:
$stats = Report::getDashboardStats($year);
$recentActivity = ActivityLog::all(15);