From 1ad771f52743871f00e4e76db90930781f50842c Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Tue, 22 Apr 2025 20:55:49 +0200 Subject: [PATCH] Order: Save Voicenumber when saving Order and check if number exists --- Layout/default/Order/Form.php | 42 +++++++++++++++- application/Contract/Contract.php | 2 + application/Contract/ContractModel.php | 30 ++++++++++- application/Order/OrderController.php | 50 ++++++++++++++++++- .../Voicenumberblock/Voicenumberblock.php | 2 + .../VoicenumberblockController.php | 2 + 6 files changed, 124 insertions(+), 4 deletions(-) diff --git a/Layout/default/Order/Form.php b/Layout/default/Order/Form.php index 2931f70fd..31a7848d5 100644 --- a/Layout/default/Order/Form.php +++ b/Layout/default/Order/Form.php @@ -31,7 +31,9 @@ - + + +
@@ -50,8 +52,20 @@
- + + +
+
+
+ ACHTUNG: Bei einem oder mehreren Produkten ist ein Fehler aufgetreten! +
+
+
+ +
+ +
@@ -780,7 +794,19 @@
+ + id, $_SESSION[MFAPPNAME."_orderproduct_warnings"])): ?> +
+
+
+ id]?> + id]); ?> +
+
+
+ +
@@ -1431,14 +1457,26 @@ if(("numbers" in success.result) && success.result.numbers.length) { $("#voicenumber-" + id + "-" + num).empty(); + var found_default = false; success.result.numbers.forEach(function(number) { if(number == default_value) { $("#voicenumber-" + id + "-" + num).append(""); + found_default = true; } else { $("#voicenumber-" + id + "-" + num).append(""); } }); + + if(default_value && !found_default) { + // default value is the number saved in this OrderProduct, so it's not free anymore + // and needs to be added to the select element + $("#voicenumber-" + id + "-" + num).append(""); + // sort number list + $("#voicenumber-" + id + "-" + num).html($("#voicenumber-" + id + "-" + num + " option").sort(function (a, b) { + return a.text == b.text ? 0 : a.text < b.text ? -1 : 1 + })); + } //$("#voicenumberblock-" + id + "-line-" + num).hide(); $("#voicenumber-custom-" + id + "-line-" + num).hide(); $("#voicenumber-custom-" + id + "-line-" + num + " input").val(""); diff --git a/application/Contract/Contract.php b/application/Contract/Contract.php index 51e18dcc4..1a491e157 100644 --- a/application/Contract/Contract.php +++ b/application/Contract/Contract.php @@ -322,6 +322,8 @@ class Contract extends mfBaseModel { foreach($voicenumbers as $vn) { $vn->contract_id = $this->id; + $vn->active = 1; + $vn->activated_date = date("U"); $vn->save(); } } diff --git a/application/Contract/ContractModel.php b/application/Contract/ContractModel.php index 5530a3fcc..46bcafb1e 100644 --- a/application/Contract/ContractModel.php +++ b/application/Contract/ContractModel.php @@ -315,7 +315,35 @@ class ContractModel { return $items; } - + + public static function getFirstActive($filter) { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $sql = "SELECT Contract.* FROM Contract + LEFT JOIN Address ON (Contract.owner_id = Address.id) + LEFT JOIN OrderProduct ON (Contract.orderproduct_id = OrderProduct.id) + LEFT JOIN `Order` ON (OrderProduct.order_id = `Order`.id) + LEFT JOIN Product ON (Contract.product_id = Product.id) + WHERE $where + AND (cancel_date IS NULL OR cancel_date > UNIX_TIMESTAMP()) + GROUP BY Contract.id + ORDER BY Contract.`create`,Contract.id + LIMIT 1"; + //var_dump($sql);exit; + $res = $db->query($sql); + if($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new Contract($data); + if($item->id) { + return $item; + } else { + return null; + } + } + return null; + } + public static function getFirst($filter) { $db = FronkDB::singleton(); diff --git a/application/Order/OrderController.php b/application/Order/OrderController.php index 8bbf1c65a..7a06efd14 100644 --- a/application/Order/OrderController.php +++ b/application/Order/OrderController.php @@ -935,6 +935,7 @@ class OrderController extends mfBaseController { $ext_products_nbe = 0; //var_dump($r->products);exit; + $orderproduct_warnings = []; // validate and add products if(is_array($r->products) && count($r->products)) { foreach($r->products as $pos => $p) { @@ -1026,8 +1027,48 @@ class OrderController extends mfBaseController { if(substr($number, 0, 1) != "+") $number = "+$number"; //if($number && !in_array($number, $voicenumbers)) $voicenumbers[] = $number; - $voicenumbers[] = $number; + $sysnumber = preg_replace('/^\+/', '',$number); + // lookup Voicenumber and add orderproduct_id + $vn = VoicenumberModel::getFirst(["number" => $sysnumber]); + //var_dump($vn);exit; + if($vn && $vn->voicenumberblock_id) { // ignore ported numbers + if($vn->contract_id) { + $contract = ContractModel::getFirstActive(["id" => $vn->contract_id]); + if($contract && $contract->orderproduct_id != $orderproduct_id) { + $this->layout()->setFlash("Rufnummer $sysnumber ist bereits vergeben (Contract " . $contract->id . ")", "error"); + $orderproduct_warnings[$orderproduct_id] = "Rufnummer $sysnumber wurde entfernt, da sie bereits in Contract " . $contract->id . " vegeben ist."; + continue; + } + } + if($vn->orderproduct_id && $vn->orderproduct_id != $orderproduct_id) { + $vn_op = new OrderProduct($vn->orderproduct_id); + //var_dump($vn_op);exit; + if($vn_op->id) { + $this->layout()->setFlash("Rufnummer $sysnumber ist bereits vergeben (Bestellung " . $vn_op->order->id . "; " . $vn_op->order->owner->getCompanyOrName() . ")", "error"); + $orderproduct_warnings[$orderproduct_id] = "Rufnummer $sysnumber wurde entfernt, da sie bereits für Bestellung " . $vn_op->order->id . " / ".$vn_op->order->owner->getCompanyOrName()." vergeben wurde."; + continue; + } + } + $vn->orderproduct_id = $orderproduct_id; + $vn->save(); + + $voicenumbers[] = $number; + } elseif(!$vn) { + $block = Voicenumberblock::findBlock($sysnumber); + //var_dump($number, $block);exit; + $vn = VoicenumberModel::create([ + "number" => $sysnumber, + "voicenumberblock_id" => ($block) ? $block->id : null, + "orderproduct_id" => $orderproduct_id, + "ported_in" => ($block) ? 0 : 1, + ]); + $vn->save(); + $voicenumbers[] = $number; + } else { + $voicenumbers[] = $number; + } } + //var_dump($voicenumbers);exit; if($voicenumbers) { $product_data['voicenumber'] = json_encode($voicenumbers); @@ -1068,6 +1109,13 @@ class OrderController extends mfBaseController { $int_products = true; } } + + if(count($orderproduct_warnings)) { + $_SESSION[MFAPPNAME."_orderproduct_warnings"] = []; + foreach($orderproduct_warnings as $orderproduct_id => $msg) { + $_SESSION[MFAPPNAME."_orderproduct_warnings"][$orderproduct_id] = $msg; + } + } //exit; diff --git a/application/Voicenumberblock/Voicenumberblock.php b/application/Voicenumberblock/Voicenumberblock.php index b0ba2719e..0b3b28624 100644 --- a/application/Voicenumberblock/Voicenumberblock.php +++ b/application/Voicenumberblock/Voicenumberblock.php @@ -29,6 +29,8 @@ class Voicenumberblock extends mfBaseModel { public static function findBlock($number) { // resolve number from right to left to find fitting block $minLength = 4; + + $number = preg_replace('/^\+/', '',$number); $try = $number; while(strlen($try) >= $minLength) { diff --git a/application/Voicenumberblock/VoicenumberblockController.php b/application/Voicenumberblock/VoicenumberblockController.php index d63d752e7..c2827b8c4 100644 --- a/application/Voicenumberblock/VoicenumberblockController.php +++ b/application/Voicenumberblock/VoicenumberblockController.php @@ -167,6 +167,8 @@ class VoicenumberblockController extends mfBaseController { } $free = $block->getFreeNumbers(); + $free[] = "43 3476 41122"; + $free[] = "43 316 413030"; return ["numbers" => $free]; }