From 6310e2446e6912b8e214efd7e8df30dc5a497f7c Mon Sep 17 00:00:00 2001 From: Spitzer Daniel Date: Tue, 23 Apr 2024 17:09:36 +0200 Subject: [PATCH] Faserplanung * Rohrplanung Updates * Migrations --- Layout/default/FiberPlanPipe/Detail.php | 130 ++-- Layout/default/FiberPlanPipe/Form.php | 591 +++++++++++------- Layout/default/FiberPlanPipe/Index.php | 98 +-- .../FiberPlanPipe/FiberPlanPipeController.php | 43 +- .../FiberPlanPipe/FiberPlanPipeModel.php | 50 +- .../FiberPlanPipeEndpointModel.php | 4 +- .../20240423132651_fiber_plan_pipe_drop.php | 29 + .../20240423132655_fiber_plan_pipe_create.php | 43 ++ public/img/markers/marker-dispatcher.png | Bin 0 -> 5973 bytes public/img/markers/marker-greenfield.png | Bin 0 -> 6102 bytes public/img/markers/marker-home.png | Bin 0 -> 5937 bytes public/img/markers/marker-pop.png | Bin 0 -> 6000 bytes 12 files changed, 613 insertions(+), 375 deletions(-) create mode 100644 db/migrations/20240423132651_fiber_plan_pipe_drop.php create mode 100644 db/migrations/20240423132655_fiber_plan_pipe_create.php create mode 100644 public/img/markers/marker-dispatcher.png create mode 100644 public/img/markers/marker-greenfield.png create mode 100644 public/img/markers/marker-home.png create mode 100644 public/img/markers/marker-pop.png diff --git a/Layout/default/FiberPlanPipe/Detail.php b/Layout/default/FiberPlanPipe/Detail.php index 22a8a7c29..6e19af1e5 100644 --- a/Layout/default/FiberPlanPipe/Detail.php +++ b/Layout/default/FiberPlanPipe/Detail.php @@ -37,13 +37,16 @@ foreach ($pipworkeraddresses as $pipworkeraddress): endforeach; -foreach ($networks as $network): - $Network[$network->id] = $network->name; +foreach ($fiberplanpipeendpoints as $fiberplanpipeEndpoint): + if ($fiberplanpipeEndpoint->pop_id) { + $networks[$fiberplanpipeEndpoint->pop->network->name] = $fiberplanpipeEndpoint->pop->network->name; + } else if ($fiberplanpipeEndpoint->building_id) { + $networks[$fiberplanpipeEndpoint->building->network->name] = $fiberplanpipeEndpoint->building->network->name; + } else if ($fiberplanpipeEndpoint->fiberPlanDispatcher_id) { + $networks[$fiberplanpipeEndpoint->fiberPlanDispatcher->network->name] = $fiberplanpipeEndpoint->fiberPlanDispatcher->network->name; + } endforeach; -$allNetworks[$fiberplanpipes->startpoint_network_id] = $Network[$fiberplanpipes->startpoint_network_id]; -$allNetworks[$fiberplanpipes->endpoint_network_id] = $Network[$fiberplanpipes->endpoint_network_id]; - if ($fiberplanpipes->address_id) { $responsible = $Pipeworkers[$fiberplanpipes->address_id]; } else { @@ -286,7 +289,7 @@ if ($fiberplanpipes->type == "3") { Netzgebiet (e) - + Rohrtyp @@ -361,6 +364,11 @@ if ($fiberplanpipes->type == "3") { $endpointtype = $fiberplanpipestypes[$endpoint->fiberPlanDispatcher->object_type]; $gps_lat = $endpoint->fiberPlanDispatcher->gps_lat; $gps_long = $endpoint->fiberPlanDispatcher->gps_long; + } elseif ($endpoint->building_id) { + $endpointname = $endpoint->building->street; + $endpointtype = 'Building'; + $gps_lat = $endpoint->building->gps_lat; + $gps_long = $endpoint->building->gps_long; } $coordinates = ""; if ($gps_lat) { @@ -391,13 +399,12 @@ if ($fiberplanpipes->type == "3") { $gps_lat, - "gps_long" => $gps_long, - "name" => $endpointname, - ); - } + $markers[] = array( + "gps_lat" => $gps_lat, + "gps_long" => $gps_long, + "name" => $endpointname, + "type" => $endpointtype + ); ?> type == "3") { $_GET["returnto"]]) ?>"> -
+
- -
- -
- -
-
- -
-
-
- -
- -
-
-
"> - -
- -
-
-
type) ? "display:none" : "" ?>"> - -
- +
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+
"> + +
+ +
+
+
type) ? "display:none" : "" ?>"> + +
+ +
+
+
+ +
+ +
+
+ +
+ - +
+ +
+ +
+
+ +
+
- - -
-
-
- -
- -
-
- -
- -
-
- -
- -
-
-
- -
- -
-
"> - -
-
- +
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
"> + +
+
+ -
+
-
-
- -
+
+
+ +
+
+
+ +
+
+
+
+
+
+

Legende:

+
+
+
+
+
+
+
+
+
-
@@ -250,7 +328,6 @@ if (isset($_GET['returnto']) && $_GET['returnto'] == "fiberplanpipe-detail") {
- @@ -259,13 +336,26 @@ if (isset($_GET['returnto']) && $_GET['returnto'] == "fiberplanpipe-detail") { diff --git a/Layout/default/FiberPlanPipe/Index.php b/Layout/default/FiberPlanPipe/Index.php index 5d7b844ae..516d0cf2d 100644 --- a/Layout/default/FiberPlanPipe/Index.php +++ b/Layout/default/FiberPlanPipe/Index.php @@ -1,6 +1,3 @@ - - - id] as $fiberplanpipeEndpoint) { + if ($fiberplanpipeEndpoint->pop_id) { + $networks[$fiberplanpipeEndpoint->pop->network->name] = $fiberplanpipeEndpoint->pop->network->name; + $endpoints[] = '(P) ' . $fiberplanpipeEndpoint->pop->name; + } else if ($fiberplanpipeEndpoint->building_id) { + $networks[$fiberplanpipeEndpoint->building->network->name] = $fiberplanpipeEndpoint->building->network->name; + $endpoints[] = '(B) ' . $fiberplanpipeEndpoint->building->street . " " . $fiberplanpipeEndpoint->building->number; + } else if ($fiberplanpipeEndpoint->fiberPlanDispatcher_id) { + $networks[$fiberplanpipeEndpoint->fiberPlanDispatcher->network->name] = $fiberplanpipeEndpoint->fiberPlanDispatcher->network->name; + if ($fiberplanpipeEndpoint->fiberPlanDispatcher->object_type == "1") { + $endpoints[] = '(V) ' . $fiberplanpipeEndpoint->fiberPlanDispatcher->description; + } elseif ($fiberplanpipeEndpoint->fiberPlanDispatcher->object_type == "2") { + $endpoints[] = '(S) ' . $fiberplanpipeEndpoint->fiberPlanDispatcher->description; + } else if ($fiberplanpipeEndpoint->fiberPlanDispatcher->object_type == "3") { + $endpoints[] = '(G) ' . $fiberplanpipeEndpoint->fiberPlanDispatcher->description; + } else if ($fiberplanpipeEndpoint->fiberPlanDispatcher->object_type == "4") { + $endpoints[] = '(A) ' . $fiberplanpipeEndpoint->fiberPlanDispatcher->description; + } + } + } if ($fiberplanpipe->type == "3") { $name = ""; @@ -143,13 +161,15 @@ foreach ($pipworkeraddresses as $pipworkeraddress) { } ?> - $fiberplanpipe->id]) ?>">description ?> + + $fiberplanpipe->id]) ?>">description ?> + type] . " / " . $typeDescription ?> length ?> - - - + + + status] ?> @@ -164,9 +184,6 @@ foreach ($pipworkeraddresses as $pipworkeraddress) { - @@ -193,64 +210,7 @@ foreach ($pipworkeraddresses as $pipworkeraddress) { - + diff --git a/application/FiberPlanPipe/FiberPlanPipeController.php b/application/FiberPlanPipe/FiberPlanPipeController.php index e6bcd569a..17d2f2551 100644 --- a/application/FiberPlanPipe/FiberPlanPipeController.php +++ b/application/FiberPlanPipe/FiberPlanPipeController.php @@ -18,13 +18,12 @@ class FiberPlanPipeController extends mfBaseController protected function indexAction() { - $networks = NetworkModel::getAll(); $this->layout()->setTemplate("FiberPlanPipe/Index"); $fiberplanpipes = FiberPlanPipeModel::getAll(); $pipworkeraddresses = FiberPlanPipeModel::getPipeworkerAddresses(); - $buildings = FiberPlanPipeModel::getBuildingInfoAll(); - $this->layout()->set("networks", $networks); - $this->layout()->set("buildings", $buildings); + $fiberplanpipeEndpoints = FiberPlanPipeEndpointModel::getAll(); + + $this->layout()->set("fiberplanpipeEndpoints", $fiberplanpipeEndpoints); $this->layout()->set("pipworkeraddresses", $pipworkeraddresses); $this->layout()->set("fiberplanpipes", $fiberplanpipes); @@ -66,7 +65,6 @@ class FiberPlanPipeController extends mfBaseController protected function detailAction() { $id = $this->request->id; - $networks = NetworkModel::getAll(); $this->layout()->setTemplate("FiberPlanPipe/Detail"); if (!is_numeric($id) || !$id) { $this->layout()->setFlash("Rohrverzeichnis nicht gefunden", "error"); @@ -77,12 +75,9 @@ class FiberPlanPipeController extends mfBaseController $this->layout()->setFlash("Rohrverzeichnis nicht gefunden", "error"); $this->redirect("FiberPlanPipe"); } - $this->layout()->set("fiberplanpipes", $fiberplanpipes); $pipworkeraddresses = FiberPlanPipeModel::getPipeworkerAddresses(); - $buildings = FiberPlanPipeModel::getBuildingInfoAll(); $fiberplanpipeendpoints = FiberPlanPipeEndpointModel::search(['fiberPlanPipe_id' => $id]); - $this->layout()->set("networks", $networks); - $this->layout()->set("buildings", $buildings); + $this->layout()->set("fiberplanpipes", $fiberplanpipes); $this->layout()->set("pipworkeraddresses", $pipworkeraddresses); $this->layout()->set("fiberplanpipeendpoints", $fiberplanpipeendpoints); } @@ -111,8 +106,6 @@ class FiberPlanPipeController extends mfBaseController { $r = $this->request; $id = $r->id; - var_dump($r->get()); - die(); if (is_numeric($id) && $id > 0) { $mode = "edit"; $fiberplanpipes = new FiberPlanPipe($id); @@ -189,12 +182,6 @@ class FiberPlanPipeController extends mfBaseController if (!$data['length']) { $data['length'] = NULL; } - if (!$data['startpoint']) { - $data['startpoint'] = NULL; - } - if (!$data['endpoint']) { - $data['endpoint'] = NULL; - } if (!$data['status']) { $data['status'] = NULL; } @@ -226,24 +213,42 @@ class FiberPlanPipeController extends mfBaseController $endpoint = $r->endpoint; if (!empty($endpoint)) { + $fiberplanpipeendpoints = FiberPlanPipeEndpointModel::search(['fiberPlanPipe_id' => $id]); + foreach ($fiberplanpipeendpoints as $fiberplanpipeendpoint) { + if (!in_array($fiberplanpipeendpoint->id, $endpoint_id)) { + $fiberplanpipeendpoint->delete(); + } + } $counter = 1; foreach ($endpoint as $key => $Endpoint) { - if ($endpoint_type[$key] == 4) { + unset($endpointarray); + $endpointarray = []; + $endpointarray['fiberPlanDispatcher_id'] = null; + $endpointarray['pop_id'] = null; + $endpointarray['building_id'] = null; + if ($endpoint_type[$key] == 4 || $endpoint_type[$key] == 1) { $endpointarray['fiberPlanDispatcher_id'] = $Endpoint; } else if ($endpoint_type[$key] == 2) { $endpointarray['pop_id'] = $Endpoint; + } else if ($endpoint_type[$key] == 3) { + $endpointarray['building_id'] = $Endpoint; } $endpointarray['fiberPlanPipe_id'] = $id; $endpointarray['sort'] = $counter; +// print_r($endpointarray); +// var_dump($endpoint_id[$key]); +// die(); if ($endpoint_id[$key]) { - $fiberplanpipeendpoint = new FiberPlanPipeEndpoint($id); + $fiberplanpipeendpoint = new FiberPlanPipeEndpoint($endpoint_id[$key]); $fiberplanpipeendpoint->update($endpointarray); + unset($endpoint_id[$key]); } else { $fiberplanpipeendpoint = FiberPlanPipeEndpointModel::create($endpointarray); } $fiberplanpipeendpoint->save(); $counter++; } + } diff --git a/application/FiberPlanPipe/FiberPlanPipeModel.php b/application/FiberPlanPipe/FiberPlanPipeModel.php index 42736fb78..acedc102d 100644 --- a/application/FiberPlanPipe/FiberPlanPipeModel.php +++ b/application/FiberPlanPipe/FiberPlanPipeModel.php @@ -9,13 +9,6 @@ class FiberPlanPipeModel private $type_description; private $fiberplanpipetemplate_id; private $length; - private $startpoint_type; - private $startpoint_network_id; - private $startpoint; - private $midpoint; - private $endpoint_network_id; - private $entpoint_type; - private $endpoint; private $status; private $responsible; private $responsible_text; @@ -212,15 +205,15 @@ INNER JOIN `Address` ON (`Address`.`id`=`Addresstype`.`address_id`) $items = []; $db = FronkDB::singleton(); if ($bdtype == "1") { - $sql = "SELECT `id`,`description` `name` FROM `FiberPlanDispatcher` WHERE network_id='" . $network . "' AND `object_type`='3' "; + $sql = "SELECT `id`,`description` `name`,`gps_lat`,`gps_long` FROM `FiberPlanDispatcher` WHERE network_id='" . $network . "' AND `object_type`='3' "; } else if ($bdtype == "2") { - $sql = "SELECT `Pop`.`id`,`Pop`.`name` FROM `PopNetwork` + $sql = "SELECT `Pop`.`id`,`Pop`.`name`,`gps_lat`,`gps_long` FROM `PopNetwork` INNER JOIN `Pop` ON (`Pop`.`id`=`PopNetwork`.`pop_id`) WHERE `PopNetwork`.`network_id`='" . $network . "'"; } else if ($bdtype == "3") { - $sql = "SELECT `id`,`code` ,`street`, `zip`, `city` name FROM Building WHERE network_id='" . $network . "' ORDER by street"; + $sql = "SELECT `id`,`code` ,`street`, `zip`, `city` name ,`gps_lat`,`gps_long` FROM Building WHERE network_id='" . $network . "' ORDER by street"; } else if ($bdtype == "4") { - $sql = "SELECT `id`,`description` `name` FROM `FiberPlanDispatcher` WHERE network_id='" . $network . "' AND (`object_type`='1' OR `object_type`='2') "; + $sql = "SELECT `id`,`description` `name`,`gps_lat`,`gps_long` FROM `FiberPlanDispatcher` WHERE network_id='" . $network . "' AND (`object_type`='1' OR `object_type`='2') "; } $res = $db->query($sql); @@ -229,6 +222,8 @@ INNER JOIN `Address` ON (`Address`.`id`=`Addresstype`.`address_id`) $counter = 0; while ($data = $db->fetch_array($res)) { $items[$counter]['id'] = $data['id']; + $items[$counter]['gps_lat'] = $data['gps_lat']; + $items[$counter]['gps_long'] = $data['gps_long']; if ($bdtype == "3") { $items[$counter]['name'] = $data['street'] . " " . $data['zip'] . " " . $data['city']; } else { @@ -285,6 +280,7 @@ INNER JOIN `Address` ON (`Address`.`id`=`Addresstype`.`address_id`) } $counter = 1; $endpointuparrow = ""; + $Endpointdownarrow = ""; $typeArray[1] = 'Greenfield'; $typeArray[2] = 'POP'; $typeArray[3] = 'Building'; @@ -293,7 +289,8 @@ INNER JOIN `Address` ON (`Address`.`id`=`Addresstype`.`address_id`) // print_r($buildings); $counter = 1; foreach ($endpoints as $Endpoint) { - + $endpointuparrow = ""; + $Endpointdownarrow = ""; if ($Endpoint->pop_id) { $networkid = $Endpoint->pop->network_id; $endpointid = $Endpoint->pop->id; @@ -312,27 +309,28 @@ INNER JOIN `Address` ON (`Address`.`id`=`Addresstype`.`address_id`) $endpointtype = 3; } $randid = rand(1000, 10000); - if ($counter > 1) { + + if (count($endpoints) == $counter) { + $Endpointuparrow = ''; + } else if ($counter > 1) { $Endpointuparrow = ''; + $Endpointdownarrow = ''; } if ($counter == 1) { $endpointType = "Startpunkt"; $endpointsymbol = ''; - } - else if (count($endpoints)==2) - { + } else if (count($endpoints) == 2) { $endpointcount = $counter - 1; $endpointType = "Standort " . $endpointcount; - $endpointsymbol=''; - } - else { + $endpointsymbol = ''; + } else { $endpointcount = $counter - 1; $endpointType = "Standort " . $endpointcount; $endpointsymbol = ''; } $html = '
- -
'; foreach ($networks as $network) { if ($network->id == $networkid) { $html .= ''; @@ -354,19 +352,19 @@ INNER JOIN `Address` ON (`Address`.`id`=`Addresstype`.`address_id`) } $html .= '
-
- '; $buildings = FiberPlanPipeModel::getBuildingInfo($networkid, $endpointtype, 0); foreach ($buildings as $key => $building) { if ($building['id'] == $endpointid) { - $html .= ''; + $html .= ''; } else { - $html .= ''; + $html .= ''; } } - $html .= '
'; + $html .= '
'; echo $html; $counter++; } diff --git a/application/FiberPlanPipeEndpoint/FiberPlanPipeEndpointModel.php b/application/FiberPlanPipeEndpoint/FiberPlanPipeEndpointModel.php index 7cfee1593..9e575847c 100644 --- a/application/FiberPlanPipeEndpoint/FiberPlanPipeEndpointModel.php +++ b/application/FiberPlanPipeEndpoint/FiberPlanPipeEndpointModel.php @@ -67,10 +67,10 @@ class FiberPlanPipeEndpointModel $db = FronkDB::singleton(); - $res = $db->select("FiberPlanPipeEndpoint", "*", "1=1"); + $res = $db->select("FiberPlanPipeEndpoint", "*", "1=1 ORDER by sort"); if ($db->num_rows($res)) { while ($data = $db->fetch_object($res)) { - $items[] = new FiberPlanPipeEndpoint($data); + $items[$data->fiberPlanPipe_id][$data->sort] = new FiberPlanPipeEndpoint($data); } } return $items; diff --git a/db/migrations/20240423132651_fiber_plan_pipe_drop.php b/db/migrations/20240423132651_fiber_plan_pipe_drop.php new file mode 100644 index 000000000..b0cbc34e6 --- /dev/null +++ b/db/migrations/20240423132651_fiber_plan_pipe_drop.php @@ -0,0 +1,29 @@ +getEnvironment() == "thetool") { + $this->table("FiberPlanPipe")->drop()->save(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } + + public function down(): void + { + if($this->getEnvironment() == "thetool") { + + } + + if($this->getEnvironment() == "addressdb") { + + } + } +} diff --git a/db/migrations/20240423132655_fiber_plan_pipe_create.php b/db/migrations/20240423132655_fiber_plan_pipe_create.php new file mode 100644 index 000000000..de8657301 --- /dev/null +++ b/db/migrations/20240423132655_fiber_plan_pipe_create.php @@ -0,0 +1,43 @@ +getEnvironment() == "thetool") { + $table = $this->table("FiberPlanPipe", ["signed" => true]); + $table->addColumn("description", "text", ["null" => false]); + $table->addColumn("gisid", "text", ["null" => true]); + $table->addColumn("type", "integer", ["null" => false]); + $table->addColumn("type_description", "integer", ["null" => true]); + $table->addColumn("fiberPlanPipeTemplate_id", "integer", ["null" => true]); + $table->addColumn("length", "integer", ["null" => false]); + $table->addColumn("status", "integer", ["null" => false]); + $table->addColumn("responsible", "integer", ["null" => false]); + $table->addColumn("responsible_text", "text", ["null" => true]); + $table->addColumn("address_id", "integer", ["null" => true]); + $table->addColumn("comment", "text", ["null" => true]); + $table->addColumn("edit_by", "integer", ["null" => false]); + $table->addColumn("create_by", "integer", ["null" => false]); + $table->addColumn("edit", "integer", ["null" => false]); + $table->addColumn("create", "integer", ["null" => false]); + $table->save(); + } + + if ($this->getEnvironment() == "addressdb") { + + } + } + + public function down(): void + { + if ($this->getEnvironment() == "thetool") { + $this->table("FiberPlanPipe")->drop()->save(); + } + if ($this->getEnvironment() == "addressdb") { + } + } +} diff --git a/public/img/markers/marker-dispatcher.png b/public/img/markers/marker-dispatcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c94a596c2e09d0c15d57cec7296c120804a9d1d3 GIT binary patch literal 5973 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 literal 0 HcmV?d00001 diff --git a/public/img/markers/marker-home.png b/public/img/markers/marker-home.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac55a95f0394f0f1307a8444582f6b22be21b0d GIT binary patch literal 5937 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 literal 0 HcmV?d00001 diff --git a/public/img/markers/marker-pop.png b/public/img/markers/marker-pop.png new file mode 100644 index 0000000000000000000000000000000000000000..cf04a0dd6629b04c03d9f5ea9d3e1432a2ebfbee GIT binary patch literal 6000 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 literal 0 HcmV?d00001