fix: Corregir envío de filtros en exportación PDF de Deudores de Conceptos
- Filtrar valores 'all' cuando hay opciones específicas seleccionadas - Evitar envío de arrays mixtos ['all', '11'] que causaban incluir todas las casas - Aplicar misma lógica en formulario de filtros y exportación - Limpiar logs de debug temporales
This commit is contained in:
@@ -925,19 +925,7 @@ switch ($page) {
|
|||||||
$houseFilters = $_GET['filter_houses'] ?? [];
|
$houseFilters = $_GET['filter_houses'] ?? [];
|
||||||
$conceptFilters = $_GET['filter_concepts'] ?? [];
|
$conceptFilters = $_GET['filter_concepts'] ?? [];
|
||||||
|
|
||||||
// Debug: mostrar todos los parámetros GET y qué filtros se están recibiendo
|
|
||||||
error_log("DEBUG - All GET params: " . print_r($_GET, true));
|
|
||||||
error_log("DEBUG - House filters: " . print_r($houseFilters, true));
|
|
||||||
error_log("DEBUG - Concept filters: " . print_r($conceptFilters, true));
|
|
||||||
|
|
||||||
// Debug temporal: escribir a archivo para ver logs
|
|
||||||
$debugFile = __DIR__ . '/debug_concept_filters.log';
|
|
||||||
$debugData = date('Y-m-d H:i:s') . "\n";
|
|
||||||
$debugData .= "All GET params: " . print_r($_GET, true) . "\n";
|
|
||||||
$debugData .= "House filters: " . print_r($houseFilters, true) . "\n";
|
|
||||||
$debugData .= "Concept filters: " . print_r($conceptFilters, true) . "\n";
|
|
||||||
$debugData .= "------------------------\n";
|
|
||||||
file_put_contents($debugFile, $debugData, FILE_APPEND);
|
|
||||||
|
|
||||||
// Determinar casas a filtrar para exportación
|
// Determinar casas a filtrar para exportación
|
||||||
if (empty($houseFilters) || in_array('all', $houseFilters)) {
|
if (empty($houseFilters) || in_array('all', $houseFilters)) {
|
||||||
|
|||||||
@@ -527,16 +527,8 @@ class Report {
|
|||||||
ORDER BY cc.name, h.number, cc.concept_date DESC
|
ORDER BY cc.name, h.number, cc.concept_date DESC
|
||||||
";
|
";
|
||||||
|
|
||||||
error_log("DEBUG - SQL Query: " . $query);
|
|
||||||
error_log("DEBUG - SQL Params: " . print_r($params, true));
|
|
||||||
|
|
||||||
$results = $db->fetchAll($query, $params);
|
$results = $db->fetchAll($query, $params);
|
||||||
|
|
||||||
error_log("DEBUG - SQL Results count: " . count($results));
|
|
||||||
if (count($results) > 0) {
|
|
||||||
error_log("DEBUG - First result sample: " . print_r($results[0], true));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Group by concept like the original method
|
// Group by concept like the original method
|
||||||
$debtors = [];
|
$debtors = [];
|
||||||
$grandTotal = 0;
|
$grandTotal = 0;
|
||||||
|
|||||||
@@ -252,68 +252,68 @@ function exportWaterDebtorsPDF() {
|
|||||||
<h5 class="mb-0"><i class="bi bi-funnel"></i> Filtros</h5>
|
<h5 class="mb-0"><i class="bi bi-funnel"></i> Filtros</h5>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<form method="GET" class="row g-3">
|
<form method="GET" class="row g-3" id="conceptFiltersForm">
|
||||||
<input type="hidden" name="page" value="reportes">
|
<input type="hidden" name="page" value="reportes">
|
||||||
<input type="hidden" name="type" value="concept-debtors">
|
<input type="hidden" name="type" value="concept-debtors">
|
||||||
|
|
||||||
<div class="col-md-5">
|
<div class="col-md-5">
|
||||||
<label class="form-label">Casas</label>
|
<label class="form-label">Casas</label>
|
||||||
<div class="border rounded p-2" style="max-height: 200px; overflow-y: auto;">
|
<div class="border rounded p-2" style="max-height: 200px; overflow-y: auto;">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" name="filter_houses[]" value="all" class="form-check-input house-checkbox" id="house-all" checked>
|
<input type="checkbox" name="filter_houses[]" value="all" class="form-check-input house-checkbox" id="house-all" checked>
|
||||||
<label class="form-check-label fw-bold" for="house-all">Todas las casas</label>
|
<label class="form-check-label fw-bold" for="house-all">Todas las casas</label>
|
||||||
</div>
|
</div>
|
||||||
<hr class="my-2">
|
<hr class="my-2">
|
||||||
<?php
|
<?php
|
||||||
$houses = House::getAccessible();
|
$houses = House::getAccessible();
|
||||||
foreach ($houses as $house):
|
foreach ($houses as $house):
|
||||||
$checked = (!isset($_GET['filter_houses']) || in_array('all', $_GET['filter_houses'] ?? []) || in_array($house['id'], $_GET['filter_houses'] ?? [])) ? 'checked' : '';
|
$checked = (!isset($_GET['filter_houses']) || in_array('all', $_GET['filter_houses'] ?? []) || in_array($house['id'], $_GET['filter_houses'] ?? [])) ? 'checked' : '';
|
||||||
?>
|
?>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" name="filter_houses[]" value="<?= $house['id'] ?>" class="form-check-input house-checkbox house-individual" id="house-<?= $house['id'] ?>" <?= $checked ?>>
|
<input type="checkbox" name="filter_houses[]" value="<?= $house['id'] ?>" class="form-check-input house-checkbox house-individual" id="house-<?= $house['id'] ?>" <?= $checked ?>>
|
||||||
<label class="form-check-label" for="house-<?= $house['id'] ?>">
|
<label class="form-check-label" for="house-<?= $house['id'] ?>">
|
||||||
<?= htmlspecialchars($house['number']) ?> - <?= htmlspecialchars($house['owner_name'] ?? 'Sin propietario') ?>
|
<?= htmlspecialchars($house['number']) ?> - <?= htmlspecialchars($house['owner_name'] ?? 'Sin propietario') ?>
|
||||||
</label>
|
</label>
|
||||||
|
</div>
|
||||||
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
<?php endforeach; ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-5">
|
|
||||||
<label class="form-label">Conceptos</label>
|
|
||||||
<div class="border rounded p-2" style="max-height: 200px; overflow-y: auto;">
|
|
||||||
<div class="form-check">
|
|
||||||
<input type="checkbox" name="filter_concepts[]" value="all" class="form-check-input concept-checkbox" id="concept-all" checked>
|
|
||||||
<label class="form-check-label fw-bold" for="concept-all">Todos los conceptos</label>
|
|
||||||
</div>
|
</div>
|
||||||
<hr class="my-2">
|
|
||||||
<?php
|
|
||||||
require_once __DIR__ . '/../../models/CollectionConcept.php';
|
|
||||||
$concepts = CollectionConcept::all(true);
|
|
||||||
foreach ($concepts as $concept):
|
|
||||||
$checked = (!isset($_GET['filter_concepts']) || in_array('all', $_GET['filter_concepts'] ?? []) || in_array($concept['id'], $_GET['filter_concepts'] ?? [])) ? 'checked' : '';
|
|
||||||
?>
|
|
||||||
<div class="form-check">
|
|
||||||
<input type="checkbox" name="filter_concepts[]" value="<?= $concept['id'] ?>" class="form-check-input concept-checkbox concept-individual" id="concept-<?= $concept['id'] ?>" <?= $checked ?>>
|
|
||||||
<label class="form-check-label" for="concept-<?= $concept['id'] ?>">
|
|
||||||
<?= htmlspecialchars($concept['name']) ?> ($<?= number_format($concept['amount_per_house'], 2) ?>)
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-2 d-flex align-items-end">
|
<div class="col-md-5">
|
||||||
<div class="d-grid gap-2 w-100">
|
<label class="form-label">Conceptos</label>
|
||||||
<button type="submit" class="btn btn-primary">
|
<div class="border rounded p-2" style="max-height: 200px; overflow-y: auto;">
|
||||||
<i class="bi bi-search"></i> Aplicar Filtros
|
<div class="form-check">
|
||||||
</button>
|
<input type="checkbox" name="filter_concepts[]" value="all" class="form-check-input concept-checkbox" id="concept-all" checked>
|
||||||
<a href="?page=reportes&type=concept-debtors" class="btn btn-outline-secondary">
|
<label class="form-check-label fw-bold" for="concept-all">Todos los conceptos</label>
|
||||||
<i class="bi bi-x-circle"></i> Limpiar
|
</div>
|
||||||
</a>
|
<hr class="my-2">
|
||||||
</div>
|
<?php
|
||||||
</div>
|
require_once __DIR__ . '/../../models/CollectionConcept.php';
|
||||||
</form>
|
$concepts = CollectionConcept::all(true);
|
||||||
|
foreach ($concepts as $concept):
|
||||||
|
$checked = (!isset($_GET['filter_concepts']) || in_array('all', $_GET['filter_concepts'] ?? []) || in_array($concept['id'], $_GET['filter_concepts'] ?? [])) ? 'checked' : '';
|
||||||
|
?>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" name="filter_concepts[]" value="<?= $concept['id'] ?>" class="form-check-input concept-checkbox concept-individual" id="concept-<?= $concept['id'] ?>" <?= $checked ?>>
|
||||||
|
<label class="form-check-label" for="concept-<?= $concept['id'] ?>">
|
||||||
|
<?= htmlspecialchars($concept['name']) ?> ($<?= number_format($concept['amount_per_house'], 2) ?>)
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-2 d-flex align-items-end">
|
||||||
|
<div class="d-grid gap-2 w-100">
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
<i class="bi bi-search"></i> Aplicar Filtros
|
||||||
|
</button>
|
||||||
|
<a href="?page=reportes&type=concept-debtors" class="btn btn-outline-secondary">
|
||||||
|
<i class="bi bi-x-circle"></i> Limpiar
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -384,12 +384,28 @@ function exportConceptDebtorsPDF() {
|
|||||||
const houseCheckboxes = document.querySelectorAll('input[name="filter_houses[]"]:checked');
|
const houseCheckboxes = document.querySelectorAll('input[name="filter_houses[]"]:checked');
|
||||||
const conceptCheckboxes = document.querySelectorAll('input[name="filter_concepts[]"]:checked');
|
const conceptCheckboxes = document.querySelectorAll('input[name="filter_concepts[]"]:checked');
|
||||||
|
|
||||||
// Debug: mostrar qué checkboxes están marcados
|
// Filtrar: excluir 'all' si hay opciones específicas seleccionadas
|
||||||
const selectedHouses = Array.from(houseCheckboxes).map(cb => cb.value);
|
let selectedHouses = Array.from(houseCheckboxes)
|
||||||
const selectedConcepts = Array.from(conceptCheckboxes).map(cb => cb.value);
|
.map(cb => cb.value)
|
||||||
|
.filter(value => {
|
||||||
|
if (value === 'all') {
|
||||||
|
// Solo incluir 'all' si no hay otras opciones seleccionadas
|
||||||
|
return houseCheckboxes.length === 1;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
let selectedConcepts = Array.from(conceptCheckboxes)
|
||||||
|
.map(cb => cb.value)
|
||||||
|
.filter(value => {
|
||||||
|
if (value === 'all') {
|
||||||
|
// Solo incluir 'all' si no hay otras opciones seleccionadas
|
||||||
|
return conceptCheckboxes.length === 1;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
console.log('DEBUG - Selected houses:', selectedHouses);
|
|
||||||
console.log('DEBUG - Selected concepts:', selectedConcepts);
|
|
||||||
|
|
||||||
let url = '/dashboard.php?page=reportes_actions&action=export_pdf_report&type=concept-debtors';
|
let url = '/dashboard.php?page=reportes_actions&action=export_pdf_report&type=concept-debtors';
|
||||||
|
|
||||||
@@ -411,6 +427,61 @@ function exportConceptDebtorsPDF() {
|
|||||||
window.open(url, '_blank');
|
window.open(url, '_blank');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Procesar formulario de filtros antes de enviar
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
const form = document.getElementById('conceptFiltersForm');
|
||||||
|
if (form) {
|
||||||
|
form.addEventListener('submit', function(e) {
|
||||||
|
// Filtrar los valores antes de enviar
|
||||||
|
const houseCheckboxes = form.querySelectorAll('input[name="filter_houses[]"]:checked');
|
||||||
|
const conceptCheckboxes = form.querySelectorAll('input[name="filter_concepts[]"]:checked');
|
||||||
|
|
||||||
|
// Limpiar valores existentes
|
||||||
|
const existingHouses = form.querySelectorAll('input[name="filter_houses[]"]');
|
||||||
|
const existingConcepts = form.querySelectorAll('input[name="filter_concepts[]"]');
|
||||||
|
|
||||||
|
existingHouses.forEach(input => input.remove());
|
||||||
|
existingConcepts.forEach(input => input.remove());
|
||||||
|
|
||||||
|
// Agregar solo los valores filtrados
|
||||||
|
let selectedHouses = Array.from(houseCheckboxes)
|
||||||
|
.map(cb => cb.value)
|
||||||
|
.filter(value => {
|
||||||
|
if (value === 'all') {
|
||||||
|
return houseCheckboxes.length === 1;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
let selectedConcepts = Array.from(conceptCheckboxes)
|
||||||
|
.map(cb => cb.value)
|
||||||
|
.filter(value => {
|
||||||
|
if (value === 'all') {
|
||||||
|
return conceptCheckboxes.length === 1;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Crear inputs hidden con los valores filtrados
|
||||||
|
selectedHouses.forEach(house => {
|
||||||
|
const input = document.createElement('input');
|
||||||
|
input.type = 'hidden';
|
||||||
|
input.name = 'filter_houses[]';
|
||||||
|
input.value = house;
|
||||||
|
form.appendChild(input);
|
||||||
|
});
|
||||||
|
|
||||||
|
selectedConcepts.forEach(concept => {
|
||||||
|
const input = document.createElement('input');
|
||||||
|
input.type = 'hidden';
|
||||||
|
input.name = 'filter_concepts[]';
|
||||||
|
input.value = concept;
|
||||||
|
form.appendChild(input);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Lógica para checkboxes de casas
|
// Lógica para checkboxes de casas
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
const houseAllCheckbox = document.getElementById('house-all');
|
const houseAllCheckbox = document.getElementById('house-all');
|
||||||
|
|||||||
Reference in New Issue
Block a user