feat: FCP filter counts now respect all active search filters

This commit is contained in:
2026-02-27 12:27:10 +01:00
parent b4f3c4260a
commit ad8c6eaeca
3 changed files with 45 additions and 6 deletions

View File

@@ -2505,7 +2505,11 @@ $pagination_entity_name = "Vorbestellungen";
fcpSelect.empty().select2({ data: [], placeholder: "Bitte Kampagne auswählen", allowClear: true });
return;
}
$.get(apiUrl, { do: "getFCPsForCampaign", campaign_id: campaign_id }, (success) => {
const filterData = $(this).closest("form").serializeArray().filter(item => item.name.startsWith("filter[") && !item.name.includes("fcp"));
const params = { do: "getFCPsForCampaign", campaign_id: campaign_id };
filterData.forEach(item => { params[item.name] = item.value; });
$.get(apiUrl, params, (success) => {
let fcpData = [];
let opts = { data: [], placeholder: "Bitte Kampagne auswählen", allowClear: true };
if (success?.status === "OK" && Array.isArray(success.result)) {

View File

@@ -1451,13 +1451,14 @@ class PreorderController extends mfBaseController {
$fcps = ADBRimoFcp::getAll(["netzgebiet_id" => intval($campaign->network->adb_netzgebiet_id)]) ?? [];
if (empty($fcps)) return [];
$fcpIds = array_map(fn($fcp) => $fcp->id, $fcps);
$stats = ADBRimoFcp::getRimoFcpStatistics($fcpIds);
$statsMap = [];
foreach ($stats as $stat) {
$statsMap[$stat['fcp_id']] = $stat['total_active_preorders'];
$filter = $this->request->filter ?? [];
// We want to count preorders matching ALL other filters, but ignoring the current FCP filter
if (isset($filter['fcp'])) {
unset($filter['fcp']);
}
$statsMap = PreorderModel::countActiveGroupedByFcp($filter);
$result = array_map(
fn($fcp) => [
"real_id" => $fcp->id,

View File

@@ -482,6 +482,40 @@ class PreorderModel
return self::count($filter);
}
public static function countActiveGroupedByFcp($filter = [])
{
if (!is_array($filter)) return false;
if (!array_key_exists("deleted", $filter)) {
$filter["deleted"] = null;
}
if (!array_key_exists("<status_code", $filter) && !array_key_exists(">status_code", $filter) && !array_key_exists("status_code", $filter)
&& !array_key_exists("<status_id", $filter) && !array_key_exists(">status_id", $filter) && !array_key_exists("status_id", $filter)) {
$filter["<status_code"] = 899;
$filter["!status_code"] = 20;
}
$db = FronkDB::singleton();
$where = self::getSqlFilter($filter);
$sql = "SELECT adb_hausnummer.fcp_id, COUNT(*) as cnt FROM `" . FRONKDB_DBNAME . "`.Preorder tt_preorder
LEFT JOIN `" . FRONKDB_DBNAME . "`.Preorderstatus tt_preorderstatus ON (tt_preorder.status_id = tt_preorderstatus.id)
LEFT JOIN `" . ADDRESSDB_DBNAME . "`.view_hausnummer as adb_hausnummer ON (tt_preorder.adb_hausnummer_id = adb_hausnummer.hausnummer_id)
LEFT JOIN `" . ADDRESSDB_DBNAME . "`.Wohneinheit as adb_wohneinheit ON (tt_preorder.adb_wohneinheit_id = adb_wohneinheit.id)
WHERE $where AND adb_hausnummer.fcp_id IS NOT NULL
GROUP BY adb_hausnummer.fcp_id
";
$res = $db->query($sql);
$counts = [];
if ($db->num_rows($res)) {
while ($row = $db->fetch_object($res)) {
$counts[$row->fcp_id] = (int)$row->cnt;
}
}
return $counts;
}
/**
* @param $filter
* @param $limit