changed logic of unit count calculation based on internal tool type

This commit is contained in:
Luca Haid
2025-06-10 09:45:57 +02:00
parent 327d6686fb
commit 28546cf4d0
8 changed files with 135 additions and 678 deletions
+83 -46
View File
@@ -495,7 +495,7 @@ class PreorderModel
$where = self::getSqlFilter($filter);
$sql = "SELECT 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 . "`.Hausnummer as adb_hausnummer ON (tt_preorder.adb_hausnummer_id = adb_hausnummer.id)
LEFT JOIN `" . ADDRESSDB_DBNAME . "`.Wohneinheit as adb_wohneinheit ON (tt_preorder.adb_wohneinheit_id = adb_wohneinheit.id)
LEFT OUTER JOIN (SELECT adb_wohneinheit_id, count(*) cnt, MAX(rimo_status) as rimo_status, MAX(rimo_name) as rimo_name, MAX(rimo_team_name) as rimo_team_name, MAX(rimo_team_id) as rimo_team_id FROM `" . FRONKDB_DBNAME . "`.RimoWorkorder WHERE rimo_status NOT IN ('deleted', 'cancelled') GROUP BY adb_wohneinheit_id) workorder ON adb_wohneinheit.id = workorder.adb_wohneinheit_id
WHERE $where
@@ -795,6 +795,18 @@ class PreorderModel
}
}
if (array_key_exists("tool_building_type", $filter)) {
$tool_building_type = $filter['tool_building_type'];
if (is_array($tool_building_type) && count($tool_building_type)) {
$where .= " AND adb_hausnummer.tool_building_type IN ('" . implode("','", $tool_building_type) . "')";
} else {
$tool_building_type = FronkDB::singleton()->escape($filter['connection_type']);
if ($tool_building_type) {
$where .= " AND adb_hausnummer.tool_building_type like '%$tool_building_type%'";
}
}
}
if (array_key_exists("connection_count", $filter)) {
$connection_count = $filter['connection_count'];
if (intval($connection_count) === 1) {
@@ -1095,7 +1107,7 @@ class PreorderModel
$sql = "SELECT 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 . "`.Hausnummer as adb_hausnummer ON (tt_preorder.adb_hausnummer_id = adb_hausnummer.id)
INNER JOIN `" . FRONKDB_DBNAME . "`.PreorderStatusflagValue psfv ON tt_preorder.id = psfv.preorder_id
INNER JOIN `" . FRONKDB_DBNAME . "`.PreorderStatusflag psf ON psfv.flag_id = psf.id
WHERE $where AND psf.code = " . $statusFlag . " AND psfv.value = 1";
@@ -1112,67 +1124,92 @@ class PreorderModel
}
public static function countActivePreorder($preorderCampaignId = null) {
$db = FronkDB::singleton();
$db = FronkDB::singleton();
$where = "";
if ($preorderCampaignId) {
$where .= " AND p.preordercampaign_id = $preorderCampaignId";
}
$where = "";
if ($preorderCampaignId) {
$where .= " AND p.preordercampaign_id = $preorderCampaignId";
}
$sql = "SELECT
COALESCE(SUM(CASE
WHEN LOWER(vh.gdaeigenschaft) IN ('multi dwelling', 'mehrparteienhaus', 'gebaeude mit 2 oder mehr wohnungen', 'gebäude mit 2 oder mehr wohnungen', 'wohngebaeude fuer gemeinschaften', 'wohngebäude für gemeinschaften', 'hotels und aehnliche gebaeude', 'hotels und ähnliche gebäude', 'wohngebäude mit 2 und mehr wohnungen')
OR LOWER(vh.rimo_type) IN ('multi dwelling', 'mehrparteienhaus', 'gebaeude mit 2 oder mehr wohnungen', 'gebäude mit 2 oder mehr wohnungen', 'wohngebaeude fuer gemeinschaften', 'wohngebäude für gemeinschaften', 'hotels und aehnliche gebaeude', 'hotels und ähnliche gebäude', 'wohngebäude mit 2 und mehr wohnungen')
THEN COALESCE(p.connection_count, 1)
ELSE 0
END), 0) AS md_count,
COALESCE(SUM(COALESCE(p.connection_count, 1)), 0) AS total_count
$sql = "SELECT
COALESCE(SUM(CASE
WHEN h.tool_building_type = 2 THEN COALESCE(p.connection_count, 1)
ELSE 0
END), 0) AS md_count,
COALESCE(SUM(COALESCE(p.connection_count, 1)), 0) AS total_count
FROM
`".FRONKDB_DBNAME."`.Preorder p
LEFT JOIN `".ADDRESSDB_DBNAME."`.Hausnummer h ON p.adb_hausnummer_id = h.id
LEFT JOIN `".FRONKDB_DBNAME."`.Preorderstatus tt_preorderstatus ON p.status_id = tt_preorderstatus.id
WHERE p.deleted = 0 AND tt_preorderstatus.code < 899";
FROM
`".FRONKDB_DBNAME."`.Preorder p
LEFT JOIN `".ADDRESSDB_DBNAME."`.view_hausnummer vh ON p.adb_hausnummer_id = vh.hausnummer_id
LEFT JOIN `".FRONKDB_DBNAME."`.Preorderstatus tt_preorderstatus ON p.status_id = tt_preorderstatus.id
WHERE p.deleted = 0 AND tt_preorderstatus.code < 899";
$queryStart = microtime(true);
$res = $db->query($sql . $where);
mfLoghandler::singleton()->debug("[Query took: ".(microtime(true) - $queryStart)." seconds] " . $sql);
$queryStart = microtime(true);
$res = $db->query($sql . $where);
mfLoghandler::singleton()->debug("[Query took: ".(microtime(true) - $queryStart)." seconds] " . $sql);
if ($db->num_rows($res)) {
if ($db->num_rows($res)) {
$data = $db->fetch_object($res);
return ['md_count' => $data->md_count, 'sd_count' => $data->total_count - $data->md_count, 'total_count' => $data->total_count];
}
return ['md_count' => 0, 'sd_count' => 0, 'total_count' => 0];
return [
'md_count' => (int)$data->md_count,
'sd_count' => (int)($data->total_count - $data->md_count),
'total_count' => (int)$data->total_count
];
}
return [
'md_count' => 0,
'sd_count' => 0,
'total_count' => 0
];
}
public static function countTotalUnits($preorderCampaignId = null) {
$db = FronkDB::singleton();
$db = FronkDB::singleton();
$where = "1=1";
if ($preorderCampaignId) {
$where .= " AND pc.id = $preorderCampaignId";
}
$where = "1=1";
if ($preorderCampaignId) {
$where .= " AND pc.id = $preorderCampaignId";
}
$sql = "SELECT
pc.id AS campaign_id,
COALESCE(SUM(n.unit_count), 0) AS total_unit_count,
COALESCE(SUM(n.unit_count_sd), 0) AS total_unit_count_sd,
COALESCE(SUM(n.unit_count_md), 0) AS total_unit_count_md
FROM Preordercampaign pc
LEFT JOIN `".FRONKDB_DBNAME."`.PreordercampaignSalescluster pcs ON pc.id = pcs.preordercampaign_id
LEFT JOIN `".ADDRESSDB_DBNAME."`.Netzgebiet n ON pcs.salescluster_id = n.id
WHERE $where
GROUP BY pc.id";
$sql = "SELECT
pc.id AS campaign_id,
COUNT(w.id) AS total_unit_count,
SUM(CASE
WHEN h.tool_building_type IN (0, 1) THEN 1
ELSE 0
END) AS total_unit_count_sd,
SUM(CASE
WHEN h.tool_building_type = 2 THEN 1
ELSE 0
END) AS total_unit_count_md
FROM Preordercampaign pc
LEFT JOIN `".FRONKDB_DBNAME."`.PreordercampaignSalescluster pcs ON pc.id = pcs.preordercampaign_id
LEFT JOIN `".ADDRESSDB_DBNAME."`.Netzgebiet n ON pcs.salescluster_id = n.id
LEFT JOIN `".ADDRESSDB_DBNAME."`.Hausnummer h ON n.id = h.netzgebiet_id
LEFT JOIN `".ADDRESSDB_DBNAME."`.Wohneinheit w ON h.id = w.hausnummer_id
WHERE $where
GROUP BY pc.id";
$queryStart = microtime(true);
$res = $db->query($sql);
mfLoghandler::singleton()->debug("[Query took: ".(microtime(true) - $queryStart)." seconds] " . $sql);
if ($db->num_rows($res)) {
$data = $db->fetch_object($res);
return ['total_unit_count' => $data->total_unit_count, 'total_unit_count_sd' => $data->total_unit_count_sd, 'total_unit_count_md' => $data->total_unit_count_md];
}
return ['total_unit_count' => 0, 'total_unit_count_sd' => 0, 'total_unit_count_md' => 0];
$data = $db->fetch_object($res);
return [
'total_unit_count' => (int)$data->total_unit_count,
'total_unit_count_sd' => (int)$data->total_unit_count_sd,
'total_unit_count_md' => (int)$data->total_unit_count_md
];
}
return [
'total_unit_count' => 0,
'total_unit_count_sd' => 0,
'total_unit_count_md' => 0
];
}
public static function countHistoryStatus($filter = [], $status_code = null) {
if ($status_code === null) {
die("Please select a status code");