From 26a59fb58800b0f0667ba9ba7f09269088647304 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Tue, 3 Jun 2025 12:33:00 +0200 Subject: [PATCH] Added Admin function mass prouductchange --- Layout/default/Admin/Index.php | 128 ++++--- .../default/Admin/MassProductchange/Index.php | 245 +++++++++++- application/Admin/AdminController.php | 31 ++ .../Admin/functions/MassProductchange.php | 243 ++++++++++-- application/Contract/Contract.php | 353 ++++++++++++++++++ application/Contract/ContractModel.php | 28 +- application/Product/ProductModel.php | 10 +- lib/mvcfronk/mfRequest/mfRequest.php | 4 + 8 files changed, 935 insertions(+), 107 deletions(-) diff --git a/Layout/default/Admin/Index.php b/Layout/default/Admin/Index.php index b152ce579..81b5fd926 100644 --- a/Layout/default/Admin/Index.php +++ b/Layout/default/Admin/Index.php @@ -17,65 +17,87 @@
-
-
Backoffice
-
-
- -
- +
+ + + +
+
+
Backoffice
+
-
-
- \ No newline at end of file diff --git a/Layout/default/Admin/MassProductchange/Index.php b/Layout/default/Admin/MassProductchange/Index.php index 50c26009d..3b72f5185 100644 --- a/Layout/default/Admin/MassProductchange/Index.php +++ b/Layout/default/Admin/MassProductchange/Index.php @@ -32,10 +32,10 @@
"create"])?>">
- - - +
@@ -43,40 +43,96 @@
+ Individuelle Produktnamen werden mit neuem Produktname überschrieben.
-
@@ -84,14 +140,155 @@
-
+ +
+
+
+
+

Produktwechsel Vorschau

+

Contracts zum Umstellen gefunden.

+

Hier werden alle Produktwechsel angezeigt, die erstellt werden.

+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Alter ContractNeuer Contract
Contract ID $oc->id])?>" target="_blank">id?>neu
Vertragsinhaber $oc->owner_id])?>" target="_blank">owner->getCompanyOrName()?> $nc->owner_id])?>" target="_blank">owner->getCompanyOrName()?>
Rechnungsempfänger $oc->billingaddress_id])?>" target="_blank">billingaddress->getCompanyOrName()?> $nc->billingaddress_id])?>" target="_blank">billingaddress->getCompanyOrName()?>
Matchcodematchcode?>matchcode?>
Produktnameproduct->name?>product->name?>
Contract Produktnameproduct_name?>product_name?>
Preisamount != 1) ? $oc->price * $oc->amount : $oc->price, 4, ",", ".")?>amount != 1) ? $nc->price * $nc->amount : $nc->price, 4, ",", ".")?>
Setup Preisprice_setup, 4, ",", ".")?>amount != 1) ? " (Gesamt: € ".number_format($oc->price_setup * $oc->amount, 4, ",", ".").")" : ""?>price_setup, 4, ",", ".")?>amount != 1) ? " (Gesamt: € ".number_format($nc->price_setup * $nc->amount, 4, ",", ".").")" : ""?>
+ +
+ +
+
Verknüpfungen
+ + + + + + + + + + + + + id): ?> + + + + + + + + + + product_id): ?> + + + + + + + + + + + + + + + + + + + + +
AktionContract IDMatchcodeProduktPreisSetup Preis
+ + Verknüpfung mit + + Verlinkten Contract kündigen + + id ?? "neu"?>matchcode?>product->name?>price < 0) ? "text-danger" : ""?>">€ amount != 1) ? $lc["link_from"]->price * $lc["link_from"]->amount : $lc["link_from"]->price, 4, ",", ".")?>price_setup, 4, ",", ".")?>amount != 1) ? " (Gesamt: € ".number_format($lc["link_from"]->price_setup * $lc["link_from"]->amount, 4, ",", ".").")" : ""?>
+ + Verknüpfung mit + + neue Gutschrift an owner->getCompanyOrName()?> + + Gutschrift kündigen + + + id ?? "neu"?>matchcode?>product->name?>price < 0) ? "text-danger" : ""?>">€ amount != 1) ? $lc["link_to"]->price * $lc["link_to"]->amount : $lc["link_to"]->price, 4, ",", ".")?>price_setup, 4, ",", ".")?>amount != 1) ? " (Gesamt: € ".number_format($lc["link_to"]->price_setup * $lc["link_to"]->amount, 4, ",", ".").")" : ""?>
Gutschriftid ?? "neu"?>matchcode?>owner->getCompanyOrName()?>price < 0) ? "text-danger" : ""?>">€ amount != 1) ? $lc["credit"]->price * $lc["credit"]->amount : $lc["credit"]->price, 4, ",", ".")?>price_setup, 4, ",", ".")?>amount != 1) ? " (Gesamt: € ".number_format($lc["credit"]->price_setup * $lc["credit"]->amount, 4, ",", ".").")" : ""?>
+ +
+
+ +
+
+ + + diff --git a/application/Admin/AdminController.php b/application/Admin/AdminController.php index 0a447f54b..77ecb2ff9 100644 --- a/application/Admin/AdminController.php +++ b/application/Admin/AdminController.php @@ -18,6 +18,37 @@ class AdminController extends mfBaseController { $this->layout()->setTemplate("Admin/Index"); } + + protected function massProductchangeAction() { + require_once(realpath(dirname(__FILE__)."/functions")."/MassProductchange.php"); + + $this->layout()->setTemplate("Admin/MassProductchange/Index"); + + $prodchange = new Admin_MassProductchange($this->request); + $response = $prodchange->runRequest(); + + foreach(["info", "success", "warning", "error"] as $level) { + if(array_key_exists($level, $response) && $response[$level]) { + $this->layout()->setFlash($response[$level], $level); + } + } + + if($response["redirect"]) { + $this->redirect($response["redirect"]); + } + + if($response["template"]) { + $this->layout()->setTemplate($response["template"]); + } + + if(is_array($response["templateVars"]) && count($response["templateVars"])) { + foreach($response["templateVars"] as $key => $value) { + $this->layout()->set($key, $value); + } + } + + + } protected function customerStatisticsAction() { $this->layout()->setTemplate("Admin/CustomerStatistics"); diff --git a/application/Admin/functions/MassProductchange.php b/application/Admin/functions/MassProductchange.php index 47e39f09a..bad96499a 100644 --- a/application/Admin/functions/MassProductchange.php +++ b/application/Admin/functions/MassProductchange.php @@ -23,7 +23,7 @@ class Admin_MassProductchange { if(method_exists($this, $method)) { return $this->$method(); } else { - throw new Exception("Method not found", "404"); + throw new Exception("Method ".htmlentities($method)." not found", "404"); } } } @@ -39,37 +39,226 @@ class Admin_MassProductchange { public function createAction() { $this->log->debug("Create action called"); - $this->log->debug($this->request->getPost()); + $this->log->debug(print_r($this->request->get(), true)); - $old_product_id = $this->request->getPost("old_product_id"); - $new_product_id = $this->request->getPost("new_product_id"); - - if(!$old_product_id || !$new_product_id) { - $this->flash[] = "Beide Produkte werden benötigt."; - return [ - "template" => "Admin/MassProductchange/Index", - "redirect" => "", - "templateVars" => [] - ]; - } - - $contracts = ContractModel::searchActive(["product_id" => $old_product_id]); - - - - if($this->request->preview) { - return [ - "template" => "Admin/MassProductchange/Index", - "redirect" => "", - "templateVars" => ["contracts" => $contracts] - ]; - } - - return [ + $return = [ "template" => "Admin/MassProductchange/Index", "redirect" => "", "templateVars" => [] ]; + + $r = $this->request; + $do_commit = $r->commit; + $linked_contracts_action = $r->linked_contracts_action; + $link_action_cancel_type = $r->link_action_cancel_type; + $exclude_termination_contracts = $r->exclude_termination_contracts; + $no_provision_credits = $r->no_provision_credits; + $price_type = $r->price_type; + $change_date = $r->change_date; + $old_product_ids = $r->old_product_ids; + $new_product_id = $r->new_product_id; + + $return["templateVars"]["linked_contracts_action"] = $linked_contracts_action; + $return["templateVars"]["link_action_cancel_type"] = $link_action_cancel_type; + $return["templateVars"]["exclude_termination_contracts"] = $exclude_termination_contracts; + $return["templateVars"]["no_provision_credits"] = $no_provision_credits; + $return["templateVars"]["price_type"] = $price_type; + $return["templateVars"]["change_date"] = $change_date; + $return["templateVars"]["old_product_ids"] = $old_product_ids; + $return["templateVars"]["new_product_id"] = $new_product_id; + + + + if(!$r->change_date) { + $return["error"] = "Fertigstellungsdatum ist erforderlich."; + return $return; + } + + try { + $finish_date = DateTime::createFromFormat("d.m.Y", $change_date, new DateTimeZone("Europe/Vienna")); + $finish_date->setTime(0,0,0); + } catch (Exception $e) { + $return["error"] = "Ungültiges Fertigstellungsdatum"; + return $return; + } + + + if(!is_array($old_product_ids) || !count($old_product_ids) || !$new_product_id) { + $return["error"] = "Beide Produkte werden benötigt."; + return $return; + } + + $old_products = []; + + foreach($old_product_ids as $product_id) { + $old_product = ProductModel::getOne($product_id); + if($old_product) $old_products[$old_product->id] = $old_product; + } + $new_product = ProductModel::getOne($new_product_id); + + $contract_search = [ + "product_id" => $old_product_ids, + "billing_period" => ">0", + "price>=" => "0", + "cancel_date" => null, + ]; + + if($exclude_termination_contracts) { + $contract_search["termination_id"] = null; + } + + $contracts = ContractModel::searchActive($contract_search, [ + "order_by" => "product_id, matchcode", + "limit" => 1000, + ]); + if(!$contracts) { + $return["error"] = "Keine passenden Verträge gefunden."; + return $return; + } + + $commit_setup_price = false; + if($r->commit_setup_price) { + $commit_setup_price = true; + } + + $results = []; + foreach($contracts as $contract) { + $new_price = $new_price_setup = $new_price_nne = $new_price_nbe = null; + + if($price_type == "keep") { + // Preise von bestehendem Contract übernehmen. + // Setup Preis wird nicht nochmal verrechnet. + $new_price = $contract->price; + $new_price_setup = 0; + $new_price_nne = $contract->price_nne; + $new_price_nbe = $contract->price_nbe; + } elseif($price_type == "from_new_product") { + // Preise vom neuen Produkt übernehmen. + // Setup Preis kann verrechnet werden, wenn angegeben. + $new_price = $new_product->price; + $new_price_setup = 0; + $new_price_nne = $new_product->price_nne; + $new_price_nbe = $new_product->price_nbe; + + if($commit_setup_price) { + $new_price_setup = $new_product->price_setup; + } + } elseif($price_type == "fixed") { + $new_price = Layout::commaToDot(trim($r->fix_price)); + $new_price_setup = Layout::commaToDot(trim($r->fix_price_setup)); + } + + if($old_products[$contract->product_id]->price > 0.0000 && $contract->price == 0.0000) { + // if old contract has a discount price of zero, keep it that way + $new_price = 0; + $new_price_setup = 0; + $new_price_nne = 0; + } + + $contract_data = []; + $contract_data['product_id'] = $new_product->id; + $contract_data['product_name'] = trim($new_product->name); + $contract_data['product_info'] = trim($contract->product_info); + $contract_data['matchcode'] = trim($contract->matchcode); + $contract_data['termination_id'] = $contract->termination_id; + $contract_data['amount'] = $contract->amount; + $contract_data['price'] = $new_price; + $contract_data['price_setup'] = $new_price_setup; + $contract_data['price_nne'] = $new_price_nne; + $contract_data['price_nbe'] = $new_price_nbe; + $contract_data["finish_date"] = $finish_date->format("d.m.Y"); + $contract_data['note'] = trim($r->note); + + + // get linked contracts + $link_data = []; + foreach(ContractLinkModel::includesContractId($contract->id, ["type" => ["link", "credit"]]) as $link) { + if($link->type == "credit") { + $link_data[$link->id] = [ + "action" => $linked_contracts_action, + "cancel_date" => null, + ]; + continue; + } + + $link_cancel_date = null; + if($linked_contracts_action == "cancel") { + // determine requested cancel date of linked contract + if($link_action_cancel_type == "finish_date") { + $lcd = clone $finish_date; + $lcd->modify("-1 day"); + $link_cancel_date = $lcd->format("d.m.Y"); + } + if($link_action_cancel_type == "link_contract_term") { + // Ende der Vertragslaufzeit + $link_cancel_date = $link->contract->getRegularCanceldate("d.m.Y"); + } + if($link_action_cancel_type == "link_billing_period") { + // Ende der aktuellen Verrechnungsperiode + $link_cancel_date = $link->contract->getNextBillingPeriodEnd("d.m.Y"); + } + } + + $link_data[$link->id] = [ + "action" => $linked_contracts_action, + "cancel_date" => $link_cancel_date, + ]; + } + + //if(!count($link_data)) continue; + //var_dump($link_data);exit; + + try { + $productchange_result = $contract->createProductchangeContract($contract_data, $link_data, [ + "link_action" => $linked_contracts_action, + "link_action_cancel_type" => $link_action_cancel_type, + "no_provision_credits" => $no_provision_credits, + ], [ + "ignore_missing_term" => true, + ]); + } catch (\Exception $e) { + $return["error"] = "Fehler beim Erstellen des Produktwechsels für Vertrag {$contract->id}: " . $e->getMessage(); + return $return; + } + + if(false && count($results) > 0) { + var_dump($productchange_result); + foreach($productchange_result["linked_contracts"] as $l) { + echo "Link FROM:"; + var_dump($l["link_from"]); + echo "Link TO:"; + var_dump($l["link_to"]); + + } + exit; + } + $results[] = $productchange_result; + } + + //var_dump($results);exit; + + if($do_commit) { + // commit all productchanges + foreach($results as $result) { + $old_contract = $result["old_contract"]; + $new_contract = $result["new_contract"]; + $links = $result["linked_contracts"]; + + if(!$old_contract->commitProductchangeContract($new_contract, $links)) { + $return["error"] = "Fehler beim Commit des Produktwechsels für Vertrag {$old_contract->id}"; + return $return; + } + } + + $return["success"] = count($results)." Produktwechsel erfolgreich durchgeführt."; + return $return; + + } + + $return["templateVars"]["contracts"] = $contracts; + $return["templateVars"]["change_contracts"] = $results; + + return $return; } } \ No newline at end of file diff --git a/application/Contract/Contract.php b/application/Contract/Contract.php index 1a491e157..48c552cfa 100644 --- a/application/Contract/Contract.php +++ b/application/Contract/Contract.php @@ -535,6 +535,359 @@ class Contract extends mfBaseModel { } + public function createProductchangeContract($new_product_data, $links = [], $options = []) { + $contract_cancel_date = null; + $me = new User(); + $me->loadMe(); + + $ignore_missing_term = $options["ignore_missing_term"] ?? false; + $no_provision_credits = $options["no_provision_credits"] ?? false; + + $new_contract = clone $this; + $linked_contracts = []; + + foreach($new_product_data as $field => $value) { + $new_contract->$field = $value; + } + + /* + * Product check + */ + $product = new Product($new_contract->product_id); + if (!$product->id) { + throw new Exception("Produkt nicht gefunden."); + } + + $new_contract->product_external = $product->external; + $new_contract->product_external_id = $product->external_id; + $new_contract->sla_id = $product->sla_id; + + // finish date + if (array_key_exists("finish_date", $new_product_data) && $new_product_data["finish_date"]) { + try { + $finish_date = DateTime::createFromFormat("d.m.Y", $new_product_data["finish_date"], new DateTimeZone("Europe/Vienna")); + } catch (Exception $e) { + throw new Exception("Ungültiges Kündigungsdatum"); + } + + $finish_date->setTime(0, 0, 0); + $new_contract->finish_date = $finish_date->getTimestamp(); + + $contract_cancel_date = clone($finish_date); + $contract_cancel_date->modify("-1 day"); + $contract_cancel_date->setTime(23, 59, 59); + } + + // termination_id + $require_term = false; + if (array_key_exists(TT_ATTRIB_TERMINATION_REQUIRED_NAME, $product->attributes) && $product->attributes[TT_ATTRIB_TERMINATION_REQUIRED_NAME]->value == 1) { + + $require_term = true; + $termination = new Termination($this->termination_id); + + if ($ignore_missing_term && (!$new_product_data['termination_id'] || !$termination->id)) { + throw new Exception("Produkt erfordert Anschluss."); + } + } else { + $new_contract->termination_id = null; + } + + // lookup credit contract and if it's missing in $r->links + if (!$me->is("Admin")) { + $credit_links = ContractLinkModel::includesContractId($this->id, ["type" => "credit"]); + foreach($credit_links as $credit_link) { + if(!$credit_link->contract->isFinished()) continue; + $links[$credit_link->id] = [ + "action" => "keep" + ]; + } + } + + + // TODO: Contractconfig übernehmen + + if ($contract_cancel_date) { + $this->cancel_date = $contract_cancel_date->getTimestamp(); + $this->edit_by = $me->id; + //$contract->save(); + } + + /* + * Hndle Linked Contracts + */ + + $handled_credit_contract = false; + + if (is_array($links) && count($links)) { + foreach ($links as $link_id => $link_data) { + $action = $link_data["action"]; + $cancel_date = false; + if ($link_data["cancel_date"]) { + try { + $cancel_date = DateTime::createFromFormat("d.m.Y", $link_data["cancel_date"], new DateTimeZone("Europe/Vienna")); + } catch (Exception $e) { + throw new Exception("Ungültiges Kündigungsdatum"); + } + } + + + $old_link = new ContractLink($link_id); + if (!$old_link->id) continue; + +// check if link contains this contract + if ($old_link->contract_id == $this->id) { + $origin_id = $old_link->origin_contract_id; + $link_contract_id = $old_link->contract_id; + + $new_link_contract_id = $new_contract->id; + $new_link_origin_id = $old_link->origin_contract_id; + } elseif ($old_link->origin_contract_id == $this->id) { + $origin_id = $old_link->contract_id; + $link_contract_id = $old_link->origin_contract_id; + + $new_link_contract_id = $old_link->contract_id; + $new_link_origin_id = $new_contract->id; + } else { + continue; + } + + if ($action != "cancel" && $old_link->type != "credit") { + /*$new_link = ContractLinkModel::create([ + 'contract_id' => $new_link_contract_id, + 'origin_contract_id' => $new_link_origin_id, + 'type' => $old_link->type, + ]);*/ + $link_from_id = $new_link_contract_id; + if(!$link_from_id) $link_from_id = $new_link_origin_id; + $linked_contracts[] = [ + "action" => "keep", + "link_from" => new Contract($link_from_id), + "link_to" => "new_contract", + "credit" => null, + ]; + /*if($new_contract->owner_id == 3997) { + var_dump($link_from_id); + var_dump($new_link_origin_id, $new_link_contract_id, $old_link);exit; + }*/ + /*if (!$new_link->save()) { + throw new Exception("Konnte neuen Link nicht speichern"); + }*/ + } + + if ($action == "cancel") { + if ($cancel_date && $contract_cancel_date) { +// insert cancel_date in old contract + $lc = new Contract($origin_id); + $lc->cancel_date = $cancel_date->getTimestamp(); + $linked_contracts[] = [ + "action" => "cancel", + "link_from" => $lc, + "link_to" => null, + "credit" => null, + ]; + //$lc->save(); + } else { +// leave cancellation for later (when finishing upgrade) + $old_link->change_action = "cancel"; + if (!$old_link->save()) { + $this->layout()->setFlash("Konnte alten Link nicht speichern", "warn"); + } + } + + } + + if (!$no_provision_credits && $old_link->type == "credit" && $action == "keep") { + $handled_credit_contract = true; +// XXX - if we have finish date then recreate credit contract right now + if ($contract_cancel_date) { + $new_credit = ContractModel::createCreditForContract($new_contract); + + + if(!$new_credit) { + // new product does not require Credit Contract + // or if contract was imported from IVT, credit contract cannot be created because of missing termination_id + // so creating is manually + + if($this->imported_from = "ivt") { + // get crediting partner + $credit_contract = new Contract($origin_id); + if($credit_contract->price > 0) { + // in case contract and origin are swapped + $credit_contract = new Contract($link_contract_id); + if($credit_contract->price > 0) { + $this->log->warn(__METHOD__.": Unable to create credit contract for product change, because can't determine original crediting contract."); + } + } + + if($credit_contract->price < 0) { + $crediting_partner_id = $credit_contract->owner_id; + $new_credit = ContractModel::createCreditForContract($new_contract, $crediting_partner_id); + /*if($new_contract->owner_id != 727) { + var_dump($new_credit); + exit; + }*/ + } + } + } + + //$new_credit->save(); + + // create journal for credit + /*$journal = ContractjournalModel::create(['contract_id' => $new_credit->id, + 'type' => "created_from", + 'value' => "productchange", + 'text' => "Produkt-/Standortwechsel von Contract ID " . $new_link_origin_id]); + $journal->save();*/ + + + $this->log->debug(print_r($new_credit, true)); + + // set cancel date for old credit + $old_credit = new Contract($origin_id); + $old_credit->cancel_date = $contract_cancel_date->getTimestamp(); + //$old_credit->save(); + +// create link to new credit contract + /*$link = ContractLinkModel::create(["contract_id" => $new_credit->id, + "origin_contract_id" => $new_contract->id, + "type" => "credit"]); + $link->save();*/ + +// create upgrade link from old to new credit contract + /*$link = ContractLinkModel::create(["contract_id" => $new_credit->id, + "origin_contract_id" => $origin_id, + "type" => "upgrade"]); + $link->save();*/ + + $linked_contracts[] = [ + "action" => "create_credit", + "link_from" => $new_contract, + "link_to" => $new_credit, + ]; + $linked_contracts[] = [ + "action" => "cancel_credit", + "link_from" => $new_contract, + "link_to" => $old_credit, + ]; + + } else { + $old_link->change_action = "recreate"; + //$old_link->save(); + } + + } + +//var_dump($new_link);exit; + } + } + + if(!$no_provision_credits && !$handled_credit_contract) { + // there was no credit contract linked before, so try creating one + $credit_contract = ContractModel::createCreditForContract($new_contract); + if(is_object($credit_contract)) { + $linked_contracts[] = [ + "action" => "create_credit", + "link_from" => $new_contract, + "link_to" => $credit_contract, + ]; + } else { + $this->log->warn("Konnte keinen Credit Contract für Produktwechsel erstellen."); + } + + } + + + return [ + "new_contract" => $new_contract, + "old_contract" => $this, + "linked_contracts" => $linked_contracts, + ]; + } + + /* + * To commit the product change, old and new contract only need to be saved. They are prepared by createProductchangeContract() already + * Links need to be created depending on action: + * - for action keep: create ContractLink from link_from to link_to + * - for action cancel: save link_from (has cancel_date already) + * - for action create_credit: save link_to (new credit contract), link link_to (credit) to link_from (new contract) + * - for action cancel_credit: save link_to (old credit to cancel), ignore link_from (new contract) + * + * + * + */ + public function commitProductchangeContract(\Contract $new_contract, $links = []) { + if(!count($links)) return true; + if($new_contract->owner_id==3476) return true; + + $this->startTransaction(); + + if(!$this->save()) { + $this->rollbackTransaction(); + return false; + } + if(!$new_contract->save()) { + $this->rollbackTransaction(); + return false; + } + // TODO + //$new_contract->copyConfigFromContractId($this->id); + + $link = ContractLinkModel::create(['contract_id' => $new_contract->id, + 'origin_contract_id' => $this->id, + 'type' => "upgrade"]); + $link->save(); + $journal = ContractjournalModel::create(['contract_id' => $new_contract->id, + 'type' => "created_from", + 'value' => "productchange", + 'text' => "Produkt-/Standortwechsel von Contract ID " . $this->id]); + $journal->save(); + + foreach($links as $link) { + //var_dump($link);exit; + $origin = $link["link_from"]; + $to = $link["link_to"]; + $action = $link["action"]; + + if($action == "keep") { + if($to == "new_contract") { + $to = $new_contract; + } + //var_dump($origin, $to);exit; + if(!is_object($origin) || !is_object($to)) continue; + $new_link = ContractLinkModel::create([ + 'contract_id' => $to->id, + 'origin_contract_id' => $origin->id, + 'type' => "link", + ]); + //var_dump($link, $new_link);exit; + if(!$new_link->save()) { + $this->rollbackTransaction(); + return false; + } + } + } + + + + $this->commitTransaction(); + return true; + + var_dump($new_link);exit; + + var_dump($this); + var_dump($new_contract); + //var_dump($links); + //var_dump($links); + foreach($links as $link) { + echo var_dump($link["action"]) . "\n
"; + echo "LINK FROM"; + var_dump($link["link_from"]); + echo "LINK TO"; + var_dump($link["link_to"]); + } + exit; + } + public function getProperty($name) { if($this->$name == null) { diff --git a/application/Contract/ContractModel.php b/application/Contract/ContractModel.php index 46bcafb1e..cf0b6ba16 100644 --- a/application/Contract/ContractModel.php +++ b/application/Contract/ContractModel.php @@ -200,15 +200,15 @@ class ContractModel { * @param Contract $contract * @return bool|Contract */ - public static function createCreditForContract($contract) { + public static function createCreditForContract($contract, $crediting_partner_id_override = null) { $log = mfLoghandler::singleton(); $me = new User(); $me->loadMe(); - if(!$contract->id) { + /*if(!$contract->id) { $log->warning(__METHOD__."(): Invalid Contract object"); return false; - } + }*/ $product = $contract->product; $owner = $contract->owner; @@ -224,18 +224,26 @@ class ContractModel { $crediting_partner_id = false; $crediting_partner_rate = false; + if($crediting_partner_id_override) { + $crediting_partner_id = $crediting_partner_id_override; + } + $product_attribs = $product->attributes; 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) { - $crediting_partner_id = $product_attribs["crediting_partner"]->value; + if(!$crediting_partner_id_override) { + if($product_attribs["crediting_partner"]->value) { + $crediting_partner_id = $product_attribs["crediting_partner"]->value; + } } if($product_attribs["crediting_rate"]->value) { $crediting_partner_rate = str_replace(",", ".",$product_attribs["crediting_rate"]->value); } } + //var_dump($crediting_partner_rate, $product); + // or from netowner if anschluss product - if(!$crediting_partner_id && $contract->termination_id) { + if(!$crediting_partner_id_override && !$crediting_partner_id && $contract->termination_id) { $crediting_partner_id = $contract->termination->building->network->owner_id; } @@ -551,6 +559,8 @@ class ContractModel { } elseif($termination_id) { $termination_id = FronkDB::singleton()->escape($filter['termination_id']); $where .= " AND Contract.termination_id = $termination_id"; + } elseif($termination_id === null || $termination_id === false || $termination_id == 0) { + $where .= " AND (Contract.termination_id = 0 OR Contract.termination_id IS NULL)"; } } @@ -624,8 +634,12 @@ class ContractModel { if(array_key_exists("billing_period", $filter)) { $billing_period = $filter['billing_period']; - if(is_numeric($billing_period)) { + if($billing_period == ">0") { + $where .= " AND Contract.billing_period > 0"; + }elseif(is_numeric($billing_period)) { $where .= " AND Contract.billing_period=$billing_period"; + }elseif(is_array($billing_period) && count($billing_period)) { + $where .= " AND Contract.billing_period IN (".implode(",", $billing_period).")"; } } diff --git a/application/Product/ProductModel.php b/application/Product/ProductModel.php index bb2638e8d..eafe20bd4 100644 --- a/application/Product/ProductModel.php +++ b/application/Product/ProductModel.php @@ -50,14 +50,18 @@ class ProductModel { if(!is_numeric($id) || !$id) { throw new Exception("Invalid number", 400); } - $item = []; + $item = null; $db = FronkDB::singleton(); $res = $db->select("Product", "*", "id=$id LIMIT 1"); if($db->num_rows($res)) { - $data = $db->fetch_object($res); - $item = new Product($data); + $data = $db->fetch_object($res); + $item = new Product($data); + if(!$item->id) { + return null; + } } + return $item; } diff --git a/lib/mvcfronk/mfRequest/mfRequest.php b/lib/mvcfronk/mfRequest/mfRequest.php index 9cf4abe96..b2e9287e9 100644 --- a/lib/mvcfronk/mfRequest/mfRequest.php +++ b/lib/mvcfronk/mfRequest/mfRequest.php @@ -78,4 +78,8 @@ class mfRequest { public function __get($name) { return $this->get($name); } + + public function __isset($name) { + return $this->isset($name); + } } \ No newline at end of file