Files
thetool/application/Dashboard/DashboardController.php

248 lines
8.5 KiB
PHP

<?php
class DashboardController extends mfBaseController {
protected function init() {
$this->needlogin=true;
$me = new User();
$me->loadMe();
$this->me = $me;
$this->layout()->set("me",$me);
}
protected function indexAction() {
if($this->me->is("preorderfront")) {
$this->redirect("Preorder");
}
if($this->me->is("Preorderlogistics")) {
$this->redirect("Preorderlogistics");
}
$newss = NewsModel::getAll();
$this->layout()->set("newss", $newss);
if($this->me->can("Statistics") && $this->me->is(["Admin", "netowner", "salespartner"])) {
return $this->dashboardAction();
}
}
protected function dashboardAction() {
$this->layout()->setTemplate("Dashboard/Dashboard");
$r = $this->request;
$campaign_ids = $r->campaign_id;
if($campaign_ids && !is_array($campaign_ids)) {
$campaign_ids = [$campaign_ids];
}
if($this->me->is("Admin")) {
$campaigns = PreordercampaignModel::getAll();
if(!$campaign_ids) {
foreach(PreordercampaignModel::getAll() as $campaign) {
$campaign_ids[] = $campaign->id;
}
}
$max_connections = $this->getTotalHomes($campaign_ids);
$count_orders = PreorderModel::count(["preordercampaign_id" => $campaign_ids, "deleted" => 0]);
$weekly_orders = $this->getWeeklyOrders($campaign_ids);
$status_connected_single = PreorderModel::count(["preordercampaign_id" => $campaign_ids, "deleted" => 0, "status_code" => 244]);
$status_connected_multi = PreorderModel::count(["preordercampaign_id" => $campaign_ids, "deleted" => 0, "status_code" => 245]);
$status_connected = PreorderModel::count(["preordercampaign_id" => $campaign_ids, "deleted" => 0, "status_code" => 500]);
$partner_orders = $this->getPartnerOrderCount($campaign_ids);
$partner_orders_by_status = $this->getPartnerOrdersByStatus($campaign_ids);
} else {
$campaigns = PreordercampaignModel::search(["owner_id" => $this->me->address_id]);
if(!$campaign_ids) {
foreach(PreordercampaignModel::search(["owner_id" => $this->me->address_id]) as $campaign) {
$campaign_ids[] = $campaign->id;
}
}
$max_connections = $this->getTotalHomes($campaign_ids);
$count_orders = PreorderModel::count(["preordercampaign_id" => $campaign_ids, "deleted" => 0]);
$weekly_orders = $this->getWeeklyOrders($campaign_ids);
$status_connected_single = PreorderModel::count(["preordercampaign_id" => $campaign_ids, "deleted" => 0, "status_code" => 244]);
$status_connected_multi = PreorderModel::count(["preordercampaign_id" => $campaign_ids, "deleted" => 0, "status_code" => 245]);
$status_connected = PreorderModel::count(["preordercampaign_id" => $campaign_ids, "deleted" => 0, "status_code" => 500]);
$partner_orders = $this->getPartnerOrderCount($campaign_ids);
$partner_orders_by_status = $this->getPartnerOrdersByStatus($campaign_ids);
}
$total_orders = $partner_orders["total"];
unset($partner_orders["total"]);
//var_dump($partner_orders);exit;
$stati = [];
foreach(PreorderstatusModel::getAll() as $status) {
$stati[$status->id] = ["code" => $status->code, "name" => $status->name];
}
$this->layout()->set("stati", $stati);
$this->layout()->set("max_connections", $max_connections);
$this->layout()->set("count_orders", $count_orders);
$this->layout()->set("weekly_orders", $weekly_orders);
$this->layout()->set("status_connected_single", $status_connected_single);
$this->layout()->set("status_connected_multi", $status_connected_multi);
$this->layout()->set("status_connected", $status_connected);
$this->layout()->set("partner_orders", $partner_orders);
$this->layout()->set("total_orders", $total_orders);
$this->layout()->set("partner_orders_by_status", $partner_orders_by_status);
$this->layout()->set("campaigns", $campaigns);
$this->layout()->set("campaign_id", $r->campaign_id);
}
private function getTotalHomes($preordercampaign_id = []) {
$total_homes = 0;
foreach($preordercampaign_id as $campaign_id) {
$campaign = new Preordercampaign($campaign_id);
if($campaign->id) {
$total_homes += ($campaign->homes_total) ? $campaign->homes_total : $campaign->total_homes;
}
}
return $total_homes;
}
private function getPartnerOrderCount($preordercampaign_id = []) {
$orders = [];
$totals = 0;
$sql = "SELECT COUNT(Preorder.id) as cnt, IF(Address.company IS NOT NULL AND Address.company <> '', Address.company, CONCAT(Address.firstname, ' ', Address.lastname)) as partner FROM Preorder
LEFT JOIN Address ON (Preorder.partner_id = Address.id)
LEFT JOIN Addresstype ON (Addresstype.address_id = Address.id AND Addresstype.type='salespartner')
WHERE Preorder.deleted = 0 AND Preorder.preordercampaign_id IN (".implode(",", $preordercampaign_id).")
GROUP BY Address.id
";
$this->log->debug($sql);
$res = $this->db()->query($sql);
if($this->db()->num_rows($res)) {
while($data = $this->db()->fetch_object($res)) {
if($data->partner) {
$orders[$data->partner] = $data->cnt;
} else {
$orders["Kein Partner"] = $data->cnt;
}
$totals += $data->cnt;
}
}
arsort($orders);
$orders["total"] = $totals;
return $orders;
}
private function getWeeklyOrders($preordercampaign_id = []) {
$orders = [];
$week = new DateTime("now - 52 weeks");
$start = $week->getTimestamp();
for($w = 1; $w <= 52; $w++) {
$week->modify("+1 week");
$end = $week->getTimestamp();
/*$week = $now->modify("-$w weeks");
$week_before = $week->modify("-1 weeks");
$this->log->debug("now: ".$now->getTimestamp()." | week ".$week->getTimestamp()." | before: ".$week_before->getTimestamp());*/
$where = "AND (tt_preorder.`create` > $start AND tt_preorder.`create` <= $end)";
$count = PreorderModel::count(["preordercampaign_id" => $preordercampaign_id, "deleted" => 0, "add-where" => $where]);
$orders[$week->getTimestamp()] = $count;
$start = $end;
}
return $orders;
//var_dump($orders);exit;
}
private function getPartnerOrdersByStatus($preordercampaign_id = []) {
$orders = [];
foreach(PreorderModel::search(["preordercampaign_id" => $preordercampaign_id, "deleted" => 0]) as $preorder) {
$name = $preorder->partner->getCompanyOrName();
if(!$name) $name = "Kein Partner";
if(!array_key_exists($name, $orders)) {
$orders[$name] = [];
$orders[$name]["total"] = 0;
}
if(!array_key_exists($preorder->status->id, $orders[$name])) {
$orders[$name][$preorder->status->id] = 0;
}
$orders[$name][$preorder->status->id]++;
$orders[$name]["total"]++;
}
//var_dump($orders);exit;
return $orders;
}
protected function pdfAction() {
$order = new Order(7);
$owner = new Address(1);
$pdf = new Layout();
$pdf->setTemplate("Emailtemplates/attachments/new_order.pdf");
$pdf->set("ressourcePathPrefix", BASEDIR."/public/");
$pdf->set("owner", $owner);
$pdf->set("order", $order);
$pdfpath = $pdf->renderPDF();
$tvalue = $pdf->getReturnedValue();
$pdfname = $tvalue['filename'];
echo $pdfname;
exit;
return true;
//var_dump($pdfpath);exit;
// send email to customer
// TODO template rendern auslagern nach Emailtempate klasse
$tpl = new Layout();
$tpl->setTemplate("Emailtemplates/customer/new_order");
$tpl->set("owner", $owner);
$body = $tpl->render();
$values = $tpl->getReturnedValue();
$subject = $values['subject'];
$from = $values['from_email'];
$from_name = $values['from_email_name'];
$to = $owner->email;
if(!$subject || !$from || !$from_name || !$to) {
$this->log->warn("Service PIN Email not sent. (subject: '$subject', from: '$from', from_email: '$from_email', to: '$to')");
} else {
$email = new Emailnotification();
$email->setSubject($subject);
$email->setBody($body);
$email->setFrom($from, $from_name);
$email->setTo($to);
$email->setHeader("X-".MFAPPNAME."-oid", $order->id);
$email->setHeader("X-".MFAPPNAME."-pid", $product->id);
$email->addAttachment($pdfpath, null, $pdfname, "application/pdf");
$email->send();
}
}
}