request = $request; $this->db = FronkDB::singleton(); $this->log = mfLoghandler::singleton(); } public function runRequest() { $action = $this->request->do; if(!$action) { return $this->indexAction(); } else { $method = $action."Action"; if(method_exists($this, $method)) { return $this->$method(); } else { throw new Exception("Method ".htmlentities($method)." not found", "404"); } } } public function indexAction() { return [ "template" => "Admin/MassProductchange/Index", "redirect" => "", "templateVars" => [] ]; } public function createAction() { $this->log->debug("Create action called"); $this->log->debug(print_r($this->request->get(), true)); $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; } }