From 6dfc4a31c64470e47a45e72e7a2ec10bb1190413 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Wed, 10 Sep 2025 17:38:53 +0200 Subject: [PATCH] PreorderstatusJournal & preorder flags -> ADBHausnummer flags sync --- Layout/default/Preorder/Index.php | 86 ++++++-- .../Preorder/include/preorder-detail.php | 26 ++- application/ADBHausnummer/ADBHausnummer.php | 17 ++ application/ADBWohneinheit/ADBWohneinheit.php | 22 +- application/AddressDB/AddressDB.php | 14 +- application/Api/v1/Modules/Preorder/Cif.php | 7 + application/Preorder/Preorder.php | 67 +++--- application/Preorder/PreorderController.php | 70 ++++-- .../PreorderStatusflagValue.php | 3 +- .../PreorderstatusJournal.php | 203 ++++++++++++++++++ .../20250910114337_preorderstatus_journal.php | 36 ++++ 11 files changed, 486 insertions(+), 65 deletions(-) create mode 100644 application/PreorderstatusJournal/PreorderstatusJournal.php create mode 100644 db/migrations/20250910114337_preorderstatus_journal.php diff --git a/Layout/default/Preorder/Index.php b/Layout/default/Preorder/Index.php index 331b3c390..8f7a09285 100644 --- a/Layout/default/Preorder/Index.php +++ b/Layout/default/Preorder/Index.php @@ -654,12 +654,6 @@ $pagination_entity_name = "Vorbestellungen"; - + +
+
+

Journal

+
+
+ Neuer Journaleintrag: +
+ +
+ +
+
+ + statusjournals) as $journal): ?> + + + + + +
create)?> (creator->name)?>)text)?>
+
+

Statusflags

@@ -748,9 +771,10 @@ id, $preorder->statusflags) && $preorder->statusflags[$flag->id]->value && $preorder->statusflags[$flag->id]->value->value) ? "checked='checked'" : ""?> /> diff --git a/application/ADBHausnummer/ADBHausnummer.php b/application/ADBHausnummer/ADBHausnummer.php index 2390f8691..7a8e06811 100644 --- a/application/ADBHausnummer/ADBHausnummer.php +++ b/application/ADBHausnummer/ADBHausnummer.php @@ -145,6 +145,23 @@ class ADBHausnummer extends mfBaseModel { return true; } + + public function setStatusflag($code, $value) { + if(!$code || !$this->id) return false; + + $this->log->debug("[".$this->_ruid."] ".__METHOD__." (Hausnummer $this->id) Setting $code to $value"); + + $sflag = ADBStatusflagModel::getFirst(["code" => $code]); + $sflag->hausnummer_id = $this->id; + + $sflag->value->value = $value ? 1 : 0; + $sflag->value->save(); + + //$this->log->ebug(print_r($sflag, true)); + //$this->log->ebug(print_r($sflag->value, true)); + + return true; + } private function getGpsCoords() { $search = [ diff --git a/application/ADBWohneinheit/ADBWohneinheit.php b/application/ADBWohneinheit/ADBWohneinheit.php index 491dde332..cd9dd2959 100644 --- a/application/ADBWohneinheit/ADBWohneinheit.php +++ b/application/ADBWohneinheit/ADBWohneinheit.php @@ -74,6 +74,7 @@ class ADBWohneinheit extends mfBaseModel { if($hausnummer->netzgebiet_id) { $netzgebiet = new ADBNetzgebiet($hausnummer->netzgebiet_id); if($netzgebiet->id) { + $usable_unit_count = 0; $unit_count = ADBWohneinheitModel::count(['netzgebiet_id' => $hausnummer->netzgebiet_id]); if($unit_count) { $unit_count_gda = [ @@ -101,13 +102,15 @@ class ADBWohneinheit extends mfBaseModel { $unit_count_gda[$type] += $hausnummer->unit_count; } } + foreach($unit_count_gda as $type => $count) { + $usable_unit_count += $count; $netzgebiet->{"unit_count_$type"} = $count; } } //var_dump($netzgebiet); - $netzgebiet->unit_count = $unit_count; + $netzgebiet->unit_count = $usable_unit_count; $netzgebiet->save(); } } @@ -164,6 +167,23 @@ class ADBWohneinheit extends mfBaseModel { return true; } + + public function setStatusflag($code, $value) { + if(!$code || !$this->id) return false; + + $this->log->debug("[".$this->_ruid."] ".__METHOD__." (Wohneinheit $this->id) Setting $code to $value"); + + $sflag = ADBStatusflagModel::getFirst(["code" => $code]); + $sflag->wohneinheit_id = $this->id; + + $sflag->value->value = $value ? 1 : 0; + $sflag->value->save(); + + $this->log->ebug(print_r($sflag, true)); + $this->log->ebug(print_r($sflag->value, true)); + + return true; + } public static function parseHausnummerZusatz($text) { diff --git a/application/AddressDB/AddressDB.php b/application/AddressDB/AddressDB.php index 339d0f5a8..36348001a 100644 --- a/application/AddressDB/AddressDB.php +++ b/application/AddressDB/AddressDB.php @@ -223,7 +223,9 @@ class AddressDB { // seems all criteria match => set new status $log->debug(__METHOD__.": new Preorder Status: ".$matrix["p"]); - $log->debug(__METHOD__.": new Preorder Status flag: ".$matrix["pf"]); + if(array_key_exists("pf", $matrix)) { + $log->debug(__METHOD__ . ": new Preorder Status flag: " . $matrix["pf"]); + } $preorder = PreorderModel::getFirstActive(["adb_wohneinheit_id" => $wohneinheit->id]); @@ -245,8 +247,16 @@ class AddressDB { $preorder->resetSaveNesting(); } if($preorderstatus_flag) { + $psflag = PreorderStatusflagModel::getFirst(["code" => $preorderstatus_flag]); $log->debug(__METHOD__.": Setting Preorder Status Flag ".$preorderstatus_flag); - $preorder->setStatusFlag($preorderstatus_flag); + if(array_key_exists($psflag->id, $preorder->statusflags)) { + if(!$preorder->statusflags[$psflag->id]->value->value) { + $preorder->setStatusFlag($preorderstatus_flag); + } + } else { + $preorder->setStatusFlag($preorderstatus_flag); + } + /* $sflag = PreorderStatusflagModel::getFirst(["code" => $preorderstatus_flag]); diff --git a/application/Api/v1/Modules/Preorder/Cif.php b/application/Api/v1/Modules/Preorder/Cif.php index a6cbfc75a..8e60be040 100644 --- a/application/Api/v1/Modules/Preorder/Cif.php +++ b/application/Api/v1/Modules/Preorder/Cif.php @@ -52,6 +52,13 @@ class Cif extends Modules\ApiControllerModule { $preorder->status_id = $new_status->id; $preorder->save(); } + + $sflag = \PreorderStatusflagModel::getFirst(["code" => 200]); + $sflag->preorder_id = $preorder->id; + if(!$sflag->value->value) { + $sflag->value->value = 1; + $sflag->value->save(); + } return \mfResponse::Ok(["message" => "Status successfully updated."]); diff --git a/application/Preorder/Preorder.php b/application/Preorder/Preorder.php index 87942b1be..9471d498d 100644 --- a/application/Preorder/Preorder.php +++ b/application/Preorder/Preorder.php @@ -23,6 +23,7 @@ class Preorder extends mfBaseModel { private $history; private $citycomoan; // ONT data private $ctags; // network-keyed array of Ctags + private $statusjournals; protected function beforeUpdate($data) { if(!array_key_exists("edit_by", $data)) { @@ -532,8 +533,8 @@ class Preorder extends mfBaseModel { if(is_array($flags) && count($flags)) { foreach($flags as $flag) { - if(strlen($flag->value->value) && array_key_exists($flag->code, TT_PREORDER_STATUS_MATRIX)) { - $flag_matrix_item = TT_PREORDER_STATUS_MATRIX[$flag->code]; + if(strlen($flag->value->value) && array_key_exists($flag->code, TT_PREORDER_STATUS_FLAG_MATRIX)) { + $flag_matrix_item = TT_PREORDER_STATUS_FLAG_MATRIX[$flag->code]; if(!$flag_matrix_item["flag"]) continue; // set hausnummer flag @@ -541,19 +542,13 @@ class Preorder extends mfBaseModel { $hflag = ADBStatusflagModel::getFirst(["code" => $flag_matrix_item["h"]]); if(!$hflag) { $this->log->warn("[".$this->_ruid."] "."Statusflag Code ".$flag->code." does not exist"); + } else { + //var_dump($hflag);exit; + $hflag->hausnummer_id = $hausnummer->id; + $hflag->value->value = $flag->value->value; + $hflag->save(); + $this->log->debug("[" . $this->_ruid . "] " . __METHOD__ . ": Hausnummer flag " . $hflag->code . " value '" . $hflag->value->value . "' gespeichert"); } - - $hflagval = ADBHausnummerStatusflagValueModel::getFirst(["hausnummer_id" => $this->adb_hausnummer_id, "flag_id" => $hflag->id]); - if(!$hflagval) { - $hflagval = ADBHausnummerStatusflagValueModel::create([ - "hausnummer_id" => $this->adb_hausnummer_id, - "flag_id" => $hflag->id, - "value" => 0 - ]); - } - $hflagval->value = $flag->value->value; - $hflagval->save(); - $this->log->debug("[".$this->_ruid."] ".__METHOD__.": Hausnummer flag ".$hflag->code." value '".$hflagval->value."' gespeichert"); } // set wohneiheit flag @@ -561,19 +556,33 @@ class Preorder extends mfBaseModel { $wflag = ADBStatusflagModel::getFirst(["code" => $flag_matrix_item["w"]]); if(!$wflag) { $this->log->warn("[".$this->_ruid."] "."Statusflag Code ".$flag->code." does not exist"); + } else { + $wflag->wohneinheit_id = $wohneinheit->id; + $wflag->value->value = $flag->value->value; + $wflag->value->save(); + $this->log->debug("[" . $this->_ruid . "] " . __METHOD__ . ": Wohneinheit flag " . $hflag->code . " value '" . $wflag->value->value . "' gespeichert"); + } + } + + if(array_key_exists("ws", $flag_matrix_item) && $flag_matrix_item["ws"] && $this->adb_wohneinheit_id) { + //echo "Setting Wohneinheit status to ".$flag_matrix_item["ws"]." from ".$this->getProperty("adb_wohneinheit")->status->code."\n"; + // set new wohneinheit status + $new_wohneinheit_status = ADBStatusModel::getFirst(["code" => $flag_matrix_item["ws"]]); + if(!$new_wohneinheit_status) { + $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": new ADBStatus code " . $flag_matrix_item["w"] . " not found!"); + return true; } - $wflagval = ADBWohneinheitStatusflagValueModel::getFirst(["wohneinheit_id" => $this->adb_wohneinheit_id, "flag_id" => $wflag->id]); - if(!$wflagval) { - $wflagval = ADBWohneinheitStatusflagValueModel::create([ - "wohneinheit_id" => $this->adb_wohneinheit_id, - "flag_id" => $wflag->id, - "value" => 0 - ]); + $wohneinheit = new ADBWohneinheit($this->adb_wohneinheit_id); + if(!$wohneinheit->id) return true; + + $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": new wohneinheit status code " . $new_wohneinheit_status->code); + // only update if current status is less than new status + if($wohneinheit->status->code < $new_wohneinheit_status->code) { + $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": Setting new wohneinheit status code: " . $new_wohneinheit_status->code); + $wohneinheit->status_id = $new_wohneinheit_status->id; + $wohneinheit->save(); } - $wflagval->value = $flag->value->value; - $wflagval->save(); - $this->log->debug("[".$this->_ruid."] ".__METHOD__.": Wohneinheit flag ".$hflag->code." gespeichert"); } } @@ -1554,6 +1563,16 @@ class Preorder extends mfBaseModel { return $this->attribute; } + if($name == "statusjournals") { + $journals = PreorderstatusJournal::search(["preorder_id" => $this->id]); + if($journals) { + $this->statusjournals = $journals; + return $this->statusjournals; + } + return []; + + } + if($name == "creator") { $user = mfValuecache::singleton()->get("Worker-id-" . $this->create_by); if($user) { diff --git a/application/Preorder/PreorderController.php b/application/Preorder/PreorderController.php index 442bfbf92..e9f470219 100644 --- a/application/Preorder/PreorderController.php +++ b/application/Preorder/PreorderController.php @@ -1087,6 +1087,9 @@ class PreorderController extends mfBaseController { case "updateBilled": $return = $this->updateBilledApi(); break; + case "saveStatusJournal": + $return = $this->saveStatusJournalApi(); + break; default: $return = false; } @@ -1105,6 +1108,35 @@ class PreorderController extends mfBaseController { } } + protected function saveStatusJournalApi() { + $preorder_id = $this->request->preorder_id; + $text = $this->request->text; + + if(!$preorder_id || !$text) { + return false; + } + + $preorder = new Preorder($preorder_id); + if(!$preorder->id) { + return false; + } + + $journal = PreorderstatusJournal::create([ + "preorder_id" => $preorder_id, + "text" => $text, + ]); + if(!$journal->save()) { + return false; + } + + return [ + "preorder_id" => $preorder_id, + "create" => (new DateTime("@".$journal->create))->setTimezone(new DateTimeZone("Europe/Vienna"))->format("Y-m-d H:i:s"), + "creator" => $journal->creator->name, + "text" => $journal->text, + ]; + + } protected function getLoggedEmail() { $preorder_id = $this->request->pid; $emaillog_id = $this->request->eid; @@ -1328,25 +1360,24 @@ class PreorderController extends mfBaseController { private function setStatusFlagApi() { $preorder_id = $this->request->preorder_id; - $flag_id = $this->request->flag_id; + $code = $this->request->code; $value = $this->request->value; - if(!$preorder_id || !$flag_id) { + if(!$preorder_id || !$code) { return false; } - $flag = new PreorderStatusflag($flag_id); - if(!$flag->id) { + $preorder = new Preorder($preorder_id); + if(!$preorder->id) return false; + + $sflag = PreorderStatusflagModel::getFirst(["code" => $code]); + if(!$sflag) { return false; } + $sflag->preorder_id = $preorder->id; - if ($flag_id == 1) { - $preorder = new Preorder($preorder_id); - if(!$preorder->id) { - return false; - } - - $attribute = "inhouse_cabling_supplied"; + if ($code == 145) { + $attribute = "inhouse_cabling_supplied"; // = Starterpaket erhalten $attribs = $preorder->attribute; if(!$attribs) { $attribs = []; @@ -1361,24 +1392,21 @@ class PreorderController extends mfBaseController { } } - $flagvalue = PreorderStatusflagValueModel::getFirst(["preorder_id" => $preorder_id, "flag_id" => $flag_id]); - if(!$flagvalue) { - $flagvalue = PreorderStatusflagValueModel::create([ - "preorder_id" => $preorder_id, - "flag_id" => $flag_id - ]); - } - - $flagvalue->value = ($value) ? 1 : 0; + $sflag->value->value = ($value) ? 1 : 0; //var_dump($flagvalue);exit; try { - if(!$flagvalue->save()) { + if(!$sflag->value->save()) { return false; } } catch(Exception $e) { $this->log->debug($e->getTraceAsString()); } + $this->log->debug("===== Setting Hausnummer Flag Value $code -> ".($value ? 1 : 0)); + if($preorder->adb_hausnummer_id) { + $preorder->adb_hausnummer->setStatusflag($code, ($value ? 1 : 0)); + } + return ["message" => "Statusflag saved successfully"]; } diff --git a/application/PreorderStatusflagValue/PreorderStatusflagValue.php b/application/PreorderStatusflagValue/PreorderStatusflagValue.php index a1a11b7ef..f4c77e1c1 100644 --- a/application/PreorderStatusflagValue/PreorderStatusflagValue.php +++ b/application/PreorderStatusflagValue/PreorderStatusflagValue.php @@ -13,8 +13,9 @@ class PreorderStatusflagValue extends mfBaseModel { ]); $history->save(); - $this->getProperty("preorder")->afterSave(); + } + $this->getProperty("preorder")->afterSave(); } public function getProperty($name) { diff --git a/application/PreorderstatusJournal/PreorderstatusJournal.php b/application/PreorderstatusJournal/PreorderstatusJournal.php new file mode 100644 index 000000000..ed6d22504 --- /dev/null +++ b/application/PreorderstatusJournal/PreorderstatusJournal.php @@ -0,0 +1,203 @@ +$name == null) { + + + if($name == "creator") { + $creator = mfValuecache::singleton()->get("Worker-id-".$this->create_by); + if($creator) { + $this->creator = $creator; + return $this->creator; + } + $this->creator = new User($this->create_by); + + if(!$this->creator->id) { + return null; + } + mfValuecache::singleton()->set("Worker-id-".$this->create_by, $this->creator); + return $this->creator; + } + + if($name == "editor") { + $editor = mfValuecache::singleton()->get("Worker-id-".$this->edit_by); + if($editor) { + $this->editor = $editor; + return $this->editor; + } + $this->editor = new User($this->edit_by); + if(!$this->editor->id) { + return null; + } + mfValuecache::singleton()->set("Worker-id-".$this->edit_by, $this->editor); + return $this->editor; + } + + $classname = ucfirst($name); + $idfield = $name . "_id"; + $this->$name = mfValuecache::singleton()->get("mfObjectmodel-$name-" . $this->$idfield); + if(!$this->$name) { + $this->$name = new $classname($this->$idfield); + } + + if($this->$name->id) { + mfValuecache::singleton()->set("mfObjectmodel-$name-" . $this->$name->id, $this->$name); + return $this->$name; + } else { + return null; + } + } + + return $this->$name; + + } + + /******************************** + * Begin static Model functions + */ + + public static function create(Array $data) { + $model = new PreorderstatusJournal(); + + $table_fields = [ + "preorder_id", "text", + "create_by","edit_by","create","edit" + ]; + + foreach($data as $field => $value) { + if(in_array($field, $table_fields)) { + $model->$field = $value; + } + } + + $me = new User(); + $me->loadMe(); + + if($model->create_by === null) { + $model->create_by = $me->id; + } + if($model->edit_by === null) { + $model->edit_by = $me->id; + } + + return $model; + } + + public static function getAll() { + $items = []; + + $db = FronkDB::singleton(); + + $res = $db->select("PreorderstatusJournal", "*", "1 = 1 ORDER BY `create`"); + if($db->num_rows($res)) { + while($data = $db->fetch_object($res)) { + $items[] = new PreorderstatusJournal($data); + } + } + return $items; + + } + + public static function getFirst($filter) { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $sql = "SELECT * FROM PreorderstatusJournal + WHERE $where + ORDER BY `create` LIMIT 1"; + //var_dump($sql);exit; + mfLoghandler::singleton()->debug($sql); + $res = $db->query($sql); + if($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new PreorderstatusJournal($data); + if($item->id) { + return $item; + } else { + return null; + } + } + return null; + } + + public static function count($filter) { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $sql = "SELECT COUNT(*) as cnt FROM PreorderstatusJournal + WHERE $where"; + + //mfLoghandler::singleton()->debug($sql); + + $res = $db->query($sql); + if($db->num_rows($res)) { + $data = $db->fetch_object($res); + return $data->cnt; + } + return 0; + } + + public static function search($filter, $limit = false, $order = false) { + //var_dump($filter);exit; + $items = []; + + if(!$order) { + $order = "`create` ASC"; + } + + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $sql = "SELECT * FROM PreorderstatusJournal + WHERE $where + ORDER BY $order"; + + if(is_array($limit) && count($limit)) { + if(is_numeric($limit['start']) && is_numeric($limit['count'])) { + $sql .= " LIMIT ".$limit['start'].", ".$limit['count']; + } elseif(is_numeric($limit['count'])) { + $sql .= " LIMIT ".$limit['count']; + } + } + + mfLoghandler::singleton()->debug($sql); + + $res = $db->query($sql); + if($db->num_rows($res)) { + while($data = $db->fetch_object($res)) { + $items[$data->id] = new PreorderstatusJournal($data); + } + } + + return $items; + } + + private static function getSqlFilter($filter) { + $where = "1=1 "; + + if(array_key_exists("preorder_id", $filter)) { + $preorder_id = $filter['preorder_id']; + if(is_numeric($preorder_id)) { + $where .= " AND PreorderstatusJournal.preorder_id=$preorder_id"; + } + } + + + if(array_key_exists("add-where", $filter)) { + $where .= " ".$filter['add-where']; + } + + //var_dump($filter, $where);exit; + return $where; + } + +} \ No newline at end of file diff --git a/db/migrations/20250910114337_preorderstatus_journal.php b/db/migrations/20250910114337_preorderstatus_journal.php new file mode 100644 index 000000000..74cb72a1d --- /dev/null +++ b/db/migrations/20250910114337_preorderstatus_journal.php @@ -0,0 +1,36 @@ +getEnvironment() == "thetool") { + $table = $this->table("PreorderstatusJournal"); + $table->addColumn("preorder_id", "integer", ["null" => false]); + $table->addColumn("text", "text", ["null" => false]); + $table->addColumn("create_by", "integer", ["null" => false]); + $table->addColumn("edit_by", "integer", ["null" => false]); + $table->addColumn("create", "integer", ["null" => false]); + $table->addColumn("edit", "integer", ["null" => false]); + $table->create(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } + + public function down(): void + { + if($this->getEnvironment() == "thetool") { + $this->table("PreorderstatusJournal")->drop()->save(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } +}