Order: Save Voicenumber when saving Order and check if number exists

This commit is contained in:
Frank Schubert
2025-04-22 20:55:49 +02:00
parent eb197ac266
commit 1ad771f527
6 changed files with 124 additions and 4 deletions

View File

@@ -32,6 +32,8 @@
</div> </div>
<!-- end page title --> <!-- end page title -->
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
@@ -51,7 +53,19 @@
<input type="hidden" name="id" value="<?=$order->id?>" /> <input type="hidden" name="id" value="<?=$order->id?>" />
<?php if(array_key_exists(MFAPPNAME."_orderproduct_warnings", $_SESSION) && count($_SESSION[MFAPPNAME."_orderproduct_warnings"])): ?>
<div class="row justify-content-center">
<div class="col-8">
<div class="alert alert-danger">
<strong>ACHTUNG:</strong> Bei einem oder mehreren Produkten ist ein Fehler aufgetreten!
</div>
</div>
</div>
<?php endif; ?>
<div class="row"> <div class="row">
<div class="col-lg-6" id="owner-block"> <div class="col-lg-6" id="owner-block">
@@ -780,6 +794,18 @@
<?php endif; ?> <?php endif; ?>
</div> </div>
<?php if(array_key_exists(MFAPPNAME."_orderproduct_warnings", $_SESSION) && count($_SESSION[MFAPPNAME."_orderproduct_warnings"]) && array_key_exists($product->id, $_SESSION[MFAPPNAME."_orderproduct_warnings"])): ?>
<div class="row">
<div class="col-10">
<div class="alert alert-danger">
<?=$_SESSION[MFAPPNAME."_orderproduct_warnings"][$product->id]?>
<?php unset($_SESSION[MFAPPNAME."_orderproduct_warnings"][$product->id]); ?>
</div>
</div>
</div>
<?php endif; ?>
</div> </div>
</div> </div>
<?php $i++; ?> <?php $i++; ?>
@@ -1431,14 +1457,26 @@
if(("numbers" in success.result) && success.result.numbers.length) { if(("numbers" in success.result) && success.result.numbers.length) {
$("#voicenumber-" + id + "-" + num).empty(); $("#voicenumber-" + id + "-" + num).empty();
var found_default = false;
success.result.numbers.forEach(function(number) { success.result.numbers.forEach(function(number) {
if(number == default_value) { if(number == default_value) {
$("#voicenumber-" + id + "-" + num).append("<option value='" + number + "' selected='selected'>+" + number + "</option>"); $("#voicenumber-" + id + "-" + num).append("<option value='" + number + "' selected='selected'>+" + number + "</option>");
found_default = true;
} else { } else {
$("#voicenumber-" + id + "-" + num).append("<option value='" + number + "'>+" + number + "</option>"); $("#voicenumber-" + id + "-" + num).append("<option value='" + number + "'>+" + number + "</option>");
} }
}); });
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("<option value='" + default_value + "' selected='selected'>+" + default_value + "</option>");
// 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(); //$("#voicenumberblock-" + id + "-line-" + num).hide();
$("#voicenumber-custom-" + id + "-line-" + num).hide(); $("#voicenumber-custom-" + id + "-line-" + num).hide();
$("#voicenumber-custom-" + id + "-line-" + num + " input").val(""); $("#voicenumber-custom-" + id + "-line-" + num + " input").val("");

View File

@@ -322,6 +322,8 @@ class Contract extends mfBaseModel {
foreach($voicenumbers as $vn) { foreach($voicenumbers as $vn) {
$vn->contract_id = $this->id; $vn->contract_id = $this->id;
$vn->active = 1;
$vn->activated_date = date("U");
$vn->save(); $vn->save();
} }
} }

View File

@@ -316,6 +316,34 @@ class ContractModel {
} }
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) { public static function getFirst($filter) {
$db = FronkDB::singleton(); $db = FronkDB::singleton();

View File

@@ -935,6 +935,7 @@ class OrderController extends mfBaseController {
$ext_products_nbe = 0; $ext_products_nbe = 0;
//var_dump($r->products);exit; //var_dump($r->products);exit;
$orderproduct_warnings = [];
// validate and add products // validate and add products
if(is_array($r->products) && count($r->products)) { if(is_array($r->products) && count($r->products)) {
foreach($r->products as $pos => $p) { foreach($r->products as $pos => $p) {
@@ -1026,8 +1027,48 @@ class OrderController extends mfBaseController {
if(substr($number, 0, 1) != "+") $number = "+$number"; if(substr($number, 0, 1) != "+") $number = "+$number";
//if($number && !in_array($number, $voicenumbers)) $voicenumbers[] = $number; //if($number && !in_array($number, $voicenumbers)) $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; $voicenumbers[] = $number;
} }
}
//var_dump($voicenumbers);exit;
if($voicenumbers) { if($voicenumbers) {
$product_data['voicenumber'] = json_encode($voicenumbers); $product_data['voicenumber'] = json_encode($voicenumbers);
@@ -1068,6 +1109,13 @@ class OrderController extends mfBaseController {
$int_products = true; $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; //exit;

View File

@@ -30,6 +30,8 @@ class Voicenumberblock extends mfBaseModel {
// resolve number from right to left to find fitting block // resolve number from right to left to find fitting block
$minLength = 4; $minLength = 4;
$number = preg_replace('/^\+/', '',$number);
$try = $number; $try = $number;
while(strlen($try) >= $minLength) { while(strlen($try) >= $minLength) {
$block = VoicenumberblockModel::getFirst(['prefix' => $try]); $block = VoicenumberblockModel::getFirst(['prefix' => $try]);

View File

@@ -167,6 +167,8 @@ class VoicenumberblockController extends mfBaseController {
} }
$free = $block->getFreeNumbers(); $free = $block->getFreeNumbers();
$free[] = "43 3476 41122";
$free[] = "43 316 413030";
return ["numbers" => $free]; return ["numbers" => $free];
} }