v1.43.10 - FIX: Drill-down incluindo categoria pai nas subcategorias
This commit is contained in:
parent
bb06ca8fae
commit
30d58c375c
19
CHANGELOG.md
19
CHANGELOG.md
@ -5,6 +5,25 @@ O formato segue [Keep a Changelog](https://keepachangelog.com/pt-BR/).
|
|||||||
Este projeto adota [Versionamento Semântico](https://semver.org/pt-BR/).
|
Este projeto adota [Versionamento Semântico](https://semver.org/pt-BR/).
|
||||||
|
|
||||||
|
|
||||||
|
## [1.43.10] - 2025-12-16
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- **Relatórios - Drill-down de Categorias e Centros de Custo**
|
||||||
|
- **FIX CRÍTICO**: Ao clicar em uma categoria/centro pai, a soma das subcategorias não batia com o total
|
||||||
|
- Problema: Query do nível 3 filtrava apenas `c.parent_id = ?`, excluindo transações da categoria pai
|
||||||
|
- Exemplo: "Vaper/Tabaco" mostrava 784,68€ (correto), mas subcategorias somavam 297,33€
|
||||||
|
- Causa: 487,35€ estavam na própria categoria pai, não nas subcategorias
|
||||||
|
- Solução: Query agora usa `(c.id = ? OR c.parent_id = ?)` para incluir categoria pai e subcategorias
|
||||||
|
- Aplicado em:
|
||||||
|
* `/api/reports/by-category` (parâmetro `parent_id`)
|
||||||
|
* `/api/reports/by-cost-center` (parâmetros `cost_center_id` + `category_id`)
|
||||||
|
- Agora mostra corretamente:
|
||||||
|
* Categoria pai: 487,35€
|
||||||
|
* Subcategoria 1: 240,45€
|
||||||
|
* Subcategoria 2: 44,20€
|
||||||
|
* Subcategoria 3: 12,68€
|
||||||
|
* **Total: 784,68€** ✅
|
||||||
|
|
||||||
## [1.43.9] - 2025-12-16
|
## [1.43.9] - 2025-12-16
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@ -168,12 +168,12 @@ public function byCategory(Request $request)
|
|||||||
WHERE t.user_id = ?
|
WHERE t.user_id = ?
|
||||||
AND t.effective_date BETWEEN ? AND ?
|
AND t.effective_date BETWEEN ? AND ?
|
||||||
AND t.type = ?
|
AND t.type = ?
|
||||||
AND c.parent_id = ?
|
AND (c.id = ? OR c.parent_id = ?)
|
||||||
AND t.deleted_at IS NULL
|
AND t.deleted_at IS NULL
|
||||||
AND {$this->excludeTransfers()}
|
AND {$this->excludeTransfers()}
|
||||||
GROUP BY c.id, c.name, c.icon, c.color, COALESCE(a.currency, 'EUR')
|
GROUP BY c.id, c.name, c.icon, c.color, COALESCE(a.currency, 'EUR')
|
||||||
ORDER BY total DESC
|
ORDER BY total DESC
|
||||||
", [$this->userId, $startDate, $endDate, $type, $parentId]);
|
", [$this->userId, $startDate, $endDate, $type, $parentId, $parentId]);
|
||||||
}
|
}
|
||||||
// Si se quiere agrupar por categoría padre, obtenemos el nombre del padre
|
// Si se quiere agrupar por categoría padre, obtenemos el nombre del padre
|
||||||
else if ($groupByParent) {
|
else if ($groupByParent) {
|
||||||
@ -286,14 +286,14 @@ public function byCostCenter(Request $request)
|
|||||||
WHERE t.user_id = ?
|
WHERE t.user_id = ?
|
||||||
AND t.effective_date BETWEEN ? AND ?
|
AND t.effective_date BETWEEN ? AND ?
|
||||||
AND " . ($costCenterId == 0 ? "t.cost_center_id IS NULL" : "t.cost_center_id = ?") . "
|
AND " . ($costCenterId == 0 ? "t.cost_center_id IS NULL" : "t.cost_center_id = ?") . "
|
||||||
AND c.parent_id = ?
|
AND (c.id = ? OR c.parent_id = ?)
|
||||||
AND t.deleted_at IS NULL
|
AND t.deleted_at IS NULL
|
||||||
AND {$this->excludeTransfers()}
|
AND {$this->excludeTransfers()}
|
||||||
GROUP BY c.id, c.name, c.icon, c.color, COALESCE(a.currency, 'EUR')
|
GROUP BY c.id, c.name, c.icon, c.color, COALESCE(a.currency, 'EUR')
|
||||||
ORDER BY expense DESC
|
ORDER BY expense DESC
|
||||||
", $costCenterId == 0
|
", $costCenterId == 0
|
||||||
? [$this->userId, $startDate, $endDate, $categoryId]
|
? [$this->userId, $startDate, $endDate, $categoryId, $categoryId]
|
||||||
: [$this->userId, $startDate, $endDate, $costCenterId, $categoryId]
|
: [$this->userId, $startDate, $endDate, $costCenterId, $categoryId, $categoryId]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// Nível 2: Categorias pai de um centro de custo específico
|
// Nível 2: Categorias pai de um centro de custo específico
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user