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:
296
dashboard.php
296
dashboard.php
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user