From c84b14d640f9dd8243ac6c12f13bc901a6bd649d Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Thu, 9 Jan 2025 15:11:08 +0100 Subject: [PATCH] Added script to recalculate ADB Netzgebiet unit counts --- application/ADBWohneinheit/ADBWohneinheit.php | 91 +++++++++++-------- .../recalculate-netzgebiet-unit_count.php | 30 ++++++ 2 files changed, 82 insertions(+), 39 deletions(-) create mode 100644 scripts/addressdb/recalculate-netzgebiet-unit_count.php diff --git a/application/ADBWohneinheit/ADBWohneinheit.php b/application/ADBWohneinheit/ADBWohneinheit.php index 7a1581a8b..2a74d2cf5 100644 --- a/application/ADBWohneinheit/ADBWohneinheit.php +++ b/application/ADBWohneinheit/ADBWohneinheit.php @@ -35,48 +35,61 @@ class ADBWohneinheit extends mfBaseModel { // Statuschange from Rimo statuschange AddressDB::handleRimoStatusUpdate($this->id); - // ADBWohneinheit_onSave_noAutoUnitCount can be defined if doing bulk - // operations where unit count is calculated seperately - if(!defined("ADBWohneinheit_onSave_noAutoUnitCount") || !ADBWohneinheit_onSave_noAutoUnitCount) { - $unit_count = ADBWohneinheitModel::count(['hausnummer_id' => $this->hausnummer_id]); - $hausnummer = $this->getProperty("hausnummer"); - if($hausnummer->id) { - $hausnummer->unit_count = $unit_count; - $hausnummer->save(); - } - - if($hausnummer->netzgebiet_id) { - $netzgebiet = new ADBNetzgebiet($hausnummer->netzgebiet_id); - if($netzgebiet->id) { - $unit_count = ADBWohneinheitModel::count(['netzgebiet_id' => $hausnummer->netzgebiet_id]); - if($unit_count) { - $unit_count_gda = []; - foreach(ADBHausnummerModel::search(["netzgebiet_id" => $hausnummer->netzgebiet_id]) as $hausnummer) { - $gda_egenschaft = strtolower($hausnummer->gdaeigenschaft); - if($hausnummer->rimo_type) { - $gda_egenschaft = strtolower($hausnummer->rimo_type); - } - if($gda_egenschaft && array_key_exists($gda_egenschaft, TT_ADB_GDA_TYPES)) { - $type = TT_ADB_GDA_TYPES[$gda_egenschaft]; - if(!array_key_exists($type, $unit_count_gda)) { - $unit_count_gda[$type] = 0; - } - $unit_count_gda[$type] += $hausnummer->unit_count; - } - } - foreach($unit_count_gda as $type => $count) { - $netzgebiet->{"unit_count_$type"} = $count; - } + $this->refreshUnitCount(); + } + public function refreshUnitCount() { + // ADBWohneinheit_onSave_noAutoUnitCount can be defined if doing bulk + // operations where unit count is calculated seperately + + if(!defined("ADBWohneinheit_onSave_noAutoUnitCount") || !ADBWohneinheit_onSave_noAutoUnitCount) { + $unit_count = ADBWohneinheitModel::count(['hausnummer_id' => $this->hausnummer_id]); + $hausnummer = $this->getProperty("hausnummer"); + if($hausnummer->id) { + $hausnummer->unit_count = $unit_count; + $hausnummer->save(); } - //var_dump($netzgebiet); - $netzgebiet->unit_count = $unit_count; - $netzgebiet->save(); - } + + if($hausnummer->netzgebiet_id) { + $netzgebiet = new ADBNetzgebiet($hausnummer->netzgebiet_id); + if($netzgebiet->id) { + $unit_count = ADBWohneinheitModel::count(['netzgebiet_id' => $hausnummer->netzgebiet_id]); + if($unit_count) { + $unit_count_gda = [ + "sd" => 0, + "md" => 0, + ]; + foreach(ADBHausnummerModel::search(["netzgebiet_id" => $hausnummer->netzgebiet_id]) as $hausnummer) { + $gda_egenschaft = strtolower($hausnummer->gdaeigenschaft); + if($hausnummer->rimo_type) { + $gda_egenschaft = strtolower($hausnummer->rimo_type); + } + + if(!$gda_egenschaft) { + $unit_count_gda["sd"] += $hausnummer->unit_count; + continue; + } + + if($gda_egenschaft && array_key_exists($gda_egenschaft, TT_ADB_GDA_TYPES)) { + $type = TT_ADB_GDA_TYPES[$gda_egenschaft]; + if(!array_key_exists($type, $unit_count_gda)) { + $unit_count_gda[$type] = 0; + } + $unit_count_gda[$type] += $hausnummer->unit_count; + } + } + foreach($unit_count_gda as $type => $count) { + $netzgebiet->{"unit_count_$type"} = $count; + } + + } + //var_dump($netzgebiet); + $netzgebiet->unit_count = $unit_count; + $netzgebiet->save(); + } + } + } - - } - } public function resetSaveNesting() { diff --git a/scripts/addressdb/recalculate-netzgebiet-unit_count.php b/scripts/addressdb/recalculate-netzgebiet-unit_count.php new file mode 100644 index 000000000..8e8f3490e --- /dev/null +++ b/scripts/addressdb/recalculate-netzgebiet-unit_count.php @@ -0,0 +1,30 @@ +#!/usr/bin/php +id); +define("INTERNAL_USER_USERNAME", $me->username); +define("MFBASE_BYPASS_LOGIN", true); + +foreach(ADBNetzgebietModel::getAll() as $netzgebiet) { + foreach(ADBHausnummerModel::search(["netzgebiet_id" => $netzgebiet->id]) as $hausnummer) { + if(!count($hausnummer->wohneinheiten)) continue; + + $wohneinheiten = $hausnummer->wohneinheiten; + $unit = array_shift($wohneinheiten); + $unit->save(); + + echo "Updated ".$netzgebiet->name."\n"; + break; + } +} \ No newline at end of file