From 9390f12c451a2e5540398bf6b40d1fdc531f1158 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Mon, 8 Jan 2024 21:29:32 +0100 Subject: [PATCH] Added new Rimo import script(s) --- .../ADBHausnummer/ADBHausnummerModel.php | 6 + application/ADBStrasse/ADBStrasseModel.php | 2 - ...0108200100_hausnummer_add_index_rimoid.php | 31 ++ .../Network/Network-60670-1-prem-sued.php | 32 ++ .../ADBAddressHelper/address_helper.php | 278 ++++++++++++++++++ scripts/adb-rimo-import/rimo-import-test.php | 127 ++++---- 6 files changed, 421 insertions(+), 55 deletions(-) create mode 100644 db/migrations/20240108200100_hausnummer_add_index_rimoid.php create mode 100644 scripts/adb-rimo-import/ADBAddressHelper/Network/Network-60670-1-prem-sued.php create mode 100644 scripts/adb-rimo-import/ADBAddressHelper/address_helper.php diff --git a/application/ADBHausnummer/ADBHausnummerModel.php b/application/ADBHausnummer/ADBHausnummerModel.php index c6afd930c..819a3cfaf 100644 --- a/application/ADBHausnummer/ADBHausnummerModel.php +++ b/application/ADBHausnummer/ADBHausnummerModel.php @@ -209,6 +209,12 @@ class ADBHausnummerModel { } } + if(array_key_exists("rimo_id", $filter)) { + $rimo_id = FronkDB::singleton()->escape($filter['rimo_id']); + if($rimo_id) { + $where .= " AND Hausnummer.rimo_id = '$rimo_id'"; + } + } if(array_key_exists("plz", $filter)) { $plz = FronkDB::singleton()->escape($filter['plz']); diff --git a/application/ADBStrasse/ADBStrasseModel.php b/application/ADBStrasse/ADBStrasseModel.php index 4a51a0fde..ff32fec7d 100644 --- a/application/ADBStrasse/ADBStrasseModel.php +++ b/application/ADBStrasse/ADBStrasseModel.php @@ -6,8 +6,6 @@ class ADBStrasseModel { public $kennziffer; public $name; - public $create_by = null; - public $edit_by = null; public $create = null; public $edit = null; diff --git a/db/migrations/20240108200100_hausnummer_add_index_rimoid.php b/db/migrations/20240108200100_hausnummer_add_index_rimoid.php new file mode 100644 index 000000000..066e86b55 --- /dev/null +++ b/db/migrations/20240108200100_hausnummer_add_index_rimoid.php @@ -0,0 +1,31 @@ +getEnvironment() == "thetool") { + + } + + if($this->getEnvironment() == "addressdb") { + $table = $this->table("Hausnummer"); + $table->addIndex("rimo_id", ["limit" => 18]); + $table->update(); + } + } + + public function down(): void + { + if($this->getEnvironment() == "thetool") { + + } + + if($this->getEnvironment() == "addressdb") { + + } + } +} diff --git a/scripts/adb-rimo-import/ADBAddressHelper/Network/Network-60670-1-prem-sued.php b/scripts/adb-rimo-import/ADBAddressHelper/Network/Network-60670-1-prem-sued.php new file mode 100644 index 000000000..684904748 --- /dev/null +++ b/scripts/adb-rimo-import/ADBAddressHelper/Network/Network-60670-1-prem-sued.php @@ -0,0 +1,32 @@ +$type = $dependencies[$type]; + } + } + + // load network helper + if($this->netzgebiet && $this->netzgebiet->extref) { + // get netzgebiet extref and make classname + $network_extref = $this->netzgebiet->extref; + $network_id = preg_replace('/[^a-zA-Z0-9]/', '_', $network_extref); + $network_helper_name = "ADBRimoImport\\ADBAddressHelper\\Network\\Network_$network_id"; + + // find network helper class + $network_helper_dir = __DIR__."/Network"; + $network_helper_filename = "Network-$network_extref"; + + $dir = opendir($network_helper_dir); + while($filename = readdir($dir)) { + if(preg_match('/^'.$network_helper_filename.'-/', $filename)) { + require_once($network_helper_dir."/$filename"); + } + } + + $network_helper = new $network_helper_name(); + $this->NetworkHelper = $network_helper; + } else { + die("Netzgebiet hat keine extref (".$this->netzgebiet->id.": ".$this->netzgebiet->name.")"); + } + + } + + + public function splitStreetHausnummer($strasse_hausnummer) { + $strasse_name = ""; + $hausnummer_name = ""; + $addresszusatz = ""; + + $m = []; + if(preg_match('/^(\D+)\s+(\d+[a-z0-9\/&#._-]*)(?:\s+((?:gesch(?:ae|ä)ft|werkstatt|betrieb und wohnungen|stg|paketlogistik|cafe|pavillon|pfarrheim|[^ ]*haus|[^ ]*geb(?:ae|ä)ude|[^ ]*halle|[^ ]*schule|Öhlmühle)(?:\s+[a-z0-9]+)?))?/i', $strasse_hausnummer, $m)) { + $strasse_name = trim($m[1]); + $hausnummer_name = trim($m[2]); + if(array_key_exists(3, $m)) { + $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]); + if(array_key_exists(3, $m)) { + $addresszusatz = trim($m[3]); + } + } elseif(preg_match('/^(.+)/i', $strasse_hausnummer, $m)) { + // ignore GST objects + return false; + $strasse_name = trim($m[1]); + } + + return [$strasse_name, $hausnummer_name, $addresszusatz]; + } + + public function findAddressFromRimoBuilding($building) { + $hausnummer = false; + + echo "===================================\n"; + + $rimo_id = trim($building->id); + + if(!$rimo_id) { + return false; + } + + $name = trim($building->name); + + $strasse_hausnummer = trim($building->address->name); + [$strasse_name, $hausnummer_name, $addresszusatz] = $this->splitStreetHausnummer($strasse_hausnummer); + $strasse_name = $this->db->escape($strasse_name); + $hausnummer_name = $this->db->escape($hausnummer_name); + $addresszusatz = $this->db->escape($addresszusatz); + + $gem_kz = $this->db->escape(trim($building->municipality->name)); + $gem_name = $this->db->escape(trim($building->municipality->userLabel)); + + $ort_name = $this->db->escape(trim($building->address->city)); + $plz_name = $this->db->escape(trim($building->address->zipCode)); + + $lat = $building->address->latitude; + $long = $building->address->longitude; + $unit_count = $building->homesCount; + $lot_num = $building->address->lotNumber; + $fcp_name = false; + + $addr_dbg_str = "strasse: $strasse_name | hausnummer: $hausnummer_name | zusatz: $addresszusatz | gemkz: $gem_kz | gem_name: $gem_name | ort_name: $ort_name | plz_name: $plz_name"; + echo "$addr_dbg_str\n"; + + // pass variables by ref, so they can be manipulated directly + $this->NetworkHelper->checkAddress([ + "strasse_name" => &$strasse_name, + "hausnummer_name" => &$hausnummer_name, + "addresszusatz" => &$addresszusatz, + "gem_kz" => &$gem_kz, + "gem_name" => &$gem_name, + "ort_name" => &$ort_name, + "plz_name" => &$plz_name + ]); + + + $gemeinde = \ADBGemeindeModel::getFirst(["kennziffer" => $gem_kz]); + if(!$gemeinde) { + $this->log->warning("[WW] ($addr_dbg_str) Gemeinde nicht gefunden"); + echo "Gemeinde $gem_name $gem_kz nicht gefunden\n"; + return false; + } + $gemeinde_id = $gemeinde->id; + + $adrcd = false; + $adr = trim($building->foreignId2); + $adr_parts = explode("-", $adr); + if(count($adr_parts)) { + $adrcd = $adr_parts[0]; + } + + $hausnummer = \ADBHausnummerModel::getFirst(["rimo_id" => $rimo_id]); + + if($hausnummer) { + echo "found hausnummer from rimo_id $rimo_id\n"; + } + + if($adrcd && !$hausnummer) { + // get Hausnummer to update + $hausnummer = \ADBHausnummerModel::getFirst(['adrcd' => $adrcd]); + if(!$hausnummer) { + //echo "Hausnummer adrcd $adrcd not found\n"; + } else { + echo "found hausnummer from adrcd $adrcd\n"; + //echo "Hausnummer adrcd $adrcd gefunden!\n"; + } + } + + if(!$hausnummer) { + $hausnummer = $this->findHausnummerByStreet($strasse_name, $hausnummer_name, $gemeinde_id); + if(!$hausnummer) { + // hausnummer anlegen + + $strasse = \ADBStrasseModel::getFirst(["gemeinde_id" => $gemeinde_id, "name" => $strasse_name]); + //if(!$strasse) die("Strasse $strasse_name (gemeinde_id $gemeinde_id; gem_kz $gem_kz) nicht gefunden\n"); + if(!$strasse) { + $strasse = $this->createStreet($gemeinde_id, $strasse_name); + echo "[EE] Konnte Strasse $strasse_name in Gemeinde $gemeinde_id nicht anlegen\n"; + if(!$strasse) return false; + } + + $plz = \ADBPlzModel::getFirst(["gemeinde_id" => $gemeinde_id, "plz" => $plz_name]); + if(!$plz) die("PLZ $plz_name nicht gefunden\n"); + + $ortschaft = \ADBOrtschaftModel::getFirst(["gemeinde_id" => $gemeinde_id, "name" => $ort_name]); + if(!$ortschaft) die("$strasse_hausnummer: ortschaft $ort_name nicht gefunden\n"); + + $hausnummer_data = [ + "netzgebiet_id" => $this->netzgebiet->id, + "adrcd" => ($adrcd) ? $adrcd : null, + "extref" => $name, + "ortschaft_id" => $ortschaft->id, + "plz_id" => $plz->id, + "strasse_id" => $strasse->id, + "hausnummer" => $hausnummer_name, + "zusatz" => ($addresszusatz) ? $addresszusatz : null, + "grund_nr" => ($lot_num) ? $lot_num : null, + "gps_lat" => $lat, + "gps_long" => $long, + "unit_count" => ($unit_count) ? $unit_count : 1, + "freigabe" => $this->netzgebiet->default_freigabe, + "rimo_id" => $rimo_id, + "rimo_fcp_name" => ($fcp_name) ? $fcp_name : null + ]; + $hausnummer = \ADBHausnummerModel::create($hausnummer_data); + //var_dump($hausnummer);exit; + //echo "----------------------\ncreating hausnummer:\n"; + //print_r($hausnummer); + $hausnummer->save(); + } + } + + // update hausnummer + if($hausnummer->netzgebiet_id != $this->netzgebiet->id) { + $hausnummer->netzgebiet_id = $this->netzgebiet->id; + //$hausnummer->save(); + } + if($hausnummer->extref != $this->netzgebiet->extref) { + $hausnummer->extref = $this->netzgebiet->extref; + //$hausnummer->save(); + } + if($lat && $long) { + $hausnummer->gps_lat = (float)$lat; + $hausnummer->gps_long = (float)$long; + } + if($rimo_id) $hausnummer->rimo_id = $rimo_id; + if($fcp_name) $hausnummer->rimo_fcp_name = $fcp_name; + //$hausnummer->freigabe = $this->netzgebiet->default_freigabe; + $hausnummer->save(); + //echo ">>>>>>>>>>>>>>>>>>>\nupdating hausnummer:"; + //print_r($hausnummer);exit; + return $hausnummer; + + } + + + public function findHausnummerByStreet($strasse_name, $hausnummer_name, $gemeinde_id) { + $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 = $gemeinde_id AND strasse IN ('". implode("', '", $strasse_search)."') AND hausnummer='$hausnummer_name'"; + //echo "$sql\n"; + /*if(preg_match('/^Tobelbader/i',$strasse_name)) { + echo "$sql\n"; + }*/ + $res = $this->db->query($sql); + + if($this->db->num_rows($res)) { + // get Hausnummer to update + //echo "Hausnummer per Suche gefunden\n"; + $data = $this->db->fetch_object($res); + return new \ADBHausnummer($data->hausnummer_id); + } + return false; + } + + private function createStreet($gemeinde_id, $strasse_name) { + if(!$gemeinde_id || !$strasse_name) return null; + + $strasse = \ADBStrasseModel::create([ + "gemeinde_id" => $gemeinde_id, + "name" => $strasse_name + ]); + + if(!$strasse->save()) { + return null; + } + return $strasse; + + } + + public function createHausnummer($hausnummer_data = []) { + $hausnummer = \ADBHausnummerModel::create($hausnummer_data); + //var_dump($hausnummer);exit; + return $hausnummer->save(); + } +} \ No newline at end of file diff --git a/scripts/adb-rimo-import/rimo-import-test.php b/scripts/adb-rimo-import/rimo-import-test.php index a4d3a5e9d..47d0f032f 100755 --- a/scripts/adb-rimo-import/rimo-import-test.php +++ b/scripts/adb-rimo-import/rimo-import-test.php @@ -1,8 +1,12 @@ #!/usr/bin/php id); define("INTERNAL_USER_USERNAME", $me->username); -$mainlog = mfLoghandler::singleton(); -$log = new mfLog_File(); +$mainlog = \mfLoghandler::singleton(); +$log = new \mfLog_File(); $log->init(BASEDIR."/var/log/rimo-import.log"); $apiOwner = "estmk"; @@ -53,6 +57,9 @@ $ctxOptsGet = [ ] ]; +$adb = \FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); + + /* * Get RIMO Sales Clusters */ @@ -73,58 +80,72 @@ if($responseText === false) { $clustersResponse = json_decode($responseText); //var_dump($clustersResponse); //exit; -if(is_object($clustersResponse) && property_exists($clustersResponse, "item") && is_array($clustersResponse->item) && count($clustersResponse->item)) { - - foreach($clustersResponse->item as $cluster) { - $cluster_rimo_id = $cluster->id; - echo "$cluster_rimo_id | name: ".$cluster->name."; label: ".$cluster->userLabel."\n"; +if(!is_object($clustersResponse) || !property_exists($clustersResponse, "item") || !is_array($clustersResponse->item) || !count($clustersResponse->item)) { + die("Invalid GetClusters Response\n"); +} + +foreach($clustersResponse->item as $cluster) { + $cluster_rimo_id = $cluster->id; + echo "$cluster_rimo_id | name: ".$cluster->name."; label: ".$cluster->userLabel."\n"; + //continue; + $adb_netzgebiet = \ADBNetzgebietModel::getFirst(['rimo_id' => $cluster_rimo_id]); + if(!$adb_netzgebiet) { + echo "Kein Netzgebiet für Salescluster $cluster_rimo_id (".$cluster->name.")\n"; continue; - $adb_netzgebiet = ADBNetzgebietModel::getFirst(['rimo_id' => $cluster_rimo_id]); - if(!$adb_netzgebiet) { - echo "Kein Netzgebiet für Salescluster $cluster_rimo_id (".$cluster->name.")\n"; - continue; - } - - /* - * Get Buildings per SalesCluster - */ - $params = $baseParams; - $params["clusterId"] = $cluster_rimo_id; - $qs = http_build_query($params); - - $req_url = $epGetBuildings."?".$qs; - $req_ctx = stream_context_create($ctxOptsGet); - - echo $req_url."\n"; - $responseText = file_get_contents($req_url, false, $req_ctx); - - if($responseText === false) { - echo "Error fetching Buildings in cluster $cluster_rimo_id (".$cluster->name.")\n"; - exit; - } - - $buildingsResponse = json_decode($responseText); - - if(is_object($buildingsResponse) && property_exists($buildingsResponse, "item") && is_array($buildingsResponse->item) && count($buildingsResponse->item)) { - foreach($buildingsResponse->item as $building) { - //var_dump($building); - if($building->buildingType && $building->buildingType->userLabel != "Greenfield") { - //var_dump($building); - } else { - continue; - } - if($building->buildingType && $building->buildingType->userLabel != "Greenfield" && $building->homesCount > 0 && property_exists($building->homes, "item") && is_array($building->homes->item) && count($building->homes->item)) { - print_r($building);exit; - foreach($building->homes->item as $home) { - - //vaR_dump($home->ftus->item); - } - exit; - } - } - } } + $AddressHelper = new ADBAddressHelper\AddressHelper(["log" => $log, "db" => $adb, "netzgebiet" => $adb_netzgebiet]); + + /* + * Get Buildings per SalesCluster + */ + $params = $baseParams; + $params["clusterId"] = $cluster_rimo_id; + $qs = http_build_query($params); + + $req_url = $epGetBuildings."?".$qs; + $req_ctx = stream_context_create($ctxOptsGet); + + echo $req_url."\n"; + $responseText = file_get_contents($req_url, false, $req_ctx); + + if($responseText === false) { + echo "Error fetching Buildings in cluster $cluster_rimo_id (".$cluster->name.")\n"; + exit; + } + + $buildingsResponse = json_decode($responseText); + + if(is_object($buildingsResponse) && property_exists($buildingsResponse, "item") && is_array($buildingsResponse->item) && count($buildingsResponse->item)) { + foreach($buildingsResponse->item as $building) { + //var_dump($building); + if($building->buildingType && $building->buildingType->userLabel != "Greenfield") { + //var_dump($building); + } else { + continue; + } + // ignore buildings without units + if(!$building->plannedTU) { + continue; + } + if($building->buildingType && $building->buildingType->userLabel != "Greenfield" && $building->homesCount > 0 && property_exists($building->homes, "item") && is_array($building->homes->item) && count($building->homes->item)) { + //print_r($building);exit; + + $rimo_building_id = $building->id; + $hausnummer = $AddressHelper->findAddressFromRimoBuilding($building); + if(!$hausnummer) { + echo "Adresse nicht gefunden: $rimo_building_id\n"; + } + + /*foreach($building->homes->item as $home) { + var_dump($home->ftus->item);exit; + }*/ + //exit; + } + + } + } } + //echo $response; echo "\n"; \ No newline at end of file