diff --git a/Layout/default/AddressDB/Index.php b/Layout/default/AddressDB/Index.php index 2bb4d1447..bf5eaf78c 100644 --- a/Layout/default/AddressDB/Index.php +++ b/Layout/default/AddressDB/Index.php @@ -6,7 +6,7 @@ if(!is_array($filter)) { $filter = []; } - + ?> @@ -191,10 +191,58 @@ + + + is("Admin")): ?> + + + + + + - + + + username == "fronk" || $me->username == "r.eschner@rmlinfrastruktur.at" || $me->username == "e.grundner@rmlinfrastruktur.at"): ?>
@@ -204,6 +252,8 @@
+ +
@@ -346,5 +396,16 @@ }); }).trigger('change'); }); + + function toggleBulkupdate() { + $("#bulk-update").toggle(); + if($("#bulk-update").is(":hidden")) { + $("#bulk-update-chevron").addClass("fa-chevron-right").removeClass("fa-chevron-down"); + $("#bulk-toggle-button").addClass("btn-outline-purple").removeClass("btn-purple"); + } else { + $("#bulk-update-chevron").addClass("fa-chevron-down").removeClass("fa-chevron-right"); + $("#bulk-toggle-button").addClass("btn-purple").removeClass("btn-outline-purple"); + } + } diff --git a/application/ADBHausnummer/ADBHausnummer.php b/application/ADBHausnummer/ADBHausnummer.php index 7a8e06811..4770c0f2a 100644 --- a/application/ADBHausnummer/ADBHausnummer.php +++ b/application/ADBHausnummer/ADBHausnummer.php @@ -57,6 +57,50 @@ class ADBHausnummer extends mfBaseModel { return true; } + private function updateAddressInRimo() { + if(!$this->rimo_id) return false; + $creds = $this->getNetownerRimoApiCredentials(); + if(!$creds) { + $this->log->warn(__METHOD__.": Keine API Credentials für Netzgebiet (Adresse {$this->id}) gefunden"); + } + + $update_data = []; + if($this->strasse_id && $this->getProperty("strasse")->name) $update_data["address"] = $this->getProperty("strasse")->name; + if($this->ortschaft_id && $this->getProperty("ort")->name) $update_data["city"] = $this->getProperty("ort")->name; + if($this->plz_id && $this->getProperty("plz")->plz) $update_data["zipCode"] = $this->getProperty("plz")->plz; + if($this->strasse_id && $this->getProperty("strasse")->gemeinde_id && $this->getProperty("strasse")->gemeinde->name) $update_data["district"] = $this->getProperty("strasse")->gemeinde->name; + + if(!count($update_data)) return true; + + if(Rimoapi::changeBuildingAddress($creds["prod"]["key"], $this->rimo_id, $update_data)) { + return true; + } + return false; + } + + public function getNetowner() { + if(!$this->netzgebiet_id) return false; + $network = NetworkModel::getFirst(["adb_netzgebiet_id" => $this->netzgebiet_id]); + $this->log->debug("[".$this->_ruid."] ".__METHOD__.": netzgebiet: ".$this->getProperty("netzgebiet")->name); + $this->log->debug("[".$this->_ruid."] ".__METHOD__.": network: ".$network->name); + if(!$network) return false; + + return $network->owner; + } + + public function getNetownerRimoApiCredentials() { + $netowner = $this->getNetowner(); + if(!$netowner) return false; + + foreach(TT_RIMO_API_CREDS as $api_creds) { + if($api_creds["address_id"] == $netowner->id) { + return $api_creds; + } + } + + return null; + } + public function refreshUnitCount() { if(!$this->id) return true; diff --git a/application/AddressDB/AddressDBController.php b/application/AddressDB/AddressDBController.php index fc5a73dfc..fc697b8a9 100644 --- a/application/AddressDB/AddressDBController.php +++ b/application/AddressDB/AddressDBController.php @@ -33,8 +33,14 @@ class AddressDBController extends mfBaseController { } $this->layout->set("filter", $filter); + + if($this->me->is("Admin") && $this->request->submitBulkUpdate) { + return $this->saveBulkupdateAction(); + } + + $filter = $this->getPreparedFilter($filter); - + // pagination defaults $pagination = []; $pagination['start'] = 0; @@ -777,6 +783,154 @@ class AddressDBController extends mfBaseController { } }*/ + protected function saveBulkupdateAction() { + if(!$this->me->is("Admin")) { + $this->redirect("AddressDB"); + } + + if(!$this->request->filter) { + $this->layout()->setFlas("Filter erforderlich!"); + $this->redirect("AddressDB"); + } + + $filter = $this->getPreparedFilter($this->request->filter); + $filter["netzgebiet_id"] = true; + + //var_dump($this->request->get(), $filter);exit; + + $update = []; + + $ort_search = trim($this->request->ort); + $gemeinde_search = trim($this->request->gemeinde); + $plz_search = trim($this->request->plz); + $strasse_search = trim($this->request->strasse); + + $do_rimo_update = $this->request->request_rimo_update; + + $i = 0; + $u = 0; + + if(ADBHausnummerModel::count($filter, true) > 1000) { + $this->layout()->setFlas("Bissi viel auf einmal"); + } + + $cache = []; + $cache["gemeinde"] = []; + $cache["ort"] = []; + $cache["plz"] = []; + $cache["strasse"] = []; + + foreach(ADBHausnummerModel::search($filter) as $hausnummer) { + $updated = false; + $netzgebiet_id = $hausnummer->netzgebiet_id; + if(!$netzgebiet_id) { + $this->layout()->setFlash("Netzgebiet nicht gefunden??", "error"); + $this->redirect("AddressDB"); + } + + $gemeinde_id = $hausnummer->strasse->gemeinde_id; + if(!$gemeinde_id) { + $this->layout()->setFlash("Strasse '{$hausnummer->strasse->name}' ({$hausnummer->strasse_id}) hat keine Gemeinde...", "error"); + $this->redirect("AddressDB"); + } + + + /*if(array_key_exists("$gemeinde_search-$netzgebiet_id", $cache["gemeinde"])) { + $gemeinde = $cache["gemeinde"]["$gemeinde_search-$netzgebiet_id"]; + } else { + $gemeinde = ADBGemeindeModel::getFirst(['name' => $gemeinde_search, 'netzgebiet_id' => $netzgebiet_id]); + $cache["gemeinde"]["$gemeinde_search-$netzgebiet_id"] = $gemeinde; + }*/ + if(array_key_exists($gemeinde_id, $cache["gemeinde"])) { + $gemeinde = $cache["gemeinde"][$gemeinde_id]; + } else { + $gemeinde = new ADBGemeinde($gemeinde_id); + } + if(!$gemeinde) { + $this->layout()->setFlash("Gemeinde $gemeinde_id nicht in AdressDB gefunden", "error"); + $this->redirect("AddressDB"); + } + + if($ort_search) { + if(array_key_exists("$ort_search-$netzgebiet_id", $cache["ort"])) { + $ort = $cache["ort"]["$ort_search-$netzgebiet_id"]; + } else { + $ort = ADBOrtschaftModel::getFirst(['name' => $ort_search, 'netzgebiet_id' => $netzgebiet_id]); + $cache["ort"]["$ort_search-$netzgebiet_id"] = $ort; + } + if(!$ort) { + $this->layout()->setFlash("Ortschaft '$ort_search' nicht in AdressDB gefunden", "error"); + $this->redirect("AddressDB"); + } + } + + if($plz_search) { + if(array_key_exists("$plz_search-$gemeinde_id", $cache["plz"])) { + $plz = $cache["plz"]["$plz_search-$gemeinde_id"]; + } else { + $plz = ADBPlzModel::getFirst(['plz' => $plz_search, 'gemeinde_id' => $gemeinde->id]); + $cache["plz"]["$plz_search-$gemeinde_id"] = $plz; + } + if(!$plz) { + $this->layout()->setFlash("PLZ '$plz_search' nicht in AdressDB gefunden", "error"); + $this->redirect("AddressDB"); + } + } + + if($strasse_search) { + if(array_key_exists("$strasse_search-$gemeinde_id", $cache["strasse"])) { + $strasse = $cache["strasse"]["$strasse_search-$gemeinde_id"]; + } else { + $strasse = ADBStrasseModel::getFirst(['name' => $strasse_search, 'gemeinde_id' => $gemeinde->id]); + $cache["strasse"]["$strasse_search-$gemeinde_id"] = $strasse; + } + if(!$strasse) { + $this->log->debug(__METHOD__ . ": create street '$strasse_search' in gemeinde {$gemeinde->name}"); + $strasse = ADBStrasseModel::create([ + 'gemeinde_id' => $gemeinde->id, + 'name' => $strasse_search + ]); + + if(!$strasse->save()) { + $this->layout()->setFlash("Fehler beim Speichern der neuen Straße", "error"); + $this->redirect("AddressDB"); + } + $cache["strasse"]["$strasse_search-$gemeinde_id"] = $strasse; + } + } + + //$hausnummer->gemeinde_id = $gemeinde->id; + if($ort_search && $hausnummer->ortschaft_id != $ort->id) { + $hausnummer->ortschaft_id = $ort->id; + $updated = true; + } + if($strasse_search && $hausnummer->strasse_id != $strasse->id) { + $hausnummer->strasse_id = $strasse->id; + $updated = true; + } + if($plz_search && $hausnummer->plz != $plz->id) { + $hausnummer->plz_id = $plz->id; + $updated = true; + } + + if($updated) { + $hausnummer->save(["no_aftersave" => true]); + if($do_rimo_update) { + $hausnummer->updateAddressInRimo(); + } + $u++; + } + + + $i++; + } + + $this->layout()->setFlash("Bulk Update erfolgreich. $u/$i Adressen updated.", "success"); + $this->redirect("AddressDB"); + + + } + protected function apiAction() { if(!$this->me->is(["Admin","netowner"]) && !$this->me->can("Preorder")) { diff --git a/lib/Rimoapi/Rimoapi.php b/lib/Rimoapi/Rimoapi.php index 922a36677..b40a22c62 100644 --- a/lib/Rimoapi/Rimoapi.php +++ b/lib/Rimoapi/Rimoapi.php @@ -2,6 +2,54 @@ class Rimoapi { + public static function changeBuildingAddress($apikey, $building_external_id, $_data) { + if(!$apikey) return false; + if(!$building_external_id) return false; + $log = mfLoghandler::singleton(); + + $update_data = []; + foreach($_data as $key => $value) { + if(!in_array($key, ["address", "city", "zipCode", "district", "country", "lotNumber", "district2"])) continue; + if($value) { + $update_data[$key] = $value; + } + } + + if(!count($update_data)) return false; + + // send request to Rimo Api + $params = []; + $params['apiKey'] = $apikey; + $params['buildingId'] = $building_external_id; + $params = array_merge($params, $update_data); + + $ctx_opts = [ + 'http' => [ + 'method' => 'PUT', + 'header' => 'accept: application/json' + ] + ]; + + $qs = http_build_query($params); + //echo $qs."\n"; + + $createOrderEp = RIMO_API_JSON_URL.RIMO_API_JSON_EP_CHANGE_BUILDING_ADDRESS; + $put_url = $createOrderEp."?".$qs; + $ctx = stream_context_create($ctx_opts); + $log->debug(__METHOD__.": Creating OAID in Rimo: $put_url"); + $response = file_get_contents($put_url, false, $ctx); + //var_dump($response);exit; + if($response === false) { + $log->error("Fehler beim Update der Adresse in RIMO ".$building_external_id); + return false; + } + + $resp_data = json_decode($response); + if(!$resp_data->id) return false; + + return true; + } + public static function getFtuData($oaid, $home_external_id) { //$oaid = $oaid; $log = mfLoghandler::singleton(); @@ -254,7 +302,7 @@ class Rimoapi { } } - var_dump($update_data); + //var_dump($update_data); if(!count($update_data)) { $log->debug(__METHOD__.": no valid update data"); return false;