@@ -50,8 +52,20 @@
-
+
+
+
+
+
+ ACHTUNG: Bei einem oder mehreren Produkten ist ein Fehler aufgetreten!
+
+
+
+
+
+
+
@@ -780,7 +794,19 @@
+
+ id, $_SESSION[MFAPPNAME."_orderproduct_warnings"])): ?>
+
+
+
+ =$_SESSION[MFAPPNAME."_orderproduct_warnings"][$product->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];
}