Merge branch 'fronkdev' into 'master'

Added AddressDB bulk update + address update in rimo

See merge request fronk/thetool!1780
This commit is contained in:
Frank Schubert
2025-09-19 09:34:02 +00:00
4 changed files with 347 additions and 4 deletions

View File

@@ -191,10 +191,58 @@
<?php endif; ?>
</div>
</div>
</form>
<?php if($me->is("Admin")): ?>
<button type="button" class="form-control btn btn-outline-purple mt-3 text-left" id="bulk-toggle-button" onclick="toggleBulkupdate()"><i id="bulk-update-chevron" class="fas fa-fw fa-chevron-right"></i> Bulk Update</button>
<div class="card hidden" id="bulk-update">
<div class="card-body">
<h3 class="mb-4">Bulk Update</h3>
<p>Die hier eingegebenen Daten werden für alle Adressen übernommen, welche mit dem <strong>oben eingestellten Filter</strong> gefunden werden.</p>
<div class="mb-2">
<label for="street" class="form-label">Straße</label>
<input type="text" class="form-control" id="street" name="strasse">
</div>
<div class="row mb-2">
<div class="col-md-4">
<label for="zip" class="form-label">PLZ</label>
<input type="text" class="form-control" id="zip" name="plz">
</div>
<div class="col-md-8">
<label for="city" class="form-label">Ort</label>
<input type="text" class="form-control" id="city" name="ort">
</div>
</div>
<div class="mb-2">
<label for="municipality" class="form-label">Gemeinde</label>
<input type="text" class="form-control" id="gemeinde" name="gemeinde" disabled="disabled">
</div>
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="request_rimo_update" name="request_rimo_update" value="1">
<label class="form-check-label" for="request_rimo_update">
Updates an Rimo schicken
</label>
</div>
</div>
<button type="submit" name="submitBulkUpdate" value="1" class="btn btn-purple"><i class="fas fa-fw fa-highlighter"></i> Bulk Update durchführen (ca. <?=(is_array($pagination) && array_key_exists("maxItems", $pagination)) ? $pagination['maxItems'] : ""?>)</button>
</div>
</div>
<?php endif; ?>
</form>
</div>
</div>
<?php if($me->username == "fronk" || $me->username == "r.eschner@rmlinfrastruktur.at" || $me->username == "e.grundner@rmlinfrastruktur.at"): ?>
<div class="card">
<div class="card-body">
@@ -205,6 +253,8 @@
<?php endif; ?>
<div class="card">
<div class="card-body mb-3">
<div class="float-left">
@@ -268,6 +318,14 @@
<td><?=$address->rollout?></td>
<td><?=$address->rollout_info?></td>
<td style="text-align: left; letter-spacing: 4px; font-size: 1.1em;">
<?php if($me->is("Admin")): ?>
<a href="<?=self::getUrl("AddressDB", "syncAddressToRimo", ["id" => $address->id])?>" title="Adressdaten nach Rimo exportieren">
<sup><span class="" style="margin-right: -16px;"><i class="fas fa-cloud-arrow-up text-success"></i></span></sup><i class="fal fa-r"></i>
</a>
<!--a href="<?=self::getUrl("AddressDB", "syncAddressFromRimo", ["id" => $address->id])?>" title="Adressdaten von Rimo holen">
<sup><span class="" style="margin-right: -16px;"><i class="fas fa-cloud-arrow-down text-danger"></i></span></sup><i class="fal fa-r"></i>
</a-->
<?php endif; ?>
<a href="<?=self::getUrl("AddressDB", "view", ["id" => $address->id])?>"><i class="far fa-fw fa-eye" title="Adresse Anzeigen"></i></a>
<a href="<?=self::getUrl("AddressDB", "edit", ["id" => $address->id])?>" class="pl-1"><i class="far fa-fw fa-edit" title="Adresse Bearbeiten"></i></a>
<a href="<?=self::getUrl("AddressDB", "delete", ["id" => $address->id])?>" onclick="if(!confirm('Addresse und alle Wohneinheiten wirklich löschen?')) return false;"><i class="far fa-fw fa-trash-alt text-danger" title="Adresse Löschen"></i></a>
@@ -346,5 +404,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");
}
}
</script>
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>

View File

@@ -57,6 +57,50 @@ class ADBHausnummer extends mfBaseModel {
return true;
}
public 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("ortschaft")->name) $update_data["city"] = $this->getProperty("ortschaft")->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;

View File

@@ -33,6 +33,12 @@ 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
@@ -777,6 +783,180 @@ class AddressDBController extends mfBaseController {
}
}*/
protected function syncAddressToRimoAction() {
if(!$this->me->is("Admin")) {
$this->redirect("AddressDB");
}
$hausnummer_id = $this->request->id;
if(!$hausnummer_id) {
$this->layout()->setFlash("Adresse nicht gefunden", "error");
$this->redirect("AddressDB");
}
$hausnummer = new ADBHausnummer($hausnummer_id);
if(!$hausnummer->id) {
$this->layout()->setFlash("Adresse nicht gefunden", "error");
}
if(!$hausnummer->updateAddressInRimo()) {
$this->layout()->setFlash("Fehler beim updaten der Adresse in Rimo", "error");
$this->redirect("AddressDB");
}
$this->layout()->setFlash("Adresse erfolgreich nach Rimo synchronisiert", "success");
$this->redirect("AddressDB");
}
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()->setFlash("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_id != $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")) {

View File

@@ -2,6 +2,56 @@
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__.": Address Change in Rimo: $put_url");
$response = file_get_contents($put_url, false, $ctx);
//var_dump($response);exit;
$log->debug(__METHOD__.": response: ".print_r($response,true));
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 +304,7 @@ class Rimoapi {
}
}
var_dump($update_data);
//var_dump($update_data);
if(!count($update_data)) {
$log->debug(__METHOD__.": no valid update data");
return false;