Files
thetool/application/Contractqueue/ContractqueueController.php
2024-04-05 12:21:54 +02:00

307 lines
10 KiB
PHP

<?php
class ContractqueueController extends mfBaseController {
protected function init() {
$this->needlogin=true;
$me = new User();
$me->loadMe();
$this->me = $me;
$this->layout()->set("me",$me);
if(!$me->is(["Admin"])) {
$this->redirect("Dashboard");
}
}
protected function indexAction() {
if($this->request->resetFilter) {
unset($_SESSION[MFAPPNAME.'-Contractqueue-filter']);
}
$filter = [];
if(is_array($this->request->filter)) {
$filter = $this->request->filter;
$_SESSION[MFAPPNAME.'-Contractqueue-filter'] = $filter;
} else {
if(array_key_exists(MFAPPNAME.'-Contractqueue-filter', $_SESSION) && count($_SESSION[MFAPPNAME.'-Contractqueue-filter'])) {
$filter = $_SESSION[MFAPPNAME.'-Contractqueue-filter'];
}
}
$this->layout->set("filter", array_map(fn($a) => htmlentities($a), $filter));
$filter = $this->getPreparedFilter($filter);
// pagination defaults
$pagination = [];
$pagination['start'] = 0;
$pagination['count'] = 50;
$pagination['maxItems'] = 0;
if(is_numeric($this->request->s)) {
$pagination['start'] = intval($this->request->s);
}
$filter["contract_id"] = null;
$pagination['maxItems'] = ContractqueueModel::count($filter);
$last_order_id = false;
$orders = [];
foreach(ContractqueueModel::search($filter, $pagination) as $contractq) {
$last_order_id = $contractq->order_id;
$orders[$contractq->order_id][] = $contractq;
}
if($last_order_id) {
$filter["order_id"] = $last_order_id;
$orders[$contractq->order_id] = [];
foreach(ContractqueueModel::search($filter, $pagination) as $contractq) {
$orders[$contractq->order_id][] = $contractq;
}
}
$this->layout()->set("orders", $orders);
$this->layout()->set("pagination", $pagination);
}
protected function getPreparedFilter($filter) {
return $filter;
}
protected function importFinishedOrdersAction() {
$o = 0;
$max_orders = 1500;
foreach(OrderModel::search(["finish_date<" => date("U")]) as $order) {
if(!is_array($order->products) || !count($order->products)) {
//echo "keine Produkte in Order ".$order->id."\n";
continue;
}
if(ContractqueueModel::getFirst(["order_id" => $order->id])) {
continue;
}
$contracts = [];
$primary_matchcode = false;
foreach($order->products as $op) {
$contract = ContractModel::getFirst(["orderproduct_id" => $op->id]);
if(!$contract) {
$contract = ContractqueueModel::getFirst(["orderproduct_id" => $op->id]);
}
if($contract && $contract->matchcode) {
$primary_matchcode = $contract->matchcode;
continue;
}
// if contract does not exist yet, create Contractqueue
$contract = ContractqueueModel::createFromOrderproduct($op);
// find reseller / receiver of credit
// from product
$product_attribs = $contract->product->attributes;
/*if($op->id == "8666") {
var_dump($product_attribs);exit;
}*/
if(is_array($product_attribs) && array_key_exists("crediting_partner", $product_attribs) && $product_attribs["crediting_partner"] && is_object($product_attribs["crediting_partner"])) {
if($product_attribs["crediting_partner"]->value) {
$contract->crediting_partner_id = $product_attribs["crediting_partner"]->value;
}
if($product_attribs["crediting_rate"]->value) {
$contract->crediting_partner_rate = str_replace(",", ".",$product_attribs["crediting_rate"]->value);
}
}
// or from netowner if anschluss product
if(!$contract->crediting_partner_id && $contract->termination_id) {
$contract->crediting_partner_id = $contract->termination->building->network->owner_id;
}
if($contract->matchcode) {
$primary_matchcode = $contract->matchcode;
}
$contract->crediting_matchcode = $order->owner->getCompanyOrName().", ".$order->owner->street.", ".$order->owner->zip." ".$order->owner->city;
$contracts[] = $contract;
}
if(!$primary_matchcode) {
$primary_matchcode = $order->owner->street.", ".$order->owner->zip." ".$order->owner->city;
}
$links = [];
// set matchcode and save
foreach($contracts as $contract) {
if(!$contract->matchcode) {
$contract->matchcode = $primary_matchcode;
}
//var_dump($contract);exit;
$contract->save();
/*if(!count($links)) {
$links[$contract->id] = $contract;
} elseif(!array_key_exists($contract->id, $links)) {
$first_link = reset($links);
$new_link = ContractLinkModel::create([
"contract_id" => $first_link->id,
"origin_contract_id" => $contract->id,
"type" => "link"
]);
$new_link->save();
$links[$contract->id] = $contract;
}*/
}
$o++;
if($o >= $max_orders) {
$this->layout()->setFlash("$o Bestellungen importiert, es gibt noch mehr Bestellungen zum importieren.", "info");
$this->redirect("Contractqueue");
}
}
$this->layout()->setFlash("Alle Bestellungen importiert", "success");
$this->redirect("Contractqueue");
}
protected function apiAction() {
if(!$this->me->is(["Admin"])) {
$this->redirect("Dashboard");
}
$do = $this->request->do;
$data = [];
switch($do) {
case "saveContract":
$return = $this->saveContractApi();
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 saveContractApi() {
$r = $this->request;
$valid_fields = [
"product" => "product_id",
"matchcode" => "matchcode",
"price" => "price",
"price_setup" => "price_setup",
"billing_period" => "billing_period",
"billing_delay" => "billing_delay"
];
$data = [];
foreach($r->get() as $f => $v) {
if(array_key_exists($f, $valid_fields)) {
$data[$valid_fields[$f]] = $v;
}
}
if(!count($data)) {
return false;
}
$cq = new Contractqueue($r->id);
if(!$cq->id) {
return false;
}
if(array_key_exists("product_id", $data)) {
$product = new Product($data["product_id"]);
if(!$product->id) {
$this->log->error(__METHOD__.": neue product_id nicht gefunden");
return false;
}
$data["product_name"] = $product->name;
}
$cq->update($data);
if(!$cq->save()) {
return false;
}
//var_dump($cq->product, $cq->product->attributes);exit;
// find reseller / receiver of credit
// from product
$product_attribs = $cq->product->attributes;
/*if($op->id == "8666") {
var_dump($product_attribs);exit;
}*/
$cq->crediting_partner_id = null;
$cq->crediting_partner_rate = null;
if(is_array($product_attribs) && array_key_exists("crediting_partner", $product_attribs) && $product_attribs["crediting_partner"] && is_object($product_attribs["crediting_partner"])) {
if($product_attribs["crediting_partner"]->value && $product_attribs["crediting_partner"]->value != $cq->crediting_partner_id) {
$cq->crediting_partner_id = $product_attribs["crediting_partner"]->value;
}
if($product_attribs["crediting_rate"]->value) {
$crediting_rate_price = round($cq->price / 100 * $product_attribs["crediting_rate"]->value, 4);
if($crediting_rate_price != $cq->crediting_partner_rate) {
$cq->crediting_partner_rate = $crediting_rate_price;
}
}
}
// or from netowner if anschluss product
if(!$cq->crediting_partner_id && $cq->termination_id && $cq->product->price_nne > 0) {
$cq->crediting_partner_id = $cq->termination->building->network->owner_id;
}
if(!$cq->save()) {
return false;
}
$return = [];
$return["product"] = $cq->product_id;
$return["product_name"] = $cq->product->name;
$return["termination"] = ($cq->termination_id) ? $cq->termination->code." ".str_replace("\n", " - ", $cq->termination->getAddress()) : null;
$return["matchcode"] = $cq->matchcode;
$return["price"] = $cq->price;
$return["price_setup"] = $cq->price_setup;
$return["billing_period"] = $cq->billing_period;
$return["billing_delay"] = $cq->billing_delay;
$credit = [];
$credit["crediting_rate"] = null;
$credit["crediting_partner_id"] = $cq->crediting_partner_id;
$credit["crediting_partner_name"] = "";
$credit["crediting_rate"] = 0;
$credit["crediting_matchcode"] = "";
if($cq->crediting_partner_id) {
$credit["crediting_partner_name"] = $cq->crediting_partner->getCompanyOrName();
if($cq->crediting_partner_rate) {
$credit["crediting_rate"] = $cq->crediting_partner_rate;
$credit["crediting_partner_name"] = "".number_format($cq->crediting_partner_rate, 4, ",",".")." (Prozentrate)";
} else {
$credit["crediting_rate"] = $cq->price_nne;
$credit["crediting_partner_name"] = "".number_format($cq->crediting_partner_rate, 4, ",",".")." (NNE)";
}
$credit["crediting_matchcode"] = $cq->crediting_matchcode;
}
return ["contract" => $return, "credit" => $credit];
}
}