From 9a3eca761ef97f5949a49a0a413aa7eed5bbd84b Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Tue, 26 Nov 2024 15:10:27 +0100 Subject: [PATCH 1/4] WIP Preorder Status Notifications --- Layout/default/Preordercampaign/Form.php | 18 ++++++++ application/Preorder/Preorder.php | 28 +++++++++++ application/Preorder/statustrigger/245.php | 46 +++++++++++++++++++ .../PreordercampaignController.php | 2 + .../PreordercampaignModel.php | 2 + ...152024_preordercampaign_add_email_from.php | 32 +++++++++++++ 6 files changed, 128 insertions(+) create mode 100644 application/Preorder/statustrigger/245.php create mode 100644 db/migrations/20241125152024_preordercampaign_add_email_from.php diff --git a/Layout/default/Preordercampaign/Form.php b/Layout/default/Preordercampaign/Form.php index 47fc8777a..9ce1b0c7b 100644 --- a/Layout/default/Preordercampaign/Form.php +++ b/Layout/default/Preordercampaign/Form.php @@ -376,6 +376,24 @@ +

Emailbenachrichtigungen

+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+

API-User

diff --git a/application/Preorder/Preorder.php b/application/Preorder/Preorder.php index 671c37470..55f13386e 100644 --- a/application/Preorder/Preorder.php +++ b/application/Preorder/Preorder.php @@ -153,6 +153,8 @@ class Preorder extends mfBaseModel { $this->log->error("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; @@ -180,12 +182,38 @@ class Preorder extends mfBaseModel { $trigger = new $classname($this, $new_status); $trigger->run(); + if(array_key_exists("action", $status) && is_array($status) && property_exists($trigger, "run_action") && $trigger->run_action) { + foreach($status["action"] as $type => $action) { + if(!array_key_exists($type, $actions)) { + $actions[$type] = []; + } + $actions[$type][] = $trigger; + } + } + + // run last email action + if(array_key_exists("email", $actions) && is_array($actions["email"]) && count($actions["email"])) { + $email_action = array_pop($actions["email"]); + $this->runTriggerEmailAction($email_action); + } + } return true; + } + + private function runTriggerEmailAction($action) { + if(!array_key_exists("template", $action)) return false; + if(!array_key_exists("from", $action)) return false; + //if(!array_key_exists("to", $action)) return false; + //if(!array_key_exists("data", $action)) return false; + + + + } /* diff --git a/application/Preorder/statustrigger/245.php b/application/Preorder/statustrigger/245.php new file mode 100644 index 000000000..7eaef027f --- /dev/null +++ b/application/Preorder/statustrigger/245.php @@ -0,0 +1,46 @@ +log = mfLoghandler::singleton(); + + $this->preorder = $preorder; + $this->new_status = $new_status; + } + + public function run() { + $this->log->debug(__METHOD__.": running trigger"); + + $changes = false; + + if(!$this->preorder->ciftoken) { + $this->preorder->ciftoken = $this->preorder->createCiftoken(); + $changes = true; + } + + /*if(!$this->preorder->ciftoken) { + $this->log->warning("Error creating ciftoken for preorder ".$this->preorder->id); + return true; + }*/ + if(!$this->preorder->cifurl) { + $this->preorder->cifurl = $this->preorder->generateCifUrl(); + $changes = true; + } + + if(!$this->preorder->cifcableurl) { + $this->preorder->cifcableurl = $this->preorder->generateCifCableUrl(); + $changes = true; + } + + if($changes) { + $this->preorder->save(); + } + + return true; + } +} \ No newline at end of file diff --git a/application/Preordercampaign/PreordercampaignController.php b/application/Preordercampaign/PreordercampaignController.php index 2f65109e6..5c8424874 100644 --- a/application/Preordercampaign/PreordercampaignController.php +++ b/application/Preordercampaign/PreordercampaignController.php @@ -236,6 +236,8 @@ class PreordercampaignController extends mfBaseController { $data['homes_total'] = (int)$r->homes_total; $data["cifurl"] = trim($r->cifurl); $data["cifcableurl"] = trim($r->cifcableurl); + $data["from_email_name"] = trim($r->from_email_name); + $data["from_email"] = trim($r->from_email); if($r->from) { $data['from'] = self::dateToTimestamp($r->from); diff --git a/application/Preordercampaign/PreordercampaignModel.php b/application/Preordercampaign/PreordercampaignModel.php index c1a89ba2a..b8842d8b6 100644 --- a/application/Preordercampaign/PreordercampaignModel.php +++ b/application/Preordercampaign/PreordercampaignModel.php @@ -19,6 +19,8 @@ class PreordercampaignModel { public $allow_unit_update; public $cifurl; public $cifcableurl; + public $from_email_name; + public $from_email; public $banned_rimo_fcp; public $note; diff --git a/db/migrations/20241125152024_preordercampaign_add_email_from.php b/db/migrations/20241125152024_preordercampaign_add_email_from.php new file mode 100644 index 000000000..79161471b --- /dev/null +++ b/db/migrations/20241125152024_preordercampaign_add_email_from.php @@ -0,0 +1,32 @@ +getEnvironment() == "thetool") { + $table = $this->table('Preordercampaign'); + $table->addColumn('from_email_name', 'string', ["null" => true, "default" => null, 'limit' => 64, "after" => "cifcableurl"]); + $table->addColumn('from_email', 'string', ["null" => true, "default" => null, 'limit' => 64, "after" => "from_email_name"]); + $table->update(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } + + public function down(): void + { + if($this->getEnvironment() == "thetool") { + + } + + if($this->getEnvironment() == "addressdb") { + + } + } +} From 8eb8893a9e2688288a4144def1fdae3e606572ae Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Tue, 26 Nov 2024 22:11:34 +0100 Subject: [PATCH 2/4] Preorder Status Notification finished --- application/Mailtemplate/Mailtemplate.php | 1 + application/Preorder/Preorder.php | 139 ++++++++++++++-- application/Preorder/statustrigger/130.php | 28 ++++ application/Preorder/statustrigger/245.php | 22 +-- .../PreorderStatusnotificationLog.php | 157 ++++++++++++++++++ ...create_preorder_statusnotification_log.php | 37 +++++ 6 files changed, 352 insertions(+), 32 deletions(-) create mode 100644 application/Preorder/statustrigger/130.php create mode 100644 application/PreorderStatusnotificationLog/PreorderStatusnotificationLog.php create mode 100644 db/migrations/20241126203227_create_preorder_statusnotification_log.php diff --git a/application/Mailtemplate/Mailtemplate.php b/application/Mailtemplate/Mailtemplate.php index 670b5080c..68068181b 100644 --- a/application/Mailtemplate/Mailtemplate.php +++ b/application/Mailtemplate/Mailtemplate.php @@ -19,6 +19,7 @@ class Mailtemplate extends mfBaseModel { if(!is_array($replaceVars)) return $text; foreach($replaceVars as $key => $replacement) { + $key = strtoupper($key); $text = str_replace("{{".$key."}}", $replacement, $text); } diff --git a/application/Preorder/Preorder.php b/application/Preorder/Preorder.php index 55f13386e..bff2b9cf2 100644 --- a/application/Preorder/Preorder.php +++ b/application/Preorder/Preorder.php @@ -182,38 +182,153 @@ class Preorder extends mfBaseModel { $trigger = new $classname($this, $new_status); $trigger->run(); + //var_dump($status["action"]); if(array_key_exists("action", $status) && is_array($status) && property_exists($trigger, "run_action") && $trigger->run_action) { foreach($status["action"] as $type => $action) { if(!array_key_exists($type, $actions)) { $actions[$type] = []; } - $actions[$type][] = $trigger; + $action["status_code"] = $intermediate_code; + $actions[$type][] = $action; + } + } + } + + // 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; } } - // run last email action - if(array_key_exists("email", $actions) && is_array($actions["email"]) && count($actions["email"])) { - $email_action = array_pop($actions["email"]); - $this->runTriggerEmailAction($email_action); + if($send_email) { + $email_to = $this->runTriggerEmailAction($email_action); + if($email_to === false) { + $this->log->warning(__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(__METHOD__.": Not sending status email because same or higher status email was sent already (Preorder ".$this->id.")"); } - - } - return true; } - private function runTriggerEmailAction($action) { + public function runTriggerEmailAction($action) { if(!array_key_exists("template", $action)) return false; if(!array_key_exists("from", $action)) return false; - //if(!array_key_exists("to", $action)) return false; - //if(!array_key_exists("data", $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(!$to) { + $this->log->warning(__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) continue; + $hausnummer_data = (array) $this->getProperty("adb_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) continue; + $wohneinheit_data = (array) $this->getProperty("adb_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(__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; + } + } + + $subject = $mailtemplate->getVariableReplacedSubject($replacers); + $body = $mailtemplate->renderBody($replacers); + + $body_type = $mailtemplate->body_html ? "html" : "text"; + + $email = new Emailnotification(); + $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 + foreach($mailtemplate->files as $file) { + if($file->filename && $file->file_id && $file->file->storage_filename); + $this->log->debug($file->file->getFullPath()); + $email->addAttachment($file->file->getFullPath(), null, $file->filename, $file->file->mimetype ?: null); + } + $email->send(); + $this->log->info(__METHOD__.": Sending StatusTrigger Email to $to"); + + return $to; + } + + private 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 $return; } /* @@ -1069,7 +1184,7 @@ class Preorder extends mfBaseModel { $this->partner = null; $this->building = null; $this->adb_hausnummer = null; - $this->adb_wohneinheit; + $this->adb_wohneinheit = null; // cleanup Preorder data $this->create_by = $me->id; diff --git a/application/Preorder/statustrigger/130.php b/application/Preorder/statustrigger/130.php new file mode 100644 index 000000000..b891cd2d8 --- /dev/null +++ b/application/Preorder/statustrigger/130.php @@ -0,0 +1,28 @@ +log = mfLoghandler::singleton(); + + $this->preorder = $preorder; + $this->new_status = $new_status; + } + + public function run() { + $this->log->debug(__METHOD__.": running trigger"); + + $changes = false; + + if($changes) { + $this->preorder->save(); + } + + return true; + } +} \ No newline at end of file diff --git a/application/Preorder/statustrigger/245.php b/application/Preorder/statustrigger/245.php index 7eaef027f..0f9f38f2f 100644 --- a/application/Preorder/statustrigger/245.php +++ b/application/Preorder/statustrigger/245.php @@ -1,11 +1,12 @@ log = mfLoghandler::singleton(); @@ -18,25 +19,6 @@ class Preorder_Statustrigger_140 { $changes = false; - if(!$this->preorder->ciftoken) { - $this->preorder->ciftoken = $this->preorder->createCiftoken(); - $changes = true; - } - - /*if(!$this->preorder->ciftoken) { - $this->log->warning("Error creating ciftoken for preorder ".$this->preorder->id); - return true; - }*/ - if(!$this->preorder->cifurl) { - $this->preorder->cifurl = $this->preorder->generateCifUrl(); - $changes = true; - } - - if(!$this->preorder->cifcableurl) { - $this->preorder->cifcableurl = $this->preorder->generateCifCableUrl(); - $changes = true; - } - if($changes) { $this->preorder->save(); } diff --git a/application/PreorderStatusnotificationLog/PreorderStatusnotificationLog.php b/application/PreorderStatusnotificationLog/PreorderStatusnotificationLog.php new file mode 100644 index 000000000..30b189054 --- /dev/null +++ b/application/PreorderStatusnotificationLog/PreorderStatusnotificationLog.php @@ -0,0 +1,157 @@ + $value) { + if(in_array($field, $table_fields)) { + $model->$field = $value; + } + } + + $me = new User(); + $me->loadMe(); + + if($model->create_by === null) { + $model->create_by = $me->id; + } + if($model->edit_by === null) { + $model->edit_by = $me->id; + } + + return $model; + } + + public static function getAll() { + $items = []; + + $db = FronkDB::singleton(); + + $res = $db->select("PreorderStatusnotificationLog", "*", "1 = 1 ORDER BY preorder_id, status_code"); + if($db->num_rows($res)) { + while($data = $db->fetch_object($res)) { + $items[] = new PreorderStatusnotificationLog($data); + } + } + return $items; + + } + + public static function getFirst($filter) { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $sql = "SELECT * FROM PreorderStatusnotificationLog + WHERE $where + ORDER BY adb_hausnummer_id LIMIT 1"; + //var_dump($sql);exit; + $res = $db->query($sql); + if($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new PreorderStatusnotificationLog($data); + if($item->id) { + return $item; + } else { + return null; + } + } + return null; + } + + public static function count($filter) { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $sql = "SELECT COUNT(*) as cnt FROM PreorderStatusnotificationLog + WHERE $where"; + + //mfLoghandler::singleton()->debug($sql); + + $res = $db->query($sql); + if($db->num_rows($res)) { + $data = $db->fetch_object($res); + return $data->cnt; + } + return 0; + } + + public static function search($filter, $limit = false, $order = false) { + //var_dump($filter);exit; + $items = []; + + if(!$order) { + $order = "preorder_id, status_code ASC"; + } + + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $sql = "SELECT * FROM PreorderStatusnotificationLog + WHERE $where + ORDER BY $order"; + + if(is_array($limit) && count($limit)) { + if(is_numeric($limit['start']) && is_numeric($limit['count'])) { + $sql .= " LIMIT ".$limit['start'].", ".$limit['count']; + } elseif(is_numeric($limit['count'])) { + $sql .= " LIMIT ".$limit['count']; + } + } + + mfLoghandler::singleton()->debug($sql); + + $res = $db->query($sql); + if($db->num_rows($res)) { + while($data = $db->fetch_object($res)) { + $items[$data->id] = new PreorderStatusnotificationLog($data); + } + } + + return $items; + } + + private static function getSqlFilter($filter) { + $where = "1=1 "; + + if(array_key_exists("preorder_id", $filter)) { + $preorder_id = $filter['preorder_id']; + if(is_numeric($preorder_id)) { + $where .= " AND PreorderStatusnotificationLog.preorder_id=$preorder_id"; + } + } + + if(array_key_exists("status_code", $filter)) { + $status_code = $filter['status_code']; + if(is_numeric($status_code)) { + $where .= " AND PreorderStatusnotificationLog.status_code=$status_code"; + } + } + + if(array_key_exists("email", $filter)) { + $email = FronkDB::singleton()->escape($filter["email"]); + if($email) { + $where .= " AND PreorderStatusnotificationLog.email='$email'"; + } + } + + + if(array_key_exists("add-where", $filter)) { + $where .= " ".$filter['add-where']; + } + + //var_dump($filter, $where);exit; + return $where; + } +} \ No newline at end of file diff --git a/db/migrations/20241126203227_create_preorder_statusnotification_log.php b/db/migrations/20241126203227_create_preorder_statusnotification_log.php new file mode 100644 index 000000000..a845c2d35 --- /dev/null +++ b/db/migrations/20241126203227_create_preorder_statusnotification_log.php @@ -0,0 +1,37 @@ +getEnvironment() == "thetool") { + $table = $this->table("PreorderStatusnotificationLog"); + $table->addColumn("preorder_id", "integer", ["null" => false]); + $table->addColumn("status_code", "integer", ["null" => false]); + $table->addColumn("email", "string", ["null" => false, "limit" => 255]); + $table->addColumn("create_by", "integer", ["null" => false]); + $table->addColumn("edit_by", "integer", ["null" => false]); + $table->addColumn("create", "integer", ["null" => false]); + $table->addColumn("edit", "integer", ["null" => false]); + $table->create(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } + + public function down(): void + { + if($this->getEnvironment() == "thetool") { + $this->table("PreorderStatusnotificationLog")->drop()->save(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } +} From 2cf306c5c3f49d58d064ed7883cacb1a17a902b0 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Wed, 27 Nov 2024 16:14:24 +0100 Subject: [PATCH 3/4] reformatted PreordernotificationController.php --- .../PreordernotificationController.php | 840 +++++++++--------- 1 file changed, 420 insertions(+), 420 deletions(-) diff --git a/application/Preordernotification/PreordernotificationController.php b/application/Preordernotification/PreordernotificationController.php index f300cb841..b8656a5b8 100644 --- a/application/Preordernotification/PreordernotificationController.php +++ b/application/Preordernotification/PreordernotificationController.php @@ -1,451 +1,451 @@ needlogin=true; - $me = new User(); - $me->loadMe(); - $this->me = $me; - $this->layout()->set("me",$me); - - if(!$me->is(["Admin", "netowner", "salespartner"])) { - $this->redirect("Dashboard"); - } - } - - protected function indexAction() { - $this->layout()->setTemplate("Preordernotification/Index"); - - $rfilter = $this->request->filter; - iF(!is_array($rfilter)) { - $rfilter = []; - } - - $this->layout->set("filter", $rfilter); - - $where = ""; - $filter = $this->getPreparedFilter($rfilter); - - // pagination defaults - $pagination = []; - $pagination['start'] = 0; - $pagination['count'] = 25; - $pagination['maxItems'] = 0; - - if(is_numeric($this->request->s)) { - $pagination['start'] = intval($this->request->s); - } - - $preorder_filter = $filter; - $my_campaigns = []; - $my_campaign_ids = []; - - if($this->me->is("Admin")) { - if($filter['preordercampaign_id']) { - $this->layout()->set("campaign", new Preordercampaign($filter['preordercampaign_id'])); - } else { - $my_campaigns = PreordercampaignModel::getAll(); - } - $this->layout()->set("my_campaigns", PreordercampaignModel::getAll()); - } else { - $my_networks = $this->me->myNetworks(["netowner", "salespartner"]); - //var_dump($my_networks);exit; - $user_network_ids = $this->me->getFlag("preorder_networks")->value(); - if($user_network_ids) { - $user_network_ids = json_decode($user_network_ids); + protected function init() { + $this->needlogin = true; + $me = new User(); + $me->loadMe(); + $this->me = $me; + $this->layout()->set("me", $me); + + if(!$me->is(["Admin", "netowner", "salespartner"])) { + $this->redirect("Dashboard"); + } + } + + protected function indexAction() { + $this->layout()->setTemplate("Preordernotification/Index"); + + $rfilter = $this->request->filter; + if(!is_array($rfilter)) { + $rfilter = []; } - if(is_array($user_network_ids) && count($user_network_ids)) { + $this->layout->set("filter", $rfilter); - if(!$my_networks) { - foreach($user_network_ids as $mnid) { - $my_networks[] = new Network($mnid); - } - } else { - //var_dump($user_network_ids, $my_networks);exit; - $new_my_networks = []; - foreach($my_networks as $network) { - if(in_array($network->id, $user_network_ids)) { - $new_my_networks[$network->id] = $network; - } - } - $my_networks = $new_my_networks; - } + $where = ""; + $filter = $this->getPreparedFilter($rfilter); + + // pagination defaults + $pagination = []; + $pagination['start'] = 0; + $pagination['count'] = 25; + $pagination['maxItems'] = 0; + + if(is_numeric($this->request->s)) { + $pagination['start'] = intval($this->request->s); } - foreach($my_networks as $network) { - foreach(PreordercampaignModel::search(['network_id' => $network->id]) as $campaign) { - $my_campaigns[] = $campaign; - if(!in_array($campaign->id, $my_campaign_ids)) $my_campaign_ids[] = $campaign->id; - } - } - //var_dump($my_network_ids,$my_campaign_ids);exit; - $this->layout()->set("my_campaigns", $my_campaigns); - - if($filter['preordercampaign_id'] && in_array($filter['preordercampaign_id'], $my_campaign_ids)) { - $campaign_id = $filter['preordercampaign_id']; - if(is_numeric($campaign_id) && $campaign_id > 0) { - $campaign = new Preordercampaign($campaign_id); - $this->layout()->set("campaign", $campaign); - } - } else { - $filter['preordercampaign_id'] = $my_campaign_ids; - } - } - //var_dump($filter);exit; - $pagination['maxItems'] = PreordernotificationModel::count($filter); - $notifications = PreordernotificationModel::search($filter, $pagination); - - $this->layout()->set("pagination", $pagination); - $this->layout()->set("notifications", $notifications); - - - } - - private function getPreparedFilter($filter) { - $new_filter = []; - - if(is_array($filter) && count($filter)) { - foreach($filter as $name => $value) { - $new_filter[$name] = $value; - } - } - - return $new_filter; - } - - protected function addAction() { - $this->layout()->setTemplate("Preordernotification/Form"); - if(!$this->request->preordercampaign_id) { - $this->layout()->setFlash("Keine Kampagne ausgewählt!", "warn"); - } - - $campaign_id = $this->request->preordercampaign_id; - $campaign = new Preordercampaign($campaign_id); - $this->layout()->set("campaign", $campaign); - - $partners = AddressModel::search(['addresstype' => ['netowner','salespartner']]); - $this->layout()->set("partners", $partners); - - } - - protected function editAction() { - $id = $this->request->id; - if(!is_numeric($id) || $id < 1) { - $this->layout()->setFlash("Aussendung nicht gefunden", "error"); - $this->redirect("Preordernotification"); - } - - $notification = new Preordernotification($id); - if(!$notification->id) { - $this->layout()->setFlash("Aussendung nicht gefunden", "error"); - $this->redirect("Preordernotification"); - } - - //var_dump($notification->filter);exit; - - $this->request->set("preordercampaign_id", $notification->preordercampaign_id); // needed in addAction() - $this->layout()->set("notification", $notification); - - return $this->addAction(); - - } - - protected function saveAction() { - $r = $this->request; - //var_dump($r->get(), $_FILES);exit; - - /* - * add or edit - */ - $id = $r->id; - if(is_numeric($id) && $id > 0) { - $mode = "edit"; - $notification = new Preordernotification($id); - if(!$notification->id) { - $this->layout()->setFlash("Aussendung nicht gefunden", "error"); - $this->redirect("Preordernotification"); - } - } else { - $id = false; - $mode = "add"; - } - - /* - * check campaign and permissions - */ - - $campaign_id = $r->preordercampaign_id; - if(!$campaign_id) { - $this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error"); - $this->redirect("Preordernotification"); - } - $campaign = new Preordercampaign($campaign_id); - if(!$campaign->id) { - $this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error"); - $this->redirect("Preordernotification"); - } - - // check permission - if(!$this->me->is("Admin")) { - /*$my_campaign_ids = []; - $my_networks = $this->me->myNetworks(["netowner", "salespartner"]); - //var_dump($my_networks);exit; - - foreach($my_networks as $network) { - foreach(PreordercampaignModel::search(['network_id' => $network->id]) as $campaign) { - if(!in_array($campaign->id, $my_campaign_ids)) $my_campaign_ids[] = $campaign->id; - } - } - - if(!in_array($campaign_id, $my_campaign_ids)) { - $this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error"); - $this->redirect("Preordernotification"); - }*/ - + $preorder_filter = $filter; $my_campaigns = []; $my_campaign_ids = []; - $my_networks = $this->me->myNetworks(["netowner", "salespartner"]); - //var_dump($my_networks);exit; + if($this->me->is("Admin")) { + if($filter['preordercampaign_id']) { + $this->layout()->set("campaign", new Preordercampaign($filter['preordercampaign_id'])); + } else { + $my_campaigns = PreordercampaignModel::getAll(); + } + $this->layout()->set("my_campaigns", PreordercampaignModel::getAll()); + } else { + $my_networks = $this->me->myNetworks(["netowner", "salespartner"]); + //var_dump($my_networks);exit; - $user_network_ids = $this->me->getFlag("preorder_networks")->value(); - if($user_network_ids) { - $user_network_ids = json_decode($user_network_ids); - } + $user_network_ids = $this->me->getFlag("preorder_networks")->value(); + if($user_network_ids) { + $user_network_ids = json_decode($user_network_ids); + } - if(is_array($user_network_ids) && count($user_network_ids)) { - if(!$my_networks) { - foreach($user_network_ids as $mnid) { - $my_networks[] = new Network($mnid); + if(is_array($user_network_ids) && count($user_network_ids)) { + + if(!$my_networks) { + foreach($user_network_ids as $mnid) { + $my_networks[] = new Network($mnid); + } + } else { + //var_dump($user_network_ids, $my_networks);exit; + $new_my_networks = []; + foreach($my_networks as $network) { + if(in_array($network->id, $user_network_ids)) { + $new_my_networks[$network->id] = $network; + } + } + $my_networks = $new_my_networks; + } + } + + foreach($my_networks as $network) { + foreach(PreordercampaignModel::search(['network_id' => $network->id]) as $campaign) { + $my_campaigns[] = $campaign; + if(!in_array($campaign->id, $my_campaign_ids)) $my_campaign_ids[] = $campaign->id; + } + } + //var_dump($my_network_ids,$my_campaign_ids);exit; + $this->layout()->set("my_campaigns", $my_campaigns); + + if($filter['preordercampaign_id'] && in_array($filter['preordercampaign_id'], $my_campaign_ids)) { + $campaign_id = $filter['preordercampaign_id']; + if(is_numeric($campaign_id) && $campaign_id > 0) { + $campaign = new Preordercampaign($campaign_id); + $this->layout()->set("campaign", $campaign); } } else { - //var_dump($user_network_ids, $my_networks);exit; - $new_my_networks = []; - foreach($my_networks as $network) { - if(in_array($network->id, $user_network_ids)) { - $new_my_networks[$network->id] = $network; - } - } - $my_networks = $new_my_networks; + $filter['preordercampaign_id'] = $my_campaign_ids; + } + } + //var_dump($filter);exit; + $pagination['maxItems'] = PreordernotificationModel::count($filter); + $notifications = PreordernotificationModel::search($filter, $pagination); + + $this->layout()->set("pagination", $pagination); + $this->layout()->set("notifications", $notifications); + + + } + + private function getPreparedFilter($filter) { + $new_filter = []; + + if(is_array($filter) && count($filter)) { + foreach($filter as $name => $value) { + $new_filter[$name] = $value; } } - foreach($my_networks as $network) { - foreach(PreordercampaignModel::search(['network_id' => $network->id]) as $campaign) { - if(!in_array($campaign->id, $my_campaign_ids)) $my_campaign_ids[] = $campaign->id; - } + return $new_filter; + } + + protected function addAction() { + $this->layout()->setTemplate("Preordernotification/Form"); + if(!$this->request->preordercampaign_id) { + $this->layout()->setFlash("Keine Kampagne ausgewählt!", "warn"); } - if(!in_array($campaign_id, $my_campaign_ids)) { + $campaign_id = $this->request->preordercampaign_id; + $campaign = new Preordercampaign($campaign_id); + $this->layout()->set("campaign", $campaign); + + $partners = AddressModel::search(['addresstype' => ['netowner', 'salespartner']]); + $this->layout()->set("partners", $partners); + + } + + protected function editAction() { + $id = $this->request->id; + if(!is_numeric($id) || $id < 1) { + $this->layout()->setFlash("Aussendung nicht gefunden", "error"); + $this->redirect("Preordernotification"); + } + + $notification = new Preordernotification($id); + if(!$notification->id) { + $this->layout()->setFlash("Aussendung nicht gefunden", "error"); + $this->redirect("Preordernotification"); + } + + //var_dump($notification->filter);exit; + + $this->request->set("preordercampaign_id", $notification->preordercampaign_id); // needed in addAction() + $this->layout()->set("notification", $notification); + + return $this->addAction(); + + } + + protected function saveAction() { + $r = $this->request; + //var_dump($r->get(), $_FILES);exit; + + /* + * add or edit + */ + $id = $r->id; + if(is_numeric($id) && $id > 0) { + $mode = "edit"; + $notification = new Preordernotification($id); + if(!$notification->id) { + $this->layout()->setFlash("Aussendung nicht gefunden", "error"); + $this->redirect("Preordernotification"); + } + } else { + $id = false; + $mode = "add"; + } + + /* + * check campaign and permissions + */ + + $campaign_id = $r->preordercampaign_id; + if(!$campaign_id) { $this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error"); $this->redirect("Preordernotification"); } - } - - - /* - * data colletion - */ - $filter = []; - if(is_array($r->type) && count($r->type)) { - $filter['type'] = []; - foreach($r->type as $type) { - switch($type) { - case "interest": - $filter["type"][] = "interest"; - break; - case "provision": - $filter["type"][] = "provision"; - break; - case "order": - $filter["type"][] = "order"; - break; - case "reorder": - $filter["type"][] = "reorder"; - break; + $campaign = new Preordercampaign($campaign_id); + if(!$campaign->id) { + $this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error"); + $this->redirect("Preordernotification"); } - } - } - - if(is_array($r->connection_type) && count($r->connection_type)) { - $filter['connection_type'] = []; - foreach($r->connection_type as $type) { - switch($type) { - case "single-dwelling": - $filter["connection_type"][] = "single-dwelling"; - break; - case "multi-dwelling": - $filter["connection_type"][] = "multi-dwelling"; - break; - case "apartment-building": - $filter["connection_type"][] = "apartment-building"; - break; - case "apartment": - $filter["connection_type"][] = "apartment"; - break; - case "business": - $filter["connection_type"][] = "business"; - break; - } - } - } - - //var_dump($filter); - $data = []; - $data['preordercampaign_id'] = $campaign_id; - $data['sender_email'] = $r->sender_email; - $data['sender_name'] = $r->sender_name; - $data['sender_replyto'] = $r->sender_replyto; - $data['subject'] = $r->subject; - $data['body_html'] = $r->body_html; - $data['note'] = $r->note; - - if($r->tosend_day) { - $tosend_day = $r->tosend_day; - $tosend_hour = $r->tosend_hour; - if($tosend_hour < 0 || $tosend_hour > 23) { - $tosend_hour = 0; - } - $data['tosend_date'] = self::dateToTimestamp($tosend_day." ".str_pad($tosend_hour, 2, "0", STR_PAD_LEFT).":00:00"); - } - - $data['preorder_filter'] = json_encode($filter); - - //var_dump($data);exit; - - if($mode == "edit") { - $notification->update($data); - } else { - $notification = PreordernotificationModel::create($data); - } - - $new_id = $notification->save(); - if(!$new_id) { - $this->layout()->setFlash("Fehler beim Speichern", "error"); - if($id) { - $this->redirect("Preordernotification", "edit", ['id' => $id]); - } else { - $this->redirect("Preordernotification"); - } - } - - /* - * Attachment upload - */ - - if(array_key_exists("attachment", $_FILES)) { - $files = $_FILES['attachment']; - if(is_array($files) && count($files)) { - $file_errors = 0; - foreach($files['name'] as $i => $name) { - if(!$name) continue; - $upload_error = false; - try { - $upload = new mfUpload(['attachment', $i]); - $upload->setSavepath(MFUPLOAD_FILE_SAVE_PATH . "/" . TT_PREORDERNOTIFICATION_FILE_UPLOAD_SUBFOLDER); - } catch(Exception $e) { - $this->layout()->setFlash("Dateiupload fehlgeschlagen: ".$e->getMessage(), "warn"); - $file_errors++; - continue; - } - - if(!$upload->getSize()) { - $this->layout()->setFlash("Dateiupload fehlgeschlagen: Datei ist leer!", "warn"); - $upload_error = true; - } - - $mime = ""; - - if(!$upload_error) { - try { - $mime = $upload->getMimetype(); - $upload->save(); - } catch(Exception $e) { - $this->layout()->setFlash("Dateiupload fehlgeschlagen", "warn"); - $upload_error = true; - } - } - if($upload_error) { - $file_errors++; - continue; - } - - $file_data = []; - $file_data['name'] = $upload->getOriginalFilename(); - $file_data['filename'] = $upload->getOriginalFilename(); - $file_data['subfolder'] = TT_PREORDERNOTIFICATION_FILE_UPLOAD_SUBFOLDER; - $file_data['store_filename'] = $upload->getFilename(); - $file_data['orig_filename'] = $upload->getOriginalFilename(); - $file_data['mimetype'] = $mime; - - $file = FileModel::create($file_data); - $file_id = $file->save(); - if(!$file_id) { - $this->layout()->setFlash("Dateiupload fehlgeschlagen", "warn"); - unlink($upload->getSavepath()."/".$upload->getFilename()); - } else { - $pnf = []; - $pnf['preordernotification_id'] = $notification->id; - $pnf['file_id'] = $file_id; - $pnf['filename'] = $file->filename; - - $notification_file = PreordernotificationFileModel::create($pnf); - if(!$notification_file->save()) { - $file->delete(); - unlink($upload->getSavepath()."/".$upload->getFilename()); - $this->layout()->setFlash("Dateiupload fehlgeschlagen", "warn"); + // check permission + if(!$this->me->is("Admin")) { + /*$my_campaign_ids = []; + $my_networks = $this->me->myNetworks(["netowner", "salespartner"]); + //var_dump($my_networks);exit; + + foreach($my_networks as $network) { + foreach(PreordercampaignModel::search(['network_id' => $network->id]) as $campaign) { + if(!in_array($campaign->id, $my_campaign_ids)) $my_campaign_ids[] = $campaign->id; + } } - } - + if(!in_array($campaign_id, $my_campaign_ids)) { + $this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error"); + $this->redirect("Preordernotification"); + }*/ + + $my_campaigns = []; + $my_campaign_ids = []; + + $my_networks = $this->me->myNetworks(["netowner", "salespartner"]); + //var_dump($my_networks);exit; + + $user_network_ids = $this->me->getFlag("preorder_networks")->value(); + if($user_network_ids) { + $user_network_ids = json_decode($user_network_ids); + } + + if(is_array($user_network_ids) && count($user_network_ids)) { + if(!$my_networks) { + foreach($user_network_ids as $mnid) { + $my_networks[] = new Network($mnid); + } + } else { + //var_dump($user_network_ids, $my_networks);exit; + $new_my_networks = []; + foreach($my_networks as $network) { + if(in_array($network->id, $user_network_ids)) { + $new_my_networks[$network->id] = $network; + } + } + $my_networks = $new_my_networks; + } + } + + foreach($my_networks as $network) { + foreach(PreordercampaignModel::search(['network_id' => $network->id]) as $campaign) { + if(!in_array($campaign->id, $my_campaign_ids)) $my_campaign_ids[] = $campaign->id; + } + } + + if(!in_array($campaign_id, $my_campaign_ids)) { + $this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error"); + $this->redirect("Preordernotification"); + } } - } - + + + /* + * data colletion + */ + $filter = []; + if(is_array($r->type) && count($r->type)) { + $filter['type'] = []; + foreach($r->type as $type) { + switch($type) { + case "interest": + $filter["type"][] = "interest"; + break; + case "provision": + $filter["type"][] = "provision"; + break; + case "order": + $filter["type"][] = "order"; + break; + case "reorder": + $filter["type"][] = "reorder"; + break; + } + } + } + + if(is_array($r->connection_type) && count($r->connection_type)) { + $filter['connection_type'] = []; + foreach($r->connection_type as $type) { + switch($type) { + case "single-dwelling": + $filter["connection_type"][] = "single-dwelling"; + break; + case "multi-dwelling": + $filter["connection_type"][] = "multi-dwelling"; + break; + case "apartment-building": + $filter["connection_type"][] = "apartment-building"; + break; + case "apartment": + $filter["connection_type"][] = "apartment"; + break; + case "business": + $filter["connection_type"][] = "business"; + break; + } + } + } + + //var_dump($filter); + $data = []; + $data['preordercampaign_id'] = $campaign_id; + $data['sender_email'] = $r->sender_email; + $data['sender_name'] = $r->sender_name; + $data['sender_replyto'] = $r->sender_replyto; + $data['subject'] = $r->subject; + $data['body_html'] = $r->body_html; + $data['note'] = $r->note; + + if($r->tosend_day) { + $tosend_day = $r->tosend_day; + $tosend_hour = $r->tosend_hour; + if($tosend_hour < 0 || $tosend_hour > 23) { + $tosend_hour = 0; + } + $data['tosend_date'] = self::dateToTimestamp($tosend_day . " " . str_pad($tosend_hour, 2, "0", STR_PAD_LEFT) . ":00:00"); + } + + $data['preorder_filter'] = json_encode($filter); + + //var_dump($data);exit; + + if($mode == "edit") { + $notification->update($data); + } else { + $notification = PreordernotificationModel::create($data); + } + + $new_id = $notification->save(); + if(!$new_id) { + $this->layout()->setFlash("Fehler beim Speichern", "error"); + if($id) { + $this->redirect("Preordernotification", "edit", ['id' => $id]); + } else { + $this->redirect("Preordernotification"); + } + } + + /* + * Attachment upload + */ + + if(array_key_exists("attachment", $_FILES)) { + $files = $_FILES['attachment']; + if(is_array($files) && count($files)) { + $file_errors = 0; + foreach($files['name'] as $i => $name) { + if(!$name) continue; + $upload_error = false; + try { + $upload = new mfUpload(['attachment', $i]); + $upload->setSavepath(MFUPLOAD_FILE_SAVE_PATH . "/" . TT_PREORDERNOTIFICATION_FILE_UPLOAD_SUBFOLDER); + } catch(Exception $e) { + $this->layout()->setFlash("Dateiupload fehlgeschlagen: " . $e->getMessage(), "warn"); + $file_errors++; + continue; + } + + if(!$upload->getSize()) { + $this->layout()->setFlash("Dateiupload fehlgeschlagen: Datei ist leer!", "warn"); + $upload_error = true; + } + + $mime = ""; + + if(!$upload_error) { + try { + $mime = $upload->getMimetype(); + $upload->save(); + } catch(Exception $e) { + $this->layout()->setFlash("Dateiupload fehlgeschlagen", "warn"); + $upload_error = true; + } + } + + if($upload_error) { + $file_errors++; + continue; + } + + $file_data = []; + $file_data['name'] = $upload->getOriginalFilename(); + $file_data['filename'] = $upload->getOriginalFilename(); + $file_data['subfolder'] = TT_PREORDERNOTIFICATION_FILE_UPLOAD_SUBFOLDER; + $file_data['store_filename'] = $upload->getFilename(); + $file_data['orig_filename'] = $upload->getOriginalFilename(); + $file_data['mimetype'] = $mime; + + $file = FileModel::create($file_data); + $file_id = $file->save(); + if(!$file_id) { + $this->layout()->setFlash("Dateiupload fehlgeschlagen", "warn"); + unlink($upload->getSavepath() . "/" . $upload->getFilename()); + } else { + $pnf = []; + $pnf['preordernotification_id'] = $notification->id; + $pnf['file_id'] = $file_id; + $pnf['filename'] = $file->filename; + + $notification_file = PreordernotificationFileModel::create($pnf); + if(!$notification_file->save()) { + $file->delete(); + unlink($upload->getSavepath() . "/" . $upload->getFilename()); + $this->layout()->setFlash("Dateiupload fehlgeschlagen", "warn"); + } + + } + + } + } + + } + + /* + * delete files + */ + //var_dump($r->deletefile);exit; + if(is_array($r->deletefile)) { + foreach($r->deletefile as $pnf_id => $check) { + if(!$check) continue; + $pnf = new PreordernotificationFile($pnf_id); + if($pnf->preordernotification_id != $notification->id) continue; + $pnf->file->delete(); + $pnf->delete(); + } + } + + + // get and save preorder count + $preorder_filter = json_decode($notification->preorder_filter, true); + $preorder_filter['preordercampaign_id'] = $notification->preordercampaign_id; + $preorder_count = PreorderModel::countActive($preorder_filter); + $notification->recipient_count = $preorder_count; + $notification->save(); + + if($r->send_testmail && $r->testmail_to) { + $preorder = PreorderModel::getFirstActive($preorder_filter); + if(!$preorder) { + $this->layout()->setFlash("Testmail konnte nicht versendet werden. Keine Empfänger gefunden", "warn"); + $this->redirect("Preordernotification", "edit", ['id' => $new_id]); + } + $notification->sendToPreorder($preorder, $r->testmail_to); + $this->layout()->setFlash("Test Email erfolgreich versendet", "success"); + $this->redirect("Preordernotification", "edit", ['id' => $new_id]); + } + + $this->layout()->setFlash("Erfolgreich gepeichert.", "success"); + if($r->return == "index") { + $this->redirect("Preordernotification"); + } else { + $this->redirect("Preordernotification", "edit", ['id' => $new_id]); + } + } - - /* - * delete files - */ - //var_dump($r->deletefile);exit; - if(is_array($r->deletefile)) { - foreach($r->deletefile as $pnf_id => $check) { - if(!$check) continue; - $pnf = new PreordernotificationFile($pnf_id); - if($pnf->preordernotification_id != $notification->id) continue; - $pnf->file->delete(); - $pnf->delete(); - } - } - - - // get and save preorder count - $preorder_filter = json_decode($notification->preorder_filter, true); - $preorder_filter['preordercampaign_id'] = $notification->preordercampaign_id; - $preorder_count = PreorderModel::countActive($preorder_filter); - $notification->recipient_count = $preorder_count; - $notification->save(); - - if($r->send_testmail && $r->testmail_to) { - $preorder = PreorderModel::getFirstActive($preorder_filter); - if(!$preorder) { - $this->layout()->setFlash("Testmail konnte nicht versendet werden. Keine Empfänger gefunden", "warn"); - $this->redirect("Preordernotification", "edit", ['id' => $new_id]); - } - $notification->sendToPreorder($preorder, $r->testmail_to); - $this->layout()->setFlash("Test Email erfolgreich versendet", "success"); - $this->redirect("Preordernotification", "edit", ['id' => $new_id]); - } - - $this->layout()->setFlash("Erfolgreich gepeichert.", "success"); - if($r->return == "index") { - $this->redirect("Preordernotification"); - } else { - $this->redirect("Preordernotification", "edit", ['id' => $new_id]); - } - - } } \ No newline at end of file From d8c826a2619c1b0db2e8c88a5c2b16f6a467efc6 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Thu, 28 Nov 2024 17:00:22 +0100 Subject: [PATCH 4/4] Preordernotification: Can attach Borderpoint image from Mapbox API now --- Layout/default/Preordernotification/Form.php | 28 +++ application/Preorder/Preorder.php | 80 ++++++++ application/Preorder/PreorderModel.php | 2 + application/PreorderFile/PreorderFile.php | 178 ++++++++++++++++++ .../Preordernotification.php | 14 +- .../PreordernotificationController.php | 10 + .../PreordernotificationFileModel.php | 4 +- ...h_borderpoint_and_create_preorder_file.php | 45 +++++ lib/Mapbox/StaticImageApi.php | 50 +++++ scripts/send_preordernotifications.php | 4 +- 10 files changed, 411 insertions(+), 4 deletions(-) create mode 100644 application/PreorderFile/PreorderFile.php create mode 100644 db/migrations/20241127144651_preordernotification_add_attach_borderpoint_and_create_preorder_file.php create mode 100644 lib/Mapbox/StaticImageApi.php diff --git a/Layout/default/Preordernotification/Form.php b/Layout/default/Preordernotification/Form.php index 97005b18f..e8cdd19bd 100644 --- a/Layout/default/Preordernotification/Form.php +++ b/Layout/default/Preordernotification/Form.php @@ -1,4 +1,5 @@ +filter);exit;?>
@@ -93,6 +94,18 @@
+ +
+ +
+ +
+
+