Files
thetool/application/Preordernotification/PreordernotificationController.php
2025-08-22 17:49:54 +02:00

585 lines
21 KiB
PHP

<?php
class PreordernotificationController extends mfBaseController {
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 = [];
}
$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);
}
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 {
$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");
}*/
$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;
}
}
}
if(is_array($r->status_id) && count($r->status_id)) {
$filter["status_id"] = [];
foreach($r->status_id as $status_id) {
$test_status = new Preorderstatus($status_id);
if(!$test_status || !$test_status->id) continue;
$filter["status_id"][] = $status_id;
}
}
//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["attach_borderpoint"] = $r->attach_borderpoint;
$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($this->attach_borderpoint) {
$i = 1;
while(!$preorder->adb_hausnummer->gps_lat && !$preorder->adb_hausnummer->gps_long) {
$this->log->debug(__METHOD__.": round $i");
$preorder = PreorderModel::searchActive($preorder_filter, ["start" => $i, "count" => 1]);
if(!$preorder) break;
$i++;
}
}
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]);
}
}
protected function EmailLog() {
$this->layout()->setTemplate("Preordernotification/EmailLog");
$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");
}
$this->layout()->set("notification", $notification);
$filter = $this->request->filter;
if(!is_array($filter)) {
$filter = [];
}
$this->layout->set("filter", $filter);
$filter["object_type"] = "Preordernotification";
$filter["object_id"] = $id;
// pagination defaults
$pagination = [];
$pagination['start'] = 0;
$pagination['count'] = 25;
$pagination['maxItems'] = 0;
if(is_numeric($this->request->s)) {
$pagination['start'] = intval($this->request->s);
}
$pagination["maxItems"] = EmailLog::count($filter);
$emails = EmailLog::search($filter, $pagination);
$this->layout()->set("pagination", $pagination);
$this->layout()->set("emails", $emails);
}
protected function apiAction() {
$do = $this->request->do;
$data = [];
switch($do) {
case "getLoggedEmail":
$return = $this->getLoggedEmail();
break;
default:
$return = false;
}
if(!is_array($return) || !count($return)) {
$data = ["status" => "error"];
$this->returnJson($data);
}
$data['status'] = "OK";
$data['result'] = $return;
$this->returnJson($data);
}
protected function getLoggedEmail() {
$preordernotification_id = $this->request->nid;
$emaillog_id = $this->request->eid;
if(!is_numeric($preordernotification_id) || $preordernotification_id < 1) {
return false;
}
if(!is_numeric($emaillog_id) || $emaillog_id < 1) {
return false;
}
$notification = new Preordernotification($preordernotification_id);
if(!$notification->id) {
return false;
}
$emaillog = new EmailLog($emaillog_id);
if(!$emaillog->id) {
return false;
}
$return = [
"preordernotification_id" => $preordernotification_id,
"emaillog_id" => $emaillog_id,
"from" => $emaillog->from,
"to" => $emaillog->to,
"subject" => $emaillog->subject,
"body" => ($emaillog->body_html) ? $emaillog->body_html : $emaillog->body_text,
"bodyIsHtml" => (bool) $emaillog->body_html,
"sent" => date("d.m.Y H:i", $emaillog->create),
"headers" => json_decode($emaillog->headers),
"attachments" => [],
];
if(is_array($emaillog->attachments) && count($emaillog->attachments)) {
foreach($emaillog->attachments as $attachment) {
$return["attachments"][] = [
"id" => $attachment->id,
"hash" => $attachment->content->sha256,
"filename" => $attachment->filename,
"filesize" => ($attachment->content) ? $attachment->content->filesize : 0,
"mimetype" => ($attachment->content) ? $attachment->content->mimetype : "",
];
}
}
return $return;
}
}