Mejorar Balance General con detalle de conceptos especiales y filtro por año

This commit is contained in:
Administrador Ibiza
2025-12-30 23:36:51 -06:00
parent d629526485
commit 5e714ebae9
4 changed files with 327 additions and 32 deletions

View File

@@ -66,6 +66,92 @@ class Report {
];
}
public static function getConceptDetailsByYear($year = null) {
$db = Database::getInstance();
$concepts = $db->fetchAll(
"SELECT c.id, c.name, c.amount_per_house, c.concept_date, c.description
FROM finance_collection_concepts c
WHERE c.is_active = 1
ORDER BY c.concept_date DESC"
);
$conceptsData = [];
$totalExpected = 0;
$totalCollected = 0;
$totalExpenses = 0;
foreach ($concepts as $concept) {
$conceptYear = date('Y', strtotime($concept['concept_date']));
if ($year && $conceptYear != $year) {
continue;
}
$activeHousesCount = $db->fetchOne(
"SELECT COUNT(*) as count FROM houses WHERE status = 'activa'"
);
$activeHousesCount = $activeHousesCount['count'] ?? 0;
$expected = $concept['amount_per_house'] * $activeHousesCount;
$whereClause = "WHERE cp.concept_id = ?";
$params = [$concept['id']];
if ($year) {
$whereClause .= " AND YEAR(cp.payment_date) = ?";
$params[] = $year;
}
$collected = $db->fetchOne(
"SELECT COALESCE(SUM(cp.amount), 0) as total
FROM finance_collection_payments cp
$whereClause",
$params
);
$collectedAmount = $collected['total'] ?? 0;
$expenses = $db->fetchOne(
"SELECT COALESCE(SUM(ec.amount), 0) as total
FROM expense_concept_allocations ec
JOIN expenses e ON ec.expense_id = e.id
WHERE ec.concept_id = ?
" . ($year ? "AND YEAR(e.expense_date) = ?" : ""),
$year ? [$concept['id'], $year] : [$concept['id']]
);
$expensesAmount = $expenses['total'] ?? 0;
$balance = $collectedAmount - $expensesAmount;
$conceptsData[] = [
'concept' => $concept,
'year' => $conceptYear,
'expected' => $expected,
'collected' => $collectedAmount,
'expenses' => $expensesAmount,
'balance' => $balance,
'pending' => max(0, $expected - $collectedAmount)
];
$totalExpected += $expected;
$totalCollected += $collectedAmount;
$totalExpenses += $expensesAmount;
}
$totalBalance = $totalCollected - $totalExpenses;
return [
'concepts' => $conceptsData,
'totals' => [
'expected' => $totalExpected,
'collected' => $totalCollected,
'expenses' => $totalExpenses,
'balance' => $totalBalance,
'pending' => max(0, $totalExpected - $totalCollected)
],
'year' => $year
];
}
public static function getHouseStatement($houseId, $year = null) {
$db = Database::getInstance();
$house = House::findById($houseId);