diff --git a/Layout/default/AddressDB/View.php b/Layout/default/AddressDB/View.php index c173e5bfb..cb9d5638b 100644 --- a/Layout/default/AddressDB/View.php +++ b/Layout/default/AddressDB/View.php @@ -71,6 +71,24 @@ Status Text status->name?> + + Statusflags + + + + + + + + statusflags as $flag): ?> + + + + + + +
CodeText
value->value) ? "" : ""?>code?>name?>
+

Adresse

diff --git a/Layout/default/AddressDB/export.csv.php b/Layout/default/AddressDB/export.csv.php index a5a8668f1..4b6fe9cb7 100644 --- a/Layout/default/AddressDB/export.csv.php +++ b/Layout/default/AddressDB/export.csv.php @@ -10,12 +10,19 @@ if(!$no_filename) { header('Content-disposition: attachment; filename="addressdb-export-'.date('Y-m-d_H-i-s').'.csv"'); } //header('Content-disposition: attachment; filename="addressdb-export-'.date('Y-m-d_H-i-s').'.csv"'); + +$status_flags_header = []; +foreach(ADBStatusflagModel::getAll() as $sflag) { + $status_flags_header[$sflag->code] = $sflag->code; +} + ?> -AddressDB_ID;Extref;Adrcd;OAID;Status Code; Status Name;Netzgebiet_Extref;Netzgebiet;Rimo Building External ID;GKZ;Gemeinde;OKZ;Ortschaft;PLZ;SKZ;Strasse;Hausnummer;Grundstueck;GPS Breite; GPS Laenge;Rollout;Rollout_Info;Freigabe;Nutzungseinheiten;GDA-Eigenschaft;Meridian;RW;HW;Sichtbarkeit +AddressDB_ID;Extref;Adrcd;OAID;Status Code;Status Name;"";Netzgebiet_Extref;Netzgebiet;Rimo Building External ID;GKZ;Gemeinde;OKZ;Ortschaft;PLZ;SKZ;Strasse;Hausnummer;Grundstueck;GPS Breite;GPS Laenge;Rollout;Rollout_Info;Freigabe;Nutzungseinheiten;GDA-Eigenschaft;Meridian;RW;HW;Sichtbarkeit id); $netzgebiet = Layout::getMfValuecacheObject("ADBNetzgebiet", $data->netzgebiet_id); $strasse = Layout::getMfValuecacheObject("ADBStrasse", $data->strasse_id); $gemeinde = Layout::getMfValuecacheObject("ADBGemeinde",$strasse->gemeinde_id); @@ -29,8 +36,14 @@ while($data = mysqli_fetch_object($res)): $freigabe = ""; } $unit_count = $data->unit_count; + + $statusflags = []; + foreach($hausnummer->statusflags as $sflag) { + $statusflags[$sflag->code] = $sflag->value->value ? 1 : 0; + } + ?> -id?>;"extref?>";adrcd?>;"oaid?>";"code?>";"name?>";"extref?>";"name?>";"rimo_id?>";kennziffer?>;"name?>";kennziffer?>;"name?>";"plz?>";kennziffer?>;"name?>";"hausnummer?>";"grund_nr?>";gps_lat?>;gps_long?>;rollout?>;"rollout_info?>";"";;"gdaeigenschaft?>";"meridian?>";rw?>;hw?>;visibility?> +id?>;"extref?>";adrcd?>;"oaid?>";"code?>";"name?>";;"extref?>";"name?>";"rimo_id?>";kennziffer?>;"name?>";kennziffer?>;"name?>";"plz?>";kennziffer?>;"name?>";"hausnummer?>";"grund_nr?>";gps_lat?>;gps_long?>;rollout?>;"rollout_info?>";"";;"gdaeigenschaft?>";"meridian?>";rw?>;hw?>;visibility?>
+
+

+ Werden Statusflags importiert, muss die Überschrift im CSV-File vorhanden sein!
+ Statusflags können in beliebiger Reihenfolge angegeben werden, die Positionen müssen aber in Kopfzeile und Datenzeilen übereinstimmen.
+ Nur zu ändernde Statusflags müssen angeführt werden.
+ Statusflags können 1 (=gesetzt), 0 (=nicht gesetzt) oder leer sein. Ist das Feld leer, wird der Wert des Flags nicht verändert. +

+

Statusupdates importieren

" enctype="multipart/form-data"> @@ -32,7 +40,15 @@
- Format: OAID;Neuer Status Code + + Format: OAID;Neuer Status Code;[flag;...]
+ Beispiel:
+ + OAID;new_code;141;145;150;200;242
+ HJR47J;200;1;0;;; +
+
+
diff --git a/Layout/default/Preorder/export.csv.php b/Layout/default/Preorder/export.csv.php index 9e58e043b..179952c08 100644 --- a/Layout/default/Preorder/export.csv.php +++ b/Layout/default/Preorder/export.csv.php @@ -8,8 +8,14 @@ header("Content-type: text/csv"); if(!$no_filename) { header('Content-disposition: attachment; filename="preorder-export-' . date('Y-m-d_H-i-s') . '.csv"'); } + +$status_flags_header = []; +foreach(PreorderStatusflagModel::getAll() as $sflag) { + $status_flags_header[$sflag->code] = $sflag->code; +} + ?> -Kampagne;Netzgebiet ID;Netzgebiet;Extref;Bestellcode;Gutscheincodes;OAID;Bestelldatum;Bestelltyp;Status Code; Status Name;Anschlusstyp;GWR Adresscode;Meridian;RW;HW;Anschluss Strasse;Anschluss Hausnummer;Anschluss PLZ;Anschluss Ort;Anschluss Wohneinheit;GPS Breite;GPS Länge;Anzahl Anschlüsse;Kunde Firma;Kunde UID;Kunde Vorname;Kunde Nachname;Kunde Strasse;Kunde PLZ;Kunde Ort;Kunde Telefon;Kunde Email;Partner;CIF Token;Cif Url; Cif Cable Url;Addon Lehrverrohrung Grundstück;Addon Hausverkabelung;BEP festgelegt;Starterpaket erhalten;Erstellt;Letzte Bearbeitung +Kampagne;Netzgebiet ID;Netzgebiet;Extref;Bestellcode;Gutscheincodes;OAID;Bestelldatum;Bestelltyp;Status Code;Status Name;"";Anschlusstyp;GWR Adresscode;Meridian;RW;HW;Anschluss Strasse;Anschluss Hausnummer;Anschluss PLZ;Anschluss Ort;Anschluss Wohneinheit;GPS Breite;GPS Länge;Anzahl Anschlüsse;Kunde Firma;Kunde UID;Kunde Vorname;Kunde Nachname;Kunde Strasse;Kunde PLZ;Kunde Ort;Kunde Telefon;Kunde Email;Partner;CIF Token;Cif Url;Cif Cable Url;Addon Lehrverrohrung Grundstück;Addon Hausverkabelung;BEP festgelegt;Starterpaket erhalten;Erstellt;Letzte Bearbeitung partner_id); $preorder = Layout::getMfValuecacheObject("Preorder", $data->id); + $statusflags = []; + foreach($preorder->statusflags as $sflag) { + $statusflags[$sflag->code] = $sflag->value->value ? 1 : 0; + } + $discounts = []; if(is_array($preorder->discounts) && count($preorder->discounts)) { foreach($preorder->discounts as $discount) { @@ -76,7 +87,7 @@ while($data = mysqli_fetch_object($res)): if($data->uid == "string") $data->uid = ""; ?> -"name?>";"extref?>";"name?>";"extref?>";"ucode?>";"";"oaid?>";"order_date) ? date("d.m.Y",$data->order_date) : ""?>";"type,"preorder")?>";"code?>";"name?>";"connection_type,"preorder")?>";"";"meridian?>";"rw?>";"hw?>";"name?>";"hausnummer?>";"plz?>";"name?>";"";"gps_lat?>";"gps_long?>";connection_count?>;"company?>";"uid?>";"firstname?>";"lastname?>";"street?>";"zip?>";"city?>";"phone?>";"email?>";"getCompanyOrName()?>";"ciftoken?>";"cifurl?>";"cifcableurl?>";;;;;"create)?>";"edit)?>" +"name?>";"extref?>";"name?>";"extref?>";"ucode?>";"";"oaid?>";"order_date) ? date("d.m.Y",$data->order_date) : ""?>";"type,"preorder")?>";"code?>";"name?>";;"connection_type,"preorder")?>";"";"meridian?>";"rw?>";"hw?>";"name?>";"hausnummer?>";"plz?>";"name?>";"";"gps_lat?>";"gps_long?>";connection_count?>;"company?>";"uid?>";"firstname?>";"lastname?>";"street?>";"zip?>";"city?>";"phone?>";"email?>";"getCompanyOrName()?>";"ciftoken?>";"cifurl?>";"cifcableurl?>";;;;;"create)?>";"edit)?>" Status adb_hausnummer->status->code?> - adb_hausnummer->status->name?> - + + Statusflags + + + + + + + + adb_hausnummer->statusflags as $flag): ?> + + + + + + +
CodeText
value->value) ? "" : ""?>code?>name?>
+ Extref adb_hausnummer->extref?> diff --git a/application/ADBHausnummer/ADBHausnummer.php b/application/ADBHausnummer/ADBHausnummer.php index 737d5b3be..0a7314804 100644 --- a/application/ADBHausnummer/ADBHausnummer.php +++ b/application/ADBHausnummer/ADBHausnummer.php @@ -7,6 +7,7 @@ class ADBHausnummer extends mfBaseModel { private $strasse; private $plz; private $status; + private $statusflags; private $freigaben = []; private $wohneinheiten = []; @@ -173,6 +174,18 @@ class ADBHausnummer extends mfBaseModel { $this->status = new ADBStatus($this->status_id); return $this->status; } + + if($name == "statusflags") { + $flags = []; + foreach(ADBStatusflagModel::getAll() as $flag) { + $flag->hausnummer_id = $this->id; + $flags[$flag->id] = $flag; + } + if(count($flags)) { + $this->statusflags = $flags; + } + return $this->statusflags; + } $classname = ucfirst($name); $idfield = $name."_id"; diff --git a/application/ADBStatusflag/ADBStatusflag.php b/application/ADBStatusflag/ADBStatusflag.php index a849bcfeb..e79d58178 100644 --- a/application/ADBStatusflag/ADBStatusflag.php +++ b/application/ADBStatusflag/ADBStatusflag.php @@ -1,9 +1,64 @@ db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $this->table = "Statusflag"; } + + public function getProperty($name) { + if($this->$name == null) { + + if($name == "value") { + if(!$this->hausnummer_id) return null; + $value = ADBHausnummerStatusflagValueModel::getFirst(["hausnummer_id" => $this->hausnummer_id, "flag_id" => $this->id]); + if(!$value) { + $value = ADBHausnummerStatusflagValueModel::create([ + "hausnummer_id" => $this->hausnummer_id, + "flag_id" => $this->id + ]); + } + $this->value = $value; + return $this->value; + } + + if($name == "creator") { + $user = mfValuecache::singleton()->get("Worker-id-".$this->create_by); + if($user) { + $this->creator = $user; + return $this->creator; + } + $this->creator = new User($this->create_by); + if($this->creator->id) { + mfValuecache::singleton()->set("Worker-id-".$this->create_by, $this->creator); + } + return $this->creator; + } + + if($name == "editor") { + $this->editor = new User($this->edit_by); + 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; + } } \ No newline at end of file diff --git a/application/Preorder/Preorder.php b/application/Preorder/Preorder.php index d11160a09..6cc7ec723 100644 --- a/application/Preorder/Preorder.php +++ b/application/Preorder/Preorder.php @@ -50,6 +50,7 @@ class Preorder extends mfBaseModel { mfValuecache::singleton()->set("preorder-save-nesting-level-" . $this->id, $nesting_level); if($nesting_level > 1) { + $this->log->debug(__METHOD__.": (Preorder ".$this->id.") Nesting level limit reached ($nesting_level) -> aborting"); return true; } @@ -73,7 +74,10 @@ class Preorder extends mfBaseModel { $this->cascadeStatus(); // Cascade status changes down all active preorders with the same hausnummer $this->cascadeStatusToPreorders(); + } + public function resetSaveNesting() { + mfValuecache::singleton()->delete("preorder-save-nesting-level-" . $this->id); } public function createHistoryEntry() { @@ -158,7 +162,7 @@ class Preorder extends mfBaseModel { * Cascade status changes down to adb_hausnummer and adb_wohneinheit */ public function cascadeStatus() { - + $this->log->debug(__METHOD__. " entered"); /* * defines status alignments of preorder status to hausnummer (h) and wohneinheit (w) * if h or w are greater than defined here, don't change them diff --git a/application/Preorder/PreorderController.php b/application/Preorder/PreorderController.php index 9e5249f9a..d125e7263 100644 --- a/application/Preorder/PreorderController.php +++ b/application/Preorder/PreorderController.php @@ -780,12 +780,36 @@ class PreorderController extends mfBaseController { $invalidcode = 0; $nochange = 0; $saved = 0; + $flags_saved = 0; + + $statusflags = []; $filename = $file->getFullPath(); $input = fopen($filename, "r"); while($csv = fgetcsv($input, 0, ";")) { $i++; - if($i == 1 && $headline_included) continue; + + if($i == 1 && $headline_included) { + // get statusflag order in header + $col = 2; + while(array_key_exists($col, $csv) && trim($csv[$col])) { + $code = trim($csv[$col]); + if(!is_numeric($code)) { + $this->layout()->setFlash("Ungültige Überschrift für Spalte ".++$col, "error"); + $this->redirect("Preorder", "statusupdateimport"); + } + + $sflag = PreorderStatusflagModel::getFirst(["code" => $code]); + if(!$sflag) { + $this->layout()->setFlash("Statusflag mit Code $code nicht gefunden", "error"); + $this->redirect("Preorder", "statusupdateimport"); + } + $sflag->col = $col; + $statusflags[$code] = $sflag; + $col++; + } + continue; + } if(!trim($csv[0])) { continue; @@ -813,23 +837,69 @@ class PreorderController extends mfBaseController { } $preorder->status_id = $new_status->id; $preorder->save(); + $preorder->resetSaveNesting(); $saved++; } else { $nochange++; } + if(count($statusflags)) { + foreach($statusflags as $code => $origin_sflag) { + $this->log->debug(__METHOD__.": $oaid - testing flag $code for update."); + $sflag = clone($origin_sflag); + $sflag->preorder_id = $preorder->id; + + if(!$sflag->col) { + $this->layout()->setFlash("Kann Statusflagcode $code nicht zuordnen. Line $i col ".$sflag->col, "error"); + $this->redirect("Preorder", "statusupdateimport"); + } + + if(!array_key_exists($sflag->col, $csv)) { + $this->log->debug(__METHOD__.": no col."); + continue; + } + + $value = trim($csv[$sflag->col]); + if(!strlen($value)) { + $this->log->debug(__METHOD__.": no val"); + continue; + } + + if($value) { + $sflag->value->value = 1; + } else { + $sflag->value->value = 0; + } + + $this->log->debug(__METHOD__.": $oaid - saving flag value $code value: ".$sflag->value->value." ($value)"); + $sflag->value->save(); + + $flags_saved++; + //$this->log->debug(__METHOD__.": $oaid - loading preorder again"); + } + + $preorder = PreorderModel::getFirstActive(["oaid" => $oaid]); + $preorder->resetSaveNesting(); + $preorder->afterSave(); + $preorder = PreorderModel::getFirstActive(["oaid" => $oaid]); + $preorder->resetSaveNesting(); + } + } $message = "Import erfolgreich. $saved Statusupdates importiert"; + if($flags_saved) { + $message .= "
$flags_saved Statusflags upgedatet"; + } if($notfound) { $message .= "
$notfound Bestellungen nicht gefunden"; } if($forbidden) { $message .= "
$forbidden Bestellungen in falschem Netzgebiet"; } - if($nochange) { + /*if($nochange) { $message .= "
$nochange Bestelllungen haben bereits den neuen Status"; - } + }*/ if($invalidcode) { $message .= "
$invalidcode ungültige Statuscodes"; } diff --git a/lib/mvcfronk/mfValuecache/mfValuecache.php b/lib/mvcfronk/mfValuecache/mfValuecache.php index b4d4fbcc5..8f25d40ee 100644 --- a/lib/mvcfronk/mfValuecache/mfValuecache.php +++ b/lib/mvcfronk/mfValuecache/mfValuecache.php @@ -28,7 +28,11 @@ class mfValuecache { public function getCache() { return $this->cache; } - + + public function delete($key) { + unset($this->cache[$key]); + } + public function getMfObject($objectname, $id) { $object = $this->get("mfObjectmodel-$objectname-".$id); if(!$object) {