Files
thetool/application/Admin/functions/RtrReporting.php
2024-12-12 21:52:46 +01:00

512 lines
20 KiB
PHP

<?php
class Admin_RtrReporting {
private $request;
private $db;
private $log;
private $flash = [];
private $systemowner_id = 1;
private $additional_owner_networks = [
7 // mortantsch
];
private $ort_replace = [
"St.Ruprecht/Raab" => "Sankt Ruprecht an der Raab",
"St. Ruprecht / Raab" => "Sankt Ruprecht an der Raab",
"St. Ruprecht a.d. Raab" => "Sankt Ruprecht an der Raab",
"St. Ruprecht a.d. R." => "Sankt Ruprecht an der Raab",
"St. Ruprecht/Raab" => "Sankt Ruprecht an der Raab",
"St. Ruprecht" => "Sankt Ruprecht an der Raab",
"Seieersberg" => "Seiersberg",
"St.Stefan im Rosental" => "Sankt Stefan im Rosental",
"St Stefan im Rosental" => "Sankt Stefan im Rosental",
"St. Stefan i.R." => "Sankt Stefan im Rosental",
"St. Stefan i. R." => "Sankt Stefan im Rosental",
"St.Stefan i. R." => "Sankt Stefan im Rosental",
"St.Stefan i.R." => "Sankt Stefan im Rosental",
"St. Stefab i. R." => "Sankt Stefan im Rosental",
"St. Stefan i.R" => "Sankt Stefan im Rosental",
"St. Stefan/R." => "Sankt Stefan im Rosental",
"Pölfing-Bunn" => "Pölfing-Brunn",
"Pölfing Brunn" => "Pölfing-Brunn",
"Eibsiwald" => "Eibiswald",
"Wolfsberg" => "Schwarzautal",
"Wolfsberg i. Sch." => "Schwarzautal",
"Wolfsberg i. Schwarzautal" => "Schwarzautal",
"Wolfsberg i.S." => "Schwarzautal",
"Wolfsberg im Scharzautal" => "Schwarzautal",
"Wolfsberg im Schwarzautal" => "Schwarzautal",
"Wolfberg im Schwarzautal" => "Schwarzautal",
"Schwarzau" => "Schwarzautal",
"Sankt Radegund" => "Sankt Radegund bei Graz",
"Sankt Radegund" => "Sankt Radegund bei Graz",
"St. Radegund" => "Sankt Radegund bei Graz",
"Judendorf-Straßengel" => "Gratwein-Straßengel",
"Judendorf-Strassengel" => "Gratwein-Straßengel",
"Gartwein-Straßengel" => "Gratwein-Straßengel",
"Gratwein" => "Gratwein-Straßengel",
"Fladnitz" => "Fladnitz an der Teichalm",
"Fladnitz a.d.T." => "Fladnitz an der Teichalm",
"Fladnitz a. d. T." => "Fladnitz an der Teichalm",
"Fladnitz/Teichalm" => "Fladnitz an der Teichalm",
"Tulwitz" => "Fladnitz an der Teichalm",
"Fladnitz/T." => "Fladnitz an der Teichalm",
"Fladnitz a. d. Teichalm" => "Fladnitz an der Teichalm",
"Stübing" => "Deutschfeistritz",
"Minihof Liebau" => "Minihof-Liebau",
"Windisch-Minihof" => "Minihof-Liebau",
"Windisch Minihof" => "Minihof-Liebau",
"St. Anna / Aigen" => "Sankt Anna am Aigen",
"St.Anna" => "Sankt Anna am Aigen",
"St.Anna/Aigen" => "Sankt Anna am Aigen",
"St. Margarethen" => "St. Margarethen an der Raab",
"St. Margarethen a.d.Raab" => "St. Margarethen an der Raab",
"St. Margarethen a.d.R." => "St. Margarethen an der Raab",
"Passeil" => "Passail",
"Neudorf b. Passail" => "Passail",
"Neudorf bei Passail" => "Passail",
"Edelsbach" => "Edelsbach bei Feldbach",
"Neuhaus am Klausenb." => "Neuhaus am Klausenbach",
"Kirchberg" => "Kirchberg an der Raab",
"Kirchberg a.d. Raab" => "Kirchberg an der Raab",
"Kirchberg a.d. R." => "Kirchberg an der Raab",
"Kirchberg a. d. Raab" => "Kirchberg an der Raab",
"Kirchberg a. d. Raab" => "Kirchberg an der Raab",
"Kalsdorf" => "Kalsdorf bei Graz",
"Strass" => "Straß in Steiermark",
"St.Oswald o.E." => "Eibiswald",
"St. Peter i. S." => "Sankt Peter im Sulmtal",
"St. Nikolai i.S." => "Sankt Nikolai im Sausal",
"St. Nikoai im Sausal" => "Sankt Nikolai im Sausal",
"Limberg B. Wies" => "Wies",
"Limberg bei Wies" => "Wies",
"Kitzeck" => "Kitzeck im Sausal",
"Nikolai i. S." => "Sankt Nikolai im Sausal",
"St.Nikolai i.S." => "Sankt Nikolai im Sausal",
"St. Nikolai i. S." => "Sankt Nikolai im Sausal",
"Braunau/Inn" => "Braunau am Inn",
"Hohenbrugg" => "Fehring",
"Seiersberg - Pirka" => "Seiersberg-Pirka",
"Heiligenkreuz a. W." => "Heiligenkreuz am Waasen",
"Heiligen Kreuz am Waasen" => "Heiligenkreuz am Waasen",
"Heiligenkreuz a.W." => "Heiligenkreuz am Waasen",
"Heiligenkreuz /W" => "Heiligenkreuz am Waasen",
"Heiligenkreuz a/W" => "Heiligenkreuz am Waasen",
"Rettenbach in der Oststeiermark" => "Pirching am Traubenberg",
"Rettenbach" => "Pirching am Traubenberg",
"St. Ulrich im Greith" => "Sankt Martin im Sulmtal",
"St. Martin i. S." => "Sankt Martin im Sulmtal",
"St. Georgen/Stiefing" => "Sankt Georgen an der Stiefing",
"St. Georgen a. d. Stiefing" => "Sankt Georgen an der Stiefing",
"St.Georgen a/d Stief." => "Sankt Georgen an der Stiefing",
"St. Georgen" => "Sankt Georgen an der Stiefing",
"St. Johann im Sausal" => "Sankt Johann im Saggautal",
"Naas bei Weiz" => "Naas",
"Nöstl bei Weiz" => "Weiz",
"Weiz/Krottendorf" => "Weiz",
"St. Andrä Höch" => "Sankt Andrä-Höch",
"St.Andrä/Sausal" => "Sankt Andrä-Höch",
"Sankt Andrä Höch" => "Sankt Andrä-Höch",
"St. Andrä/Höch" => "Sankt Andrä-Höch",
"St. Andrä - Höch" => "Sankt Andrä-Höch",
"St. Andrä i/S" => "Sankt Andrä-Höch",
"St. Andrä" => "Sankt Andrä-Höch",
"St. Andrä /Höch" => "Sankt Andrä-Höch",
"Hartl bei Kaindorf" => "Hartl",
"Hartl/Tiefenbach" => "Hartl",
"Tilmitsch" => "Tillmitsch",
"St.Marein b. Graz" => "Sankt Marein bei Graz",
"St. Marein b. Graz" => "Sankt Marein bei Graz",
"St. Marein / Graz" => "Sankt Marein bei Graz",
"St. Marein" => "Sankt Marein bei Graz",
"St. MArein b. Graz" => "Sankt Marein bei Graz",
"Weiz - Thannhausen" => "Thannhausen",
"Hof bei Straden" => "Tieschen",
"Kopfing bei Kaindorf" => "Kaindorf",
"Wettmanstätten" => "Wettmannstätten",
"Kirchbach" => "Kirchbach-Zerlach",
"KIRCHBACH" => "Kirchbach-Zerlach",
"Kirchbach - Zerlach" => "Kirchbach-Zerlach",
"Kirchbach Zerlach" => "Kirchbach-Zerlach",
"Kirchbach/Zerlach" => "Kirchbach-Zerlach",
"Kirchbach in der Steiermark" => "Kirchbach-Zerlach",
"Groß-St. Florian" => "Groß Sankt Florian",
"Groß St. Florian" => "Groß Sankt Florian",
"Lang/Lebring" => "Lang",
"St.Stefan" => "Sankt Stefan ob Stainz",
"St.Stefan/Stainz" => "Sankt Stefan ob Stainz",
"St.Josef/Stainz" => "Sankt Josef (Weststeiermark)",
"Rosental" => "Rosental an der Kainach",
"Krottendorf" => "Krottendorf-Gaisfeld",
//"" => "Sankt Ruprecht an der Raab",
//"" => "Sankt Ruprecht an der Raab",
//"" => "Sankt Ruprecht an der Raab",
//"" => "Sankt Ruprecht an der Raab",
//"" => "Sankt Ruprecht an der Raab",
//"" => "Sankt Ruprecht an der Raab",
//"" => "Sankt Ruprecht an der Raab",
];
public function __construct($request = false) {
$this->request = $request;
$this->db = FronkDB::singleton();
$this->log = mfLoghandler::singleton();
}
public function runRequest() {
$action = $this->request->do;
if(!$action) {
return $this->indexAction();
} else {
$method = $action."Action";
if(method_exists($this, $method)) {
return $this->$method();
} else {
throw new Exception("Method not found", "404");
}
}
}
public function indexAction() {
return [
"template" => "Admin/RtrReporting/Index",
"redirect" => "",
"templateVars" => []
];
}
public function a10reportAction() {
// alle anschlüsse
$rasterpunkte = [];
foreach(BuildingModel::getAll() as $building) {
// limit to sytemowners networks
if($building->network->owner_id != $this->systemowner_id && !in_array($building->network->owner_id, $this->additional_owner_networks)) continue;
$raster = $building->laea;
if(!$raster) continue;
$prod_code = 14310;
$bb = "1000,00"; // glas = 1000, funk = 50
//$user_count = TerminationModel::count(["building_id" => $building->id]);
$rtr100m = Rtr100mRaster::getFirst(["raster" => $raster]);
if(!$rtr100m) {
die("RTR Raster fehlt ".$raster);
}
$user_count = $rtr100m->unit_count;
$unit_sum = $building->units;
if(!array_key_exists($raster, $rasterpunkte)) {
$rasterpunkte[$raster] = [];
}
if(!array_key_exists($prod_code, $rasterpunkte[$raster])) {
$rasterpunkte[$raster][$prod_code] = [
"bb" => $bb,
"unit_sum" => 0,
"user_count" => 0
];
}
$rasterpunkte[$raster][$prod_code]["unit_sum"] += $unit_sum;
$rasterpunkte[$raster][$prod_code]["user_count"] = $user_count;
}
$building = new Building();
$eigen_product_ids = $this->getEigenProductIds();
foreach(ContractModel::search(["product_id" => $eigen_product_ids]) as $contract) {
if($contract->termination_id) continue;
$address = $contract->owner;
if(!$address->gps_lat || !$address->gps_long || !$address->laea) {
$address->save(); // gets gps and laea after saving
}
$raster = $address->laea;
if(!$raster) continue;
$rtr_code = $contract->product->attributes["rtr_tech_code"]->value;
if(substr($rtr_code, 0, 4) == 1431) {
$prod_code = 14310;
$bb = "1000,00";
} elseif(substr($rtr_code, 0, 4) == 1042) {
$prod_code = 10420;
$bb = "50,00";
} else {
continue; // incompatible product
}
if(!array_key_exists($raster, $rasterpunkte)) {
$rasterpunkte[$raster] = [];
}
if(!array_key_exists($prod_code, $rasterpunkte[$raster])) {
$rasterpunkte[$raster][$prod_code] = [
"bb" => $bb,
"unit_sum" => 0,
"user_count" => 0
];
}
$rtr100m = Rtr100mRaster::getFirst(["raster" => $raster]);
if(!$rtr100m) {
$this->log->warn(__METHOD__.": RTR Raster fehlt ".$raster);
continue;
}
$rasterpunkte[$raster][$prod_code]["unit_sum"]++;
$rasterpunkte[$raster][$prod_code]["user_count"] = $rtr100m->unit_count;
}
$csv_header = "rasterid;code;dl_min_max_bb;dl_q25_max_bb;dl_avg_max_bb;dl_max_max_bb;ul_min_max_bb;ul_q25_max_bb;ul_avg_max_bb;ul_max_max_bb;dl_min_n_bb;dl_q25_n_bb;dl_avg_n_bb;dl_avg_n_bb;ul_min_n_bb;ul_q25_n_bb;ul_avg_n_bb;ul_avg_n_bb;anz_anschl_cov";
$csv = $csv_header."\n";
foreach($rasterpunkte as $rastercode => $raster) {
foreach($raster as $prod_code => $data) {
$csv .= $rastercode . ";";
$csv .= $prod_code . ";";
for($i = 0; $i < 16; $i++) {
$csv .= $data["bb"] . ";";
}
$csv .= ($data["user_count"]) ?: ($data["unit_sum"]) ?: 1;
$csv .= "\n";
}
}
header("Content-type: text/csv; charset=utf-8");
header('Content-disposition: attachment; filename="rtr-A10-report-'.date('Y-m-d_H-i-s').'.csv"');
echo $csv;
exit;
}
protected function b10reportAction() {
$data = [];
$adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
$ort2gem = [];
foreach(ContractModel::searchActive([]) as $contract) {
if(!$contract->product->attributes["rtr_tech_code"]->value) continue;
$prod_code = $contract->product->attributes["rtr_tech_code"]->value;
$bb_down = $contract->product->attributes["bw_down"]->value;
$bb_up = $contract->product->attributes["bw_up"]->value;
if(!$bb_down && substr($prod_code,0,4) == "1042") {
// funkprodukt
$bb_down = 50;
$bb_up = 10;
}
if(!$bb_down) {
/*$m = [];
if(preg_match('@\d/\d@', $contract->product_name, $m)) {
}*/
echo "Keine BB für ".$contract->product_name." ".$contract->id."\n";
exit;
}
$is_sym = false;
if($bb_down == $bb_up) {
$is_sym = true;
$bb_code = $this->getRtrBBCode($bb_down, "sym");
} else {
$bb_code_down = $this->getRtrBBCode($bb_down, "down");
$bb_code_up = $this->getRtrBBCode($bb_up, "up");
}
if($contract->termination_id) {
$plz = trim($contract->termination->building->zip);
$ort = trim($contract->termination->building->city);
} else {
$plz = trim($contract->owner->zip);
$ort = trim($contract->owner->city);
}
// get Gemeinde ID
if(!$ort) {
continue;
}
$ort = preg_replace('/\s+/', ' ', $ort);
$orte = [$ort];
if(substr($ort, 0, 4) == "St. " || substr($ort, 0, 4) == "St, ") {
$orte[] = preg_replace('/^St[.,]/', "Sankt", $ort);
}
if(substr($ort, 0, 3) == "St." || substr($ort, 0, 3) == "St,") {
$orte[] = preg_replace('/^St[.,]/', "Sankt ", $ort);
}
if(array_key_exists($ort, $this->ort_replace)) {
$orte[] = $this->ort_replace[$ort];
}
if(!array_key_exists("$plz--$ort", $ort2gem)) {
$sql = AddressDB::$wohneinheit_query;
$where = " WHERE Plz.plz='$plz' AND Gemeinde.name IN ('".implode("','", $orte)."') LIMIT 1";
$sql .= $where;
//$this->log->debug("$sql\n$where");
$res = $adb->query($sql);
if(!$adb->num_rows($res)) {
$sql = AddressDB::$wohneinheit_query;
$where = " WHERE Plz.plz='$plz' AND Ortschaft.name IN ('".implode("','", $orte)."') LIMIT 1";
//$this->log->debug("$sql\n$where");
$sql .= $where;
$res = $adb->query($sql);
if(!$adb->num_rows($res)) {
echo "Geminde nicht gefunden Plz.plz='$plz' AND Ortschaft.name='$ort'\n";
exit;
}
}
$row = $adb->fetch_object($res);
if(!$row->gemeinde_kennziffer) {
echo "Keine Gem KZ $plz $ort\n";
exit;
}
$gemid = $row->gemeinde_kennziffer;
//$this->log->debug("Adding '$plz--$ort' to $gemid");
$ort2gem["$plz--$ort"] = $gemid;
} else {
$gemid = $ort2gem["$plz--$ort"];
}
if(!array_key_exists($gemid, $data)) {
$data[$gemid] = [];
}
if(!array_key_exists($prod_code, $data[$gemid])) {
$data[$gemid][$prod_code] = [];
}
if($is_sym) {
if(!array_key_exists($bb_code, $data[$gemid][$prod_code])) {
$data[$gemid][$prod_code][$bb_code] = 0;
}
$data[$gemid][$prod_code][$bb_code]++;
} else {
if(!array_key_exists($bb_code_down, $data[$gemid][$prod_code])) {
$data[$gemid][$prod_code][$bb_code_down] = 0;
}
if(!array_key_exists($bb_code_up, $data[$gemid][$prod_code])) {
$data[$gemid][$prod_code][$bb_code_up] = 0;
}
$data[$gemid][$prod_code][$bb_code_down]++;
$data[$gemid][$prod_code][$bb_code_up]++;
}
}
$csv_header = "gemid;code;bb;anz_akt_anschl";
$csv = $csv_header."\n";
foreach($data as $gemid => $gem) {
foreach($gem as $prod_code => $prod) {
foreach($prod as $bb_code => $count) {
$csv .= $gemid . ";";
$csv .= $prod_code . ";";
$csv .= $bb_code . ";";
$csv .= $count . ";";
$csv .= "\n";
}
}
}
header("Content-type: text/csv; charset=utf-8");
header('Content-disposition: attachment; filename="rtr-B10-report-'.date('Y-m-d_H-i-s').'.csv"');
echo $csv;
exit;
}
/*
* 1042% = radio
* 1431% = fiber
*/
private function getEigenProductIds() {
$product_ids = [];
$sql = "SELECT product_id FROM `ProductAttribute`
LEFT JOIN ProducttechAttribute ON (ProductAttribute.producttechattribute_id = ProducttechAttribute.id)
WHERE ProducttechAttribute.name='rtr_tech_code'
AND (ProductAttribute.value LIKE '1042%' OR ProductAttribute.value LIKE '1431%')";
$res = $this->db->query($sql);
while($data = $this->db->fetch_object($res)) {
$product_ids[] = $data->product_id;
}
return $product_ids;
}
private function getRtrBBCode($bb, $direction = "down") {
if($direction == "down") {
if($bb < 1) return 1;
if($bb >= 1 && $bb < 2) return 2;
if($bb >= 2 && $bb < 10) return 3;
if($bb >= 10 && $bb < 30) return 4;
if($bb >= 30 && $bb < 50) return 5;
if($bb >= 50 && $bb < 75) return 6;
if($bb >= 75 && $bb < 100) return 7;
if($bb >= 100 && $bb < 150) return 8;
if($bb >= 150 && $bb < 300) return 9;
if($bb >= 300 && $bb < 1000) return 10;
if($bb >= 1000) return 11;
}
if($direction == "up") {
if($bb < 0.5) return 51;
if($bb >= 0.5 && $bb < 1) return 52;
if($bb >= 1 && $bb < 2) return 53;
if($bb >= 2 && $bb < 3) return 54;
if($bb >= 3 && $bb < 5) return 55;
if($bb >= 5 && $bb < 10) return 56;
if($bb >= 10 && $bb < 20) return 57;
if($bb >= 20 && $bb < 30) return 58;
if($bb >= 30 && $bb < 40) return 59;
if($bb >= 40 && $bb < 100) return 60;
if($bb >= 100 && $bb < 150) return 61;
if($bb >= 150 && $bb < 300) return 62;
if($bb >= 3000 && $bb < 1000) return 63;
if($bb >= 1000) return 64;
}
if($direction == "sym") {
if($bb < 1) return 21;
if($bb >= 1 && $bb < 2) return 22;
if($bb >= 2 && $bb < 10) return 23;
if($bb >= 10 && $bb < 30) return 24;
if($bb >= 30 && $bb < 50) return 25;
if($bb >= 50 && $bb < 75) return 26;
if($bb >= 75 && $bb < 100) return 27;
if($bb >= 100 && $bb < 150) return 28;
if($bb >= 150 && $bb < 300) return 29;
if($bb >= 300 && $bb < 500) return 30;
if($bb >= 500 && $bb < 750) return 31;
if($bb >= 750 && $bb < 1000) return 32;
if($bb >= 1000) return 33;
}
return 0;
}
}