From 9db6ae59c3c8897b9aa369c68a395ed66a8d76aa Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Tue, 4 Oct 2022 12:43:54 +0200 Subject: [PATCH] WIP GWR Umbau mit Netzgebiet und Adressstatus --- application/ADBHausnummer/ADBHausnummer.php | 26 +- .../ADBHausnummer/ADBHausnummerModel.php | 10 +- application/ADBNetzgebiet/ADBNetzgebiet.php | 51 +++ .../ADBOrtschaft/ADBOrtschaftModel.php | 13 +- application/ADBPlz/ADBPlzModel.php | 1 + .../ADBWohneinheit/ADBWohneinheitModel.php | 3 + application/AddressDB/AddressDB.php | 21 ++ application/AddressDB/AddressDBController.php | 6 +- application/AddressDB/Importer/csv.php | 15 +- application/AddressDB/Importer/rimo.php | 2 +- application/Api/v1/AddressdbApicontroller.php | 7 + scripts/addressdb_update.php | 295 ++++++++++++++++++ 12 files changed, 434 insertions(+), 16 deletions(-) create mode 100644 application/ADBNetzgebiet/ADBNetzgebiet.php create mode 100755 scripts/addressdb_update.php diff --git a/application/ADBHausnummer/ADBHausnummer.php b/application/ADBHausnummer/ADBHausnummer.php index 612e37466..80c22b46d 100644 --- a/application/ADBHausnummer/ADBHausnummer.php +++ b/application/ADBHausnummer/ADBHausnummer.php @@ -13,7 +13,31 @@ class ADBHausnummer extends mfBaseModel { //$this->strasse = new ADBStrasse($this->strasse_id); //$this->plz = new ADBPlz($this->plz_id); } - + /* + public static function parseAddresszusatz($text) { + $zusatz = ""; + + $text = trim($text); + if(!$text) return $data; + $text = " ".$text; + + $m = []; + if(preg_match('/((?:gesch(?:ae|ä)ft|betrieb und wohnungen|paketlogistik|cafe|pavillon|pfarrheim|[^ ]*haus|[^ ]*geb(?:ae|ä)ude|[^ ]*halle)(?:\s+[a-z0-9]+)?)/i', $text, $m)) { + $zusatz = $m[1]; + $text = str_replace($m[0], "", $text); + } + + + + $text = trim(preg_replace('/\s{2,}/', "", $text)); + + if($text) { + $data['zusatz'] = $text; + } + + + return $data; + }*/ public function getProperty($name) { if($this->$name == null) { diff --git a/application/ADBHausnummer/ADBHausnummerModel.php b/application/ADBHausnummer/ADBHausnummerModel.php index 1c120a732..89c5038b1 100644 --- a/application/ADBHausnummer/ADBHausnummerModel.php +++ b/application/ADBHausnummer/ADBHausnummerModel.php @@ -1,11 +1,15 @@ db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); + $this->table = "Netzgebiet"; + } + + public function loadByExtref($extref) { + $extref = $this->db->escape(trim($extref)); + if(!$extref) { + return false; + } + + $res = $this->db->select("Netzgebiet", "*", "extref='$extref'"); + if(!$this->db->num_rows($res)) { + return false; + } + $data = $this->db->fetch_object($res); + $this->load($data); + return true; + } + + public function getProperty($name) { + if($this->$name == null) { + + if($name == "strasse") { + $this->strasse = new ADBStrasse($this->strasse_id); + return $this->strasse; + } + + if($name == "plz") { + $this->plz = new ADBPlz($this->plz_id); + return $this->plz; + } + + $classname = ucfirst($name); + $idfield = $name."_id"; + $this->$name = new $classname($this->$idfield); + + if($this->$name->id) { + return $this->$name; + } else { + return null; + } + } + + return $this->$name; + } +} diff --git a/application/ADBOrtschaft/ADBOrtschaftModel.php b/application/ADBOrtschaft/ADBOrtschaftModel.php index 560b7ed69..48bfc9a2c 100644 --- a/application/ADBOrtschaft/ADBOrtschaftModel.php +++ b/application/ADBOrtschaft/ADBOrtschaftModel.php @@ -115,8 +115,6 @@ class ADBOrtschaftModel { private static function getSqlFilter($filter) { $where = "1=1 "; - - if(array_key_exists("gemeinde_id", $filter)) { $gemeinde_id = $filter['gemeinde_id']; @@ -137,9 +135,14 @@ class ADBOrtschaftModel { } if(array_key_exists("name", $filter)) { - $name = FronkDB::singleton()->escape($filter['name']); - if($name) { - $where .= " AND Ortschaft.`name` = '$name'"; + if(is_array($filter['name'])) { + $name = $filter['name']; + $where .= " AND Ortschaft.name IN ('". implode("','", $name)."')"; + } else { + $name = FronkDB::singleton()->escape($filter['name']); + if($name) { + $where .= " AND Ortschaft.`name` = '$name'"; + } } } diff --git a/application/ADBPlz/ADBPlzModel.php b/application/ADBPlz/ADBPlzModel.php index d7e1777c5..b773e740a 100644 --- a/application/ADBPlz/ADBPlzModel.php +++ b/application/ADBPlz/ADBPlzModel.php @@ -1,6 +1,7 @@ log = mfLoghandler::singleton(); } + + public function import($input) { + $path = __DIR__."/Importer/"; + $dir = opendir($path); + + while(($file = readdir($dir)) !== false) { + if(substr($file, 0, 1) == ".") continue; + if(substr($file, -4) != ".php") continue; + if(!is_file($path.$file)) continue; + + require_once $path.$file; + $classname = "AddressDB_Importer_".ucfirst(substr($file, 0, strlen($file)-4)); + if(class_exists($classname)) { + $importer = new $classname(); + if($importer->isValid($input)) { + return $importer->import(); + } + } + } + } + } \ No newline at end of file diff --git a/application/AddressDB/AddressDBController.php b/application/AddressDB/AddressDBController.php index deb4c470e..051f054f5 100644 --- a/application/AddressDB/AddressDBController.php +++ b/application/AddressDB/AddressDBController.php @@ -13,11 +13,7 @@ class AddressDBController extends mfBaseController { $this->redirect("Dashboard"); } } - - protected function importAction($input) { - - } - + protected function apiAction() { if(!$this->me->is(["Admin","netowner"])) { $this->redirect("Dashboard"); diff --git a/application/AddressDB/Importer/csv.php b/application/AddressDB/Importer/csv.php index 3a46816b1..10cd619b8 100644 --- a/application/AddressDB/Importer/csv.php +++ b/application/AddressDB/Importer/csv.php @@ -4,12 +4,25 @@ class AddressDB_Importer_Csv { private $db; private $log; + private $input; + public function __construct() { $this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $this->log = mfLoghandler::singleton(); } - public function import($input) { + public function isValid($input) { + if(strlen($input) < 1024 && strpos($input, "\n") === false) { + $this->input = $input; + return true; + } + return false; + } + + public function import() { + echo "importing...\n";exit; + $input = $this->input; + if(!$input) { return false; } diff --git a/application/AddressDB/Importer/rimo.php b/application/AddressDB/Importer/rimo.php index bdc252090..fa5292c38 100644 --- a/application/AddressDB/Importer/rimo.php +++ b/application/AddressDB/Importer/rimo.php @@ -6,7 +6,7 @@ class AddressDB_Importer_Rimo { private $campaign; - public function __construct(Preordercampain $campaign) { + public function __construct() { $this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $this->log = mfLoghandler::singleton(); } diff --git a/application/Api/v1/AddressdbApicontroller.php b/application/Api/v1/AddressdbApicontroller.php index ddab886fe..2302e87ec 100644 --- a/application/Api/v1/AddressdbApicontroller.php +++ b/application/Api/v1/AddressdbApicontroller.php @@ -35,8 +35,10 @@ class AddressdbApicontroller extends mfBaseApicontroller { } protected function findCity() { + // unofficially supporting GET and POST in v1 $get = array_merge($this->post, $this->get); + // search parameter is unofficially deprecated but still supported $search = trim($get['search']); $city = trim($get['city']); $zip = trim($get['zip']); @@ -67,8 +69,10 @@ class AddressdbApicontroller extends mfBaseApicontroller { } protected function findZip() { + // unofficially supporting GET and POST in v1 $get = array_merge($this->post, $this->get); + // search parameter is unofficially deprecated but still supported $search = trim($get['search']); $zip = trim($get['zip']); @@ -93,8 +97,10 @@ class AddressdbApicontroller extends mfBaseApicontroller { } protected function findStreet() { + // unofficially supporting GET and POST in v1 $get = array_merge($this->post, $this->get); + // search parameter is unofficially deprecated but still supported $search = trim($get['search']); $street = trim($get['street']); $city = trim($get['city']); @@ -129,6 +135,7 @@ class AddressdbApicontroller extends mfBaseApicontroller { } protected function find() { + // unofficially supporting GET and POST in v1 $get = array_merge($this->post, $this->get); $search_street = $this->db()->escape(trim($get['street'])); diff --git a/scripts/addressdb_update.php b/scripts/addressdb_update.php new file mode 100755 index 000000000..107fe65fc --- /dev/null +++ b/scripts/addressdb_update.php @@ -0,0 +1,295 @@ +#!/usr/bin/php +loadByExtref($netzgebiet_extref); + if(!$netzgebiet->id) { + die("Netzgebiet nicht gefunden: $netzgebiet_extref\n"); + } + //var_dump($netzgebiet);exit; + + $nutzung = trim($csv[7]); + $funktion = trim($csv[9]); + if($nutzung != "Greenfield" && $funktion == "Greenfield") { + $nutzung = "Greenfield"; + } + + if(!$strasse_hausnummer) continue; + + //echo "strasse: $strasse\n"; + //echo "strasse_building: $strasse_building\n"; + + $strasse_name = ""; + $hausnummer_name = ""; + $addresszusatz = ""; + + $m = []; + // (?:\s+((?:gesch(?:ae|ä)ft|betrieb und wohnungen|paketlogistik|cafe|pavillon|pfarrheim|[^ ]*haus|[^ ]*geb(?:ae|ä)ude|[^ ]*halle)(?:\s+[a-z0-9]+)?))? + if(preg_match('/^(\D+)\s+(\d+[a-z0-9\/&#._-]*)(?:\s+((?:gesch(?:ae|ä)ft|betrieb und wohnungen|stg|paketlogistik|cafe|pavillon|pfarrheim|[^ ]*haus|[^ ]*geb(?:ae|ä)ude|[^ ]*halle)(?:\s+[a-z0-9]+)?))?/i', $strasse_hausnummer, $m)) { + $strasse_name = trim($m[1]); + $hausnummer_name = trim($m[2]); + $addresszusatz = trim($m[3]); + } elseif(preg_match('/^(.+)\s+(\d+[a-z0-9\/&#._-]*)(.+)?/i', $strasse_hausnummer, $m)) { + $strasse_name = trim($m[1]); + $hausnummer_name = trim($m[2]); + $addresszusatz = trim($m[3]); + } elseif(preg_match('/^(.+)/i', $strasse_hausnummer, $m)) { + // ignore GST objects + continue; + $strasse_name = trim($m[1]); + } + + if($strasse_name == "Dr.Karl-Renner-Weg") $strasse_name = "Dr.-Karl-Renner-Weg"; + if($strasse_name == "Bierbaumer Strasse") $strasse_name = "Bierbaumerstrasse"; + if($strasse_name == "GST") continue; + if(preg_match('/^L\d+/',$strasse_name)) continue; + + /*if($strasse_name == "Hauptstrasse 103 Geschaeft" && $hausnummer_name == "1") { + $strasse_name = "Hauptstrasse"; + $hausnummer_name = "103"; + $addresszusatz = "Geschaeft 1"; + } + + if($strasse_name == "Hauptstrasse 131 Stg") { + $strasse_name = "Hauptstrasse"; + $addresszusatz = "Stg $hausnummer_name"; + $hausnummer_name = "131"; + }*/ + + if(!$strasse_name && !$nutzung == "Greenfield") { + die("Unbekanntes Adressformat\n"); + } + } + + + + + + if(!$gem_name || !$plz_name || !$ort_name || !$strasse_name) { + die("!! Konnte Adresse nicht parsen\n"); + } + + if(!$hausnummer_extref) { + die("!!! Keine Hausnummer Extref\n"); + } + + if(!$netzgebiet_extref) { + die("!!! Keine Netzgebiet Extref\n"); + } + if($nutzung == "Greenfield") continue; + //echo "Netzgebiet extref: \033[1m$netzgebiet_extref\033[0m | Hausnummer extref: \033[1m$hausnummer_extref\033[0m | gem: \033[1m$gem_name\033[0m | plz: \033[1m$plz_name\033[0m | ort: \033[1m$ort_name\033[0m | strasse: \033[1m$strasse_name\033[0m | hausnummer: \033[1m$hausnummer_name\033[0m |"; + //echo "Zusatz: \033[1m$addresszusatz\033[0m | (\033[1m$nutzung\033[0m)\n"; + //continue; + // find address in AddressDB and update extrefs + + $strasse_name = $db->escape($strasse_name); + $hausnummer_name = $db->escape($hausnummer_name); + + $strasse_search = [$strasse_name]; + + if(strpos($strasse_name, ' ') !== false) $strasse_search[] = str_replace(' ', '-', $strasse_name); + if(strpos($strasse_name, '-') !== false) $strasse_search[] = str_replace('-', ' ', $strasse_name); + if(strpos($strasse_name, '.') !== false) $strasse_search[] = str_replace('.', '. ', $strasse_name); + if(strpos($strasse_name, '.') !== false) $strasse_search[] = str_replace('.', '.-', $strasse_name); + if(strpos($strasse_name, '. ') !== false) $strasse_search[] = str_replace('. ', '.', $strasse_name); + if(strpos($strasse_name, '. ') !== false) $strasse_search[] = str_replace('. ', '.-', $strasse_name); + if(strpos($strasse_name, '.') !== false) $strasse_search[] = str_replace('.-', '.', $strasse_name); + if(strpos($strasse_name, '.') !== false) $strasse_search[] = str_replace('.-', '. ', $strasse_name); + + foreach($strasse_search as $search) { + if(strpos($search, 'ß') !== false) $strasse_search[] = str_replace('ß', 'ss', $search); + if(strpos($search, 'ä') !== false) $strasse_search[] = str_replace('ä', 'ae', $search); + if(strpos($search, 'ö') !== false) $strasse_search[] = str_replace('ö', 'oe', $search); + if(strpos($search, 'ü') !== false) $strasse_search[] = str_replace('ü', 'ue', $search); + + if(strpos($search, 'ss') !== false) $strasse_search[] = str_replace('ss', 'ß', $search); + if(strpos($search, 'ae') !== false) $strasse_search[] = str_replace('ae', 'ä', $search); + if(strpos($search, 'oe') !== false) $strasse_search[] = str_replace('oe', 'ö', $search); + if(strpos($search, 'ue') !== false) $strasse_search[] = str_replace('ue', 'ü', $search); + } + + + $sql = "SELECT * FROM view_hausnummer WHERE gemeinde_id = 1 AND strasse IN ('". implode("', '", $strasse_search)."') AND hausnummer='$hausnummer_name'"; + /*if(preg_match('/^Tobelbader/i',$strasse_name)) { + echo "$sql\n"; + }*/ + $res = $db->query($sql); + + if(!$db->num_rows($res)) { + // adresse nicht gefunden => anlegen + + if($nutzung == "Greenfield") continue; + if(!$nutzung || $nutzung == "Transmitting station") continue; + + echo "creating $strasse_name $hausnummer_name $ort_name\n"; + + $ort_search = [$ort_name]; + + if(strpos($ort_name, 'ß') !== false) $ort_search[] = str_replace('ß', 'ss', $ort_name); + if(strpos($ort_name, 'ä') !== false) $ort_search[] = str_replace('ä', 'ae', $ort_name); + if(strpos($ort_name, 'ö') !== false) $ort_search[] = str_replace('ö', 'oe', $ort_name); + if(strpos($ort_name, 'ü') !== false) $ort_search[] = str_replace('ü', 'ue', $ort_name); + + if(strpos($ort_name, 'ss') !== false) $ort_search[] = str_replace('ss', 'ß', $ort_name); + if(strpos($ort_name, 'ae') !== false) $ort_search[] = str_replace('ae', 'ä', $ort_name); + if(strpos($ort_name, 'oe') !== false) $ort_search[] = str_replace('oe', 'ö', $ort_name); + if(strpos($ort_name, 'ue') !== false) $ort_search[] = str_replace('ue', 'ü', $ort_name); + + $ortschaft = ADBOrtschaftModel::getFirst(['name' => $ort_search]); + if(!$ortschaft->id) die("Ortschaft nicht gefunden: $ort_name\n"); + + $strasse_id = false; + + $strsql = "SELECT * FROM view_hausnummer WHERE gemeinde_id=1 AND ortschaft IN ('". implode("', '", $ort_search)."') AND strasse IN ('". implode("', '", $strasse_search)."')"; + echo "$strsql\n";exit; + $strres = $db->query($strsql); + if(!$db->num_rows($strres)) { + echo("Strasse in adressdb nicht gefunden: $strsql\n"); + + // create strasse + + $strasse_data = [ + 'ortschaft_id' => $ortschaft->id, + 'gemeinde_id' => 1, + 'name' => $strasse_name + ]; + $strasse = ADBStrasseModel::create($strasse_data); + $strasse_id = $strasse->save(); + if(!$strasse_id) die("Cannot create strasse: $strasse_name\n"); + } else { + $data = $db->fetch_object($strres); + $strasse_id = $data->strasse_id; + } + + if(!$strasse_id) { + die("keine strasse_id"); + } + + $plz = ADBPlzModel::getFirst(['plz' => $plz_name]); + if(!$plz) die("PLZ nicht gefunden: $plz_name\n"); + + $hausnummer_data = [ + 'netzgebiet_id' => $netzgebiet->id, + 'extref' => $hausnummer_extref, + 'ortschaft_id' => $ortschaft->id, + 'plz_id' => $plz->id, + 'strasse_id' => $strasse_id, + 'hausnummer' => $hausnummer_name, + 'zusatz' => $addresszusatz, + 'gps_lat' => $lat, + 'gps_long' => $long + ]; + + //var_dump($hausnummer_data);exit; + $hausnummer = ADBHausnummerModel::create($hausnummer_data); + $hausnummer_id = $hausnummer->save(); + + if(!$hausnummer_id) die("Error creating hausnummer"); + + } else { + $data = $db->fetch_object($res); + $hausnummer = new ADBHausnummer($data->hausnummer_id); + + if($hausnummer->netzgebiet_id != $netzgebiet->id) { + $hausnummer->netzgebiet_id = $netzgebiet->id; + $hausnummer->save(); + } + if($hausnummer->extref != $hausnummer_extref) { + $hausnummer->extref = $hausnummer_extref; + $hausnummer->save(); + } + $hausnummer->gps_lat = $lat; + $hausnummer->gps_long = $long; + $hausnummer->save(); + + } + + + + + $data = $db->fetch_object($res); + $csv_ort = str_replace(['ß','ä','ö','ü'], ['ss','ae','oe','ue'], $ort_name); + $db_ort = str_replace(['ß','ä','ö','ü'], ['ss','ae','oe','ue'], $data->ortschaft); + + // update ortschaft if needed + if($csv_ort != $db_ort && $nutzung != "Greenfield") { + + if($strasse_name != "Hauptstrasse" && $hausnummer_name != "133") { + + echo "Netzgebiet extref: \033[1m-------\033[0m | Hausnummer extref: \033[1m--------\033[0m | gem: \033[1m$data->gemeinde\033[0m | plz: \033[1m$data->plz\033[0m | ort: \033[1m$db_ort\033[0m | strasse: \033[1m$data->strasse\033[0m | hausnummer: \033[1m$data->hausnummer\033[0m\n"; + // find ortschaft + + /*$ortschaft = ADBOrtschaftModel::getFirst(['name' => $ort_name]); + if(!$ortschaft) { + $ort_data = []; + $ort_data['gemeinde_id'] = 1; + $ort_data['name'] = $ort_name; + $ort_data['plz'] = $plz_name; + $ortschaft = ADBOrtschaftModel::create($ort_data); + $ortschaft_id = $ortschaft->save(); + if(!$ortschaft_id) { + die("Konnte Ortschaft ($ort_name) nicht erstellen."); + } + } + + // update ortschaft in hausnummer + $hausnummer = new ADBHausnummer($data->hausnummer_id); + if(!$hausnummer->id) { + die("Hausnummer nicht gefunden für Ort update"); + } + $hausnummer->ortschaft_id = $ortschaft->id; + $hausnummer->save();*/ + } + } + + //echo "$data->ortschaft, $data->plz, $data->strasse, $data->hausnummer\n"; + + +} \ No newline at end of file