loadMe(); $data["edit_by"] = $me->id; } return $data; } public function afterLoad() { if($this->uid === "string") { $this->uid = ""; } if($this->id) { //echo "[{$this->_ruid}] preorder::afterload: adding to cache\n"; mfValuecache::singleton()->set("mfObjectmodel-preorder-" . $this->id, $this); } } public function beforeSave($_params = []) { if(!isset($this->data->status_id)) { $this->data->status_id = 1; } } public function afterSave($_params = []) { // reset auto magic properties $this->status = null; $this->campaign = null; $this->partner = null; $this->building = null; $this->adb_hausnummer = null; $this->adb_wohneinheit = null; $this->attribute = null; $this->services = null; $this->ordered_services = null; $this->creator = null; $this->editor = null; if(array_key_exists("no_aftersave", $_params) && $_params["no_aftersave"]) return true; $this->log->debug("[".$this->_ruid."] "."-----------------------------------------"); $this->log->debug("[".$this->_ruid."] ".__METHOD__.": preorder_id: ".$this->id); // prevent potential infinite loop $nesting_level = mfValuecache::singleton()->get("preorder-save-nesting-level-" . $this->id); if(!$nesting_level) { $nesting_level = 1; } else { $nesting_level++; } mfValuecache::singleton()->set("preorder-save-nesting-level-" . $this->id, $nesting_level); if($nesting_level > 1) { $this->log->debug("[".$this->_ruid."] ".__METHOD__.": (Preorder ".$this->id.") Nesting level limit reached ($nesting_level) -> aborting"); return true; } if(!array_key_exists("no_oaid_update", $_params) || !$_params['no_oaid_update']) { // update preorder OAID if it's different from the unit OAID // but only if the unit OAID is of the same origin as the campaign $old_oaid = $this->oaid; $this->setOrCreateOaid(); if($this->oaid != $old_oaid) { $this->resetSaveNesting(); $this->save(); //return true; } } //TODO: history start //if($this->status_id != $this->_old_data->status_id) { $this->createHistoryEntry(); //} if(!array_key_exists("dont_cascade", $_params) || !$_params['dont_cascade']) { $this->updateRimoWorkorderContact(); // run triggers based on new status $this->runStatusTrigger(); // Cascade status changes down to adb_hausnummer and adb_wohneinheit $this->cascadeStatus(); // Cascade status changes down all active preorders with the same hausnummer $this->cascadeStatusToPreorders(); } } public function resetSaveNesting() { mfValuecache::singleton()->delete("preorder-save-nesting-level-" . $this->id); } public function getStatuschangeTo($status_code) { $status = PreorderstatusModel::getFirst(["code" => $status_code]); if(!$status) { return false; } $history = PreorderHistoryModel::getLastStatusChangeTo($this->id, $status_code); if(!$history) { return false; } return $history->changed; } public function updateRimoWorkorderContact() { $contact_fields = [ "company", "uid", "firstname", "lastname", "phone", "email" ]; $changed_fields = $this->getChangedFields(); $update = []; foreach($changed_fields as $field) { if(in_array($field, $contact_fields)) { $update[$field] = $this->data->$field; } } $campaign = $this->getProperty("campaign"); if($campaign->oaid_origin == "other") return true; if($this->adb_wohneinheit_id && is_array($this->getProperty("adb_wohneinheit")->rimo_workorders)) { foreach($this->getProperty("adb_wohneinheit")->rimo_workorders as $workorder) { Rimoapi::updateWorkorder($workorder->rimo_id, $update); } } return true; } public function createHistoryEntry() { if(!$this->id) return true; $changed = $this->getChangedFields(); try { foreach($changed as $field) { $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": $field changed from '" . $this->_old_data->$field . "' to '" . $this->data->$field . "'"); $history = PreorderHistoryModel::create([ "preorder_id" => $this->id, "key" => $field, "old_value" => $this->_old_data->$field, "new_value" => $this->data->$field, "changed" => date("U") ]); $history->save(); } } catch(Exception $e) { $this->log->debug("[".$this->_ruid."] ".$e->getTraceAsString()); } } public function runStatusTrigger() { if(!$this->id) return true; if(property_exists($this->_old_data, "status_id") && $this->status_id == $this->_old_data->status_id) return true; $this->log->debug("[".$this->_ruid."] ".__METHOD__ . " running"); $new_status = $this->getProperty("status"); if(!property_exists($this->_old_data, "status_id")) { return true; } $old_status = new Preorderstatus($this->_old_data->status_id); if(!$new_status->id || !$old_status->id) return true; $this->log->debug("[".$this->_ruid."] ".__METHOD__ . " status changed from '" . ($old_status ? $old_status->code : "") . "' to '" . $new_status->code . "'"); if($new_status->code <= $old_status->code) return true; if(!defined("TT_PREORDER_STATUS_MATRIX") || !TT_PREORDER_STATUS_MATRIX) { $this->log->error("[".$this->_ruid."] "."config TT_PREORDER_STATUS_MATRIX not defined!"); } $actions = []; // run every trigger bnetween old and new status code foreach(TT_PREORDER_STATUS_MATRIX as $intermediate_code => $status) { if($intermediate_code <= $old_status->code) continue; if($intermediate_code > $new_status->code) continue; $code = $intermediate_code; // find trigger for new status code $classname = "Preorder_Statustrigger_$code"; $filepath = __DIR__ . "/statustrigger/$code.php"; $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": Looking for $classname in $filepath"); if(file_exists($filepath)) { require_once $filepath; } if(class_exists($classname)) { $trigger = new $classname($this, $new_status); $trigger->run(); /* // deprecated, replaced by PreordercampaignStatusnotifictionMailtemplate //var_dump($status["action"]); if(is_array($status) && array_key_exists("action", $status)) { foreach ($status["action"] as $type => $action) { if (!array_key_exists($type, $actions)) { $actions[$type] = []; } $action["status_code"] = $intermediate_code; $actions[$type][] = $action; } }*/ } else { $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": $classname not found"); } // TODO create email action if status templates configured in Campaign $campaign = new Preordercampaign($this->preordercampaign_id); if(!$campaign->id) continue; $status_mail = PreordercampaignStatusnotificationMailtemplate::getFirst(["preordercampaign_id" => $this->preordercampaign_id, "status_code" => $intermediate_code]); if($status_mail) { $mailtemplate = $status_mail->mailtemplate; if(!$mailtemplate) continue; if(!array_key_exists("email", $actions)) { $actions["email"] = []; } $actions["email"][] = [ "template" => $mailtemplate->code, "from" => "campaign", "data" => "preorder, adb_hausnummer, adb_wohneinheit", "status_code" => $intermediate_code, "allow_on_skip" => $status_mail->allow_on_skip ]; } } //var_dump($actions);exit; $this->log->debug("[".$this->_ruid."] ".print_r($actions, true)); //var_dump($actions);exit; // run last email action if(array_key_exists("email", $actions) && is_array($actions["email"]) && count($actions["email"])) { // get last email action, ignore previous status' // we only want to send emails for the highest new status $email_action = array_pop($actions["email"]); // check if this or a higher-status email was sent already $send_email = true; foreach(PreorderStatusnotificationLog::search(["preorder_id" => $this->id]) as $log) { if($log->status_code >= $email_action["status_code"]) { $send_email = false; break; } } if($new_status->code != $email_action["status_code"]) { // check if curent status allows sending previous status' notifications $current_status_mt = PreordercampaignStatusnotificationMailtemplate::getFirst(["preordercampaign_id" => $this->preordercampaign_id, "status_code" => $new_status->code]); if($current_status_mt && $current_status_mt->prevent_previous) { $send_email = false; $this->log->debug("[".$this->_ruid."] ".__METHOD__.": Sending disallowed by current status"); } // check if email action allows sending if skipped over it if(!$email_action["allow_on_skip"]) { $send_email = false; $this->log->debug("[".$this->_ruid."] ".__METHOD__.": Sending disallowed by previous status"); } } if($send_email) { $this->log->debug("[".$this->_ruid."] ".__METHOD__.": Sending Email Action for Status ".$email_action["status_code"]); $email_to = $this->runTriggerEmailAction($email_action); if($email_to === false) { $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": Could not send preorder action email (Preorder " . $this->id . ")"); } elseif(is_string($email_to)) { // TODO Save history $psn_log = PreorderStatusnotificationLog::create([ "preorder_id" => $this->id, "status_code" => $email_action["status_code"], "email" => $email_to ]); $psn_log->save(); } } else { $this->log->warning("[".$this->_ruid."] ".__METHOD__.": Not sending status (".$email_action["status_code"].") email because disallowed by current status or same or higher status email was sent already (Preorder ".$this->id.")"); } } return true; } public function runTriggerEmailAction($action, $custom_replacers = []) { if(!array_key_exists("template", $action)) return false; if(!array_key_exists("from", $action)) return false; $from_name = $this->getProperty("campaign")->from_email_name; $from_email = $this->getProperty("campaign")->from_email; if(!$from_email || !$from_name) { return true; } $to = $this->email; if(array_key_exists("to", $action) && $action["to"]) { $to = $action["to"]; } if(!$to) { $this->log->warning("[".$this->_ruid."] ".__METHOD__.": Keine To Adresse (Preorder ".$this->id.")"); return false; } $data = []; if(array_key_exists("data", $action)) { foreach(preg_split('/ *, */', $action["data"]) as $data_type) { if($data_type == "preorder") { $data["preorder"] = $this->getPropertiesAsArray(); } if($data_type == "adb_hausnummer") { // TODO Array convertion in jeweilige Klasse auslagern $hausnummer = $this->getProperty("adb_hausnummer"); if(!$hausnummer || !$hausnummer->id) continue; $hausnummer = clone $hausnummer; // so we dont unset data in cache $hausnummer_data = (array) $hausnummer->data; unset($hausnummer->data, $hausnummer->_old_data, $hausnummer->db, $hausnummer->log); $data["adb_hausnummer"] = array_merge((array) $hausnummer, $hausnummer_data); } if($data_type == "adb_wohneinheit") { $wohneinheit = $this->getProperty("adb_wohneinheit"); if(!$wohneinheit || !$wohneinheit->id) continue; $wohneinheit = clone $wohneinheit; // so we dont unset data in cache $wohneinheit_data = (array) $wohneinheit->data; unset($wohneinheit->data, $wohneinheit->_old_data, $wohneinheit->db, $wohneinheit->log); $data["adb_wohneinheit"] = array_merge((array) $wohneinheit, $wohneinheit_data); } } } $mailtemplate = MailtemplateModel::getFirst(["code" => $action["template"]]); if(!$mailtemplate) { $this->log->warning("[".$this->_ruid."] ".__METHOD__.": Mailtemplate nicht gefunden: ".$action["template"]." (Preorder ".$this->id.")"); return false; } $replacers = []; foreach($data as $type => $values) { foreach($values as $key => $value) { if(substr($key, 0, 1) == "\0") continue; $replacers[$key] = $value; } } foreach($custom_replacers as $key => $value) { if(!$key) continue; $replacers[$key] = $value; } $subject = $mailtemplate->getVariableReplacedSubject($replacers); $body = ''; $body .= $mailtemplate->renderBody($replacers); $body .= "\n"; $body_type = $mailtemplate->body_html ? "html" : "text"; $email = new Emailnotification("Preorder", $this->id, json_encode(["template" => $action["template"]])); $email->setSubject($subject); if($body_type == "html") { $email->setHtmlBody($body); } else { $email->setBody($body); } $email->setFrom($from_email, $from_name); $email->setTo($to); $email->setHeader("X-".ucfirst(MFAPPNAME)."-pid", $this->id); $email->setHeader("X-".ucfirst(MFAPPNAME)."-ps", $this->getProperty("status")->code); // add attachments try { foreach ($mailtemplate->files as $file) { if (!$file->filename || !$file->file_id || !$file->file->store_filename) continue; $this->log->debug("[".$this->_ruid."] ".$file->file->getFullPath()); $email->addAttachment($file->file->getFullPath(), null, $file->filename, $file->file->mimetype ?: null); } $email->send(); } catch (Exception $e) { $this->log->warning("[".$this->_ruid."] ".__METHOD__.": ".$e->getMessage()); } $this->log->info("[".$this->_ruid."] ".__METHOD__.": Sending StatusTrigger Email to $to"); return $to; } public function getPropertiesAsArray() { $preorder = clone $this; unset($preorder->data, $preorder->_old_data, $preorder->db, $preorder->log); $status = $this->getProperty("status"); $array = (array) $preorder; $array = array_merge($array, (array) $this->data); $return = []; foreach($array as $key => $value) { if(substr($key, 0, 1) == "\0") continue; $return[$key] = $value; } $return["status_code"] = $status->code; $return["status_name"] = $status->name; $return["contact_fullname"] = $this->getCompanyOrName(); return $return; } /* * Cascade status changes down to adb_hausnummer and adb_wohneinheit */ public function cascadeStatus() { $this->log->debug("[".$this->_ruid."] ".__METHOD__. " entered"); /* * defines status alignments of preorder status to hausnummer (h) and wohneinheit (w) * if h or w are greater than defined here, don't change them * * $statusmatrix = [ * "preorder_status_code" => [ * "h" => adb_status_code, * "w" => adb_status_code * ] * ] */ if(!$this->adb_hausnummer_id && !$this->adb_wohneinheit_id) { return true; } if(!defined("TT_PREORDER_STATUS_MATRIX") || !is_array(TT_PREORDER_STATUS_MATRIX) || !count(TT_PREORDER_STATUS_MATRIX)) { $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": TT_PREORDER_STATUS_MATRIX undefined! Cannot cascade Preorder status to Hausnummer and Wohneinheit"); return true; } $hausnummer = mfValuecache::singleton()->get("mfObjectmodel-adb_hausnummer-" . $this->adb_hausnummer_id); if(!$hausnummer) { $hausnummer = new ADBHausnummer($this->adb_hausnummer_id); if($hausnummer->id) mfValuecache::singleton()->set("mfObjectmodel-adb_hausnummer-".$this->adb_hausnummer_id, $hausnummer); } if(!$hausnummer->id) { $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": hausnummer " . $this->adb_hausnummer_id . " not found!"); return true; } $new_status = new Preorderstatus($this->status_id); if(!$new_status->id) { $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": Preorder has invalid status! ".print_r($this, true)); return true; } if(!array_key_exists($new_status->code, TT_PREORDER_STATUS_MATRIX)) { return true; } $cascade = TT_PREORDER_STATUS_MATRIX[$new_status->code]; if($cascade["h"] && $this->adb_hausnummer_id) { // set new hausnummer status $new_hausnummer_status = ADBStatusModel::getFirst(["code" => $cascade["h"]]); if(!$new_hausnummer_status) { $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": new ADBStatus code " . $cascade["h"] . " not found!"); return true; } $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": new hausnummer status code " . $new_hausnummer_status->code); // only update if current status is less than new status if($hausnummer->status->code < $new_hausnummer_status->code) { $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": Setting new hausnummer status code: " . $new_hausnummer_status->code); $hausnummer->status_id = $new_hausnummer_status->id; $hausnummer->save(); } } if($cascade["w"] && $this->adb_wohneinheit_id) { // set new wohneinheit status $new_wohneinheit_status = ADBStatusModel::getFirst(["code" => $cascade["w"]]); if(!$new_wohneinheit_status) { $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": new ADBStatus code " . $cascade["w"] . " not found!"); return true; } $wohneinheit = mfValuecache::singleton()->get("mfObjectmodel-adb_wohneinheit-" . $this->adb_wohneinheit_id); if(!$wohneinheit) { $wohneinheit = new ADBwohneinheit($this->adb_wohneinheit_id); if($wohneinheit->id) mfValuecache::singleton()->set("mfObjectmodel-adb_wohneinheit-".$this->adb_wohneinheit_id, $wohneinheit); } if(!$wohneinheit->id) return true; $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": new wohneinheit status code " . $new_wohneinheit_status->code); // only update if current status is less than new status if($wohneinheit->status->code < $new_wohneinheit_status->code) { $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": Setting new wohneinheit status code: " . $new_wohneinheit_status->code); $wohneinheit->status_id = $new_wohneinheit_status->id; $wohneinheit->save(); } } $flags = $this->getProperty("statusflags"); if(is_array($flags) && count($flags)) { foreach($flags as $flag) { if(strlen($flag->value->value) && array_key_exists($flag->code, TT_PREORDER_STATUS_FLAG_MATRIX)) { if($flag->code == "145") { //echo "flag 145\n"; $attribs = $this->getProperty("attribute"); if(!is_array($attribs)) { $attribs = []; } if(!array_key_exists("inhouse_cabling_supplied", $attribs) || $attribs["inhouse_cabling_supplied"] != $flag->value->value) { $attribs["inhouse_cabling_supplied"] = (int)$flag->value->value; //echo "[{$this->_ruid}] preorder::aftersave: updating attrib to ".(int)$flag->value->value."\n"; $this->attributes = json_encode($attribs); $this->save(["no_aftersave" => true]); //print_r($this->attributes);echo "\n"; } } $flag_matrix_item = TT_PREORDER_STATUS_FLAG_MATRIX[$flag->code]; if(!$flag_matrix_item["flag"]) continue; // set hausnummer flag if($flag_matrix_item["h"] && $this->adb_hausnummer_id) { $hflag = ADBStatusflagModel::getFirst(["code" => $flag_matrix_item["h"]]); if(!$hflag) { $this->log->warn("[".$this->_ruid."] "."Statusflag Code ".$flag->code." does not exist"); } else { $hflag->hausnummer_id = $hausnummer->id; $hflag->value->value = $flag->value->value; $hflag->value->save(); $this->log->debug("[" . $this->_ruid . "] " . __METHOD__ . ": Hausnummer flag " . $hflag->code . " value '" . $hflag->value->value . "' gespeichert"); } } // set wohneiheit flag if($flag_matrix_item["w"] && $this->adb_wohneinheit_id) { $wflag = ADBStatusflagModel::getFirst(["code" => $flag_matrix_item["w"]]); if(!$wflag) { $this->log->warn("[".$this->_ruid."] "."Statusflag Code ".$flag->code." does not exist"); } else { $wflag->wohneinheit_id = $wohneinheit->id; $wflag->value->value = $flag->value->value; $wflag->value->save(); $this->log->debug("[" . $this->_ruid . "] " . __METHOD__ . ": Wohneinheit flag " . $hflag->code . " value '" . $wflag->value->value . "' gespeichert"); } } if($flag->value->value && array_key_exists("ws", $flag_matrix_item) && $flag_matrix_item["ws"] && $this->adb_wohneinheit_id) { //echo "Setting Wohneinheit status to ".$flag_matrix_item["ws"]." from ".$this->getProperty("adb_wohneinheit")->status->code."\n"; // set new wohneinheit status $new_wohneinheit_status = ADBStatusModel::getFirst(["code" => $flag_matrix_item["ws"]]); if(!$new_wohneinheit_status) { $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": new ADBStatus code " . $flag_matrix_item["w"] . " not found!"); return true; } $wohneinheit = new ADBWohneinheit($this->adb_wohneinheit_id); if(!$wohneinheit->id) return true; $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": new wohneinheit status code " . $new_wohneinheit_status->code." (because flag ".$flag->code." is active)"); // only update if current status is less than new status if($wohneinheit->status->code < $new_wohneinheit_status->code) { $this->log->debug("[".$this->_ruid."] ".__METHOD__ . ": Setting new wohneinheit status code: " . $new_wohneinheit_status->code); $wohneinheit->status_id = $new_wohneinheit_status->id; $wohneinheit->save(); } } } } } return true; } public function cascadeStatusToPreorders() { $status = new Preorderstatus($this->status_id); if(!$status->id) { return false; } if($this->adb_hausnummer_id) { foreach(PreorderModel::searchActive(["adb_hausnummer_id" => $this->adb_hausnummer_id, " $status->code]) as $preorder) { if($preorder->deleted) continue; if($preorder->id == $this->id) continue; // load status explicitly to work around // visibility in different instances of same class $tmp_s = $preorder->getProperty("status"); /*if(!$preorder->status->code || !$status->code) { $this->log->debug("[".$this->_ruid."] "."Preorder->status->code". print_r($preorder->status, true)); $this->log->debug("[".$this->_ruid."] "."Status->code". print_r($status->code, true)); }*/ if($preorder->status->code < $status->code && $status->code <= 244) { $preorder->status_id = $status->id; $preorder->save(); } } } return true; } public function syncStatusFlagsFromAdb() { if(!$this->id || !$this->adb_hausnummer_id) return true; $hausnummer = $this->getProperty("adb_hausnummer"); foreach(ADBStatusflagModel::getAll() as $hflag) { $val = $hausnummer->statusflags[$hflag->id]->value->value; if(!$val) continue; // only set flags from 0 to 1 $pflag = PreorderStatusflagModel::getFirst(["preorder_id" => $this->id, "code" => $hflag->code]); if(!$pflag) { $this->log->error("[".$this->_ruid."] ".__METHOD__."PreorderStatusFlag with code ".$hflag->code." not found!"); continue; } $pflag->preorder_id = $this->id; if($pflag->value->value != $val) { $pflag->value->value = $val; $pflag->value->save(); } } return true; } public function getCompanyOrName() { $company = trim($this->company); if($company) { return $company; } return $this->getFullName(); } public function getFullName() { // Assumes "Firma1 Firma2" or "firstname lastname" as readable form $name = ""; if($this->firstname && $this->lastname) { $name = $this->firstname . " " . $this->lastname; } elseif($this->lastname) { $name = $this->lastname; } elseif($this->firstname) { $name = $this->firstname; } return $name; } public function getFreeCtagsInSet($search_ctag) { if(!$this->getProperty("adb_hausnummer")->vlan_stag) { echo "no stag\n"; return false; } $stag = $this->adb_hausnummer->vlan_stag; if(!$stag) { return false; } $ctags_per_home = 1; $network_name = ""; if($this->adb_hausnummer->netzgebiet->source == "citycom-oan-api") { $network_name = "citycom-oan"; $ctags_per_home = count(CITYCOM_OAN_API_SERVICES_FOR_ORDER) + count(CITYCOM_OAN_API_SERVICES_FOR_RESERVATION); // Service VLANS + mgmt VLANS } if(!$network_name) { echo "no network\n"; return false; } // get start of ctag range $first_ctag = $search_ctag - ($search_ctag % $ctags_per_home); $last_ctag = $first_ctag + $ctags_per_home - 1; $mgmt_ctag_exists = false; $mgmt_ctag = null; $ctag_range = []; for($i = $first_ctag; $i <= $last_ctag; $i++) { $ctag = PreorderCtag::getFirstActive(["stag" => $stag, "ctag" => $i, "network" => $network_name]); if(!$ctag) { if($i == $last_ctag && !$mgmt_ctag_exists) { // mgmt ctag should be the last in range $mgmt_ctag = $i; continue; } $ctag_range[] = $i; } else { if($ctag->service_type == "mgmt") { $this->log->debug(__METHOD__.": mgmt ctag ($i / stag $stag) exists already\n"); $mgmt_ctag_exists = true; } } } return [$ctag_range, $mgmt_ctag]; } public function getNextFreeCtags() { if(!$this->getProperty("adb_hausnummer")->vlan_stag) { echo "no stag\n"; return false; } $stag = $this->adb_hausnummer->vlan_stag; if(!$stag) { return false; } $new_ctag = false; $ctags_per_home = 1; $network_name = ""; if($this->adb_hausnummer->netzgebiet->source == "citycom-oan-api") { $network_name = "citycom-oan"; $first_ctag = CITYCOM_OAN_FIRST_CTAG; $ctags_per_home = count(CITYCOM_OAN_API_SERVICES_FOR_ORDER) + count(CITYCOM_OAN_API_SERVICES_FOR_RESERVATION); // Service VLANS + mgmt VLANS } if(!$network_name) { echo "no network\n"; return false; } $last_ctag = PreorderCtag::getLastActive(["stag" => $stag, "network" => $network_name]); if(!$last_ctag) { $new_ctag = $first_ctag; } else { $last_ctag_num = $last_ctag->ctag; $miss = $last_ctag_num % $ctags_per_home; if($miss) { $last_ctag_num = $last_ctag_num - $miss; } $new_ctag = $last_ctag_num + $ctags_per_home; } $new_ctags = []; for($i = $new_ctag; $i < $new_ctag + $ctags_per_home; $i++) { $new_ctags[] = $i; } $mgmt_ctag = array_pop($new_ctags); return [$new_ctags, $mgmt_ctag]; } public function setOrCreateOaid($oaid_attributes = false) { $campaign = new Preordercampaign($this->preordercampaign_id); //var_dump($campaign);exit; if(!$campaign->id) { return false; } if(!$this->adb_wohneinheit_id) { $this->oaid = null; return false; } $wohneinheit = new ADBWohneinheit($this->adb_wohneinheit_id); if(!$wohneinheit) { return true; } /*if($campaign->oaid_origin == "other") { // oaid in wohneinheit übernehmen, falls in Preorder schon vorhanden if($this->oaid) // oaid aus wohneinheit übernehmen, falls vorhanden $this->log->debug("[".$this->_ruid."] ".__METHOD__.": Kampagne unterstützt keine OAIDs"); return true; }*/ if($campaign->oaid_origin == "other") { if($wohneinheit->oaid != $this->oaid) { $this->oaid = $wohneinheit->oaid; } return true; } if($this->oaid) { // If current OAID is from correct Origin then do nothing if($campaign->oaid_origin == "thetool") { $current_oaid = OpenAccessIdModel::getFirstOaid($this->oaid); if($current_oaid) { $this->log->warning("[".$this->_ruid."] "."OAID of Preorder " . $this->id . " should be thetool, but is OFAA"); } else { if($wohneinheit->oaid != $this->oaid) { $this->oaid = $wohneinheit->oaid; return true; } } } elseif($campaign->oaid_origin == "ofaa") { $current_oaid = OpenAccessIdModel::getFirstOaid($this->oaid); //var_dump($current_oaid);exit; if(!$current_oaid) { $this->log->error("[".$this->_ruid."] "."OAID of Preorder " . $this->id . " not found in OpenAccessIds"); // assume it's from a different origin } else { if($campaign->oaid_origin == $current_oaid->origin) { // also check if wohneinheit has no oaid and set it if(!$wohneinheit->oaid) { $wohneinheit->oaid = $current_oaid->oaid; $wohneinheit->save(); } elseif($wohneinheit->oaid != $this->oaid) { // also check if wohneinheit has a different OAID and set it in the Preorder // No need to update OAID object, it should be correct already, because Wohneinheit is the source of oaid data, $this->oaid = $wohneinheit->oaid; } return true; } } } } if($this->type == "interest") return true; if(!$this->id) { $this->log->error("[".$this->_ruid."] ".__METHOD__ . ": Tried to create OAID in unsaved Preorder"); throw new Exception(__METHOD__ . ": Tried to create OAID in unsaved Preorder"); } // use Wohneinehit OAID if available and from same origin $unit_oaid = $this->getOaidFromWohneinheitIfOriginMatch(); if($unit_oaid) { $this->oaid = $unit_oaid; $this->save(); return true; } // else create new OAID if(!$campaign->network) { $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": Cannot create OAID: Invalid campaign Network"); return false; } $netowner = new Address($campaign->network->owner_id); if(!$netowner->id) { $this->log->warning("[".$this->_ruid."] ".__METHOD__ . ": Cannot create OAID: Invalid campaign Network Owner"); return false; } switch($campaign->oaid_origin) { case "ofaa": if(!$oaid_attributes) { $oaid_attributes = [ "origin" => $campaign->oaid_origin, "owner_id" => $campaign->network->owner_id ]; } // get new OFAA OAID $oaid = new OpenAccessId(); $oaid->loadRandomUnassigned($oaid_attributes); if(!$oaid->oaid) { $this->log->error("[".$this->_ruid."] "."Keine weiteren OAIDs verfügbar"); throw new Exception("Keine weiteren OAIDs verfügbar in " . $netowner->getCompanyOrName()); } else { // make sure this OAID is not in use on another wohneinheit by accident $oaid_unit_count = ADBWohneinheitModel::count(['oaid' => $oaid->oaid]); $oaid_unit_try = 0; while($oaid_unit_count) { if($oaid_unit_try > 5) { $this->log->error("[".$this->_ruid."] ".__METHOD__ . ": Can't find random OAID which is not already used in Wohneinheit by accident after 5 tries. Giving up"); throw new Exception("Can't find random OAID which is not already used in Wohneinheit by accident after 5 tries. Giving up"); } $oaid_unit_try++; $oaid = new OpenAccessId(); $oaid->loadRandomUnassigned($oaid_attributes); $oaid_unit_count = ADBWohneinheitModel::count(['oaid' => $oaid->oaid]); } } if(!$oaid->oaid) { $this->log->error("[".$this->_ruid."] ".__METHOD__ . ": Cannot generate OAID: OpenAccessId::loadRandomUnassigned() failed."); return false; } if($wohneinheit->oaid != $oaid->oaid) { $wohneinheit->oaid = $oaid->oaid; $wohneinheit->save(); } $this->oaid = $oaid->oaid; $oaid->assigned = date('U'); $oaid->adb_wohneinheit_id = $wohneinheit->id; $oaid->address = $wohneinheit->hausnummer->getAddress(); $oaid->unit_string = (string)$wohneinheit; //var_dump($oaid);exit; if(!$oaid->save()) { $this->log->error("[".$this->_ruid."] "."Fehler beim Speichern der OAID für Preorder " . $this->id); return false; } if(!$this->save()) { $oaid->assigned = 0; $oaid->adb_wohneinheit_id = null; $oaid->address = null; $oaid->unit_string = null; $oaid->save(); return false; } break; case "thetool": // create new thethool OAID $wohneinheit = new ADBWohneinheit($this->adb_wohneinheit_id); if(!$wohneinheit->oaid) { $wohneinheit->oaid = $wohneinheit->getNewOAID(); $wohneinheit->save(); } if($wohneinheit->oaid) { $this->oaid = $wohneinheit->oaid; } $this->save(); break; } return true; } private function getOaidFromWohneinheitIfOriginMatch() { if($this->adb_wohneinheit_id) { $unit = new ADBWohneinheit($this->adb_wohneinheit_id); if($unit && $unit->oaid && $this->oaid != $unit->oaid) { $campaign = new Preordercampaign($this->preordercampaign_id); $unit_oaid = OpenAccessIdModel::getFirst(["oaid" => $unit->oaid]); if($unit_oaid && $unit_oaid->origin == $campaign->oaid_origin) { return $unit->oaid; } } } } public function createRimoWorkorder() { if(!$this->adb_wohneinheit_id) { return false; } $wohneinheit = new ADBWohneinheit($this->adb_wohneinheit_id); if(!$wohneinheit->id) { $this->log->error("[".$this->_ruid."] ".__METHOD__.": Wohneinheit nicht gefunden (Preorder ".$this->id." ".$this->ucode." ".$this->oaid.")"); return false; } if(!$wohneinheit->extref) { return false; } $campaign = new Preordercampaign($this->preordercampaign_id); if($campaign->oaid_origin == "other") { $this->log->debug("[".$this->_ruid."] ".__METHOD__.": Kampagne unterstützt keine OAIDs"); return false; } if(!$this->oaid) { $this->setOrCreateOaid(); if(!$this->oaid) { return false; } } $oaid = OpenAccessIdModel::getFirstOaid($wohneinheit->oaid); if(!$oaid) { $this->log->warning("[".$this->_ruid."] ".__METHOD__.": OAID '".$wohneinheit->oaid."' not found"); return false; } // create and assign OAID if not yet done $oaid->exportToRimoAndAssignFtu(); // create Workorder $data = []; $data["firstname"] = trim($this->firstname); $data["lastname"] = trim($this->lastname); $data["company"] = trim($this->company); $data["phone"] = trim($this->phone); $data["email"] = trim($this->email); $data["orderId"] = $this->ucode; $response = Rimoapi::createWorkorder($wohneinheit->extref, $data); //var_dump($response);exit; if(!$response) { $this->log->error("[".$this->_ruid."] ".__METHOD__."Cannot create RimoWorkorder! Invalid Response! (Preorder ucode: ".$this->ucode.")"); return false; } $rimo_status = $response->state->userLabel; if(!$rimo_status) { $rimo_status = ""; } $wo = RimoWorkorderModel::create([ "rimo_id" => $response->id, "rimo_name" => $response->name, "rimo_status" => $rimo_status, "adb_wohneinheit_id" => $this->adb_wohneinheit_id, "create_data" => json_encode($response) ]); //var_dump($wo);exit; $wo->save(); return $wo; } public function setNewStatusCode($new_status_code) { if(!$new_status_code) return false; $new_status = PreorderstatusModel::getFirst(["code" => $new_status_code]); if(!$new_status) return false; $status = $this->getProperty("status"); if($status->code < $new_status->code) { $this->status_id = $new_status->id; } return true; } public function setStatusFlag($code, $value = 1) { if(!$code) return false; $sflag = PreorderStatusflagModel::getFirst(["code" => $code]); if(!$sflag) return false; $sflag->preorder_id = $this->id; $sflag->value->value = $value; $sflag->value->save(); return true; } public function getNetowner() { if(!$this->id) return false; if(!$this->adb_hausnummer_id) return false; $network = $this->getProperty("campaign")->network; $this->log->debug("[".$this->_ruid."] ".__METHOD__.": campaign: ".$this->getProperty("campaign")->name); $this->log->debug("[".$this->_ruid."] ".__METHOD__.": network: ".$network->name); if(!$network) return false; return $network->owner; } public function getNetownerRimoApiCredentials() { $netowner = $this->getNetowner(); if(!$netowner) return false; foreach(TT_RIMO_API_CREDS as $api_creds) { if($api_creds["address_id"] == $netowner->id) { return $api_creds; } } return null; } public function createUcode() { $ucode = $this->generateNewUcode(); while(PreorderModel::search(['ucode' => $ucode])) { $ucode = $this->generateNewUcode(); } $this->ucode = $ucode; return $this->ucode; } private function generateNewUcode() { $chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; $charsLength = strlen($chars); $ucode = ''; for($i = 0; $i < 8; $i++) { $ucode .= $chars[rand(0, $charsLength - 1)]; } return $ucode; } public function createCiftoken() { $ciftoken = $this->generateNewCiftoken(); while(PreorderModel::getFirst(['ciftoken' => $ciftoken])) { $ciftoken = $this->generateNewCiftoken(); } $this->ciftoken = $ciftoken; return $this->ciftoken; } private function generateNewCiftoken() { $chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxzy'; $charsLength = strlen($chars); $ciftoken = ''; for($i = 0; $i < 16; $i++) { $ciftoken .= $chars[rand(0, $charsLength - 1)]; } return $ciftoken; } public function generateCifUrl() { $campaign = $this->getProperty("campaign"); $cifurl = $campaign->cifurl; $cifurl = str_replace("{{CIFTOKEN}}", $this->ciftoken, $cifurl); return $cifurl; } public function generateCifCableUrl() { $campaign = $this->getProperty("campaign"); $cifcableurl = $campaign->cifcableurl; str_replace("{{CIFTOKEN}}", $this->ciftoken, $cifcableurl); return $cifcableurl; } public function getCifdataApiArray() { if(!$this->id) { return false; } $hausnummer = $this->getProperty("adb_hausnummer"); $wohneinheit = $this->getProperty("adb_wohneinheit"); $campaign = $this->getProperty("campaign"); $a = []; $a["ciftoken"] = $this->ciftoken; $a["code"] = $this->ucode; $a['oaid'] = $this->oaid; $a['company'] = ($this->company) ? $this->company : null; $a['uid'] = ($this->uid) ? $this->uid : null; $a['firstnam'] = ($this->firstname) ? $this->firstname : null; $a['lastname'] = ($this->lastname) ? $this->lastname : null; $a['street'] = $hausnummer->strasse->name; $a['housenumber'] = $hausnummer->hausnummer; $a['zip'] = $hausnummer->plz->plz; $a['city'] = $hausnummer->strasse->gemeinde->name; $a['municipality'] = ""; $a['district'] = $hausnummer->ortschaft->name; $a['block'] = ($wohneinheit->block) ? $wohneinheit->block : null; $a['stock'] = ($wohneinheit->stock) ? $wohneinheit->stock : null; $a['stiege'] = ($wohneinheit->stiege) ? $wohneinheit->stiege : null; $a['tuer'] = ($wohneinheit->tuer) ? $wohneinheit->tuer : null; if($campaign->district_is_city) { $a['city'] = $hausnummer->ortschaft->name; $a['municipality'] = $hausnummer->strasse->gemeinde->name; } else { unset($a['municipality']); } return $a; } public function getBorderpointImageFile() { if(!$this->adb_hausnummer_id) return false; $border_lat = $this->getProperty("adb_hausnummer")->borderpoint_lat; $border_long = $this->getProperty("adb_hausnummer")->borderpoint_long; if(!$border_lat || !$border_long ) { return false; } $filename = "borderpoint_map_h".$this->adb_hausnummer_id."_{$border_lat}_{$border_long}"; $bpi_file = PreorderFile::getFirst(["preorder_id" => $this->id, "filename" => $filename]); if($bpi_file) { return $bpi_file; } // get new Borderpoint Image from Mapbox API $params = [ "gps_lat" => $border_lat, "gps_long" => $border_long, "zoom" => 19, "size_x" => 640, "size_y" => 640, "style" => "satellite-streets-v12", "pin" => [ "gps_lat" => $border_lat, "gps_long" => $border_long, "size" => "l", "color" => "ee9900", "icon" => "embassy" ], "access_token" => TT_MAPBOX_TILE_API_TOKEN ]; $image_content = Mapbox_StaticImageApi::getImageFileContent($params); if(!$image_content) { return false; } $fs_filename = "$filename.jpg"; if(!file_put_contents(MFUPLOAD_FILE_SAVE_PATH."/preorder-borderpoint/$fs_filename", $image_content)) { $this->log->error("[".$this->_ruid."] ".__METHOD__.": Error saving Borderpoint Static Map Image File"); return false; } $file = FileModel::create([ "name" => "borderpoint_map", "description" => $this->adb_hausnummer_id, "filename" => "$filename.jpg", "orig_filename" => "$filename.jpg", "store_filename" => $fs_filename, "subfolder" => "preorder-borderpoint", ]); if(!$file->save()) { $this->log->error("[".$this->_ruid."] ".__METHOD__.": Error saving File Object"); return false; } $file->mimetype = $file->getMimetype(); $file->save(); $pf = PreorderFile::create([ "preorder_id" => $this->id, "file_id" => $file->id, "filename" => $filename ]); if(!$pf->save()) { $this->log->error("[".$this->_ruid."] ".__METHOD__.": Error saving PreorderFile Object"); return false; } return $pf; } public function getApiArray($options = []) { if(!$this->id) { return false; } $include_full_home = false; $include_full_address = false; if(in_array("full_home", $options)) { $include_full_home = true; } if(in_array("full_address", $options)) { $include_full_address = true; } $hausnummer = $this->getProperty("adb_hausnummer"); $wohneinheit = $this->getProperty("adb_wohneinheit"); $campaign = $this->getProperty("campaign"); $status = $this->getProperty("status")->getApiArray(); foreach($this->getProperty("statusflags") as $sflag) { $status["flags"][] = [ "code" => (int)$sflag->code, "text" => $sflag->name, "value" => ($sflag->value->value == 1) ]; } //var_dump($status);exit; $a = []; $a['code'] = strtoupper($this->ucode); $a['oaid'] = $this->oaid; $a['extref'] = $this->extref; $a['orderDate'] = ($this->order_date) ? date("Y-m-d", $this->order_date) : null; $a['status'] = $status; $a['ciftoken'] = ($this->ciftoken) ? $this->ciftoken : null; $a['cifurl'] = ($this->cifurl) ? $this->cifurl : null; $a['cifcableurl'] = ($this->cifcableurl) ? $this->cifcableurl : null; $a['installationDate'] = ($this->installation_date) ? date("c", $this->installation_date) : null; $a['connectionType'] = $this->connection_type; $a['connectionCount'] = ($this->connection_count) ? (int)$this->connection_count : 1; $a['isAdditionalOrder'] = ($this->is_additional_order) ? true : false; $a['technology'] = ($this->technology) ? $this->technology : null; $a['equipment_name'] = ($wohneinheit->getPatchEqString()) ? $wohneinheit->getPatchEqString() : null; $a['equipment_port'] = ($wohneinheit->patch_port) ? $wohneinheit->patch_port : null; $a['preorderType'] = $this->type; $a['acceptMarketing'] = ($this->accept_marketing) ? true : false; $a['acceptAgb'] = ($this->accept_agb) ? true : false; $a['acceptDsgvo'] = ($this->accept_dsgvo) ? true : false; $a['acceptWithdrawal'] = ($this->accept_withdrawal) ? true : false; $a['acceptDigging'] = ($this->accept_digging) ? true : false; $a['address_info'] = ($this->address_info) ? $this->address_info : null; $address = []; $address['cluster_id'] = $hausnummer->netzgebiet->extref; $address['street'] = $hausnummer->strasse->name; $address['housenumber'] = $hausnummer->hausnummer; $address['stiege'] = $hausnummer->stiege; $address['zip'] = $hausnummer->plz->plz; $address['city'] = $hausnummer->strasse->gemeinde->name; $address['municipality'] = ""; $address['district'] = $hausnummer->ortschaft->name; if($campaign->district_is_city) { $address['city'] = $hausnummer->ortschaft->name; $address['municipality'] = $hausnummer->strasse->gemeinde->name; } else { unset($address['municipality']); } if($include_full_address) { $address['gps_lat'] = $hausnummer->gps_lat; $address['gps_long'] = $hausnummer->gps_long; $address["borderpoint_lat"] = $hausnummer->borderpoint_lat; $address["borderpoint_long"] = $hausnummer->borderpoint_long; $address["trenches"] = []; $address["home_trench"] = []; if($hausnummer->trenches) { $address["trenches"] = json_decode($hausnummer->trenches); } if($hausnummer->home_trench) { $address["home_trench"] = json_decode($hausnummer->home_trench); } } if(!$include_full_home) { $address['block'] = ($wohneinheit->block) ? $wohneinheit->block : null; $address['stock'] = ($wohneinheit->stock) ? $wohneinheit->stock : null; $address['tuer'] = ($wohneinheit->tuer) ? $wohneinheit->tuer : null; $address['unit_string'] = ($wohneinheit->bezeichner) ? $wohneinheit->bezeichner : null; } else { $home = []; $home_status = $wohneinheit->status->getApiArray(); foreach(ADBWohneinheitStatusflagValueModel::search(["hausnummer_id" => $hausnummer->id]) as $sflag) { $home_status["flags"][] = [ "code" => (int)$sflag->flag->code, "text" => $sflag->flag->name, "value" => ($sflag->value == 1) ]; } $home["id"] = (int)$wohneinheit->id; $home["status"] = $home_status; $home['block'] = ($wohneinheit->block) ? $wohneinheit->block : null; $home['stock'] = ($wohneinheit->stock) ? $wohneinheit->stock : null; $home['tuer'] = ($wohneinheit->tuer) ? $wohneinheit->tuer : null; $home['unit_string'] = ($wohneinheit->bezeichner) ? $wohneinheit->bezeichner : null; $home["rimo_external_id"] = $wohneinheit->extref; $home["nutzung"] = $wohneinheit->nutzung; $home["rimo_executionstate"] = $wohneinheit->rimo_ex_state; $home["rimo_operationalstate"] = $wohneinheit->rimo_op_state; $home['created'] = date("c", $wohneinheit->create); $home['created_ts'] = (int)$wohneinheit->create; $home['updated'] = date("c", $wohneinheit->edit); $home['updated_ts'] = (int)$wohneinheit->edit; $address['address_id'] = (int)$hausnummer->id; } $address['is_shipping'] = ($this->shipping_address == "address") ? true : false; $customer = []; $customer['company'] = ($this->company) ? $this->company : null; $customer['uid'] = ($this->uid) ? $this->uid : null; $customer['firstnam'] = ($this->firstname) ? $this->firstname : null; $customer['lastname'] = ($this->lastname) ? $this->lastname : null; $customer['street'] = ($this->street) ? $this->street : null; $customer['stiege'] = ($this->stiege) ? $this->stiege : null; $customer['housenumber'] = ($this->housenumber) ? $this->housenumber : null; $customer['zip'] = ($this->zip) ? $this->zip : null; $customer['city'] = ($this->city) ? $this->city : null; $customer['block'] = ($this->block) ? $this->block : null; $customer['stock'] = ($this->stock) ? $this->stock : null; $customer['tuer'] = ($this->tuer) ? $this->tuer : null; $customer['unit_string'] = ($this->unit_string) ? $this->unit_string : null; $customer['phone'] = ($this->phone) ? $this->phone : null; $customer['email'] = ($this->email) ? $this->email : null; $a['address'] = $address; if($include_full_home) { $a["home"] = $home; } $a['customer'] = $customer; $a['addonServices'] = null; if($this->addon_services) { $addon_services = json_decode($this->addon_services); if(json_last_error() === JSON_ERROR_NONE) { $a['addonServices'] = $addon_services; } } $a['additionalData'] = null; if($this->addon_data) { $addon_data = json_decode($this->addon_data); if(json_last_error() === JSON_ERROR_NONE) { $a['additionalData'] = $addon_data; } } $a['created'] = date("c", $this->create); $a['created_ts'] = (int)$this->create; $a['updated'] = date("c", $this->edit); $a['updated_ts'] = (int)$this->edit; return $a; } public function getProperty($name) { if($this->$name == null) { if($name == "campaign") { $this->campaign = new Preordercampaign($this->preordercampaign_id); return $this->campaign; } if($name == "status") { $this->status = mfValuecache::singleton()->get("mfObjectmodel-Preorderstatus-" . $this->status_id); if(!$this->status) { $this->status = new Preorderstatus($this->status_id); if($this->status->id) { mfValuecache::singleton()->set("mfObjectmodel-Preorderstatus-" . $this->status_id, $this->status); } } return $this->status; } if($name == "statusflags") { $flags = []; foreach(PreorderStatusflagModel::getAll() as $flag) { $flag->preorder_id = $this->id; $flags[$flag->id] = $flag; } if(count($flags)) { $this->statusflags = $flags; } return $this->statusflags; } if($name == "partner") { $this->partner = mfValuecache::singleton()->get("mfObjectmodel-Address-" . $this->partner_id); if(!$this->partner) { $this->partner = new Address($this->partner_id); if($this->partner->id) { mfValuecache::singleton()->set("mfObjectmodel-Address-" . $this->partner_id, $this->partner); } } return $this->partner; } if($name == "discounts") { $discounts = PreorderDiscountModel::search(["preorder_id" => $this->id]); if($discounts) { $this->discounts = $discounts; } return $this->discounts; } if($name == "applied_discounts") { $discounts = PreorderDiscountModel::search(["preorder_id" => $this->id, "assigned" => true]); if($discounts) { $this->discounts = $discounts; } return $this->discounts; } if($name == "building") { $this->building = mfValuecache::singleton()->get("mfObjectmodel-Building-" . $this->building_id); if(!$this->building) { $this->building = new Building($this->building_id); if($this->building->id) { mfValuecache::singleton()->set("mfObjectmodel-Building-" . $this->building_id, $this->building); } } return $this->building; } if($name == "adb_hausnummer") { $hausnummer = mfValuecache::singleton()->get("mfObjectmodel-adb_hausnummer-" . $this->adb_hausnummer_id); if(!$hausnummer) { $hausnummer = new ADBHausnummer($this->adb_hausnummer_id); } if($hausnummer && $hausnummer->id) { mfValuecache::singleton()->set("mfObjectmodel-adb_hausnummer-" . $this->adb_hausnummer_id, $hausnummer); $this->adb_hausnummer = $hausnummer; return $this->adb_hausnummer; } return new ADBHausnummer(); } if($name == "adb_wohneinheit") { $wohneinheit = mfValuecache::singleton()->get("mfObjectmodel-adb_wohneinheit-" . $this->adb_wohneinheit_id); if(!$wohneinheit) { $wohneinheit = new ADBWohneinheit($this->adb_wohneinheit_id); } if($wohneinheit && $wohneinheit->id) { mfValuecache::singleton()->set("mfObjectmodel-adb_wohneinheit-" . $this->adb_wohneinheit_id, $wohneinheit); $this->adb_wohneinheit = $wohneinheit; return $this->adb_wohneinheit; } return new ADBWohneinheit(); } if($name == "services") { if(!$this->addon_services) { return null; } $addon_services = json_decode($this->addon_services); if(json_last_error() === JSON_ERROR_NONE) { $this->services = $addon_services; return $this->services; } return null; } if($name == "ordered_services") { if(!$this->addon_services) { return null; } $ordered_services = []; $addon_services = json_decode($this->addon_services); if(json_last_error() === JSON_ERROR_NONE) { foreach($addon_services as $s) { if($s->ordered) { $ordered_services[] = $s; } } $this->ordered_services = $ordered_services; return $this->ordered_services; } return null; } if($name == "logistics") { $logistics = PreorderlogisticsModel::getFirst(["preorder_id" => $this->id]); $this->logistics = $logistics; return $this->logistics; } if($name == "history") { $history = PreorderHistoryModel::search(["preorder_id" => $this->id]); $this->history = $history; return $this->history; } if($name == "attribute") { if(!$this->attributes) { return null; } $this->attribute = json_decode($this->attributes, true); return $this->attribute; } if($name == "statusjournals") { $journals = PreorderstatusJournal::search(["preorder_id" => $this->id]); if($journals) { $this->statusjournals = $journals; return $this->statusjournals; } return []; } if($name === 'fcp') { if(!$this->adb_hausnummer || !$this->adb_hausnummer->fcp_id) return null; return ADBRimoFcp::get($this->adb_hausnummer->fcp_id); } if($name == "citycomoan") { $ccoan = PreorderCitycomOan::getFirst(["preorder_id" => $this->id]); if(!$ccoan) return null; $this->citycomoan = $ccoan; return $this->citycomoan; } if($name == "ctags") { $ctags = PreorderCtag::searchActive(["preorder_id" => $this->id]); if(!$ctags) return null; $this->ctags = $ctags; return $this->ctags; } if($name == "cancel_request_status") { if(!$this->cancel_request_status_code) return null; $this->cancel_request_status = mfValuecache::singleton()->get("mfObjectmodel-Preorderstatus-code-" . $this->cancel_request_status_code); if(!$this->cancel_request_status) { $cancel_request_status = PreorderstatusModel::getFirst(["code" => $this->cancel_request_status_code]); if($cancel_request_status) { mfValuecache::singleton()->set("mfObjectmodel-Preorderstatus-code-" . $this->cancel_request_status_code, $cancel_request_status); $this->cancel_request_status = $cancel_request_status; } } return $this->cancel_request_status; } if($name == "cancel_request_creator") { $user = mfValuecache::singleton()->get("Worker-id-" . $this->cancel_request_by); if($user) { $this->cancel_request_creator = $user; return $this->cancel_request_creator; } $this->cancel_request_creator = new User($this->cancel_request_by); if($this->cancel_request_creator->id) { mfValuecache::singleton()->set("Worker-id-" . $this->cancel_request_by, $this->cancel_request_creator); } return $this->cancel_request_creator; } if($name == "cancel_approver") { $user = mfValuecache::singleton()->get("Worker-id-" . $this->cancel_approved_by); if($user) { $this->cancel_approver = $user; return $this->cancel_approver; } $this->cancel_approver = new User($this->cancel_approved_by); if($this->cancel_approver->id) { mfValuecache::singleton()->set("Worker-id-" . $this->cancel_approved_by, $this->cancel_approver); } return $this->editor; } if($name == "creator") { $user = mfValuecache::singleton()->get("Worker-id-" . $this->create_by); if($user) { $this->creator = $user; return $this->creator; } $this->creator = new User($this->create_by); if($this->creator->id) { mfValuecache::singleton()->set("Worker-id-" . $this->create_by, $this->creator); } return $this->creator; } if($name == "editor") { $user = mfValuecache::singleton()->get("Worker-id-" . $this->edit_by); if($user) { $this->editor = $user; return $this->editor; } $this->editor = new User($this->edit_by); if($this->editor->id) { mfValuecache::singleton()->set("Worker-id-" . $this->edit_by, $this->editor); } return $this->editor; } $classname = ucfirst($name); $idfield = $name . "_id"; $this->$name = mfValuecache::singleton()->get("mfObjectmodel-$name-" . $this->$idfield); if(!$this->$name) { $this->$name = new $classname($this->$idfield); } if($this->$name->id) { mfValuecache::singleton()->set("mfObjectmodel-$name-" . $this->$name->id, $this->$name); return $this->$name; } else { return null; } } return $this->$name; } public function __clone() { $me = new User; $me->loadMe(); $old_id = $this->id; //$old_ucode = $this->ucode; $this->id = null; $this->_ruid = bin2hex(random_bytes(16)); $this->data = clone($this->data); $this->_old_data = new StdClass(); $this->status = null; $this->campaign = null; $this->partner = null; $this->building = null; $this->adb_hausnummer = null; $this->adb_wohneinheit = null; // cleanup Preorder data $this->create_by = $me->id; $this->edit_by = $me->id; $this->create = null; $this->edit = null; $this->saved = 0; $this->mode = "new"; //$this->save(); $this->log->debug("Cloned Preorder $old_id"); } }