WIP Contract 2024-05-07 - 2
This commit is contained in:
@@ -3,10 +3,37 @@
|
||||
class Admin_IvtContractImport {
|
||||
private $request;
|
||||
private $log;
|
||||
private $static_ivt_order_match = [];
|
||||
|
||||
public function __construct($request) {
|
||||
$this->request = $request;
|
||||
$this->log = mfLoghandler::singleton();
|
||||
|
||||
/*
|
||||
* ivt::customer_product::id => Order::id
|
||||
* SELECT cp.id,cp.cid,cp.pid,products.name,cp.sid,cp.created,cp.lastdate,cp.comment,tp.name
|
||||
* FROM `customer_product` as cp LEFT JOIN products ON (cp.pid = products.id)
|
||||
* LEFT JOIN thetool_live4.IvtProductMatch ipm ON (ipm.ivt_product_id = cp.pid)
|
||||
* LEFT JOIN thetool_live4.Product tp ON (ipm.product_id = tp.id)
|
||||
* WHERE `cid` = 1840;
|
||||
*/
|
||||
$this->static_ivt_order_match = [
|
||||
17245 => 3946, // lugitsch 1840
|
||||
16704 => 3342,
|
||||
16703 => 3342,
|
||||
15712 => 3414,
|
||||
14798 => 2940,
|
||||
14322 => 2623,
|
||||
14321 => 2623,
|
||||
14222 => 2702,
|
||||
13951 => 2218,
|
||||
13322 => 2623,
|
||||
2034 => false,
|
||||
561 => false,
|
||||
|
||||
11409 => 1222, // x-tec 1842
|
||||
14192 => 2596
|
||||
];
|
||||
}
|
||||
|
||||
public function run($doit = false) {
|
||||
@@ -19,9 +46,8 @@ class Admin_IvtContractImport {
|
||||
$last_cid = 0;
|
||||
|
||||
$i = 0;
|
||||
foreach(IvtCustomerProductModel::search(["lasdt_date>", "2024-04-01"], "cid") as $ivt_contract) {
|
||||
if($ivt_contract->cid == 1494);
|
||||
if($i > 150 && $ivt_contract->cid != $last_cid) break; // only break after the last ivtcontract of this customer
|
||||
foreach(IvtCustomerProductModel::search(["lasdt_date>", "2023-04-01"], "cid") as $ivt_contract) {
|
||||
if($i > 1000 && $ivt_contract->cid != $last_cid) break; // only break after the last ivtcontract of this customer
|
||||
$last_cid = $ivt_contract->cid;
|
||||
|
||||
$i++;
|
||||
@@ -32,20 +58,6 @@ class Admin_IvtContractImport {
|
||||
$ivt_customer = $ivt_contract->customer;
|
||||
$ivt_product = $ivt_contract->product;
|
||||
|
||||
/*
|
||||
* check ivt customer and get Billingaddress
|
||||
*/
|
||||
$billingaddress_id = false;
|
||||
|
||||
$customer_check_return = $this->checkIvtCustomer($ivt_customer);
|
||||
|
||||
if(!$customer_check_return || !array_key_exists("billingaddress_id", $customer_check_return) || !$customer_check_return["billingaddress_id"]) {
|
||||
echo "IVT Customer " . $ivt_contract->cid . " nicht im tool<br />\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
$billingaddress_id = $customer_check_return["billingaddress_id"];
|
||||
|
||||
/*
|
||||
* get thetool product from IvtProductMatch
|
||||
*/
|
||||
@@ -55,7 +67,6 @@ class Admin_IvtContractImport {
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
if(!$this->checkIvtProduct($productMatch->ivtproduct, $doit)) {
|
||||
exit;
|
||||
}
|
||||
@@ -63,6 +74,20 @@ class Admin_IvtContractImport {
|
||||
$ip = $productMatch->ivtproduct;
|
||||
$product = $productMatch->product;
|
||||
|
||||
/*
|
||||
* check ivt customer and get Billingaddress
|
||||
*/
|
||||
$billingaddress_id = false;
|
||||
|
||||
$customer_check_return = $this->checkIvtCustomer($ivt_contract, $ivt_customer, $product);
|
||||
|
||||
if(!$customer_check_return || !array_key_exists("billingaddress_id", $customer_check_return) || !$customer_check_return["billingaddress_id"]) {
|
||||
echo "IVT Customer " . $ivt_contract->cid . " nicht im tool<br />\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
$billingaddress_id = $customer_check_return["billingaddress_id"];
|
||||
|
||||
/*
|
||||
* get or create customer
|
||||
*/
|
||||
@@ -141,6 +166,8 @@ class Admin_IvtContractImport {
|
||||
$ignore = true;
|
||||
}
|
||||
|
||||
if($product->billing_period > 1 && $ivt_contract->last_date < "2023-04-08")
|
||||
|
||||
/*
|
||||
* Try to match ivt contract to thetool Order
|
||||
*/
|
||||
@@ -233,12 +260,16 @@ class Admin_IvtContractImport {
|
||||
if(count($contracts) < 2) continue;
|
||||
$prev_contracts = [];
|
||||
$primary_matchcode = false;
|
||||
$primary_matchcode_source_product_group = "";
|
||||
$primary_matchcode_no_productgroups_pattern = '/(Pauschalen|TV|Managed Services|Vorbestellung|Mobilfunk|Standortvernetzung|Colo|Vorort|Webhosting|zusatz)/i';
|
||||
|
||||
|
||||
foreach($contracts as $contract) {
|
||||
if($contract->matchcode && !$primary_matchcode && !preg_match('/(Pauschalen|TV|Managed Services|Vorbestellung|Mobilfunk|Standortvernetzung|Colo|Vorort|Webhosting|zusatz)/i',$contract->product->productgroup->name)) {
|
||||
if($contract->matchcode && !$primary_matchcode && !preg_match($primary_matchcode_no_productgroups_pattern, $contract->product->productgroup->name)) {
|
||||
$primary_matchcode = $contract->matchcode;
|
||||
$primary_matchcode_source_product_group = $contract->product->productgroup->name;
|
||||
}
|
||||
if($primary_matchcode && !$contract->matchcode) {
|
||||
if($primary_matchcode && !$contract->matchcode && !preg_match($primary_matchcode_no_productgroups_pattern, $primary_matchcode_source_product_group)) {
|
||||
$contract->matchcode = $primary_matchcode;
|
||||
$contract->save();
|
||||
}
|
||||
@@ -248,10 +279,20 @@ class Admin_IvtContractImport {
|
||||
continue;
|
||||
}
|
||||
foreach($prev_contracts as $prev) {
|
||||
if(!$prev->matchcode && $primary_matchcode) {
|
||||
if(!$prev->matchcode && $primary_matchcode && !preg_match($primary_matchcode_no_productgroups_pattern, $primary_matchcode_source_product_group)) {
|
||||
$prev->matchcode = $primary_matchcode;
|
||||
$prev->save();
|
||||
}
|
||||
if(preg_match('/Service Pauschale/i',$prev->product->name)) {
|
||||
foreach($contracts as $c) {
|
||||
if($c->termination_id && $c->matchcode) {
|
||||
$prev->matchcode = $c->matchcode;
|
||||
$prev->save();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (ContractLinkModel::getFirst(["contract_id" => $contract->id, "origin_contract_id" => $prev->id])) {
|
||||
continue;
|
||||
@@ -274,7 +315,7 @@ class Admin_IvtContractImport {
|
||||
return $data;
|
||||
}
|
||||
|
||||
private function checkIvtCustomer($ivt_customer, $doit = false)
|
||||
private function checkIvtCustomer($ivt_contract, $ivt_customer, $product, $doit = false)
|
||||
{
|
||||
$return = [];
|
||||
// create customer if not exists
|
||||
@@ -288,14 +329,8 @@ class Admin_IvtContractImport {
|
||||
die("Address $ivt_custnum not found!");
|
||||
}
|
||||
|
||||
// find order
|
||||
$order_count = OrderModel::count(["owner_id" => $owner->id, "finish_date" => true]);
|
||||
if ($order_count > 1) {
|
||||
die("Mehr als eine Bestellung für ivt_customer $ivt_custnum gefunden.\n" . print_r($owner, true));
|
||||
}
|
||||
$order = OrderModel::getFirst(["owner_id" => $owner->id, "finish_date" => true]);
|
||||
if (!$order) {
|
||||
$this->log->debug(__METHOD__ . ": No order for ivt customer $ivt_custnum");
|
||||
$order = $this->findOrder($ivt_contract);
|
||||
if(!$order) {
|
||||
return ["billingaddress_id" => $owner->id];
|
||||
}
|
||||
|
||||
@@ -511,6 +546,63 @@ class Admin_IvtContractImport {
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
private function findOrder($ivt_contract) {
|
||||
// find order
|
||||
$ivt_customer = $ivt_contract->customer;
|
||||
$ivt_product = $ivt_contract->product;
|
||||
|
||||
$productMatch = IvtProductMatchModel::getFirst(["ivt_product_id" => $ivt_contract->pid]);
|
||||
if(!$productMatch) {
|
||||
echo "Kein Match zu IVT Product " . $ivt_contract->pid . " gefunden.<br />\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
$product = $productMatch->product;
|
||||
|
||||
$owner = AddressModel::getFirst(["customer_number" => $ivt_customer->id]);
|
||||
if (!$owner) {
|
||||
//var_dump($ivt_customer, $ivt_contract);
|
||||
die("Address ".$ivt_customer->id." not found!");
|
||||
}
|
||||
|
||||
if(array_key_exists($ivt_contract->id, $this->static_ivt_order_match)) {
|
||||
$order_id = $this->static_ivt_order_match[$ivt_contract->id];
|
||||
if($order_id === false) {
|
||||
return false;
|
||||
}
|
||||
$order = new Order($order_id);
|
||||
if(!$order->id) {
|
||||
die("Manually specified order id ".$this->static_ivt_order_match[$ivt_contract->id]." not found for customer ".$ivt_customer->id);
|
||||
}
|
||||
return $order;
|
||||
} else {
|
||||
$order_count = OrderModel::count(["owner_id" => $owner->id, "finish_date" => true]);
|
||||
$order_id = false;
|
||||
|
||||
if ($order_count > 1) {
|
||||
$found_product = 0;
|
||||
foreach(OrderModel::search(["owner_id" => $owner->id, "finish_date" => true]) as $o) {
|
||||
// find the one with the right product
|
||||
foreach(OrderProductModel::search(["order_id" => $o->id, "product_id" => $product->id]) as $op) {
|
||||
$order_id = $op->id;
|
||||
$found_product++;
|
||||
}
|
||||
if($found_product > 1) {
|
||||
die("Mehr als eine Bestellung für ivt_customer ".$ivt_customer->id." gefunden.\n" . print_r($owner, true));
|
||||
}
|
||||
}
|
||||
$order = new Order($order_id);
|
||||
if(!$order) {
|
||||
die("Order $order_id not found");
|
||||
}
|
||||
return $order;
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private function getRadiusUser($ivt_customer, $ivt_product, $contract) {
|
||||
// find radius user (kundennummer in radius info feld
|
||||
$radius = new RadiusDB_Client();
|
||||
|
||||
Reference in New Issue
Block a user