From 3a206603848439d2e221d2d9627e8285b9547ba1 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Thu, 10 Oct 2024 20:24:09 +0200 Subject: [PATCH] Added Readonly Preorder API user (Meridiam) --- .../Api/v1/Modules/Preorder/Activation.php | 2 + application/Api/v1/Modules/Preorder/Cif.php | 4 + application/Api/v1/PreorderApicontroller.php | 2141 +++++++++-------- 3 files changed, 1098 insertions(+), 1049 deletions(-) diff --git a/application/Api/v1/Modules/Preorder/Activation.php b/application/Api/v1/Modules/Preorder/Activation.php index d29d30111..a669547bf 100644 --- a/application/Api/v1/Modules/Preorder/Activation.php +++ b/application/Api/v1/Modules/Preorder/Activation.php @@ -18,6 +18,8 @@ class Activation extends Modules\ApiControllerModule { * POST /preorder/:code/serviceActivated */ public function setServiceActive($code) { + if($this->me->is("Preorderreadonly")) return \mfResponse::Forbidden(); + $code = trim($code); if(!$code) { return \mfResponse::NotFound(["message" => "Preorder not found"]); diff --git a/application/Api/v1/Modules/Preorder/Cif.php b/application/Api/v1/Modules/Preorder/Cif.php index 793c445c7..dc8c16b00 100644 --- a/application/Api/v1/Modules/Preorder/Cif.php +++ b/application/Api/v1/Modules/Preorder/Cif.php @@ -18,6 +18,8 @@ class Cif extends Modules\ApiControllerModule { * GET /preorder/:code/clientInstallationFinished */ public function providerSetCif($code) { + if($this->me->is("Preorderreadonly")) return \mfResponse::Forbidden(); + $code = trim($code); if(!$code) { return \mfResponse::NotFound(["message" => "Preorder not found"]); @@ -59,6 +61,7 @@ class Cif extends Modules\ApiControllerModule { * GET /preorder/customerInstallationFeedback */ public function getCifData() { + if($this->me->is("Preorderreadonly")) return \mfResponse::Forbidden(); if(!array_key_exists("ciftoken", $this->get) || !$this->get['ciftoken']) { return \mfResponse::BadRequest(["message" => "ciftoken missing"]); @@ -91,6 +94,7 @@ class Cif extends Modules\ApiControllerModule { * POST /preorder/customerInstallationFeedback */ public function userSetCif() { + if($this->me->is("Preorderreadonly")) return \mfResponse::Forbidden(); //return \mfResponse::InternalServerError(); $ciftoken = false; diff --git a/application/Api/v1/PreorderApicontroller.php b/application/Api/v1/PreorderApicontroller.php index 2d5ae6447..113c0cd87 100644 --- a/application/Api/v1/PreorderApicontroller.php +++ b/application/Api/v1/PreorderApicontroller.php @@ -1,1103 +1,1146 @@ db(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); - $this->allowMissingOrigin = true; - } - - protected function registerRoutes() { - - /* - * TODO: Load Api Modules automatically in mfBaseApiController - */ - $modules = []; - foreach(["Cif", "Activation"] as $moduleName) { - $classname = "application\\Api\\v1\\Modules\\Preorder\\".$moduleName; - $modules[$moduleName] = new $classname([ - "get" => $this->get, - "post" => $this->post, - "db" => $this->db(), - "me" => $this->me - ]); - } - - - - $this->addRoute("/preorder", "submitPreorder", "POST"); - $this->addRoute("/preorder/open", "getOpenPreorders", "GET"); - $this->addRoute("/preorder/all", "getAllPreorders", "GET"); - $this->addRoute("/preorder/customerInstallationFeedback", [$modules["Cif"], "getCifData"], "GET"); - $this->addRoute("/preorder/customerInstallationFeedback", [$modules["Cif"], "userSetCif"], "POST"); - $this->addRoute("/preorder/fullexport", "exportPreorders", "GET"); + //private $filter_gemeinde_ids = []; + //private $campaign; - $this->addRoute("/preorder/:code/clientInstallationFinished", [$modules["Cif"], "providerSetCif"], "POST"); - $this->addRoute("/preorder/:code/serviceActivated", [$modules["Activation"], "setServiceActive"], "POST"); - $this->addRoute("/preorder/:code", "getPreorder", "GET"); - $this->addRoute("/preorder/:code", "cancelPreorder", "DELETE"); + private $campaign; + private $campaigns = []; + private $filter_salescluster_ids = []; + private $campaigns_by_scluster = []; - - - } - - /* - * is called after User is authenticated by API Key - */ - protected function authenticated() { - $this->registerRoutes(); - - if($this->me->is("preorderaddressreporting")) { - return mfResponse::Forbidden(); - } - - $campaignApiusers = PreordercampaignApiuserModel::search(["worker_id" => $this->me->id]); - - foreach($campaignApiusers as $campaignApiuser) { - $campaign = new Preordercampaign($campaignApiuser->preordercampaign_id); - if($campaign->id) { - foreach(PreordercampaignSalesclusterModel::search(['preordercampaign_id' => $campaign->id]) as $campain_scluster) { - if(!in_array($campain_scluster->salescluster_id, $this->filter_salescluster_ids)) { - $this->filter_salescluster_ids[] = $campain_scluster->salescluster_id; - } - - $this->campaigns_by_scluster[$campain_scluster->salescluster_id] = $campaign->id; - - } - $this->campaigns[$campaign->id] = $campaign; - - // get allowed preordertypes - if(is_array($campaign->types) && count($campaign->types)) { - foreach($campaign->types as $type) { - $this->allowed_preordertypes[] = $type->type; - } - } - - if($campaign->district_is_city == 1) { - $this->district_is_city = true; - } - if($campaign->hausnummer_add_zusatz == 1) { - $this->hausnummer_add_zusatz = true; - } - if($campaign->exist_is_error == 1) { - $this->exist_is_error = true; - } - if($campaign->require_connectiontype == 1) { - $this->require_connectiontype = true; - } - if($campaign->allow_unit_update == 1) { - $this->allow_unit_update = true; - } - } else { - $this->log->debug(__METHOD__.": campaign not found (PreordercampaignApiuser::preordercampaign_id ".$campaignApiuser->preordercampaign_id.")"); - $this->log->debug(print_r($campaignApiuser, true)); - } - - + private $allowed_preordertypes = []; + private $district_is_city = false; + private $hausnummer_add_zusatz = false; + private $exist_is_error = false; + private $require_connectiontype = false; + private $allow_unit_update = false; - foreach(PreordercampaignOriginhostnameModel::search(['preordercampaign_id' => $campaign->id]) as $origin) { - $this->addAllowedOrigin($origin->hostname); - } - } - - $this->allowed_preordertypes = array_unique($this->allowed_preordertypes); - } - - protected function exportPreorders() { - if($this->me->username != 'r.eschner@rmlinfrastruktur.at') { - return mfResponse::Forbidden(); - } - - if($this->me->is("Admin")) { - $my_networks = NetworkModel::getAll(); - } else { - $my_networks = $this->me->myNetworks(["netowner", "salespartner"]); - } - - $netzgebiet_ids = []; - $my_adb_networks = []; - foreach($my_networks as $network) { - if($network->adb_netzgebiet_id && !in_array($network->adb_netzgebiet_id, $netzgebiet_ids)) { - $netzgebiet_ids[] = $network->id; - $my_adb_networks[$network->adb_netzgebiet_id] = new ADBNetzgebiet($network->adb_netzgebiet_id); - } - } - $preorder_filter = []; - - $campaign_ids = []; - foreach(PreordercampaignModel::search(["network_id" => $netzgebiet_ids]) as $campaign) { - if(!in_array($campaign->id, $campaign_ids)) { - $campaign_ids[] = $campaign->id; - } - } - - $preorder_filter["preordercampaign_id"] = $campaign_ids; - - // Get mysqli resource from Model, so layout can output data as it's retrieved - // Works around lousy performance and horrendous memory usage - $res = PreorderModel::searchActive($preorder_filter, [], true); - - - $tpl = new Layout(); - $tpl->setTemplate("Preorder/export.csv"); - $tpl->set("res", $res); - $tpl->set("no_filename", true); - $tpl->display(); - //$csv = $tpl->render(); - //echo $csv; - exit; - - } - - protected function getOpenPreorders() { - $ts = $this->get['ts']; - - $update_ts = 0; - - if($ts) { - if(is_numeric($ts)) { - $update_ts = $ts; - } else { - $update_date = new DateTime($ts); - if($update_date) { - $update_ts = $update_date->format('U'); - } - } - } - - // nicht auf cluster einschränken, sondern auf partner_id - /* - $preorder_search = []; - if(count($this->filter_salescluster_ids)) { - $preorder_search['netzgebiet_id'] = $this->filter_salescluster_ids; - }*/ - - $preorder_search = []; - if(!$this->me->preorderaddressreporting) { - $preorder_search['partner_id'] = $this->me->address_id; + protected function init() { + $db = $this->db(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); + $this->allowMissingOrigin = true; } - if($update_ts) { - $preorder_search['add-where'] = "AND tt_preorder.`edit` > $update_ts"; - } else { - // if no timestamp, return only open orders (500 == finished) - $preorder_search['getApiArray(); - } + protected function registerRoutes() { - $this->requestLog->debug(print_r($return, true)); - return mfResponse::Ok(["preorders" => $return]); - } - - protected function getAllPreorders() { - - // nicht auf cluster einschränken, sondern auf partner_id /* + * TODO: Load Api Modules automatically in mfBaseApiController + */ + $modules = []; + foreach(["Cif", "Activation"] as $moduleName) { + $classname = "application\\Api\\v1\\Modules\\Preorder\\" . $moduleName; + $modules[$moduleName] = new $classname([ + "get" => $this->get, + "post" => $this->post, + "db" => $this->db(), + "me" => $this->me + ]); + } + + + $this->addRoute("/preorder", "submitPreorder", "POST"); + $this->addRoute("/preorder/open", "getOpenPreorders", "GET"); + $this->addRoute("/preorder/all", "getAllPreorders", "GET"); + $this->addRoute("/preorder/customerInstallationFeedback", [$modules["Cif"], "getCifData"], "GET"); + $this->addRoute("/preorder/customerInstallationFeedback", [$modules["Cif"], "userSetCif"], "POST"); + $this->addRoute("/preorder/fullexport", "exportPreorders", "GET"); + + $this->addRoute("/preorder/:code/clientInstallationFinished", [$modules["Cif"], "providerSetCif"], "POST"); + $this->addRoute("/preorder/:code/serviceActivated", [$modules["Activation"], "setServiceActive"], "POST"); + $this->addRoute("/preorder/:code", "getPreorder", "GET"); + $this->addRoute("/preorder/:code", "cancelPreorder", "DELETE"); + + + } + + /* + * is called after User is authenticated by API Key + */ + protected function authenticated() { + $this->registerRoutes(); + + /*if($this->me->is("preorderaddressreporting")) { + return mfResponse::Forbidden(); + }*/ + + $campaignApiusers = PreordercampaignApiuserModel::search(["worker_id" => $this->me->id]); + + foreach($campaignApiusers as $campaignApiuser) { + $campaign = new Preordercampaign($campaignApiuser->preordercampaign_id); + if($campaign->id) { + foreach(PreordercampaignSalesclusterModel::search(['preordercampaign_id' => $campaign->id]) as $campain_scluster) { + if(!in_array($campain_scluster->salescluster_id, $this->filter_salescluster_ids)) { + $this->filter_salescluster_ids[] = $campain_scluster->salescluster_id; + } + + $this->campaigns_by_scluster[$campain_scluster->salescluster_id] = $campaign->id; + + } + $this->campaigns[$campaign->id] = $campaign; + + // get allowed preordertypes + if(is_array($campaign->types) && count($campaign->types)) { + foreach($campaign->types as $type) { + $this->allowed_preordertypes[] = $type->type; + } + } + + if($campaign->district_is_city == 1) { + $this->district_is_city = true; + } + if($campaign->hausnummer_add_zusatz == 1) { + $this->hausnummer_add_zusatz = true; + } + if($campaign->exist_is_error == 1) { + $this->exist_is_error = true; + } + if($campaign->require_connectiontype == 1) { + $this->require_connectiontype = true; + } + if($campaign->allow_unit_update == 1) { + $this->allow_unit_update = true; + } + } else { + $this->log->debug(__METHOD__ . ": campaign not found (PreordercampaignApiuser::preordercampaign_id " . $campaignApiuser->preordercampaign_id . ")"); + $this->log->debug(print_r($campaignApiuser, true)); + } + + + foreach(PreordercampaignOriginhostnameModel::search(['preordercampaign_id' => $campaign->id]) as $origin) { + $this->addAllowedOrigin($origin->hostname); + } + } + + $this->allowed_preordertypes = array_unique($this->allowed_preordertypes); + } + + protected function exportPreorders() { + if($this->me->username != 'r.eschner@rmlinfrastruktur.at') { + return mfResponse::Forbidden(); + } + + if($this->me->is("Admin")) { + $my_networks = NetworkModel::getAll(); + } else { + $my_networks = $this->me->myNetworks(["netowner", "salespartner"]); + } + + $netzgebiet_ids = []; + $my_adb_networks = []; + foreach($my_networks as $network) { + if($network->adb_netzgebiet_id && !in_array($network->adb_netzgebiet_id, $netzgebiet_ids)) { + $netzgebiet_ids[] = $network->id; + $my_adb_networks[$network->adb_netzgebiet_id] = new ADBNetzgebiet($network->adb_netzgebiet_id); + } + } + $preorder_filter = []; + + $campaign_ids = []; + foreach(PreordercampaignModel::search(["network_id" => $netzgebiet_ids]) as $campaign) { + if(!in_array($campaign->id, $campaign_ids)) { + $campaign_ids[] = $campaign->id; + } + } + + $preorder_filter["preordercampaign_id"] = $campaign_ids; + + // Get mysqli resource from Model, so layout can output data as it's retrieved + // Works around lousy performance and horrendous memory usage + $res = PreorderModel::searchActive($preorder_filter, [], true); + + + $tpl = new Layout(); + $tpl->setTemplate("Preorder/export.csv"); + $tpl->set("res", $res); + $tpl->set("no_filename", true); + $tpl->display(); + //$csv = $tpl->render(); + //echo $csv; + exit; + + } + + protected function getOpenPreorders() { + $ts = $this->get['ts']; + + $update_ts = 0; + + if($ts) { + if(is_numeric($ts)) { + $update_ts = $ts; + } else { + try { + $update_date = new DateTime($ts); + } catch(\Exception $e) { + return mfResponse::BadRequest(["message" => "Invalid Timestamp format"]); + } + if($update_date) { + $update_ts = $update_date->format('U'); + } + } + } + + // auf cluster und partner_id einschränken + $preorder_search = []; if(count($this->filter_salescluster_ids)) { $preorder_search['netzgebiet_id'] = $this->filter_salescluster_ids; - }*/ + } $preorder_search = []; - if($this->me->preorderaddressreporting) { - + if($this->me->is("preorderaddressreporting")) { + $user_networks_json = $this->me->getFlag("preorder_networks"); + $user_networks = json_decode($user_networks_json); + + if(!is_array($user_networks) || !count($user_networks)) { + return mfResponse::Forbidden(); + } + + $user_campaigns = []; + foreach($user_networks as $un) { + $uc = PreordercampaignModel::getFirst(["network_id" => $un]); + if($uc) { + $user_campaigns[] = $uc->id; + } + } + + $preorder_search['preordercampaign_id'] = $user_campaigns; + } else { - // providers see their own orders $preorder_search['partner_id'] = $this->me->address_id; } - // if no timestamp, return only open orders (500 == finished) - $preorder_search['getApiArray(); } - $this->requestLog->debug(print_r($return, true)); + //$this->requestLog->debug(print_r($return, true)); return mfResponse::Ok(["preorders" => $return]); } - - protected function getPreorder($code) { - $code = trim($code); - if(!$code) { - return mfResponse::NotFound(["message" => "Preorder not found"]); - } - - $preorder = PreorderModel::getFirst(['ucode' => strtoupper($code), 'partner_id' => $this->me->address_id]); - if(!$preorder) { - // try as extref - $preorder = PreorderModel::getFirst(['extref' => $code, 'partner_id' => $this->me->address_id]); - } - if(!$preorder) { - // try oan id - $preorder = PreorderModel::getFirst(['oaid' => strtolower($code), 'partner_id' => $this->me->address_id], "`create` DESC"); - } - - if(!$preorder) { - return mfResponse::NotFound(["message" => "Preorder not found"]); - } - - - if($preorder->partner_id != $this->me->address_id) { - return mfResponse::NotFound(["message" => "Preorder not found"]); - } - - $return = $preorder->getApiArray(); - if(!$return) { - return mfResponse::NotFound(["message" => "Preorder not found"]); - } - - return mfResponse::Ok($return); - - } - - protected function cancelPreorder($code) { - /* - $code = trim(strtoupper($code)); - if(!$code) { - return mfResponse::NotFound(["message" => "Preorder not found"]); - } - - $preorder = PreorderModel::getFirst(['ucode' => $code, 'partner_id' => $this->me->address_id, 'deleted' => 0, ' 800]); - if(!$preorder) { - // try oan id - $preorder = PreorderModel::getFirst(['oaid' => $code, 'partner_id' => $this->me->address_id, 'deleted' => 0, ' 800]); - if(!$preorder) { - return mfResponse::NotFound(["message" => "Preorder not found or cancelled already"]); - } - }*/ - - $code = trim($code); - if(!$code) { - return mfResponse::NotFound(["message" => "Preorder not found"]); - } - $preorder = PreorderModel::getFirst(['ucode' => strtoupper($code), 'partner_id' => $this->me->address_id, 'deleted' => 0]); - if(!$preorder) { - // try oan id - $preorder = PreorderModel::getFirst(['oaid' => strtolower($code), 'partner_id' => $this->me->address_id, 'deleted' => 0]); - } - if(!$preorder) { - // try as extref - $preorder = PreorderModel::getFirst(['extref' => $code, 'partner_id' => $this->me->address_id, 'deleted' => 0]); - } - if(!$preorder) { - return mfResponse::NotFound(["message" => "Preorder not found"]); - } - - // check if user owns preorder - if($preorder->partner_id != $this->me->address_id) { - return mfResponse::Forbidden(["message" => "Permission denied"]); - } - /* - if($preorder->cancel_request) { - if($preorder->cancel_approved) { - return mfResponse::Forbidden(["message" => "Order already cancelled"]); - } else { - return mfResponse::Forbidden(["message" => "Cancellation request was already submitted"]); - } - } - */ - if($preorder->deleted || $preorder->cancel_request || $preorder->status->code >= 899) { - return mfResponse::Forbidden(["message" => "Order already cancelled"]); - } - - if(array_key_exists("status", $this->get)) { - $status_code = $this->get["status"]; - if($status_code < 899 || $status_code > 999) { - return mfResponse::BadRequest(["message" => "Status code out of bounds"]); - } - - $status = PreorderstatusModel::getFirst(["code" => $status_code]); - if(!$status) { - return mfResponse::BadRequest(["message" => "Invalid Status code"]); - } - } else { - //910 - Cancelled (ohne weitere Begründung) - $status = PreorderstatusModel::getFirst(["code" => TT_PREORDER_DEFAULT_CANCEL_STATUSCODE]); - if(!$status) { - return mfResponse::InternalServerError(); - } - } - - - - // set cancel_date and canceller - /*$preorder->cancel_request = date('U'); - $preorder->cancel_request_by = $this->me->id; - $preorder->cancel_approved = $this->me->id; - $preorder->deleted = date('U'); - $preorder->deleted_by = $this->me->id;*/ - $preorder->status_id = $status->id; - $preorder->edit_by = $this->me->id; - if(!$preorder->save()) { - return mfResponse::InternalServerError(); - } - - return mfResponse::Ok(['message' => "Order successfully canceled"]); - - } - - protected function submitPreorder() { - //var_dump($this->post);exit; - if(!$this->campaigns) { - $this->log->debug("disallowed request because no campaign for apikey"); - return mfResponse::Forbidden(); - } - - $type = $this->post['preorderType']; - if($type != "interest" && $type != "provision" && $type != "order" && $type != "reorder") { - return mfResponse::BadRequest(["message" => "Invalid preorderType"]); - } - - $connection_type = null; - switch($this->post['connectionType']) { - case "single-dwelling": - $connection_type = "single-dwelling"; - break; - case "multi-dwelling": - $connection_type = "multi-dwelling"; - break; - case "apartment-building": - $connection_type = "apartment-building"; - break; - case "apartment": - $connection_type = "apartment"; - break; - case "business": - $connection_type = "business"; - break; - default: - if($this->require_connectiontype) { - return mfResponse::BadRequest(["message" => "Invalid connectionType"]); - } - } - - if(!array_key_exists("address", $this->post)) { - return mfResponse::BadRequest(['message' => "address missing"]); - } - - if(!array_key_exists("customer", $this->post)) { - return mfResponse::BadRequest(['message' => "customer data missing"]); - } - - $request_oaid = false; - $request_oaid_hausnummer = false; - $request_oaid_unit = false; - if(property_exists($this->post['address'],"oaid")) { - $request_oaid = trim($this->post['address']->oaid); - - $m = []; - if($request_oaid && preg_match('/^([a-z]{2}-\d+-[0-9a-f]+)(:?\.(\d+))?/i', $request_oaid, $m)) { - if(array_key_exists(1, $m)) { - $request_oaid_hausnummer = $m[1]; - } - - if(array_key_exists(2, $m)) { - $request_oaid_unit = "$request_oaid_hausnummer".$m[2]; - } - } elseif(strlen($request_oaid) == 8) { - $request_oaid_hausnummer = $request_oaid; - $request_oaid_unit = $request_oaid; - } - } - - $is_additional_order = false; - if(array_key_exists("isAdditionalOrder", $this->post) && $this->post['isAdditionalOrder']) { - $is_additional_order = true; - } - - /************************************************************ - * check address - */ - //var_dump($request_oaid_unit);exit; - if(!$request_oaid_hausnummer) { - if(!property_exists($this->post['address'],"street") || !$this->post['address']->street || - !property_exists($this->post['address'],"housenumber") || !$this->post['address']->housenumber || - !property_exists($this->post['address'],"zip") || !$this->post['address']->zip || - !property_exists($this->post['address'],"city") || !$this->post['address']->city - ) { - return mfResponse::BadRequest(['message' => "Mandatory address fields missing"]); - } - } - - $shipping_address = "customer"; - if(property_exists($this->post['address'], "is_shipping") && $this->post['address']->is_shipping) { - $shipping_address = "address"; - } - - $address_search = []; - $address_search_fields = [ - 'street' => 'strasse', - 'housenumber' => "hausnummer", - 'zip' => "plz" - ]; - if($this->district_is_city) { - $address_search_fields['city'] = "ortschaft"; - } else { - $address_search_fields['city'] = "gemeinde"; - } - - foreach($address_search_fields as $key => $field_name) { - if(property_exists($this->post['address'], $key)) { - $address_search[$field_name] = $this->db()->escape(trim($this->post['address']->$key)); - } - } + protected function getAllPreorders() { + $ts = $this->get['ts']; - if(property_exists($this->post['address'], "stiege") && trim($this->post['address']->stiege)) { - $address_search["hausnummer_stiege"] = $this->db()->escape(trim($this->post['address']->stiege)); - } else { - $address_search["hausnummer_stiege"] = null; - } - - $zusatz = false; - if($this->hausnummer_add_zusatz) { - $m = []; - if(preg_match('/^(.*) \((.+)\)$/', trim($address_search['hausnummer']), $m)) { - $address_search['hausnummer'] = $this->db()->escape($m[1]); - $zusatz = $m[2]; - } - } - - $unit_search = []; - foreach(['block','stock','tuer','unit_string'] as $key) { - if(property_exists($this->post['address'], $key) && trim($this->post['address']->$key)) { - $unit_search[$key] = trim($this->post['address']->$key); - } - } - - - // ignore unit_string if the specific fields were provided - if($unit_search['block'] || $unit_search['stock'] || $unit_search['tuer']) { - unset($unit_search['unit_string']); - } - - if($zusatz) { - $unit_search['zusatz'] = $zusatz; - } - - /* - * check customer - */ - $customer = $this->post['customer']; - - if(!property_exists($customer,"firstname") || !$customer->firstname || - !property_exists($customer,"lastname") || !$customer->lastname || - !property_exists($customer,"street") || !$customer->street || - !property_exists($customer,"zip") || !$customer->zip || - !property_exists($customer,"city") || !$customer->city - ) { - return mfResponse::BadRequest(['message' => "Mandatory customer fields missing"]); - } - - /************************************************************** - * search address in AddressDB - */ - if($request_oaid_hausnummer) { - - $where = "oaid='$request_oaid_hausnummer'"; - - if(count($this->filter_salescluster_ids)) { - $where .= " AND netzgebiet_id IN (".implode(',', $this->filter_salescluster_ids).")"; - } - - $res = $this->db()->select("view_hausnummer", "*", $where); - if(!$this->db()->num_rows($res)) { - // search for oaid in wohneinheit - $hausnummer_unit = ADBWohneinheitModel::getFirst(["oaid" => $request_oaid_hausnummer]); - if($hausnummer_unit) { - $hausnummer_id = $hausnummer_unit->hausnummer_id; - $where = "hausnummer_id=$hausnummer_id"; - if(count($this->filter_salescluster_ids)) { - $where .= " AND netzgebiet_id IN (".implode(',', $this->filter_salescluster_ids).")"; - } - $res = $this->db()->select("view_hausnummer", "*", $where); - } - } - - if(!$this->db()->num_rows($res)) { - return mfResponse::NotFound(["message" => "OAID not found"]); - } - - $address = $this->db()->fetch_object($res); - } else { - $where = "1=1 "; - foreach($address_search as $field => $value) { - if($field == "ortschaft" || $field == "gemeinde") continue; - if($field == "hausnummer_stiege" && !$value) { - $where .= " AND (`hausnummer_stiege` = '' OR hausnummer_stiege IS NULL)"; - continue; - } - $where .= " AND `$field` = '$value'"; - } - - // filter salesclusters - if(count($this->filter_salescluster_ids)) { - $where .= " AND netzgebiet_id IN (".implode(',', $this->filter_salescluster_ids).")"; - } + $update_ts = 0; - $sql = "SELECT * FROM view_hausnummer WHERE $where"; - //$this->log->debug($sql); - $res = $this->db()->query($sql); - - // If not found, try with Ortschaft in front of strasse (liezen gwr issue) - if(!$this->db()->num_rows($res)) { - $where = "1=1 "; - foreach($address_search as $field => $value) { - if($field == "ortschaft" || $field == "gemeinde") continue; - if($field == "hausnummer_stiege" && !$value) { - $where .= " AND (`hausnummer_stiege` = '' OR hausnummer_stiege IS NULL)"; - continue; - } - - if($field == "strasse") { - $prefix = ($address_search['ortschaft']) ? $address_search['ortschaft'] : $address_search['gemeinde']; - if(strpos($value, "$prefix ") === 0) { - $str = substr($value, strlen($prefix)+1); + if($ts) { + if(is_numeric($ts)) { + $update_ts = $ts; } else { - $str = $value; + $update_date = new DateTime($ts); + if($update_date) { + $update_ts = $update_date->format('U'); + } } - $where .= " AND `strasse` = '$str'"; - } else { - $where .= " AND `$field` = '$value'"; - } } - // filter salesclusters - if(count($this->filter_salescluster_ids)) { - $where .= " AND netzgebiet_id IN (".implode(',', $this->filter_salescluster_ids).")"; - } + $preorder_search = [ + "deleted" => 0 + ]; - $sql = "SELECT * FROM view_hausnummer WHERE $where"; - //$this->log->debug($sql); - $res = $this->db()->query($sql); - if(!$this->db()->num_rows($res)) { - return mfResponse::NotFound(['message' => "Adresse nicht gefunden"]); - } - } + $preorder_search = []; + if($this->me->is("preorderaddressreporting")) { + $user_networks_json = $this->me->getFlag("preorder_networks"); + $user_networks = json_decode($user_networks_json); - $address = $this->db()->fetch_object($res); - } - //var_dump($address);exit; - - /* ************************************************************** - * search wohneinheit - */ - $update_unit = false; - $assign_unit = false; - $where = "1=1 "; - $unit = false; - - // We ignore Stock when matching units - $unit_search_count_without_stock = count($unit_search); - if(array_key_exists("stock", $unit_search) && $unit_search['stock']) { - $unit_search_count_without_stock--; - } - - if($request_oaid_unit) { - $where = "wohneinheit_oaid='$request_oaid_unit'"; - if(count($this->filter_salescluster_ids)) { - $where .= " AND netzgebiet_id IN (".implode(',', $this->filter_salescluster_ids).")"; - } - //$unit = ADBWohneinheitModel::getFirst(["oaid" => $request_oaid_unit]); - $res = $this->db()->select("view_wohneinheit", "*", $where); - if($this->db()->num_rows($res)) { - $unit = $this->db()->fetch_object($res); - } - if(!$unit) { - return mfResponse::NotFound(["message" => "Wohneinheit nicht gefunden"]); - } - if(count($unit_search)) { - $update_unit = true; - } + if(!is_array($user_networks) || !count($user_networks)) { + return mfResponse::Forbidden(); + } - } elseif($unit_search_count_without_stock > 0) { - - //var_dump($unit_search);exit; - if(array_key_exists("unit_string", $unit_search)) { - $where .= " AND bezeichner LIKE '".$unit_search['unit_string']."'"; - } else { - foreach($unit_search as $field => $value) { - if($field == "stock") continue; // only check for block, stiege and tuer - $where .= " AND `$field` = '$value'"; - } - } - // filter salesclusters - if(count($this->filter_salescluster_ids)) { - $where .= " AND netzgebiet_id IN (".implode(',', $this->filter_salescluster_ids).")"; - } - - $sql = "SELECT * FROM view_wohneinheit WHERE $where AND hausnummer_id=".$address->hausnummer_id; - //$this->log->debug($sql); - $res = $this->db()->query($sql); - if($this->db()->num_rows($res)) { - $unit = $this->db()->fetch_object($res); - } else { - $update_unit = true; - } + $user_campaigns = []; + foreach($user_networks as $un) { + $uc = PreordercampaignModel::getFirst(["network_id" => $un]); + if($uc) { + $user_campaigns[] = $uc->id; + } + } - } else { + $preorder_search['preordercampaign_id'] = $user_campaigns; - // if all unit values are empty try to find the unit with all empty values - // failure is not an error, but must be checked by a human at some point - $where = "hausnummer_id=".$address->hausnummer_id." AND (block = '' OR block IS NULL) AND (stock = '' OR stock IS NULL) AND (tuer = '' OR tuer IS NULL) AND (bezeichner = '' OR bezeichner IS NULL)"; - if($zusatz) { - $where .= " AND zusatz='$zusatz'"; - } else { - $where .= " AND (zusatz = '' OR zusatz IS NULL)"; - } - // filter salesclusters - if(count($this->filter_salescluster_ids)) { - $where .= " AND netzgebiet_id IN (".implode(',', $this->filter_salescluster_ids).")"; - } - - $sql = "SELECT * FROM view_wohneinheit WHERE $where"; - //$this->log->debug($sql); - $res = $this->db()->query($sql); - - $found_units_count = $this->db()->num_rows($res); - if($found_units_count) { - // check if unit has active preorder already and try next unit - $existing_preorder = false; - while($unit = $this->db()->fetch_object($res)) { - // check if there is an existing preorder - $existing_preorder = PreorderModel::getFirstActive(['adb_wohneinheit_id' => $unit->wohneinheit_id]); - if(!$existing_preorder) { - break; - } - } - if($existing_preorder && $this->exist_is_error && !$is_additional_order) { - return mfResponse::Forbidden(['message' => "Für diese Wohneinheit liegt bereits eine Bestellung vor"]); - } - } else { - // XXX - If there are no units without unit data maybe try finding a fitting unit without an order - //$assign_unit = true; - } - } - - - /* - * check if there is an existing preorder for this unit already - */ - - if($unit && $unit->wohneinheit_id) { - $existing_preorder = PreorderModel::getFirstActive(['adb_wohneinheit_id' => $unit->wohneinheit_id]); - if($existing_preorder) { - if($this->exist_is_error && !$is_additional_order) { - return mfResponse::Forbidden(['message' => "Für diese Wohneinheit liegt bereits eine Bestellung vor"]); - } - } - } - - - - - - $address_info = $this->db()->escape(trim($this->post['address_info'])); - - // get correct campaign by salescluster - if(!array_key_exists($address->netzgebiet_id, $this->campaigns_by_scluster)) { - return mfResponse::NotFound(['message' => "Adresse nicht gefunden"]); - } - - $campaign_id = $this->campaigns_by_scluster[$address->netzgebiet_id]; - $this->campaign = new Preordercampaign($campaign_id); - - if(!$this->campaign->id) { - $this->log->debug("================================================================="); - $this->log->debug(__METHOD__.": Campaign not found"); - $this->log->debug(print_r($address, true)); - $this->log->debug(print_r($this->campaigns_by_scluster, true)); - $this->log->debug("campaign id: $campaign_id"); - $this->log->debug(print_r($this->campaign, true)); - $this->log->debug("================================================================="); - return mfResponse::InternalServerError(['message' => "Ein Interner Fehler ist aufgetreten"]); - } - - if($this->campaign->from > date('U') || $this->campaign->to < date('U')) { - return mfResponse::Forbidden(['message' => "Bestellung in diesem Netzgebiet/Cluster nicht erlaubt"]); - } - - // check for allowed PreorderType in address - $allowed_freigabe = json_decode($address->freigabe); - if(!is_array($allowed_freigabe) || !count($allowed_freigabe)) { - return mfResponse::Forbidden(['message' => "Adresse (noch) nicht bestellbar"]); - } - if(!in_array($type, $allowed_freigabe)) { - return mfResponse::Forbidden(['message' => "Adresse (noch) nicht bestellbar"]); - } - - // check for allowed PreorderType in campaign - $allowed_campaigntypes = $this->campaign->types; - if(!is_array($allowed_campaigntypes) || !count($allowed_campaigntypes)) { - return mfResponse::Forbidden(['message' => "PreorderType not allowed"]); - } - if(!array_key_exists($type, $allowed_campaigntypes)) { - return mfResponse::Forbidden(['message' => "PreorderType not allowed"]); - } - - // if FCP is on blacklist, don't allow order - if($address->rimo_fcp_name && is_array($this->campaign->banned_fcps) && count($this->campaign->banned_fcps) && in_array($address->rimo_fcp_name, $this->campaign->banned_fcps)) { - return mfResponse::Forbidden(['message' => "PreorderType not allowed"]); - } - - /* - * build fields - */ - $preorder_data = []; - $preorder_data['preordercampaign_id'] = $campaign_id; - $preorder_data['type'] = $type; - $preorder_data['connection_type'] = $connection_type; - $preorder_data['connection_count'] = (intval($this->post['connectionCount'])) ? intval($this->post['connectionCount']) : 1; - $preorder_data['submit_type'] = "api"; - if($this->request_json) { - $preorder_data['submit_request'] = $this->request_json; - } - $preorder_data['adb_hausnummer_id'] = $address->hausnummer_id; - $preorder_data['partner_id'] = $this->me->address_id; - - if($unit) { - $preorder_data['adb_wohneinheit_id'] = $unit->wohneinheit_id; - $preorder_data['oaid'] = $unit->wohneinheit_oaid; - } - if($address_info) { - $preorder_data['address_info'] = $address_info; - } - if(property_exists($this->post['address'],"district") && $this->post['address']->district) { - $preorder_data['address_district'] = $this->post['address']->district; - } - - if($this->post['acceptAgb'] === true) { - $preorder_data['accept_agb'] = 1; - } - if($this->post['acceptDsgvo'] === true) { - $preorder_data['accept_dsgvo'] = 1; - } - if($this->post['acceptMarketing'] === true) { - $preorder_data['accept_marketing'] = 1; - } - if($this->post['acceptWithdrawal'] === true) { - $preorder_data['accept_withdrawal'] = 1; - } - if($this->post['acceptDigging'] === true) { - $preorder_data['accept_digging'] = 1; - } - - if(trim($this->post['orderDate'])) { - $order_date = trim($this->post['orderDate']); - $m = []; - if(preg_match('/^(\d\d\d\d)-(\d\d)-(\d\d)$/', $order_date, $m)) { - $preorder_data['order_date'] = mktime(4,0,0,$m[2],$m[3],$m[1]); - } - } - - if($is_additional_order) { - $preorder_data['is_additional_order'] = 1; - } else { - $preorder_data['is_additional_order'] = 0; - } - $preorder_data['extref'] = (trim($this->post['extref'])) ? trim($this->post['extref']) : null; - $preorder_data['technology'] = (trim($this->post['technology'])) ? trim($this->post['technology']) : null; - /* - * patchposition now comes from RIMO - $preorder_data['equipment_name'] = (trim($this->post['equipment_name'])) ? trim($this->post['equipment_name']) : null; - $preorder_data['equipment_port'] = (trim($this->post['equipment_port'])) ? trim($this->post['equipment_port']) : null;*/ - - /* - * setup price - */ - $product = false; - if($type == "provision") { - $product = $this->campaign->setup_products['provision'][0]; - } - if($type == "order") { - $product = $this->campaign->setup_products['activation'][0]; - } - if($type == "reorder") { - $product = $this->campaign->setup_products['reorder'][0]; - } - - if($product) { - $preorder_data['setup_product_id'] = $product->id; - $preorder_data['price_setup'] = $product->price_setup; - if($connection_type == "multi-dwelling") { - if($preorder_data['connection_count'] == 2) { - //$preorder_data['price_setup'] = round($product->price_setup * 2 - (($product->price_setup * 2) / 100) * TT_PREORDER_DISCOUNT_2); - $preorder_data['price_setup'] = ($product->attributes["presales_setup_price2"]->value) ? $product->attributes["presales_setup_price2"]->value : $product->price_setup; - } - if($connection_type == "multi-dwelling" && $preorder_data['connection_count'] == 3) { - //$preorder_data['price_setup'] = round($product->price_setup * 3 - (($product->price_setup * 3) / 100) * TT_PREORDER_DISCOUNT_3); - $preorder_data['price_setup'] = ($product->attributes["presales_setup_price3"]->value) ? $product->attributes["presales_setup_price3"]->value : $product->price_setup; - } - } - if($connection_type == "apartment" && $type == "order") { - //$preorder_data['price_setup'] = round($product->price_setup - (($product->price_setup) / 100) * TT_PREORDER_DISCOUNT_APART); - $preorder_data['price_setup'] = ($product->attributes["presales_setup_price4"]->value) ? $product->attributes["presales_setup_price4"]->value : $product->price_setup; - } - if($connection_type == "business") { - //$preorder_data['price_setup'] = round($product->price_setup - (($product->price_setup) / 100) * TT_PREORDER_DISCOUNT_BUSINESS); - $preorder_data['price_setup'] = ($product->attributes["presales_setup_price_business"]->value) ? $product->attributes["presales_setup_price_business"]->value : $product->price_setup; - } - - if($preorder_data['price_setup']) { - $preorder_data['price_setup'] = str_replace(',', '.', $preorder_data['price_setup']); - } - } - - - - - /* - * get customer data - */ - foreach(['company','uid','firstname','lastname','street','housenumber','zip','city','phone','email','block','stiege','stock','tuer', 'unit_string'] as $key) { - if(property_exists($customer, $key)) { - $preorder_data[$key] = (trim($customer->$key)) ? trim($customer->$key) : null; - } - } - - /* - * check optional required fields - */ - if(is_array($this->campaign->required_fields) && count($this->campaign->required_fields)) { - if(in_array("contact_type", $this->campaign->required_fields)) { - if($customer->type == "tenant") { - $preorder_data['contact_type'] = "tenant"; - } elseif($customer->type == "owner") { - $preorder_data['contact_type'] = "owner"; } else { - return mfResponse::BadRequest(["message" => "customer type must be 'tenant' or 'owner'"]); - } - } - } - - /* - * check for addon services - */ - if(array_key_exists("addonServices", $this->post)) { - $addon_services = $this->post['addonServices']; - if($addon_services) { - $preorder_data['addon_services'] = json_encode($addon_services); - } - } - - /* - * check for addon data - */ - if(array_key_exists("additionalData", $this->post)) { - $addon_data = $this->post['additionalData']; - if($addon_data) { - $preorder_data['addon_data'] = json_encode($addon_data); - } - } - - - - - //var_dump($this->allow_unit_update, $update_unit);exit; - - /************************************************** - * update wohneinheit if allowed - * and unit search data was submitted - */ - - $unit_changed = false; - - if($this->allow_unit_update && $update_unit) { - //var_dump($unit_search); - //var_dump($unit); - //exit; - - if($request_oaid_unit) { - // if unit oaid is set, we know our unit already - $unit = new ADBWohneinheit($unit->wohneinheit_id); - if($unit->block || $unit->stiege || $unit->stock || $unit->tuer) { - foreach(["block", "stiege", "stock", "tuer"] as $type) { - if($unit->$type && $unit->$type != $unit_search[$type]) { - return mfResponse::Forbidden(['message' => "Überschreiben von Wohneinheitsdaten nicht erlaubt"]); + $preorder_search['partner_id'] = $this->me->address_id; + + if(count($this->filter_salescluster_ids)) { + $preorder_search['netzgebiet_id'] = $this->filter_salescluster_ids; } + } + + if($update_ts) { + $preorder_search['add-where'] = "AND tt_preorder.`edit` > $update_ts"; + } + + $return = []; + + foreach(PreorderModel::search($preorder_search) as $preorder) { + $return[] = $preorder->getApiArray(); + } + + //$this->requestLog->debug(print_r($return, true)); + return mfResponse::Ok(["preorders" => $return]); + } + + protected function getPreorder($code) { + $code = trim($code); + if(!$code) { + return mfResponse::NotFound(["message" => "Preorder not found"]); + } + + $preorder = PreorderModel::getFirst(['ucode' => strtoupper($code), 'partner_id' => $this->me->address_id]); + if(!$preorder) { + // try as extref + $preorder = PreorderModel::getFirst(['extref' => $code, 'partner_id' => $this->me->address_id]); + } + if(!$preorder) { + // try oan id + $preorder = PreorderModel::getFirst(['oaid' => strtolower($code), 'partner_id' => $this->me->address_id], "`create` DESC"); + } + + if(!$preorder) { + return mfResponse::NotFound(["message" => "Preorder not found"]); + } + + + if($preorder->partner_id != $this->me->address_id) { + return mfResponse::NotFound(["message" => "Preorder not found"]); + } + + $return = $preorder->getApiArray(); + if(!$return) { + return mfResponse::NotFound(["message" => "Preorder not found"]); + } + + return mfResponse::Ok($return); + + } + + protected function cancelPreorder($code) { + if($this->me->is("Preorderreadonly")) return \mfResponse::Forbidden(); + /* + $code = trim(strtoupper($code)); + if(!$code) { + return mfResponse::NotFound(["message" => "Preorder not found"]); + } + + $preorder = PreorderModel::getFirst(['ucode' => $code, 'partner_id' => $this->me->address_id, 'deleted' => 0, ' 800]); + if(!$preorder) { + // try oan id + $preorder = PreorderModel::getFirst(['oaid' => $code, 'partner_id' => $this->me->address_id, 'deleted' => 0, ' 800]); + if(!$preorder) { + return mfResponse::NotFound(["message" => "Preorder not found or cancelled already"]); + } + }*/ + + $code = trim($code); + if(!$code) { + return mfResponse::NotFound(["message" => "Preorder not found"]); + } + + $preorder = PreorderModel::getFirst(['ucode' => strtoupper($code), 'partner_id' => $this->me->address_id, 'deleted' => 0]); + if(!$preorder) { + // try oan id + $preorder = PreorderModel::getFirst(['oaid' => strtolower($code), 'partner_id' => $this->me->address_id, 'deleted' => 0]); + } + if(!$preorder) { + // try as extref + $preorder = PreorderModel::getFirst(['extref' => $code, 'partner_id' => $this->me->address_id, 'deleted' => 0]); + } + if(!$preorder) { + return mfResponse::NotFound(["message" => "Preorder not found"]); + } + + // check if user owns preorder + if($preorder->partner_id != $this->me->address_id) { + return mfResponse::Forbidden(["message" => "Permission denied"]); + } + /* + if($preorder->cancel_request) { + if($preorder->cancel_approved) { + return mfResponse::Forbidden(["message" => "Order already cancelled"]); + } else { + return mfResponse::Forbidden(["message" => "Cancellation request was already submitted"]); } } - } else { - // else get available units with no unit data, so we can update it - $exclude_wohneinheit_ids = []; - $preorders_in_hausnummer = PreorderModel::searchActive(['adb_hausnummer_id' => $address->hausnummer_id]); - if(count($preorders_in_hausnummer)) { - foreach($preorders_in_hausnummer as $pih) { - if($pih->adb_wohneinheit_id) { - $exclude_wohneinheit_ids[] = $pih->adb_wohneinheit_id; + */ + if($preorder->deleted || $preorder->cancel_request || $preorder->status->code >= 899) { + return mfResponse::Forbidden(["message" => "Order already cancelled"]); + } + + if(array_key_exists("status", $this->get)) { + $status_code = $this->get["status"]; + if($status_code < 899 || $status_code > 999) { + return mfResponse::BadRequest(["message" => "Status code out of bounds"]); + } + + $status = PreorderstatusModel::getFirst(["code" => $status_code]); + if(!$status) { + return mfResponse::BadRequest(["message" => "Invalid Status code"]); + } + } else { + //910 - Cancelled (ohne weitere Begründung) + $status = PreorderstatusModel::getFirst(["code" => TT_PREORDER_DEFAULT_CANCEL_STATUSCODE]); + if(!$status) { + return mfResponse::InternalServerError(); } - } } - - // get units excluding unavailable units - $where = "hausnummer_id=".$address->hausnummer_id; - $where .= " AND ( block = '' OR block IS NULL)"; - $where .= " AND ( stiege = '' OR stiege IS NULL)"; - $where .= " AND ( stock = '' OR stock IS NULL)"; - $where .= " AND ( tuer = '' OR tuer IS NULL)"; - $where .= " AND ( bezeichner = '' OR bezeichner IS NULL)"; - - if(count($exclude_wohneinheit_ids)) { - $where .= " AND wohneinheit_id NOT IN (". implode(",",$exclude_wohneinheit_ids).")"; + + + // set cancel_date and canceller + /*$preorder->cancel_request = date('U'); + $preorder->cancel_request_by = $this->me->id; + $preorder->cancel_approved = $this->me->id; + $preorder->deleted = date('U'); + $preorder->deleted_by = $this->me->id;*/ + $preorder->status_id = $status->id; + $preorder->edit_by = $this->me->id; + if(!$preorder->save()) { + return mfResponse::InternalServerError(); } - $sql = "SELECT * FROM view_wohneinheit WHERE $where"; - //$this->log->debug($sql); - $res = $this->db()->query($sql); - if(!$this->db()->num_rows($res)) { - return mfResponse::Forbidden(['message' => "Keine Wohneinheiten verfügbar"]); + + return mfResponse::Ok(['message' => "Order successfully canceled"]); + + } + + protected function submitPreorder() { + if($this->me->is("Preorderreadonly")) return \mfResponse::Forbidden(); + //var_dump($this->post);exit; + if(!$this->campaigns) { + $this->log->debug("disallowed request because no campaign for apikey"); + return mfResponse::Forbidden(); } - - $unit_row = $this->db()->fetch_object($res); - $unit = new ADBWohneinheit($unit_row->wohneinheit_id); - } - - if(!$unit->id) { - return mfResponse::InternalServerError(['message' => "unit not found"]); - } - //echo "blah";exit; - - $change_note_data = []; - foreach(['block','stiege','stock','tuer','bezeichner'] as $unit_address_part) { - if($unit_search[$unit_address_part] && $unit_search[$unit_address_part] != $unit->$unit_address_part) { - $unit->$unit_address_part = $unit_search[$unit_address_part]; - $unit_changed = true; - $change_note_data[] = [ - 'field' => $unit_address_part, - 'from' => $unit->_old_data->$unit_address_part, - 'to' => $unit_search[$unit_address_part] - ]; + + $type = $this->post['preorderType']; + if($type != "interest" && $type != "provision" && $type != "order" && $type != "reorder") { + return mfResponse::BadRequest(["message" => "Invalid preorderType"]); } - } - - if($unit_changed) { - $change_note_text = ($unit->note) ? $unit->note : ""; - $change_note_text .= date("Y-m-d H:i:s").": "; - foreach($change_note_data as $cn) { - $field = $cn['field']; - $from = ($cn['from'] === null) ? "NULL" : "'".$cn['from']."'"; - $to = ($cn['to'] === null) ? "NULL" : "'".$cn['to']."'"; - $change_note_text .= "$field from $from to $to; "; + + $connection_type = null; + switch($this->post['connectionType']) { + case "single-dwelling": + $connection_type = "single-dwelling"; + break; + case "multi-dwelling": + $connection_type = "multi-dwelling"; + break; + case "apartment-building": + $connection_type = "apartment-building"; + break; + case "apartment": + $connection_type = "apartment"; + break; + case "business": + $connection_type = "business"; + break; + default: + if($this->require_connectiontype) { + return mfResponse::BadRequest(["message" => "Invalid connectionType"]); + } } - $change_note_text .= "\n"; - $unit->note = $change_note_text; - - $unit->startTransaction(); - $unit->save(); - } - //var_dump($unit);exit; - - $preorder_data['adb_wohneinheit_id'] = $unit->id; - $preorder_data['oaid'] = $unit->oaid; + + if(!array_key_exists("address", $this->post)) { + return mfResponse::BadRequest(['message' => "address missing"]); + } + + if(!array_key_exists("customer", $this->post)) { + return mfResponse::BadRequest(['message' => "customer data missing"]); + } + + $request_oaid = false; + $request_oaid_hausnummer = false; + $request_oaid_unit = false; + if(property_exists($this->post['address'], "oaid")) { + $request_oaid = trim($this->post['address']->oaid); + + $m = []; + if($request_oaid && preg_match('/^([a-z]{2}-\d+-[0-9a-f]+)(:?\.(\d+))?/i', $request_oaid, $m)) { + if(array_key_exists(1, $m)) { + $request_oaid_hausnummer = $m[1]; + } + + if(array_key_exists(2, $m)) { + $request_oaid_unit = "$request_oaid_hausnummer" . $m[2]; + } + } elseif(strlen($request_oaid) == 8) { + $request_oaid_hausnummer = $request_oaid; + $request_oaid_unit = $request_oaid; + } + } + + $is_additional_order = false; + if(array_key_exists("isAdditionalOrder", $this->post) && $this->post['isAdditionalOrder']) { + $is_additional_order = true; + } + + /************************************************************ + * check address + */ + //var_dump($request_oaid_unit);exit; + if(!$request_oaid_hausnummer) { + if(!property_exists($this->post['address'], "street") || !$this->post['address']->street || + !property_exists($this->post['address'], "housenumber") || !$this->post['address']->housenumber || + !property_exists($this->post['address'], "zip") || !$this->post['address']->zip || + !property_exists($this->post['address'], "city") || !$this->post['address']->city + ) { + return mfResponse::BadRequest(['message' => "Mandatory address fields missing"]); + } + } + + $shipping_address = "customer"; + if(property_exists($this->post['address'], "is_shipping") && $this->post['address']->is_shipping) { + $shipping_address = "address"; + } + + $address_search = []; + $address_search_fields = [ + 'street' => 'strasse', + 'housenumber' => "hausnummer", + 'zip' => "plz" + ]; + if($this->district_is_city) { + $address_search_fields['city'] = "ortschaft"; + } else { + $address_search_fields['city'] = "gemeinde"; + } + + foreach($address_search_fields as $key => $field_name) { + if(property_exists($this->post['address'], $key)) { + $address_search[$field_name] = $this->db()->escape(trim($this->post['address']->$key)); + } + } + + if(property_exists($this->post['address'], "stiege") && trim($this->post['address']->stiege)) { + $address_search["hausnummer_stiege"] = $this->db()->escape(trim($this->post['address']->stiege)); + } else { + $address_search["hausnummer_stiege"] = null; + } + + $zusatz = false; + if($this->hausnummer_add_zusatz) { + $m = []; + if(preg_match('/^(.*) \((.+)\)$/', trim($address_search['hausnummer']), $m)) { + $address_search['hausnummer'] = $this->db()->escape($m[1]); + $zusatz = $m[2]; + } + } + + $unit_search = []; + foreach(['block', 'stock', 'tuer', 'unit_string'] as $key) { + if(property_exists($this->post['address'], $key) && trim($this->post['address']->$key)) { + $unit_search[$key] = trim($this->post['address']->$key); + } + } + + + // ignore unit_string if the specific fields were provided + if($unit_search['block'] || $unit_search['stock'] || $unit_search['tuer']) { + unset($unit_search['unit_string']); + } + + if($zusatz) { + $unit_search['zusatz'] = $zusatz; + } + + /* + * check customer + */ + $customer = $this->post['customer']; + + if(!property_exists($customer, "firstname") || !$customer->firstname || + !property_exists($customer, "lastname") || !$customer->lastname || + !property_exists($customer, "street") || !$customer->street || + !property_exists($customer, "zip") || !$customer->zip || + !property_exists($customer, "city") || !$customer->city + ) { + return mfResponse::BadRequest(['message' => "Mandatory customer fields missing"]); + } + + /************************************************************** + * search address in AddressDB + */ + if($request_oaid_hausnummer) { + + $where = "oaid='$request_oaid_hausnummer'"; + + if(count($this->filter_salescluster_ids)) { + $where .= " AND netzgebiet_id IN (" . implode(',', $this->filter_salescluster_ids) . ")"; + } + + $res = $this->db()->select("view_hausnummer", "*", $where); + if(!$this->db()->num_rows($res)) { + // search for oaid in wohneinheit + $hausnummer_unit = ADBWohneinheitModel::getFirst(["oaid" => $request_oaid_hausnummer]); + if($hausnummer_unit) { + $hausnummer_id = $hausnummer_unit->hausnummer_id; + $where = "hausnummer_id=$hausnummer_id"; + if(count($this->filter_salescluster_ids)) { + $where .= " AND netzgebiet_id IN (" . implode(',', $this->filter_salescluster_ids) . ")"; + } + $res = $this->db()->select("view_hausnummer", "*", $where); + } + } + + if(!$this->db()->num_rows($res)) { + return mfResponse::NotFound(["message" => "OAID not found"]); + } + + $address = $this->db()->fetch_object($res); + } else { + $where = "1=1 "; + foreach($address_search as $field => $value) { + if($field == "ortschaft" || $field == "gemeinde") continue; + if($field == "hausnummer_stiege" && !$value) { + $where .= " AND (`hausnummer_stiege` = '' OR hausnummer_stiege IS NULL)"; + continue; + } + $where .= " AND `$field` = '$value'"; + } + + // filter salesclusters + if(count($this->filter_salescluster_ids)) { + $where .= " AND netzgebiet_id IN (" . implode(',', $this->filter_salescluster_ids) . ")"; + } + + $sql = "SELECT * FROM view_hausnummer WHERE $where"; + //$this->log->debug($sql); + $res = $this->db()->query($sql); + + // If not found, try with Ortschaft in front of strasse (liezen gwr issue) + if(!$this->db()->num_rows($res)) { + $where = "1=1 "; + foreach($address_search as $field => $value) { + if($field == "ortschaft" || $field == "gemeinde") continue; + if($field == "hausnummer_stiege" && !$value) { + $where .= " AND (`hausnummer_stiege` = '' OR hausnummer_stiege IS NULL)"; + continue; + } + + if($field == "strasse") { + $prefix = ($address_search['ortschaft']) ? $address_search['ortschaft'] : $address_search['gemeinde']; + if(strpos($value, "$prefix ") === 0) { + $str = substr($value, strlen($prefix) + 1); + } else { + $str = $value; + } + $where .= " AND `strasse` = '$str'"; + } else { + $where .= " AND `$field` = '$value'"; + } + } + + // filter salesclusters + if(count($this->filter_salescluster_ids)) { + $where .= " AND netzgebiet_id IN (" . implode(',', $this->filter_salescluster_ids) . ")"; + } + + $sql = "SELECT * FROM view_hausnummer WHERE $where"; + //$this->log->debug($sql); + $res = $this->db()->query($sql); + if(!$this->db()->num_rows($res)) { + return mfResponse::NotFound(['message' => "Adresse nicht gefunden"]); + } + } + + $address = $this->db()->fetch_object($res); + } + //var_dump($address);exit; + + /* ************************************************************** + * search wohneinheit + */ + $update_unit = false; + $assign_unit = false; + $where = "1=1 "; + $unit = false; + + // We ignore Stock when matching units + $unit_search_count_without_stock = count($unit_search); + if(array_key_exists("stock", $unit_search) && $unit_search['stock']) { + $unit_search_count_without_stock--; + } + + if($request_oaid_unit) { + $where = "wohneinheit_oaid='$request_oaid_unit'"; + if(count($this->filter_salescluster_ids)) { + $where .= " AND netzgebiet_id IN (" . implode(',', $this->filter_salescluster_ids) . ")"; + } + //$unit = ADBWohneinheitModel::getFirst(["oaid" => $request_oaid_unit]); + $res = $this->db()->select("view_wohneinheit", "*", $where); + if($this->db()->num_rows($res)) { + $unit = $this->db()->fetch_object($res); + } + if(!$unit) { + return mfResponse::NotFound(["message" => "Wohneinheit nicht gefunden"]); + } + if(count($unit_search)) { + $update_unit = true; + } + + } elseif($unit_search_count_without_stock > 0) { + + //var_dump($unit_search);exit; + if(array_key_exists("unit_string", $unit_search)) { + $where .= " AND bezeichner LIKE '" . $unit_search['unit_string'] . "'"; + } else { + foreach($unit_search as $field => $value) { + if($field == "stock") continue; // only check for block, stiege and tuer + $where .= " AND `$field` = '$value'"; + } + } + // filter salesclusters + if(count($this->filter_salescluster_ids)) { + $where .= " AND netzgebiet_id IN (" . implode(',', $this->filter_salescluster_ids) . ")"; + } + + $sql = "SELECT * FROM view_wohneinheit WHERE $where AND hausnummer_id=" . $address->hausnummer_id; + //$this->log->debug($sql); + $res = $this->db()->query($sql); + if($this->db()->num_rows($res)) { + $unit = $this->db()->fetch_object($res); + } else { + $update_unit = true; + } + + } else { + + // if all unit values are empty try to find the unit with all empty values + // failure is not an error, but must be checked by a human at some point + $where = "hausnummer_id=" . $address->hausnummer_id . " AND (block = '' OR block IS NULL) AND (stock = '' OR stock IS NULL) AND (tuer = '' OR tuer IS NULL) AND (bezeichner = '' OR bezeichner IS NULL)"; + if($zusatz) { + $where .= " AND zusatz='$zusatz'"; + } else { + $where .= " AND (zusatz = '' OR zusatz IS NULL)"; + } + // filter salesclusters + if(count($this->filter_salescluster_ids)) { + $where .= " AND netzgebiet_id IN (" . implode(',', $this->filter_salescluster_ids) . ")"; + } + + $sql = "SELECT * FROM view_wohneinheit WHERE $where"; + //$this->log->debug($sql); + $res = $this->db()->query($sql); + + $found_units_count = $this->db()->num_rows($res); + if($found_units_count) { + // check if unit has active preorder already and try next unit + $existing_preorder = false; + while($unit = $this->db()->fetch_object($res)) { + // check if there is an existing preorder + $existing_preorder = PreorderModel::getFirstActive(['adb_wohneinheit_id' => $unit->wohneinheit_id]); + if(!$existing_preorder) { + break; + } + } + if($existing_preorder && $this->exist_is_error && !$is_additional_order) { + return mfResponse::Forbidden(['message' => "Für diese Wohneinheit liegt bereits eine Bestellung vor"]); + } + } else { + // XXX - If there are no units without unit data maybe try finding a fitting unit without an order + //$assign_unit = true; + } + } + + + /* + * check if there is an existing preorder for this unit already + */ + + if($unit && $unit->wohneinheit_id) { + $existing_preorder = PreorderModel::getFirstActive(['adb_wohneinheit_id' => $unit->wohneinheit_id]); + if($existing_preorder) { + if($this->exist_is_error && !$is_additional_order) { + return mfResponse::Forbidden(['message' => "Für diese Wohneinheit liegt bereits eine Bestellung vor"]); + } + } + } + + + $address_info = $this->db()->escape(trim($this->post['address_info'])); + + // get correct campaign by salescluster + if(!array_key_exists($address->netzgebiet_id, $this->campaigns_by_scluster)) { + return mfResponse::NotFound(['message' => "Adresse nicht gefunden"]); + } + + $campaign_id = $this->campaigns_by_scluster[$address->netzgebiet_id]; + $this->campaign = new Preordercampaign($campaign_id); + + if(!$this->campaign->id) { + $this->log->debug("================================================================="); + $this->log->debug(__METHOD__ . ": Campaign not found"); + $this->log->debug(print_r($address, true)); + $this->log->debug(print_r($this->campaigns_by_scluster, true)); + $this->log->debug("campaign id: $campaign_id"); + $this->log->debug(print_r($this->campaign, true)); + $this->log->debug("================================================================="); + return mfResponse::InternalServerError(['message' => "Ein Interner Fehler ist aufgetreten"]); + } + + if($this->campaign->from > date('U') || $this->campaign->to < date('U')) { + return mfResponse::Forbidden(['message' => "Bestellung in diesem Netzgebiet/Cluster nicht erlaubt"]); + } + + // check for allowed PreorderType in address + $allowed_freigabe = json_decode($address->freigabe); + if(!is_array($allowed_freigabe) || !count($allowed_freigabe)) { + return mfResponse::Forbidden(['message' => "Adresse (noch) nicht bestellbar"]); + } + if(!in_array($type, $allowed_freigabe)) { + return mfResponse::Forbidden(['message' => "Adresse (noch) nicht bestellbar"]); + } + + // check for allowed PreorderType in campaign + $allowed_campaigntypes = $this->campaign->types; + if(!is_array($allowed_campaigntypes) || !count($allowed_campaigntypes)) { + return mfResponse::Forbidden(['message' => "PreorderType not allowed"]); + } + if(!array_key_exists($type, $allowed_campaigntypes)) { + return mfResponse::Forbidden(['message' => "PreorderType not allowed"]); + } + + // if FCP is on blacklist, don't allow order + if($address->rimo_fcp_name && is_array($this->campaign->banned_fcps) && count($this->campaign->banned_fcps) && in_array($address->rimo_fcp_name, $this->campaign->banned_fcps)) { + return mfResponse::Forbidden(['message' => "PreorderType not allowed"]); + } + + /* + * build fields + */ + $preorder_data = []; + $preorder_data['preordercampaign_id'] = $campaign_id; + $preorder_data['type'] = $type; + $preorder_data['connection_type'] = $connection_type; + $preorder_data['connection_count'] = (intval($this->post['connectionCount'])) ? intval($this->post['connectionCount']) : 1; + $preorder_data['submit_type'] = "api"; + if($this->request_json) { + $preorder_data['submit_request'] = $this->request_json; + } + $preorder_data['adb_hausnummer_id'] = $address->hausnummer_id; + $preorder_data['partner_id'] = $this->me->address_id; + + if($unit) { + $preorder_data['adb_wohneinheit_id'] = $unit->wohneinheit_id; + $preorder_data['oaid'] = $unit->wohneinheit_oaid; + } + if($address_info) { + $preorder_data['address_info'] = $address_info; + } + if(property_exists($this->post['address'], "district") && $this->post['address']->district) { + $preorder_data['address_district'] = $this->post['address']->district; + } + + if($this->post['acceptAgb'] === true) { + $preorder_data['accept_agb'] = 1; + } + if($this->post['acceptDsgvo'] === true) { + $preorder_data['accept_dsgvo'] = 1; + } + if($this->post['acceptMarketing'] === true) { + $preorder_data['accept_marketing'] = 1; + } + if($this->post['acceptWithdrawal'] === true) { + $preorder_data['accept_withdrawal'] = 1; + } + if($this->post['acceptDigging'] === true) { + $preorder_data['accept_digging'] = 1; + } + + if(trim($this->post['orderDate'])) { + $order_date = trim($this->post['orderDate']); + $m = []; + if(preg_match('/^(\d\d\d\d)-(\d\d)-(\d\d)$/', $order_date, $m)) { + $preorder_data['order_date'] = mktime(4, 0, 0, $m[2], $m[3], $m[1]); + } + } + + if($is_additional_order) { + $preorder_data['is_additional_order'] = 1; + } else { + $preorder_data['is_additional_order'] = 0; + } + $preorder_data['extref'] = (trim($this->post['extref'])) ? trim($this->post['extref']) : null; + $preorder_data['technology'] = (trim($this->post['technology'])) ? trim($this->post['technology']) : null; + /* + * patchposition now comes from RIMO + $preorder_data['equipment_name'] = (trim($this->post['equipment_name'])) ? trim($this->post['equipment_name']) : null; + $preorder_data['equipment_port'] = (trim($this->post['equipment_port'])) ? trim($this->post['equipment_port']) : null;*/ + + /* + * setup price + */ + $product = false; + if($type == "provision") { + $product = $this->campaign->setup_products['provision'][0]; + } + if($type == "order") { + $product = $this->campaign->setup_products['activation'][0]; + } + if($type == "reorder") { + $product = $this->campaign->setup_products['reorder'][0]; + } + + if($product) { + $preorder_data['setup_product_id'] = $product->id; + $preorder_data['price_setup'] = $product->price_setup; + if($connection_type == "multi-dwelling") { + if($preorder_data['connection_count'] == 2) { + //$preorder_data['price_setup'] = round($product->price_setup * 2 - (($product->price_setup * 2) / 100) * TT_PREORDER_DISCOUNT_2); + $preorder_data['price_setup'] = ($product->attributes["presales_setup_price2"]->value) ? $product->attributes["presales_setup_price2"]->value : $product->price_setup; + } + if($connection_type == "multi-dwelling" && $preorder_data['connection_count'] == 3) { + //$preorder_data['price_setup'] = round($product->price_setup * 3 - (($product->price_setup * 3) / 100) * TT_PREORDER_DISCOUNT_3); + $preorder_data['price_setup'] = ($product->attributes["presales_setup_price3"]->value) ? $product->attributes["presales_setup_price3"]->value : $product->price_setup; + } + } + if($connection_type == "apartment" && $type == "order") { + //$preorder_data['price_setup'] = round($product->price_setup - (($product->price_setup) / 100) * TT_PREORDER_DISCOUNT_APART); + $preorder_data['price_setup'] = ($product->attributes["presales_setup_price4"]->value) ? $product->attributes["presales_setup_price4"]->value : $product->price_setup; + } + if($connection_type == "business") { + //$preorder_data['price_setup'] = round($product->price_setup - (($product->price_setup) / 100) * TT_PREORDER_DISCOUNT_BUSINESS); + $preorder_data['price_setup'] = ($product->attributes["presales_setup_price_business"]->value) ? $product->attributes["presales_setup_price_business"]->value : $product->price_setup; + } + + if($preorder_data['price_setup']) { + $preorder_data['price_setup'] = str_replace(',', '.', $preorder_data['price_setup']); + } + } + + + /* + * get customer data + */ + foreach(['company', 'uid', 'firstname', 'lastname', 'street', 'housenumber', 'zip', 'city', 'phone', 'email', 'block', 'stiege', 'stock', 'tuer', 'unit_string'] as $key) { + if(property_exists($customer, $key)) { + $preorder_data[$key] = (trim($customer->$key)) ? trim($customer->$key) : null; + } + } + + /* + * check optional required fields + */ + if(is_array($this->campaign->required_fields) && count($this->campaign->required_fields)) { + if(in_array("contact_type", $this->campaign->required_fields)) { + if($customer->type == "tenant") { + $preorder_data['contact_type'] = "tenant"; + } elseif($customer->type == "owner") { + $preorder_data['contact_type'] = "owner"; + } else { + return mfResponse::BadRequest(["message" => "customer type must be 'tenant' or 'owner'"]); + } + } + } + + /* + * check for addon services + */ + if(array_key_exists("addonServices", $this->post)) { + $addon_services = $this->post['addonServices']; + if($addon_services) { + $preorder_data['addon_services'] = json_encode($addon_services); + } + } + + /* + * check for addon data + */ + if(array_key_exists("additionalData", $this->post)) { + $addon_data = $this->post['additionalData']; + if($addon_data) { + $preorder_data['addon_data'] = json_encode($addon_data); + } + } + + + //var_dump($this->allow_unit_update, $update_unit);exit; + + /************************************************** + * update wohneinheit if allowed + * and unit search data was submitted + */ + + $unit_changed = false; + + if($this->allow_unit_update && $update_unit) { + //var_dump($unit_search); + //var_dump($unit); + //exit; + + if($request_oaid_unit) { + // if unit oaid is set, we know our unit already + $unit = new ADBWohneinheit($unit->wohneinheit_id); + if($unit->block || $unit->stiege || $unit->stock || $unit->tuer) { + foreach(["block", "stiege", "stock", "tuer"] as $type) { + if($unit->$type && $unit->$type != $unit_search[$type]) { + return mfResponse::Forbidden(['message' => "Überschreiben von Wohneinheitsdaten nicht erlaubt"]); + } + } + } + } else { + // else get available units with no unit data, so we can update it + $exclude_wohneinheit_ids = []; + $preorders_in_hausnummer = PreorderModel::searchActive(['adb_hausnummer_id' => $address->hausnummer_id]); + if(count($preorders_in_hausnummer)) { + foreach($preorders_in_hausnummer as $pih) { + if($pih->adb_wohneinheit_id) { + $exclude_wohneinheit_ids[] = $pih->adb_wohneinheit_id; + } + } + } + + // get units excluding unavailable units + $where = "hausnummer_id=" . $address->hausnummer_id; + $where .= " AND ( block = '' OR block IS NULL)"; + $where .= " AND ( stiege = '' OR stiege IS NULL)"; + $where .= " AND ( stock = '' OR stock IS NULL)"; + $where .= " AND ( tuer = '' OR tuer IS NULL)"; + $where .= " AND ( bezeichner = '' OR bezeichner IS NULL)"; + + if(count($exclude_wohneinheit_ids)) { + $where .= " AND wohneinheit_id NOT IN (" . implode(",", $exclude_wohneinheit_ids) . ")"; + } + $sql = "SELECT * FROM view_wohneinheit WHERE $where"; + //$this->log->debug($sql); + $res = $this->db()->query($sql); + if(!$this->db()->num_rows($res)) { + return mfResponse::Forbidden(['message' => "Keine Wohneinheiten verfügbar"]); + } + + $unit_row = $this->db()->fetch_object($res); + $unit = new ADBWohneinheit($unit_row->wohneinheit_id); + } + + if(!$unit->id) { + return mfResponse::InternalServerError(['message' => "unit not found"]); + } + //echo "blah";exit; + + $change_note_data = []; + foreach(['block', 'stiege', 'stock', 'tuer', 'bezeichner'] as $unit_address_part) { + if($unit_search[$unit_address_part] && $unit_search[$unit_address_part] != $unit->$unit_address_part) { + $unit->$unit_address_part = $unit_search[$unit_address_part]; + $unit_changed = true; + $change_note_data[] = [ + 'field' => $unit_address_part, + 'from' => $unit->_old_data->$unit_address_part, + 'to' => $unit_search[$unit_address_part] + ]; + } + } + + if($unit_changed) { + $change_note_text = ($unit->note) ? $unit->note : ""; + $change_note_text .= date("Y-m-d H:i:s") . ": "; + foreach($change_note_data as $cn) { + $field = $cn['field']; + $from = ($cn['from'] === null) ? "NULL" : "'" . $cn['from'] . "'"; + $to = ($cn['to'] === null) ? "NULL" : "'" . $cn['to'] . "'"; + $change_note_text .= "$field from $from to $to; "; + } + $change_note_text .= "\n"; + $unit->note = $change_note_text; + + $unit->startTransaction(); + $unit->save(); + } + //var_dump($unit);exit; + + $preorder_data['adb_wohneinheit_id'] = $unit->id; + $preorder_data['oaid'] = $unit->oaid; + } + + + // assign next wohneinheit if no unit search data was submitted + /* + if($this->allow_unit_update && $assign_unit) { + var_dump($unit_search); + var_dump($unit); + exit; + }*/ + + + /* + * create preorder record + */ + $preorder = PreorderModel::create($preorder_data); + $preorder->createUcode(); + + /* + * set status based on building or unit status + */ + $new_status = false; + if($preorder->adb_wohneinheit_id) { + $new_status = PreorderstatusModel::getFirst(["code" => $preorder->adb_wohneinheit->status->code]); + if($preorder->adb_hausnummer->status->code > $preorder->adb_wohneinheit->status->code) { + $new_status = PreorderstatusModel::getFirst(["code" => $preorder->adb_hausnummer->status->code]); + } + } elseif($preorder->adb_hausnummer_id) { + $new_status = PreorderstatusModel::getFirst(["code" => $preorder->adb_hausnummer->status->code]); + } + if($new_status) { + $preorder->status_id = $new_status->id; + } else { + $preorder->status_id = 1; + } + + try { + $preorder_id = $preorder->save(); + } catch(\Exception $e) { + $err_id = uniqid('err'); + $this->log->error(__METHOD__ . ": [$err_id] Caught Exception while saving Preorder: " . $e->getMessage() . "\n" . $e->getTraceAsString()); + if($unit_changed) $unit->rollbackTransaction(); + return mfResponse::InternalServerError(["error_id" => $err_id, "message" => "error id: $err_id"]); + } + + if(!$preorder_id || !$preorder->ucode) { + $err_id = uniqid('err'); + $this->log->error(__METHOD__ . ": [$err_id] Error saving Preorder"); + if($unit_changed) $unit->rollbackTransaction(); + return mfResponse::InternalServerError(); + } + + if($unit_changed) $unit->commitTransaction(); + + $return = ["code" => $preorder->ucode]; + if($preorder->oaid) { + $return['oaid'] = $preorder->oaid; + } + if($preorder->extref) { + $return['extref'] = $preorder->extref; + } + if($preorder->order_date) { + $return['orderDate'] = date("Y-m-d", $preorder->order_date); + } + $return['status'] = $preorder->status->getApiArray(); + foreach($preorder->statusflags as $sflag) { + $return['status']['flags'][] = [ + "code" => (int)$sflag->code, + "text" => $sflag->name, + "value" => ($sflag->value->value == 1) + ]; + } + //var_dump($return['status']);exit; + if($addon_data) { + $return["additionalData"] = $addon_data; + } + + $return['created'] = date("c", $preorder->create); + $return['created_ts'] = (int)$preorder->create; + $return['updated'] = date("c", $preorder->edit); + $return['updated_ts'] = (int)$preorder->edit; + + return mfResponse::Ok($return); } - - - // assign next wohneinheit if no unit search data was submitted - /* - if($this->allow_unit_update && $assign_unit) { - var_dump($unit_search); - var_dump($unit); - exit; - }*/ - - - /* - * create preorder record - */ - $preorder = PreorderModel::create($preorder_data); - $preorder->createUcode(); - - /* - * set status based on building or unit status - */ - $new_status = false; - if($preorder->adb_wohneinheit_id) { - $new_status = PreorderstatusModel::getFirst(["code" => $preorder->adb_wohneinheit->status->code]); - if($preorder->adb_hausnummer->status->code > $preorder->adb_wohneinheit->status->code) { - $new_status = PreorderstatusModel::getFirst(["code" => $preorder->adb_hausnummer->status->code]); - } - } elseif($preorder->adb_hausnummer_id) { - $new_status = PreorderstatusModel::getFirst(["code" => $preorder->adb_hausnummer->status->code]); - } - if($new_status) { - $preorder->status_id = $new_status->id; - } else { - $preorder->status_id = 1; - } - - try { - $preorder_id = $preorder->save(); - } catch (\Exception $e) { - $err_id = uniqid('err'); - $this->log->error(__METHOD__.": [$err_id] Caught Exception while saving Preorder: ".$e->getMessage()."\n".$e->getTraceAsString()); - if($unit_changed) $unit->rollbackTransaction(); - return mfResponse::InternalServerError(["error_id" => $err_id, "message" => "error id: $err_id"]); - } - - if(!$preorder_id || !$preorder->ucode) { - $err_id = uniqid('err'); - $this->log->error(__METHOD__.": [$err_id] Error saving Preorder"); - if($unit_changed) $unit->rollbackTransaction(); - return mfResponse::InternalServerError(); - } - - if($unit_changed) $unit->commitTransaction(); - - $return = ["code" => $preorder->ucode]; - if($preorder->oaid) { - $return['oaid'] = $preorder->oaid; - } - if($preorder->extref) { - $return['extref'] = $preorder->extref; - } - if($preorder->order_date) { - $return['orderDate'] = date("Y-m-d",$preorder->order_date); - } - $return['status'] = $preorder->status->getApiArray(); - foreach($preorder->statusflags as $sflag) { - $return['status']['flags'][] = [ - "code" => (int)$sflag->code, - "text" => $sflag->name, - "value" => ($sflag->value->value == 1) - ]; - } - //var_dump($return['status']);exit; - if($addon_data) { - $return["additionalData"] = $addon_data; - } - - $return['created'] = date("c", $preorder->create); - $return['created_ts'] = (int)$preorder->create; - $return['updated'] = date("c", $preorder->edit); - $return['updated_ts'] = (int)$preorder->edit; - - return mfResponse::Ok($return); - } - + } \ No newline at end of file