From b4cb70b6432bfe15bd07802134d71fa84a2b34b2 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Tue, 12 Mar 2024 22:34:28 +0100 Subject: [PATCH] Added voicenumber select in Order --- Layout/default/Order/Form.php | 115 ++++++++++++++++-- .../Voicenumberblock/include/block-detail.php | 4 +- Layout/default/footer.php | 2 +- application/Order/OrderController.php | 28 +++-- .../OrderProduct/OrderProductModel.php | 2 + application/Voicenumber/Voicenumber.php | 12 ++ application/Voicenumber/VoicenumberModel.php | 10 +- .../Voicenumberblock/Voicenumberblock.php | 22 ++++ .../VoicenumberblockController.php | 46 +++++++ .../VoicenumberblockModel.php | 10 +- .../20231004143109_add_voicenumber_tables.php | 2 + scripts/test.php | 7 +- 12 files changed, 234 insertions(+), 26 deletions(-) diff --git a/Layout/default/Order/Form.php b/Layout/default/Order/Form.php index 7da0a3d98..030e42b28 100644 --- a/Layout/default/Order/Form.php +++ b/Layout/default/Order/Form.php @@ -652,10 +652,38 @@ @@ -771,11 +799,31 @@ @@ -1271,6 +1319,59 @@ } + function toggleVoicenumberEdit(id) { + $('#voicenumber-edit-' + id).toggle(); + + $("#voicenumber-select-" + id + "-line select").empty(); + $("#voicenumber-custom-" + id + "-line input").val(""); + + } + + function loadVoicenumbers(id) { + var block_id = $("#voicenumberblock_id-" + id).val(); + + if(block_id == "portin") { + $("#voicenumber-select-" + id + "-line").hide(); + $("#voicenumber-select-" + id + "-line select").val(""); + $("#voicenumber-" + id).empty(); + + $("#voicenumber-custom-" + id + "-line").show(); + //$("#voicenumberblock-" + id + "-line").hide(); + return; + } + + if(!block_id) return; + + $.ajax({ + url: "", + type: "POST", + context: id, + data: { + do: "getFreeNumbers", + id: block_id + }, + success: function(success) { + //console.log(success, id); + if(success.status != "OK") return; + + if(("numbers" in success.result) && success.result.numbers.length) { + $("#voicenumber-" + id).empty(); + success.result.numbers.forEach(function(num) { + $("#voicenumber-" + id).append(""); + }); + //$("#voicenumberblock-" + id + "-line").hide(); + $("#voicenumber-custom-" + id + "-line").hide(); + $("#voicenumber-custom-" + id + "-line input").val(""); + + $("#voicenumber-select-" + id + "-line").show(); + + } + }, + dataType: "json" + }); + + } + /********************* * Form validation */ diff --git a/Layout/default/Voicenumberblock/include/block-detail.php b/Layout/default/Voicenumberblock/include/block-detail.php index b082eb895..918bd4ebb 100644 --- a/Layout/default/Voicenumberblock/include/block-detail.php +++ b/Layout/default/Voicenumberblock/include/block-detail.php @@ -15,8 +15,8 @@ Entsperrung - first, $block->last) as $number): ?> - $block_id, 'number' => $number]) ?> + id, $num_from) ? $num_from[$block->id] : $block->first), $block->last) as $number): ?> + $block->id, 'number' => $number]) ?> diff --git a/Layout/default/footer.php b/Layout/default/footer.php index 58916a8d7..4a7c9b0bb 100644 --- a/Layout/default/footer.php +++ b/Layout/default/footer.php @@ -83,7 +83,7 @@ return; } - if(rest_duration < 60*5) { + if(rest_duration < 60) { // show notification if($("#se_notf").length) { $("#se_notf .time").text(rest_duration); diff --git a/application/Order/OrderController.php b/application/Order/OrderController.php index 66f9dbb01..050ff4770 100644 --- a/application/Order/OrderController.php +++ b/application/Order/OrderController.php @@ -920,18 +920,28 @@ class OrderController extends mfBaseController { if(array_key_exists(TT_ATTRIB_VOICENUMBER_REQUIRED_NAME, $prod->attributes) && $prod->attributes[TT_ATTRIB_VOICENUMBER_REQUIRED_NAME]->value == 1) { $voicenumbers = []; - foreach(explode("\n", $p['voicenumber']) as $number) { - $number = preg_replace('/\D/', '', trim($number)); - if(substr($number, 0, 2) == "00") $number = "+".substr($number, 2); - if(preg_match('/^0[^0]/', $number)) { - $number = "+43".substr($number, 1); - } - if(substr($number, 0, 1) != "+") $number = "+$number"; - if($number && !in_array($number, $voicenumbers)) $voicenumbers[] = $number; - + //var_dump($p);exit; + //if($p["voicenumber_custom"]); + + if(array_key_exists("voicenumber", $p) && $p["voicenumber"]) { + $number = $p["voicenumber"]; + } + if(array_key_exists("voicenumber_custom", $p) && $p["voicenumber_custom"]) { + $number = $p["voicenumber_custom"]; } + $number = preg_replace('/\D/', '', trim($number)); + if(substr($number, 0, 2) == "00") $number = "+".substr($number, 2); + if(preg_match('/^0[^0]/', $number)) { + $number = "+43".substr($number, 1); + } + if(substr($number, 0, 1) != "+") $number = "+$number"; + //if($number && !in_array($number, $voicenumbers)) $voicenumbers[] = $number; + + $voicenumbers[] = $number; + $product_data['voicenumber'] = json_encode($voicenumbers); + //var_dump($product_data);exit; } else { $product_data['voicenumber'] = null; } diff --git a/application/OrderProduct/OrderProductModel.php b/application/OrderProduct/OrderProductModel.php index bcfa395b3..f65059355 100644 --- a/application/OrderProduct/OrderProductModel.php +++ b/application/OrderProduct/OrderProductModel.php @@ -5,6 +5,8 @@ class OrderProductModel public $order_id; public $product_id; public $termination_id; + public $voicenumber; + public $domain; public $upgrade; public $amount; public $pos; diff --git a/application/Voicenumber/Voicenumber.php b/application/Voicenumber/Voicenumber.php index 7f6af4712..81decf54c 100644 --- a/application/Voicenumber/Voicenumber.php +++ b/application/Voicenumber/Voicenumber.php @@ -12,6 +12,18 @@ class Voicenumber extends mfBaseModel { //$this->number_prepend_zero = $block->number_prepend_zero; return true; } + + public function getPrettyNumber() { + if(!$this->voicenumberblock_id) return $this->number; + $block = $this->getProperty("block"); + + $prefix = $this->block->countrycode; + $prefix .= $this->block->areacode; + + $return = $this->block->countrycode." ".$this->block->areacode." ".substr($this->number, strlen($prefix)); + + return $return; + } public function beforeSave() { if($this->ported_from && $this->port_in_date) { diff --git a/application/Voicenumber/VoicenumberModel.php b/application/Voicenumber/VoicenumberModel.php index 5f47118c1..afc618d86 100644 --- a/application/Voicenumber/VoicenumberModel.php +++ b/application/Voicenumber/VoicenumberModel.php @@ -97,14 +97,14 @@ class VoicenumberModel { return 0; } - public static function search($filter, $limit = false) { + public static function search($filter, $limit = false, $key = false) { $items = []; $db = FronkDB::singleton(); $where = self::getSqlFilter($filter); $sql = "SELECT * FROM Voicenumber WHERE $where - ORDER BY countrycode, areacode, first, last"; + ORDER BY number"; if(is_array($limit) && count($limit)) { if(is_numeric($limit['start']) && is_numeric($limit['count'])) { @@ -120,7 +120,11 @@ class VoicenumberModel { if($db->num_rows($res)) { while($data = $db->fetch_object($res)) { - $items[] = new Voicenumber($data); + if($key) { + $items[$data->$key] = new Voicenumber($data); + } else { + $items[] = new Voicenumber($data); + } } } return $items; diff --git a/application/Voicenumberblock/Voicenumberblock.php b/application/Voicenumberblock/Voicenumberblock.php index 3053e1795..b40c60cba 100644 --- a/application/Voicenumberblock/Voicenumberblock.php +++ b/application/Voicenumberblock/Voicenumberblock.php @@ -35,6 +35,28 @@ class Voicenumberblock extends mfBaseModel { return $block; } + public function getFreeNumbers() { + if(!$this->id) return false; + + $free = []; + $block_numbers = VoicenumberModel::search(["block_id" => $this->id], false, "number"); + + $pnumber = new Voicenumber(); + $pnumber->voicenumberblock_id = $this->id; + + foreach(range($this->first, $this->last) as $num) { + if(array_key_exists($num, $block_numbers)) { + $bn = $block_numbers[$num]; + if($bn->active || $bn->disabled || $bn->ported_in || $bn->ported_out || $bn->orderproduct_id || $bn->contrat_id) { + continue; + } + } + $pnumber->number = $num; + $free[] = $pnumber->getPrettyNumber(); + } + return $free; + } + public function getProperty($name) { if($this->$name == null) { diff --git a/application/Voicenumberblock/VoicenumberblockController.php b/application/Voicenumberblock/VoicenumberblockController.php index deab9cf4a..d63d752e7 100644 --- a/application/Voicenumberblock/VoicenumberblockController.php +++ b/application/Voicenumberblock/VoicenumberblockController.php @@ -28,6 +28,15 @@ class VoicenumberblockController extends mfBaseController { $filter = $this->getPreparedFilter($filter); } + $num_from = []; + $num_from_start = $this->request->nf; + $num_from_block = $this->request->nfb; + + if($num_from_start && $num_from_block) { + $num_from[$num_from_block] = $num_from_start; + } + $this->layout()->set("num_from", $num_from); + // pagination defaults $pagination = []; $pagination['start'] = 0; @@ -124,4 +133,41 @@ class VoicenumberblockController extends mfBaseController { $this->redirect("Voicenumberblock"); } + + protected function apiAction() { + $do = $this->request->do; + $data = []; + + switch($do) { + case "getFreeNumbers": + $return = $this->getFreeNumbersApi(); + break; + default: + $return = false; + } + + if(!is_array($return) || !count($return)) { + $data = ["status" => "error"]; + $this->returnJson($data); + } + $data['status'] = "OK"; + $data['result'] = $return; + $this->returnJson($data); + } + + private function getFreeNumbersApi() { + $block_id = $this->request->id; + if(!is_numeric($block_id) || $block_id < 1) { + return false; + } + + $block = new Voicenumberblock($block_id); + if(!$block->id) { + return false; + } + + $free = $block->getFreeNumbers(); + + return ["numbers" => $free]; + } } \ No newline at end of file diff --git a/application/Voicenumberblock/VoicenumberblockModel.php b/application/Voicenumberblock/VoicenumberblockModel.php index eb4a4389d..912d30359 100644 --- a/application/Voicenumberblock/VoicenumberblockModel.php +++ b/application/Voicenumberblock/VoicenumberblockModel.php @@ -37,12 +37,18 @@ class VoicenumberblockModel { return $model; } - public static function getAll() { + public static function getAll($order = "countrycode,areacode,first,last") { $items = []; $db = FronkDB::singleton(); - $res = $db->select("Voicenumberblock", "*"); + $order_by = ""; + + if($order) { + $order_by = $order; + } + + $res = $db->select("Voicenumberblock", "*", "1=1 ORDER BY $order_by"); if($db->num_rows($res)) { while($data = $db->fetch_object($res)) { $items[] = new Voicenumberblock($data); diff --git a/db/migrations/20231004143109_add_voicenumber_tables.php b/db/migrations/20231004143109_add_voicenumber_tables.php index ea62bbdb3..8829f9ce5 100644 --- a/db/migrations/20231004143109_add_voicenumber_tables.php +++ b/db/migrations/20231004143109_add_voicenumber_tables.php @@ -34,6 +34,8 @@ final class AddVoicenumberTables extends AbstractMigration $table->addColumn("port_out_date", "integer", ["null" => true, "default" => null]); $table->addColumn("ported_in", "integer", ["null" => true, "default" => null]); $table->addColumn("ported_out", "integer", ["null" => true, "default" => null]); + $table->addColumn("ported_from", "string", ["null" => true, "default" => null, "limit" => 64]); + $table->addColumn("ported_to", "string", ["null" => true, "default" => null, "limit" => 64]); $table->addColumn("disabled", "integer", ["null" => false, "default" => 0, "limit" => \Phinx\Db\Adapter\MysqlAdapter::INT_TINY]); $table->addColumn("disabled_reason", "enum", ["values" => "ported_out,ported_back,reserved,legacy,damaged", "null" => true, "default" => null]); $table->addColumn("enable_on_date", "integer", ["null" => true, "default" => null]); diff --git a/scripts/test.php b/scripts/test.php index faf2a0396..bf97dec6c 100644 --- a/scripts/test.php +++ b/scripts/test.php @@ -15,5 +15,8 @@ $me = new User(1); define("INTERNAL_USER_ID", $me->id); define("INTERNAL_USER_USERNAME", $me->username); -$netzgebiet = new ADBNetzgebiet(45); -var_dump($netzgebiet->getOption("hausnummer_dont_overwrite_netzgebiet")); \ No newline at end of file +$block = new Voicenumberblock(2); +$free = $block->getFreeNumbers(); + +echo implode("\n", $free); +echo "\n"; \ No newline at end of file