From 9e392fec68bffbc836d0c7fd7578256052c96486 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Tue, 14 Jan 2025 21:53:49 +0100 Subject: [PATCH] more filters and testmail in MailtemplateDispatch --- Layout/default/MailtemplateDispatch/Form.php | 25 ++- .../MailtemplateDispatch.php | 211 +++++++++++++++++- .../MailtemplateDispatchController.php | 24 ++ 3 files changed, 255 insertions(+), 5 deletions(-) diff --git a/Layout/default/MailtemplateDispatch/Form.php b/Layout/default/MailtemplateDispatch/Form.php index c7ca010e3..f71b32551 100644 --- a/Layout/default/MailtemplateDispatch/Form.php +++ b/Layout/default/MailtemplateDispatch/Form.php @@ -79,6 +79,10 @@ recipient_filter_array) && $dispatch->recipient_filter_array["order_open"]) ? 'checked="checked"' : ''?> /> +
+ recipient_filter_array) && $dispatch->recipient_filter_array["order_int_products"]) ? 'checked="checked"' : ''?> /> + +

Aktive Contracts

@@ -86,13 +90,30 @@

Allgemein

recipient_filter_array) && $dispatch->recipient_filter_array["fibu_account"]) ? 'checked="checked"' : ''?> /> - + +
+
+ recipient_filter_array) && $dispatch->recipient_filter_array["billingaddress"]) ? 'checked="checked"' : ''?> /> + +
+
+ recipient_filter_array) && $dispatch->recipient_filter_array["techcontact"]) ? 'checked="checked"' : ''?> /> +
- + recipient_filter_array)) ? implode(", ", $dispatch->recipient_filter_array["zip"]) : ""?>" /> PLZ' mit Leerzeichen oder Komma getrennt
+ + + diff --git a/application/MailtemplateDispatch/MailtemplateDispatch.php b/application/MailtemplateDispatch/MailtemplateDispatch.php index f06792329..e5e3f0470 100644 --- a/application/MailtemplateDispatch/MailtemplateDispatch.php +++ b/application/MailtemplateDispatch/MailtemplateDispatch.php @@ -10,29 +10,234 @@ class MailtemplateDispatch extends mfBaseModel { public function sendToRecipients($test_to_email = false) { - $emails = $this->getRecipients(); - if(!$emails) return true; + if(!$test_to_email) { + $emails = $this->getRecipients(); + if(!$emails) return true; + if(!$this->tosend_date || $this->tosend_date > date('U')) return false; + if($this->send_lock) return false; + } + + if($test_to_email) { + $emails = [$test_to_email]; + } + + if(!$this->subject) return false; + if(!$this->sender_email) return false; + if(!$this->sender_name) return false; + + $template = $this->getProperty("mailtemplate"); + if(!$template) return false; + + $body = ""; + $body .= $template->renderBody(); + $body .= "\n"; // explicitly add new line, or some mail clients wont show attachment + + $subject = $this->subject; + + $from_email = $this->sender_email; + $from_name = $this->sender_name; + + $attachments = []; + foreach($this->getProperty("mailtemplate")->files as $file) { + $att = []; + $att["path"] = MFUPLOAD_FILE_SAVE_PATH."/".$file->file->subfolder."/".$file->file->store_filename; + $att["filename"] = $file->filename; + $att["mimetype"] = $file->file->mimetype; + $attachments[] = $att; + } + + foreach($emails as $email) { + $to = $email; + + // check for NotificationLog + /*$mnlog = MaintenanceNotificationLog::getFirst(["maintenancenotification_id" => $this->id, "email" => $to]); + if($mnlog) { + // was sent already + continue; + }*/ + /*fwrite(STDERR, "Subject: $subject\n\n"); + fwrite(STDERR, "$body\n\n"); + exit;*/ + + $email = new Emailnotification(); + $email->setSubject($subject); + $email->setBody($body); + $email->setFrom($from_email, $from_name); + $email->setTo($to); + $email->setHeader("X-".ucfirst(MFAPPNAME)."-mnid", $this->id); + if(count($attachments)) { + foreach($attachments as $file) { + $email->addAttachment($file["path"], null, $file["filename"], $file['mimetype']); + } + } + $email->send(); + $this->log->info(__METHOD__.": Sending MaintenanceNotification to $to"); + + if($test_to_email) { + return true; + } + + /*$mnlog = MaintenanceNotificationLog::create([ + "maintenancenotification_id" => $this->id, + "email" => $to, + "sent" => date("U"), + ]); + + $mnlog->save(); + */ + } + + //$this->sent = date("U"); + //$this->save(); + + + + } - public function getRecipients($list_recipients = false) { + public function getRecipients($list_recipients = false, $return_recipients = false) { $datasources = $this->getProperty("filter_datasource_array"); $filter = $this->getProperty("recipient_filter_array"); + $zips = []; + $zip_source = "owner"; + $to_billcontact = false; + $to_techcontact = false; + $fibu_account = false; + + if(array_key_exists("zip", $filter) && count($filter["zip"])) { + $zips = $filter["zip"]; + } + + // only owner is implemented yet + if(array_key_exists("zip_source", $filter) && $filter["zip_source"] == "termination") { + $zip_source = "term"; + } + if(array_key_exists("billingaddress", $filter) && $filter["billingaddress"]) { + $to_billcontact = true; + } + if(array_key_exists("techcontact", $filter) && $filter["techcontact"]) { + $to_techcontact = true; + } + if(array_key_exists("fibu_account", $filter) && $filter["fibu_account"]) { + $fibu_account = true; + } + if(!is_array($datasources) || !count($datasources)) { $this->log->warn(__METHOD__.": Mailtemplate ".$this->id.": no datasource"); return false; } + $owner_ids = []; $emails = []; if(in_array("contract", $datasources)) { + foreach(ContractModel::searchActive([]) as $contract) { + if($fibu_account && !$contract->owner->fibu_account_number) continue; + if(($zips && in_array($contract->owner->zip, $zips)) || !$zips ) { + if(!in_array($contract->owner_id, $owner_ids)) { + $owner_ids[] = $contract->owner_id; + } + + if($contract->owner->email) { + $emails[] = trim($contract->owner->email); + } + + if($to_billcontact && $contract->billingaddress_id && $contract->billingaddress->email) { + if(($zips && in_array($contract->billingaddress->zip, $zips)) || !$zips ) { + $emails[] = trim($contract->billingaddress->email); + } + } + + if($to_techcontact && array_key_exists("techcontact", $contract->owner->links) && is_array($contract->owner->links["techcontact"])) { + foreach($contract->owner->links["techcontact"] as $techlink) { + if($techlink->address->email) { + $emails[] = trim($techlink->address->email); + } + } + } + + } + + } } + if(in_array("order", $datasources)) { + $order_search = []; + $order_search["finish_date"] = true; + if(array_key_exists("order_open", $filter) && $filter["order_open"]) { + $order_search["finish_date"] = false; + } + + foreach(OrderModel::search($order_search) as $order) { + if($fibu_account && !$order->owner->fibu_account_number) continue; + + if(array_key_exists("order_int_products", $filter) && $filter["order_int_products"]) { + $include_order = true; + foreach($order->products as $op) { + if($op->product->external) { + //fwrite(STDERR, "found external product (".$op->product->name.")\n"); + $include_order = false; + break; + } + } + if(!$include_order) continue; + } + + if(($zips && in_array($order->owner->zip, $zips)) || !$zips ) { + if(!in_array($order->owner_id, $owner_ids)) { + $owner_ids[] = $order->owner_id; + } + if($order->owner->email) { + $emails[] = trim($order->owner->email); + } + if($to_billcontact && $order->billingaddress_id && $order->billingaddress->email) { + $emails[] = trim($order->billingaddress->email); + } + if($to_techcontact && $order->techcontact_id && $order->techcontact->email) { + $emails[] = trim($order->techcontact->email); + } + } + + + } + } + + + if($list_recipients || $return_recipients) { + $csv = "Kundennummer;Firma;Vorname;Nachname;Straße;PLZ;Ort;Email\n"; + foreach ($owner_ids as $id) { + $address = new Address($id); + if (!$address->id) { + echo "Adresse mit id $id nicht gefunden\n"; + } + + $csv .= $address->customer_number . ";"; + $csv .= '"' . str_replace(["\r\n", "\n", "\r"]," ", $address->company) . '";'; + $csv .= '"' . $address->firstname . '";'; + $csv .= '"' . $address->lastname . '";'; + $csv .= '"' . $address->street . '";'; + $csv .= '"' . $address->zip . '";'; + $csv .= '"' . $address->city . '";'; + $csv .= '"' . $address->email . '";' . "\n"; + } + + if($return_recipients) { + return $csv; + } else { + echo $csv; + exit; + } + + } + + $emails = array_unique($emails); + return $emails; } public function getProperty($name) { diff --git a/application/MailtemplateDispatch/MailtemplateDispatchController.php b/application/MailtemplateDispatch/MailtemplateDispatchController.php index 2b8816a5c..b1c014aad 100644 --- a/application/MailtemplateDispatch/MailtemplateDispatchController.php +++ b/application/MailtemplateDispatch/MailtemplateDispatchController.php @@ -118,7 +118,19 @@ class MailtemplateDispatchController extends mfBaseController { if($r->filter_order_open) { $filter["order_open"] = true; } + if($r->filter_order_int_products) { + $filter["order_int_products"] = true; + } + if($r->filter_billingaddress) { + $filter["billingaddress"] = true; + } + if($r->filter_techcontact) { + $filter["techcontact"] = true; + } + if($r->filter_zip_source) { + $filter["zip_source"] = $r->filter_zip_source; + } if($r->filter_zip) { foreach(preg_split("/[, ]+/", $r->filter_zip) as $zip) { $filter["zip"][] = trim($zip); @@ -142,6 +154,18 @@ class MailtemplateDispatchController extends mfBaseController { return $this->addAction(); } + $dispatch->recipient_count = count($dispatch->getRecipients()); + $dispatch->save(); + + + if($r->send_testmail && $r->testmail_to) { + $dispatch->sendToRecipients($r->testmail_to); + + $this->layout()->setFlash("Test Email erfolgreich versendet", "success"); + $this->redirect("MailtemplateDispatch", "edit", ['id' => $dispatch->id]); + } + + $this->layout()->setFlash("Emailversand erfolgreich gespeichert", "success"); $this->redirect("MailtemplateDispatch");