From 071601fa35daebb63f93396a9755e97a3d8fa0d9 Mon Sep 17 00:00:00 2001
From: Xenomporio <>
Date: Wed, 25 May 2022 09:24:23 +0200
Subject: [PATCH] Bugfix verkaufszahlen
---
phpwf/widgets/easytable.php | 2 +-
www/pages/verkaufszahlen.php | 2321 +++++++++++++++++-----------------
2 files changed, 1167 insertions(+), 1156 deletions(-)
diff --git a/phpwf/widgets/easytable.php b/phpwf/widgets/easytable.php
index 7ba09b1f..0618dd1c 100644
--- a/phpwf/widgets/easytable.php
+++ b/phpwf/widgets/easytable.php
@@ -54,7 +54,7 @@ class EasyTable {
* @param string|int $limit
* @param string $newevent
*/
- function Query($sql,$limit='',$newevent='')
+ function Query($sql,$limit=0,$newevent='')
{
if(!is_array($sql)) {
$this->sql = $sql;
diff --git a/www/pages/verkaufszahlen.php b/www/pages/verkaufszahlen.php
index 04e3d747..eec2ce1b 100644
--- a/www/pages/verkaufszahlen.php
+++ b/www/pages/verkaufszahlen.php
@@ -1,1158 +1,1169 @@
-app=$app;
- if($intern){
- return;
- }
- $this->app->ActionHandlerInit($this);
-
- $this->app->ActionHandler("list","VerkaufszahlenList");
- $this->app->ActionHandler("details","VerkaufszahlenDetails");
-
- $this->app->Tpl->Set('UEBERSCHRIFT','Verkaufszahlen');
- $this->app->ActionHandlerListen($app);
- }
-
- public function Install()
- {
- $this->app->erp->CheckTable('verkaufszahlen_chart');
- $this->app->erp->CheckColumn('id','int(11)','verkaufszahlen_chart','DEFAULT 0 NOT NULL AUTO_INCREMENT');
- $this->app->erp->CheckColumn('aktiv', 'tinyint(1)', 'verkaufszahlen_chart', 'DEFAULT 1 NOT NULL');
- $this->app->erp->CheckColumn('regs', 'tinyint(1)', 'verkaufszahlen_chart', 'DEFAULT 0 NOT NULL');
- $this->app->erp->CheckColumn('monat', 'tinyint(1)', 'verkaufszahlen_chart', 'DEFAULT 1 NOT NULL');
- $this->app->erp->CheckColumn('bezeichnung', 'varchar(255)', 'verkaufszahlen_chart', 'DEFAULT \'\' NOT NULL');
- $this->app->erp->CheckColumn('bearbeiter', 'varchar(255)', 'verkaufszahlen_chart', 'DEFAULT \'\' NOT NULL');
- $this->app->erp->CheckColumn('zeitstempel', 'timestamp', 'verkaufszahlen_chart','DEFAULT CURRENT_TIMESTAMP NOT NULL');
- $this->app->erp->CheckColumn('sort','int(11)','verkaufszahlen_chart','DEFAULT 0 NOT NULL');
- $this->app->erp->CheckTable('verkaufszahlen_chart_projekt');
- $this->app->erp->CheckColumn('id','int(11)','verkaufszahlen_chart_projekt','DEFAULT 0 NOT NULL AUTO_INCREMENT');
- $this->app->erp->CheckColumn('chart','int(11)','verkaufszahlen_chart_projekt','DEFAULT 0');
- $this->app->erp->CheckColumn('projekt','int(11)','verkaufszahlen_chart_projekt','DEFAULT 0');
- $this->app->erp->CheckColumn('aktiv', 'tinyint(1)', 'verkaufszahlen_chart_projekt', 'DEFAULT 1 NOT NULL');
- $this->app->erp->CheckIndex('verkaufszahlen_chart_projekt',['chart','projekt']);
-
- if(!$this->app->DB->Select('SELECT id FROM verkaufszahlen_chart WHERE aktiv = 1 LIMIT 1'))
- {
- $this->app->DB->Insert("INSERT INTO verkaufszahlen_chart (aktiv, bearbeiter) VALUES (1,'initial')");
- }
- }
-
- /**
- * @param $diagrammid
- * @param bool $onlyids Wenn false Liste mit id, bezeichnung und Farbe, sonst einfaches Array mit Projekt ids
- * @return array Aktive Projekte zum Diagramm
- */
- protected function GetDiagrammProjekte($diagrammid, $onlyids = false)
- {
- if($diagrammid > 0){
- $projekte_arr = $this->app->DB->SelectArr(
- "SELECT DISTINCT vcp.projekt, pr.abkuerzung, pr.farbe
- FROM verkaufszahlen_chart_projekt vcp INNER JOIN projekt pr ON vcp.projekt = pr.id AND pr.geloescht = 0 AND vcp.aktiv = 1
- WHERE vcp.chart = '" . $diagrammid . "' ORDER BY pr.abkuerzung"
- );
- }
- if($diagrammid <= 0 || empty($projekte_arr)){
- $projekte_arr = $this->app->DB->SelectArr(sprintf(
- "SELECT p.id as projekt, p.abkuerzung, p.farbe
- FROM projekt AS p WHERE p.verkaufszahlendiagram = '1' AND p.geloescht != '1' %s
- ORDER BY p.abkuerzung",
- $this->app->erp->ProjektRechte('id')
- ));
- }
-
- if(!$onlyids)
- {
- return $projekte_arr;
- }
- if(empty($projekte_arr))
- {
- return array();
- }
- $ret = array();
- foreach($projekte_arr as $v)
- {
- $ret[] = $v['projekt'];
- }
- return $ret;
- }
-
- protected function DrawDiagramm($target, $daten){
- $this->app->Tpl->Set('DIAGRAMMWOCHE','');
- $this->app->Tpl->Set('DIAGRAMMMONAT','');
- $subwherea = null;
-
- // Ermitteln ob es Projekte gibt für die Diagramme gezeichnet werden sollen
-
- $projekte_arr = $this->GetDiagrammProjekte($daten['id']);
- if(!empty($projekte_arr))
- {
- $ertesdatum = $this->app->DB->Select("SELECT DATE_SUB(date_format(now(),'%Y-%m-01'),INTERVAL 12 MONTH)");
- foreach($projekte_arr as $k => $v)
- {
- $subwherea[] = $v['projekt'];
- $idtoabkuerzung[$v['projekt']] = $v['abkuerzung'];
- }
-
- // Daten basierend auf Rechnungen oder Aufträgen?
- $dataBasedOnInvoices = (bool)$daten['regs'];
-
- // Wochendiagramm zusammenbauen
- $weekChart = $this->BuildWeekChart($idtoabkuerzung, $dataBasedOnInvoices);
- $weekRenderer = new HtmlRenderer($weekChart, '', 400, 120);
- $this->app->Tpl->Set('DIAGRAMMWOCHE', $weekRenderer->render());
-
- // 12-Monats-Diagramm anzeigen?
- if($daten['monat']){
- $yearChart = $this->BuildFullYearChart($idtoabkuerzung, $ertesdatum, $dataBasedOnInvoices);
- $yearRenderer = new HtmlRenderer($yearChart, '', 400, 80);
- $this->app->Tpl->Set('DIAGRAMMMONAT', $yearRenderer->render());
- }
-
- // Diagramm-Titel
- if (empty($daten['bezeichnung'])){
- $chartTitle = $daten['regs'] ? 'Gesamtübersicht Rechnungen / Gutschriften' : 'Gesamtübersicht Auftragseingang';
- } else {
- $chartTitle = $daten['bezeichnung'];
- }
- $this->app->Tpl->Set('BESCHRIFTUNG1', $chartTitle);
- }
-
- //heute
-
- if($daten['regs'])
- {
- $this->app->Tpl->Set('BELEGTYP', 'Rechnungen / Gutschriften');
- }else{
- $this->app->Tpl->Set('BELEGTYP', 'Aufträge');
- }
-
- if($subwherea)
- {
- $pakete = $this->getPackages(
- " v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d')
- AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')
- );
- $this->app->Tpl->Set(
- 'PAKETE',
- $pakete
- //$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d') AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')."")
- );
- }else{
- $pakete = $this->getPackages(
- " v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d')
- ".$this->app->erp->ProjektRechte('l.projekt')
- );
- $this->app->Tpl->Set(
- 'PAKETE',
- $pakete
- //$this->app->DB->Select("SELECT COUNT(v.id) FROM versand INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d') ".$this->app->erp->ProjektRechte('l.projekt')."")
- );
- }
-
- if($daten['regs'])
- {
- if($subwherea)
- {
- $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,'.'SUM(erloes_netto)'." as erloes_netto2 FROM `rechnung` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='versendet' OR status='freigegeben' OR status ='storniert') AND projekt in (".implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
- $data2 = $this->app->DB->SelectArr('SELECT SUM(-umsatz_netto) as umsatz_netto2,'.'SUM(-erloes_netto)'." as erloes_netto2 FROM `gutschrift` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='versendet' OR status='freigegeben') AND projekt in (".implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
- $data[0]['umsatz_netto2'] += (float)str_replace(',','',$data2[0]['umsatz_netto2']);
- $data[0]['erloes_netto2'] += (float)str_replace(',','',$data2[0]['erloes_netto2']);
- }else{
- $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,'.'SUM(erloes_netto)'." as erloes_netto2 FROM `rechnung` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='versendet' OR status='freigegeben' OR status ='storniert') ".$this->app->erp->ProjektRechte('projekt'));
- $data2 = $this->app->DB->SelectArr('SELECT SUM(-umsatz_netto) as umsatz_netto2,'.'SUM(-erloes_netto)'." as erloes_netto2 FROM `gutschrift` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='versendet' OR status='freigegeben') ".$this->app->erp->ProjektRechte('projekt'));
- $data[0]['umsatz_netto2'] += (float)str_replace(',','',$data2[0]['umsatz_netto2']);
- $data[0]['erloes_netto2'] += (float)str_replace(',','',$data2[0]['erloes_netto2']);
- }
- }else{
- if($subwherea)
- {
- $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2, '.'SUM(erloes_netto)'." as erloes_netto2 FROM `auftrag` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') AND projekt in (".implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
- }else{
- $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,'.'SUM(erloes_netto)'." as erloes_netto2 FROM `auftrag` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') ".$this->app->erp->ProjektRechte('projekt'));
- }
- }
-
- $einnahmen_auftrag = str_replace(',','',$data[0]['umsatz_netto2']);
- $ausgaben_auftrag = str_replace(',','',$data[0]['umsatz_netto2']) - str_replace(',','',$data[0]['erloes_netto2']);
-
- $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
- $deckungsbeitragprozent = $einnahmen_auftrag == 0?0:($deckungsbeitrag / $einnahmen_auftrag)*100;
-
- if($einnahmen_auftrag <=0) {
- $einnahmen_auftrag='0.00';
- }
- $this->app->Tpl->Set('UMSATZ',number_format($einnahmen_auftrag,2,',','.').' €');
- //SELECT e.preis,ap.menge,ap.bezeichnung,ap.artikel FROM auftrag auf LEFT JOIN auftrag_position ap ON ap.auftrag=auf.id RIGHT JOIN einkaufspreise e ON e.artikel=ap.artikel WHERE auf.datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND (auf.status='abgeschlossen' OR auf.status='freigegeben') AND (e.gueltig_bis > NOW() OR e.gueltig_bis!='0000-00-00') AND e.geloescht!=1 GROUP by e.artikel
- $this->app->Tpl->Set('DECKUNGSBEITRAG',number_format($deckungsbeitrag,2,',','.') );
- $this->app->Tpl->Set('DECKUNGSBEITRAGPROZENT',number_format($deckungsbeitragprozent,2,',','.'));
- $this->app->Tpl->Parse('STATISTIKHEUTE','verkaufszahlen_statistik.tpl');
-
- //gestern
- if($subwherea)
- {
- $pakete = $this->getPackages(
- " v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d')
- AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')
- );
- $this->app->Tpl->Set(
- 'PAKETE',
- $pakete
- //$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')."")
- );
- }else{
- $pakete = $this->getPackages(
- " v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d')
- AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')
- );
- $this->app->Tpl->Set(
- 'PAKETE',
- $pakete
- //$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') ".$this->app->erp->ProjektRechte('l.projekt')."")
- );
- }
-
- if($daten['regs'])
- {
- if($subwherea)
- {
- $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2 FROM `rechnung` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),\'%Y-%m-%d\') AND ( status=\'versendet\' OR status=\'freigegeben\' OR status =\'storniert\') AND projekt in ('.implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
- $data2 = $this->app->DB->SelectArr('SELECT SUM(-umsatz_netto) as umsatz_netto2,SUM(-erloes_netto) as erloes_netto2 FROM `gutschrift` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),\'%Y-%m-%d\') AND ( status=\'versendet\' OR status=\'freigegeben\') AND projekt in ('.implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
- $data[0]['umsatz_netto2'] += $data2[0]['umsatz_netto2'];
- $data[0]['erloes_netto2'] += $data2[0]['erloes_netto2'];
- }else{
- $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2 FROM `rechnung` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),\'%Y-%m-%d\') AND ( status=\'versendet\' OR status=\'freigegeben\' OR status =\'storniert\') '.$this->app->erp->ProjektRechte('projekt'));
- $data2 = $this->app->DB->SelectArr('SELECT SUM(-umsatz_netto) as umsatz_netto2,SUM(-erloes_netto) as erloes_netto2 FROM `gutschrift` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),\'%Y-%m-%d\') AND ( status=\'versendet\' OR status=\'freigegeben\') '.$this->app->erp->ProjektRechte('projekt'));
- $data[0]['umsatz_netto2'] += $data2[0]['umsatz_netto2'];
- $data[0]['erloes_netto2'] += $data2[0]['erloes_netto2'];
- }
- }else{
- if($subwherea)
- {
- $data = $this->app->DB->SelectArr("SELECT
- SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2 FROM `auftrag` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') AND projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('projekt'));
- }else{
- $data = $this->app->DB->SelectArr("SELECT
- SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2 FROM `auftrag` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') ".$this->app->erp->ProjektRechte('projekt')."");
- }
- }
-
- // $umsatz = $data[0]['gesamtsumme2'];
- $einnahmen_auftrag = $data[0]['umsatz_netto2'];
- $ausgaben_auftrag = $data[0]['umsatz_netto2'] - $data[0]['erloes_netto2'];
-
- $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
- $deckungsbeitragprozent = $einnahmen_auftrag == 0?0:($deckungsbeitrag / $einnahmen_auftrag)*100;
-
- if($einnahmen_auftrag <=0) {
- $einnahmen_auftrag='0.00';
- }
- $this->app->Tpl->Set('UMSATZ',number_format($einnahmen_auftrag,2,',','.').' €');
- //SELECT e.preis,ap.menge,ap.bezeichnung,ap.artikel FROM auftrag auf LEFT JOIN auftrag_position ap ON ap.auftrag=auf.id RIGHT JOIN einkaufspreise e ON e.artikel=ap.artikel WHERE auf.datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND (auf.status='abgeschlossen' OR auf.status='freigegeben') AND (e.gueltig_bis > NOW() OR e.gueltig_bis!='0000-00-00') AND e.geloescht!=1 GROUP by e.artikel
- $this->app->Tpl->Set('DECKUNGSBEITRAG',number_format($deckungsbeitrag,2,',','.') );
- $this->app->Tpl->Set('DECKUNGSBEITRAGPROZENT',number_format($deckungsbeitragprozent,2,',','.'));
- $this->app->Tpl->Parse('STATISTIKGESTERN','verkaufszahlen_statistik.tpl');
-
- $subwhereSql = $this->app->erp->ProjektRechte('a.projekt');
- if(!empty($subwherea)) {
- $subwhereSql .= sprintf(' AND a.projekt IN (%s) ', implode(', ', $subwherea));
- }
- list($imversand, $offen) = $this->getVersandStats($subwhereSql);
-
- $this->app->Tpl->Set('IMVERSAND',number_format($imversand,0,',','.') );
- $this->app->Tpl->Set('AUFTRAEGEOFFEN',number_format($offen,0,',','.'));
- $this->app->Tpl->Parse('STATISTIKAUFTRAEGE','verkaufszahlen_statistik2.tpl');
- $this->app->Tpl->Set('ID', $daten['id']);
- $this->app->Tpl->Parse($target, 'verkaufszahlen_listdetail.tpl');
- }
-
- /**
- * @param string $subwhere
- * @param string $joinInvoice
- * @param string $joinCreditnote
- *
- * @return float[]
- */
- public function getInvoiceStats($subwhere, $joinInvoice = '', $joinCreditnote = '')
- {
- $data = $this->app->DB->SelectRow(
- 'SELECT SUM(r.umsatz_netto) as umsatz_netto2,SUM(r.erloes_netto) as erloes_netto2
- FROM `rechnung` AS `r`
- $joinInvoice
- WHERE ( r.status=\'versendet\' OR r.status=\'freigegeben\' OR r.status =\'storniert\')
- '.$subwhere
- );
- $data2 = $this->app->DB->SelectRow(
- 'SELECT SUM(-r.umsatz_netto) as umsatz_netto2,SUM(-r.erloes_netto) as erloes_netto2
- FROM `gutschrift` AS `r`
- $joinCreditnote
- WHERE
- AND ( r.status=\'versendet\' OR r.status=\'freigegeben\') '
- .$subwhere
- );
- $data['umsatz_netto2'] += $data2['umsatz_netto2'];
- $data['erloes_netto2'] += $data2['erloes_netto2'];
-
- $einnahmen_auftrag = $data['umsatz_netto2'];
- $ausgaben_auftrag = $data['umsatz_netto2'] - $data['erloes_netto2'];
-
- $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
- $deckungsbeitragprozent = $einnahmen_auftrag == 0?0:($deckungsbeitrag / $einnahmen_auftrag)*100;
-
- if($einnahmen_auftrag <=0) {
- $einnahmen_auftrag=0;
- }
-
- return [(float)$einnahmen_auftrag, (float)$deckungsbeitrag, (float)$deckungsbeitragprozent];
- }
-
- /**
- * @param string $subwhere
- * @param string $join
- *
- * @return int
- */
- public function getPackages($subwhere, $join = '')
- {
- return (int)$this->app->DB->Select(
- "SELECT COUNT(v.id)
- FROM versand v
- INNER JOIN lieferschein l ON v.lieferschein = l.id
- $join
- WHERE ".$subwhere
- );
- }
-
- /**
- * @param string $subwhere
- *
- * @return float[]
- */
- public function getOrderStats($subwhere)
- {
- $data = $this->app->DB->SelectRow(
- "SELECT
- SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2
- FROM `auftrag`
- WHERE ( status='abgeschlossen' OR status='freigegeben')
- ".$subwhere
- );
- $einnahmen_auftrag = $data['umsatz_netto2'];
- $ausgaben_auftrag = $data['umsatz_netto2'] - $data['erloes_netto2'];
-
- $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
- $deckungsbeitragprozent = $einnahmen_auftrag == 0?0:($deckungsbeitrag / $einnahmen_auftrag)*100;
-
- if($einnahmen_auftrag <=0) {
- $einnahmen_auftrag=0;
- }
-
- return [(float)$einnahmen_auftrag, (float)$deckungsbeitrag, (float)$deckungsbeitragprozent];
- }
-
- /**
- * @param string $subwhere
- *
- * @return int[]
- */
- public function getVersandStats($subwhere) {
-
- $imversand = $this->app->DB->Select(
- "SELECT count(a.id)
- FROM auftrag a
- INNER JOIN lieferschein l ON a.id = l.auftragid
- LEFT JOIN versand v ON l.id = v.lieferschein
- WHERE v.abgeschlossen!='1' AND (tracking <> '' OR weitererlieferschein <> 1)
- AND v.cronjob = 0 ".$subwhere
- );
- $offen = $this->app->DB->Select(
- "SELECT count(a.id)
- FROM auftrag a
- WHERE a.status='freigegeben' ".$subwhere
- );
- return [
- (int)$imversand, (int)$offen
- ];
- }
-
- public function VerkaufszahlenList()
- {
- $cmd = $this->app->Secure->GetGET('cmd');
- if($cmd === 'geteasytablelist') {
- $element = $this->app->Secure->GetPOST('element');
- $html = $this->getEasyTable($element);
- echo json_encode(['element'=>$element,'html'=>$html]);
- $this->app->ExitXentral();
- }
- if($cmd === 'getchart')
- {
- $el = (int)$this->app->Secure->GetPOST('el');
- $arr = $this->app->DB->SelectRow("SELECT * FROM verkaufszahlen_chart WHERE id = '$el' LIMIT 1");
- $projekte = null;
- $ret = array('bezeichnung'=>'','regs'=>0,'monat'=>1);
- if($arr) {
- $ret = array('bezeichnung'=>$arr['bezeichnung'],'regs'=>$arr['regs'],'monat'=>$arr['monat']);
- if($this->app->DB->Select("SELECT p.id FROM projekt p INNER JOIN verkaufszahlen_chart_projekt vcp ON p.id = vcp.projekt AND vcp.chart = '$el' WHERE p.geloescht <> 1 LIMIT 1")){
- $projekte = $this->app->DB->SelectArr("SELECT p.id, vcp.aktiv FROM projekt p LEFT JOIN verkaufszahlen_chart_projekt vcp ON p.id = vcp.projekt AND vcp.chart = '$el' WHERE p.geloescht <> 1 ");
- }
- }
- if(!$projekte)
- {
- $projekte = $this->app->DB->SelectArr('SELECT p.id, p.verkaufszahlendiagram as aktiv FROM projekt p WHERE p.geloescht <> 1 ');
- }
- if($projekte)
- {
- foreach($projekte as $k => $v){
- $ret['projekte'][(int)$v['id']] = (int)$v['aktiv'];
- }
- }
- $ret['id'] = $el;
- echo json_encode($ret);
- $this->app->ExitXentral();
- }
-
- if($cmd === 'savechart')
- {
- $ret = array('status'=>1);
- $el = (int)$this->app->Secure->GetPOST('sid');
- if(!$el)
- {
- $this->app->DB->Insert('INSERT INTO verkaufszahlen_chart (aktiv) VALUES (1)');
- $el = $this->app->DB->GetInsertID();
- }
- $this->app->DB->Update("UPDATE verkaufszahlen_chart SET bezeichnung = '".$this->app->Secure->GetPOST('bezeichnung')."', bearbeiter = '".$this->app->DB->real_escape_string($this->app->User->GetName())."', monat = '".(int)$this->app->Secure->GetPOST('monat')."', regs = '".(int)$this->app->Secure->GetPOST('regs')."' WHERE id = '$el' LIMIT 1");
- $projekte = $this->app->DB->Select('SELECT p.id FROM projekt p WHERE p.geloescht <> 1 ');
- foreach($projekte as $pr)
- {
- $check = $this->app->DB->Select("SELECT id FROM verkaufszahlen_chart_projekt WHERE chart = '$el' AND projekt = '".$pr['id']."' LIMIT 1");
- $projekt = $this->app->Secure->GetPOST('projekt');
- if($check)
- {
- if($projekt && is_array($projekt) && in_array($pr['id'],$projekt))
- {
- $this->app->DB->Update("UPDATE verkaufszahlen_chart_projekt SET aktiv = 1 WHERE id = '$check' LIMIT 1");
- }else{
- $this->app->DB->Update("UPDATE verkaufszahlen_chart_projekt SET aktiv = 0 WHERE id = '$check' LIMIT 1");
- }
- }elseif($projekt && is_array($projekt) && in_array($pr['id'],$projekt)){
- $this->app->DB->Insert("INSERT INTO verkaufszahlen_chart_projekt (chart, projekt, aktiv) VALUES ('$el','".$pr['id']."','1')");
- }
- }
- echo json_encode($ret);
- $this->app->ExitXentral();
- }
-
- if($cmd === 'deletechart')
- {
- $ret = array('status'=>1);
- $el = (int)$this->app->Secure->GetPOST('sid');
- if($el)
- {
- $this->app->DB->Delete("DELETE FROM verkaufszahlen_chart_projekt WHERE chart = '$el'");
- $this->app->DB->Delete("DELETE FROM verkaufszahlen_chart WHERE id = '$el'");
- }
- echo json_encode($ret);
- $this->app->ExitXentral();
- }
-
- if(!$this->app->DB->Select('SELECT id FROM verkaufszahlen_chart WHERE aktiv = 1 LIMIT 1'))
- {
- $this->Install();
- }
- $useJson = $this->useJson;
- $this->VerkaufszahlenMenu();
-
-
- $diagramme = $this->app->DB->SelectArr('SELECT * FROM verkaufszahlen_chart WHERE aktiv = 1 ORDER BY sort');
-
- if(!empty($diagramme))
- {
- $projektefirst = $this->GetDiagrammProjekte($diagramme[0]['id'],true);
- if(count($diagramme) <= 1)
- {
- $this->app->Tpl->Set('VORDEAKTIVIEREN','/*');
- $this->app->Tpl->Set('NACHDEAKTIVIEREN','*/');
- }
- foreach($diagramme as $diagramm)
- {
- $this->DrawDiagramm('DIAGRAMME', $diagramm);
- }
- }else{
- $projektefirst = array();
- }
-
-
- //$this->app->Tpl->Set('TABTEXT',"Verkaufszahlen");
-
- $projekte_arr = $this->app->DB->SelectArr("SELECT id as projekt FROM projekt WHERE verkaufszahlendiagram='1' AND geloescht!='1' ".$this->app->erp->ProjektRechte('id').' order by abkuerzung');
- if(!empty($projekte_arr)){
- $cprojekte_arr = count($projekte_arr);
- for ($i = 0; $i < $cprojekte_arr; $i++) {
- $projekte[] = $projekte_arr[$i]['projekt'];
-
- $abkuerzung = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='" . $projekte_arr[$i]['projekt'] . "' LIMIT 1");
- $farbe = $this->app->DB->Select("SELECT farbe FROM projekt WHERE id='" . $projekte_arr[$i]['projekt'] . "' LIMIT 1");
-
- if($farbe == '') {
- $farbe = '#eee';
- }
-
- if($i < count($projekte_arr) - 1){
- $this->app->Tpl->Add('PLOTLEGENDS', '{ label: "' . $abkuerzung . '", data: d' . ($i + 1) . ', color: "' . $farbe . '"},');
- }
- else{
- $this->app->Tpl->Add('PLOTLEGENDS', '{ label: "' . $abkuerzung . '", data: d' . ($i + 1) . ', color: "' . $farbe . '"}');
- }
- }
- }
-
- $betraege = $this->app->DB->SelectArr("SELECT date_format(a.datum,'%Y-%m-%d') as datum,p.id, CEILING(SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))) as betrag
- FROM auftrag_position ap LEFT JOIN auftrag a ON ap.auftrag=a.id
- LEFT JOIN projekt p ON p.id=a.projekt WHERE a.status!='storniert' AND a.belegnr!='0' AND a.datum > date_sub(now(),INTERVAL 13 DAY) group by p.id,a.datum order by a.datum ,p.id");
-
-
-
- $spalte = 0;
- $daten = '';
- $projekte_daten = array();
- for ($zaehler = -12; $zaehler <= 0; $zaehler++) {
- $daten .= "[$spalte,'".date('D', strtotime('+' . $zaehler . ' day')).' '.date('d.m', strtotime("+" . $zaehler . " day"))."']";
-
- $tagdatum = date('Y-m-d', strtotime('+' . $zaehler . ' day'));
-
-
- foreach($projekte as $value)
- {
- $betrag = '';
- if(!empty($betraege)){
- foreach($betraege as $betr)
- {
- if($betr['id'] == $value && $betr['datum'] == $tagdatum){
- $betrag = $betr['betrag'];
- }
- }
- }
-
- if($betrag!=''){
- $betrag = "'".$betrag."'";
- }
- else {
- $betrag='0.0';
- }
-
- $projekte_daten[$value] .= "[$spalte,$betrag]";
- }
- if($zaehler<0)
- {
- $daten .= ',';
- foreach($projekte as $value) {
- $projekte_daten[$value] .= ',';
- }
- }
- $spalte++;
- }
-
-
-
- $this->app->Tpl->Set('DATUM',"[$daten]");
-
- $nummer = 1;
- $var = '';
- if(!empty($projekte)){
- foreach ($projekte as $value) {
- $var .= 'var d'.$nummer.' = [' . $projekte_daten[$value] . '];';
- $nummer++;
- }
- }
- $this->app->Tpl->Set('VARIABLEN',$var);
-
- //Auftragseingang leztzten 2 Wochen
- if(!$useJson){
- $table = new EasyTable($this->app);
- $arr = $this->getDetailQueries('TAGESUEBERSICHT');
- $table->Query($arr);
- if(!empty($table->datasets)){
- $pakete = $this->getDetailQueries('TAGESUEBERSICHTPAKETE');
- if($pakete){
- foreach ($pakete as $paket) {
- if($paket['pakete']){
- foreach ($table->datasets as $k => $d) {
- if($d['datum'] == $paket['datum']){
- $table->datasets[$k]['pakete'] = $paket['pakete'];
- }
- }
- }
- }
- }
- }
- $table->DisplayNew('TAGESUEBERSICHT', 'Pakete', 'noAction');
- }
- /* extend */
-
- $summe = $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM auftrag_position ap INNER JOIN auftrag a ON ap.auftrag=a.id WHERE (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."");
- $summe_gs = $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM gutschrift_position ap INNER JOIN gutschrift a ON ap.gutschrift=a.id WHERE (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."");
-
- $summe30 = $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM auftrag_position ap INNER JOIN auftrag a ON ap.auftrag=a.id
- WHERE a.datum > date_add(NOW(), interval -30 day) AND (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."");
- $summe30_gs = $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM gutschrift_position ap INNER JOIN gutschrift a ON ap.gutschrift=a.id
- WHERE a.datum > date_add(NOW(), interval -30 day) AND (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."");
-
- $summemenge = count($this->app->DB->SelectArr("SELECT
- COUNT(a.datum) FROM auftrag_position ap INNER JOIN auftrag a ON ap.auftrag=a.id WHERE (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."
- GROUP by a.datum, a.projekt "));
-
- if($summemenge < 30)
- {
- $summe_gutschriften = $summe_gs;
- $summe_auftrag = $summe;
- $durchschnitt = ($summe-$summe_gs) / $summemenge;
- $summe= number_format(($summe-$summe_gs),2);
- $tage = $summemenge;
- } else {
- $summe_gutschriften = $summe30_gs;
- $summe_auftrag = $summe30;
- $durchschnitt = ($summe30-$summe30_gs) / 30; // wenn mehr als 30 tage
- $summe= number_format(($summe30-$summe30_gs),2);
- $tage = 30;
- }
-
- $summe_gutschriften = number_format($summe_gutschriften,2);
- $summe_auftrag = number_format($summe_auftrag,2);
-
- $durchschnitt = number_format($durchschnitt,2);
- $this->app->Tpl->Set('EXTEND',"Summe: $summe_auftrag € (abzgl. Gutschriften $summe_gutschriften € = pro Tag $durchschnitt seit $tage Tagen)");
-
-
- /* tages uebersicht detail */
-
- $table = new EasyTable($this->app);
- $table->Query("SELECT
- DATE_FORMAT(a.datum,'%d.%m.%Y') as datum,p.abkuerzung as projekt, ".$this->app->erp->FormatPreis("SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))")." as Auftragseingang, COUNT(ap.id) as positionen,
- CONCAT('Details') as id FROM auftrag_position ap INNER JOIN auftrag a ON ap.auftrag=a.id
- LEFT JOIN projekt p ON p.id=a.projekt WHERE a.status!='storniert' ".$this->app->erp->ProjektRechte('a.projekt')." GROUP by a.datum DESC, a.projekt LIMIT 14");
- $table->DisplayNew('TAGESUEBERSICHTDETAIL','');
-
- // top artikel
- if(!$useJson) {
- $table = new EasyTable($this->app);
- $arr = $this->getDetailQueries('TOPARTIKEL');
- $table->Query($arr);
- $table->DisplayNew('TOPARTIKEL', "Bezeichnung", "noAction");
- }
-
- //heute
-
- $this->app->Tpl->Set('PAKETE',$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d') ".$this->app->erp->ProjektRechte('l.projekt').""));
- $data = $this->app->DB->SelectArr("SELECT ifnull(SUM(umsatz_netto),0) as umsatz_netto2,ifnull(SUM(erloes_netto),0) as erloes_netto2 FROM `auftrag`
- WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') ".
- $this->app->erp->ProjektRechte('projekt').
- (!empty($projektefirst)? ' AND projekt in ('.implode(', ', $projektefirst).')' :''));
- $einnahmen_auftrag = 0;
- $ausgaben_auftrag = 0;
- $deckungsbeitrag = 0;
- $deckungsbeitragprozent = 0;
- if(!empty($data)) {
- $einnahmen_auftrag = $data[0]['umsatz_netto2'];
- $ausgaben_auftrag = $data[0]['umsatz_netto2'] - $data[0]['erloes_netto2'];
-
- $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
- $deckungsbeitragprozent = $einnahmen_auftrag != 0? ($deckungsbeitrag / $einnahmen_auftrag) * 100:0;
- }
- if($einnahmen_auftrag <=0) {
- $einnahmen_auftrag='0.00';
- }
- $this->app->Tpl->Set('UMSATZ',number_format($einnahmen_auftrag,2,',','.').' €');
- $this->app->Tpl->Set('DECKUNGSBEITRAG',number_format($deckungsbeitrag,2,',','.') );
- $this->app->Tpl->Set('DECKUNGSBEITRAGPROZENT',number_format($deckungsbeitragprozent,2,',','.'));
- $this->app->Tpl->Parse('STATISTIKHEUTE','verkaufszahlen_statistik.tpl');
-
- //gestern
-
- $this->app->Tpl->Set('PAKETE',$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') ".$this->app->erp->ProjektRechte('l.projekt').""));
-
- $data = $this->app->DB->SelectArr("SELECT
- ifnull(SUM(umsatz_netto),0) as umsatz_netto2,ifnull(SUM(erloes_netto),0) as erloes_netto2 FROM `auftrag`
- WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') ".
- $this->app->erp->ProjektRechte('projekt').
- (!empty($projektefirst)? ' AND projekt in ('.implode(', ', $projektefirst).')' :''));
-
- $einnahmen_auftrag = 0;
- $ausgaben_auftrag = 0;
- $deckungsbeitrag = 0;
- $deckungsbeitragprozent = 0;
- if(!empty($data)){
- $einnahmen_auftrag = $data[0]['umsatz_netto2'];
- $ausgaben_auftrag = $data[0]['umsatz_netto2'] - $data[0]['erloes_netto2'];
-
- $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
- $deckungsbeitragprozent = $einnahmen_auftrag!=0? ($deckungsbeitrag / $einnahmen_auftrag) * 100:0;
- }
- if($einnahmen_auftrag <=0) {
- $einnahmen_auftrag='0.00';
- }
- $this->app->Tpl->Set('UMSATZ',number_format($einnahmen_auftrag,2,',','.').' €');
- $this->app->Tpl->Set('DECKUNGSBEITRAG',number_format($deckungsbeitrag,2,',','.') );
- $this->app->Tpl->Set('DECKUNGSBEITRAGPROZENT',number_format($deckungsbeitragprozent,2,',','.'));
- $this->app->Tpl->Parse('STATISTIKGESTERN','verkaufszahlen_statistik.tpl');
-
- $projekte = $this->app->DB->SelectArr("SELECT id, abkuerzung FROM projekt WHERE geloescht = 0 ".$this->app->erp->ProjektRechte('id')." ORDER BY abkuerzung");
- if(!empty($projekte)) {
- foreach($projekte as $projekt) {
- $this->app->Tpl->Add(
- 'POPUPPROJEKTE',
- '
-
- '.
- $projekt['abkuerzung'].'
-
-
'
- );
- }
- }
- $this->app->Tpl->Parse('TAB1','verkaufszahlen_list.tpl');
- $this->app->Tpl->Parse('PAGE','tabview.tpl');
- }
-
- /**
- * @param string $type
- * @param int $seconds
- *
- * @return array|null
- */
- public function getDetailQueries($type, $seconds = 3600)
- {
- switch(strtoupper($type)) {
- case 'TAGESUEBERSICHTPAKETE':
- return $this->app->DB->SelectArrCache("SELECT DATE_FORMAT(v.versendet_am,'%d.%m.%Y') as datum,
- count(v.id) as pakete
- from versand v
- INNER JOIN lieferschein l ON v.lieferschein = l.id
- WHERE 1 ".$this->app->erp->ProjektRechte('l.projekt').' group by v.versendet_am',
- $seconds, 'verkaufszahlen'
- );
- break;
- case 'TAGESUEBERSICHT':
- return $this->app->DB->SelectArrCache("SELECT
- DATE_FORMAT(a.datum,'%d.%m.%Y') as datum,
- ".$this->app->erp->FormatPreis('SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))',2)." as Auftragseingang ,
- '' as pakete
- FROM auftrag_position ap
- INNER JOIN auftrag a ON ap.auftrag=a.id
- WHERE (a.status='freigegeben' OR a.status='abgeschlossen') AND (a.belegnr!='0' OR a.belegnr!='') ".$this->app->erp->ProjektRechte('a.projekt')." GROUP by a.datum DESC LIMIT 30",
- $seconds, 'verkaufszahlen'
- );
- break;
- case 'TAGESUEBERSICHTDETAIL':
- return $this->app->DB->SelectArrCache(
- "SELECT
- DATE_FORMAT(a.datum,'%d.%m.%Y') as datum,p.abkuerzung as projekt, ".$this->app->erp->FormatPreis("SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))", 2)." as 'Auftragseingang Summe', COUNT(ap.id) as positionen,
- CONCAT('Details') as id FROM auftrag_position ap LEFT JOIN auftrag a ON ap.auftrag=a.id
- LEFT JOIN projekt p ON p.id=a.projekt WHERE a.status!='storniert' ".$this->app->erp->ProjektRechte('a.projekt')." GROUP by a.datum DESC, a.projekt LIMIT 14",
- $seconds, 'verkaufszahlen'
- );
- break;
- case 'TAGESUEBERSICHTDETAILGESTERN':
- return $this->app->DB->SelectArrCache(
- "SELECT
- DATE_FORMAT(a.datum,'%d.%m.%Y') as datum,p.abkuerzung as projekt, ".$this->app->erp->FormatPreis("SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))")." as 'Auftragseingang Summe', COUNT(ap.id) as positionen,
- CONCAT('Details') as id FROM auftrag_position ap LEFT JOIN auftrag a ON ap.auftrag=a.id
-
- LEFT JOIN projekt p ON p.id=a.projekt WHERE a.status!='storniert' ".$this->app->erp->ProjektRechte('a.projekt')." GROUP by a.datum DESC, a.projekt LIMIT 14",
- $seconds, 'verkaufszahlen'
- );
- break;
- case 'JAHR':
- return $this->app->DB->SelectArrCache(
- "
- SELECT EXTRACT(MONTH FROM a.datum) as monat, EXTRACT(YEAR FROM a.datum) as jahr,
- " . $this->app->erp->FormatPreis("(SELECT SUM(auf.gesamtsumme) FROM auftrag auf
- WHERE EXTRACT(MONTH FROM auf.datum)=monat AND EXTRACT(YEAR FROM auf.datum)=jahr AND auf.status!='storniert' AND auf.status!='angelegt' " . $this->app->erp->ProjektRechte('auf.projekt') . " )") . " as auftraege,
-
- " . $this->app->erp->FormatPreis("SUM(a.soll)") . " as rechnungen,
- " . $this->app->erp->FormatPreis("(SELECT SUM(g.soll) FROM gutschrift g
- WHERE EXTRACT(MONTH FROM g.datum)=monat AND EXTRACT(YEAR FROM g.datum)=jahr AND g.status!='storniert' AND g.status!='angelegt' " . $this->app->erp->ProjektRechte('g.projekt') . " )") . " as gutschriften,
-
- " . $this->app->erp->FormatPreis("(SUM(a.soll) - IFNULL((SELECT SUM(g.soll) FROM gutschrift g
- WHERE EXTRACT(MONTH FROM g.datum)=monat AND EXTRACT(YEAR FROM g.datum)=jahr AND g.status!='storniert' AND g.status!='angelegt'),0) " . $this->app->erp->ProjektRechte('g.projekt') . " )") . " as umsatz
-
- FROM rechnung a WHERE a.status!='angelegt' " . $this->app->erp->ProjektRechte('a.projekt') . "
- GROUP By monat,jahr ORDER by jahr DESC, monat DESC LIMIT 12",
- $seconds, 'verkaufszahlen'
- );
- break;
- case 'JAHRESUEBERSICHTPROJEKTE':
- return $this->app->DB->SelectArrCache(
- '
- SELECT '.$this->app->erp->FormatPreis('SUM(a.soll)').' as rechnungen,
- '.$this->app->erp->FormatPreis("IFNULL((SELECT SUM(g.soll) FROM gutschrift g WHERE g.status!='storniert' AND g.status!='angelegt' AND EXTRACT(YEAR FROM g.datum)=EXTRACT(YEAR FROM NOW()) AND g.projekt=p.id ".$this->app->erp->ProjektRechte('g.projekt')."),0)")." as gutschriften,
- ".$this->app->erp->FormatPreis("SUM(a.soll)-IFNULL((SELECT SUM(g.soll) FROM gutschrift g WHERE g.status!='storniert' AND g.status!='angelegt' AND EXTRACT(YEAR FROM g.datum)=EXTRACT(YEAR FROM NOW()) AND g.projekt=p.id ".$this->app->erp->ProjektRechte('g.projekt')." ),0)")." as umsatz,
- p.abkuerzung as projekt,COUNT(a.id) as anzahl_rechnungen FROM rechnung a LEFT JOIN projekt p ON p.id=a.projekt
- WHERE a.status!='angelegt' AND a.status!='storniert' AND EXTRACT(YEAR FROM a.datum)=EXTRACT(YEAR FROM NOW()) ".$this->app->erp->ProjektRechte('a.projekt')."
- GROUP By projekt ORDER by umsatz",
- $seconds, 'verkaufszahlen'
- );
- break;
- case 'GUTSCHRIFTJAHR':
- return $this->app->DB->SelectArrCache(
- "
- SELECT EXTRACT(MONTH FROM a.datum) as month, EXTRACT(YEAR FROM a.datum) as year, FORMAT(SUM(a.soll),2)
- FROM gutschrift a
- WHERE (a.status!='storniert' AND a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."
- GROUP By month,year ORDER by year DESC, month DESC",
- $seconds, 'verkaufszahlen'
- );
- break;
- case 'ANGEBOTJAHR':
- return $this->app->DB->SelectArrCache(
- "
- SELECT EXTRACT(MONTH FROM a.datum) as month, EXTRACT(YEAR FROM a.datum) as year, FORMAT(SUM(ap.preis*ap.menge),2)
- FROM angebot a LEFT JOIN angebot_position ap ON a.id=ap.angebot
- WHERE (a.status!='storniert' AND a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."
- GROUP By month,year ORDER by year DESC, month DESC",
- $seconds, 'verkaufszahlen'
- );
- break;
- case 'TOPARTIKEL':
- return $this->app->DB->SelectArrCache(
- "SELECT trim(SUM(ap.menge))+0 as menge,ap.nummer, ap.bezeichnung FROM auftrag_position ap LEFT JOIN artikel a ON a.id=ap.artikel INNER JOIN
- auftrag auf ON ap.auftrag=auf.id WHERE auf.datum >= DATE_SUB(NOW(),INTERVAL 90 day) AND a.lagerartikel=1 ".$this->app->erp->ProjektRechte('auf.projekt')." GROUP BY ap.artikel ORDER by 1 DESC LIMIT 30",
- $seconds, 'verkaufszahlen'
- );
- break;
- }
-
- return null;
- }
-
- /**
- * @param string $element
- *
- * @return string
- */
- public function getEasyTable($element)
- {
- if(empty($element)) {
- return '';
- }
- switch(strtoupper($element)) {
- case 'TAGESUEBERSICHT':
- $table = new EasyTable($this->app);
- $arr = $this->getDetailQueries('TAGESUEBERSICHT');
- $table->Query($arr);
- if(!empty($table->datasets)){
- $pakete = $this->getDetailQueries('TAGESUEBERSICHTPAKETE');
- if($pakete){
- foreach ($pakete as $paket) {
- if($paket['pakete']){
- foreach ($table->datasets as $k => $d) {
- if($d['datum'] == $paket['datum']){
- $table->datasets[$k]['pakete'] = $paket['pakete'];
- }
- }
- }
- }
- }
- }
- return $table->DisplayNew('return', 'Pakete', 'noAction');
- break;
- case 'TAGESUEBERSICHTDETAILGESTERN':
- case 'TAGESUEBERSICHTDETAIL':
- $lastCol = 'Umsatz';
- break;
- case 'JAHRESUEBERSICHTPROJEKTE':
- $lastCol = 'Anzahl Rechnungen';
- break;
- case 'TOPARTIKEL':
- $lastCol = 'Bezeichnung';
- break;
- case 'ANGEBOTJAHR':
- case 'GUTSCHRIFTJAHR':
- case 'JAHR':
- $lastCol = 'Jahr';
- break;
- default:
- $lastCol = 'Umsatz';
- break;
- }
- if(empty($lastCol)) {
- return '';
- }
- $table = new EasyTable($this->app);
- $table->Query($this->getDetailQueries($element));
- return $table->DisplayNew('return', strtoupper($element),$lastCol,'noAction');
- }
-
- public function VerkaufszahlenDetails()
- {
- $cmd = $this->app->Secure->GetGET('cmd');
- if($cmd === 'getdetails') {
- $element = $this->app->Secure->GetPOST('element');
- $html = $this->getEasyTable($element);
- echo json_encode(['element'=>$element,'html'=>$html]);
- $this->app->ExitXentral();
- }
- $this->VerkaufszahlenMenu();
- $useJson = $this->useJson;
-
- if(!$useJson){
- /* tages uebersicht detail */
- $table = new EasyTable($this->app);
- $arr = $this->getDetailQueries('TAGESUEBERSICHTDETAIL');
- $table->Query($arr);
- $table->DisplayNew('TAGESUEBERSICHTDETAIL', '');
- }
-
- /* tages uebersicht detail */
- /*
- $table = new EasyTable($this->app);
- $arr = $this->getDetailQueries('TAGESUEBERSICHTDETAILGESTERN');
- $table->Query($arr);
- $table->DisplayNew('TAGESUEBERSICHTDETAILGESTERN','');
- $table = new EasyTable($this->app);
- $table->Query('SELECT SUM(ap.menge) menge,ap.bezeichnung FROM auftrag_position ap INNER JOIN auftrag auf ON ap.auftrag = auf.id LEFT JOIN artikel a ON a.id=ap.artikel WHERE 1 '.$this->app->erp->ProjektRechte('auf.projekt').' GROUP BY ap.artikel ORDER by 1 DESC LIMIT 14');
- //$table->Query("SELECT SUM(ap.menge) menge,ap.bezeichnung FROM auftrag_position ap LEFT JOIN artikel a ON a.id=ap.artikel WHERE a.lagerartikel=1 GROUP BY ap.artikel ORDER by 1 DESC LIMIT 14");
- $table->DisplayNew('TOPARTIKEL','Umsatz','noAction');
- */
- /* umsatz gesamt */
- if(!$useJson) {
- $table = new EasyTable($this->app);
- $arr = $this->getDetailQueries('JAHR');
- $table->Query($arr);
- $table->DisplayNew('JAHR', "Umsatz", "noAction");
- }
-
- // Umsatzanteile aktuelles Jahr (Rechnungen und Gutschriften)
- $projektesummen = $this->app->DB->SelectArr(
- "SELECT
- SUM(r.soll) - IFNULL((SELECT SUM(g.soll) FROM gutschrift AS g WHERE g.status != 'storniert' AND g.status != 'angelegt' AND EXTRACT(YEAR FROM g.datum)=EXTRACT(YEAR FROM NOW()) AND g.projekt = p.id),0) AS summe,
- IFNULL(p.abkuerzung, 'Ohne Projekt') AS projekt,
- p.farbe AS farbe
- FROM rechnung AS r LEFT JOIN projekt AS p ON p.id = r.projekt
- WHERE r.status != 'storniert' AND r.status != 'angelegt' AND EXTRACT(YEAR FROM r.datum) = EXTRACT(YEAR FROM NOW())
- ".$this->app->erp->ProjektRechte('r.projekt')."
- GROUP By r.projekt"
- );
- if ($projektesummen === null) {
- $projektesummen = [];
- }
-
- $colors = array_column($projektesummen, 'farbe');
- $labels = array_column($projektesummen, 'projekt');
- $data = array_column($projektesummen, 'summe');
- $data = array_map('floatVal', $data);
-
- $dataset = new PieDataset(date('Y'), $data);
- $dataset->setColors($colors);
-
- $projektsummenChart = new Chart('doughnut', $labels, [$dataset]);
- $projektsummenRenderer = new HtmlRenderer($projektsummenChart, '', 400, 300, ['style' => 'max-width:400px;max-height:300px;']);
- $this->app->Tpl->Set('UMSATZPIE', $projektsummenRenderer->render());
-
-
- // jahres uebersicht projekte
- if(!$useJson) {
- $table = new EasyTable($this->app);
- $arr = $this->getDetailQueries('JAHRESUEBERSICHTPROJEKTE');
- $table->Query($arr);
- $table->DisplayNew('JAHRESUEBERSICHTPROJEKTE', 'Anzahl Rechnungen', 'noAction');
- }
- /*
- // gutschriften
- $table = new EasyTable($this->app);
- $arr = $this->getDetailQueries('GUTSCHRIFTJAHR');
- $table->Query($arr);
- $table->DisplayNew('GUTSCHRIFTJAHR','Jahr','noAction');
-
-
- // angebot
- $table = new EasyTable($this->app);
- $arr = $this->getDetailQueries('ANGEBOTJAHR');
- $table->Query($arr);
- $table->DisplayNew('ANGEBOTJAHR','Jahr','noAction');*/
-
-
- $this->app->Tpl->Parse('TAB1','verkaufszahlen_details.tpl');
- $this->app->Tpl->Parse('PAGE','tabview.tpl');
- }
-
- public function VerkaufszahlenMenu()
- {
- $this->app->erp->Headlines('Verkaufszahlen');
- $this->app->erp->MenuEintrag('index.php?module=verkaufszahlen&action=list','Übersicht');
- $this->app->erp->MenuEintrag('index.php?module=verkaufszahlen&action=details','Details');
- }
-
- // Daten für 12-Monats-Diagramm, basierend auf Rechnungen und Gutschriften
- protected function GetFullYearChartDataBasedOnInvoices($projectId, $startDate)
- {
- return $this->app->DB->SelectArr(
- "SELECT r.monthyear, SUM(r.total) AS total
- FROM (
- (
- SELECT DATE_FORMAT(r2.datum, '%m/%Y') AS monthyear,
- (SUM(rp.preis * rp.menge * (100 - rp.rabatt) / 100)) AS total
- FROM rechnung_position rp INNER JOIN rechnung r2 ON rp.rechnung = r2.id
- WHERE r2.datum > '$startDate'
- AND r2.projekt = '$projectId' ". $this->app->erp->ProjektRechte('r2.projekt') . "
- GROUP BY `monthyear`
- )
- UNION ALL
- (
- SELECT DATE_FORMAT(r2.datum, '%m/%Y') AS monthyear,
- -(SUM(rp.preis * rp.menge * (100 - rp.rabatt) / 100)) AS total
- FROM gutschrift_position rp INNER JOIN gutschrift r2 ON rp.gutschrift = r2.id
- WHERE r2.datum > '$startDate' AND r2.status <> 'storniert'
- AND r2.projekt = '$projectId' " . $this->app->erp->ProjektRechte('r2.projekt') . "
- GROUP BY `monthyear`
- )
- ) AS r
- GROUP BY `monthyear`
- ORDER BY `monthyear`"
- );
- }
-
- // Daten für 12-Monats-Diagramm, basierend auf Aufträgen
- protected function GetFullYearChartDataBasedOnOrders($projectId, $startDate)
- {
- return $this->app->DB->SelectArr(
- "SELECT DATE_FORMAT(a.datum,'%m/%Y') AS monthyear,
- (SUM(ap.preis * ap.menge * (100 - ap.rabatt) / 100)) AS total
- FROM auftrag AS a
- INNER JOIN auftrag_position AS ap ON a.id = ap.auftrag AND a.status <> 'storniert' AND a.belegnr <> '' AND a.datum > '$startDate'
- WHERE a.projekt = '$projectId' " . $this->app->erp->ProjektRechte('a.projekt') . "
- GROUP BY `monthyear`
- ORDER BY `monthyear`"
- );
- }
-
-
- // Daten für Wochendiagramm, basierend auf Rechnungen und Gutschriften
- protected function GetWeekChartDataBasedOnInvoices($projectId)
- {
- return $this->app->DB->SelectArr(
- "SELECT r.datum, SUM(r.betrag) AS betrag
- FROM (
- (
- SELECT r2.datum, SUM(rp.preis * rp.menge * (100 - rp.rabatt) / 100) AS betrag
- FROM rechnung_position AS rp
- INNER JOIN rechnung AS r2 ON rp.rechnung = r2.id
- WHERE r2.datum > date_sub(CURDATE(), INTERVAL 7 DAY)
- AND r2.projekt = '$projectId' " . $this->app->erp->ProjektRechte('r2.projekt') . "
- GROUP BY r2.datum
- )
- UNION ALL
- (
- SELECT r2.datum, -(SUM(rp.preis * rp.menge * (100 - rp.rabatt) / 100)) AS betrag
- FROM gutschrift_position AS rp
- INNER JOIN gutschrift AS r2 ON rp.gutschrift = r2.id
- WHERE r2.datum > date_sub(CURDATE(), INTERVAL 7 DAY) AND r2.status <> 'storniert'
- AND r2.projekt = '$projectId' " . $this->app->erp->ProjektRechte('r2.projekt') . "
- GROUP BY r2.datum
- )
- ) AS r
- GROUP BY r.datum
- ORDER BY r.datum"
- );
- }
-
- // Daten für Wochendiagramm, basierend auf Aufträgen
- protected function GetWeekChartDataBasedOnOrders($projectId)
- {
- return $this->app->DB->SelectArr(
- "SELECT a.datum,
- SUM(ap.preis * ap.menge * (100 - ap.rabatt) / 100) AS betrag
- FROM auftrag AS a
- INNER JOIN auftrag_position AS ap ON a.id = ap.auftrag
- AND a.status <> 'storniert' AND a.belegnr <> '' AND a.datum > DATE_SUB(CURDATE(), INTERVAL 30 DAY)
- WHERE a.projekt = '$projectId' " . $this->app->erp->ProjektRechte('r2.projekt') . "
- GROUP BY a.datum
- ORDER BY a.datum"
- );
- }
-
- // 12-Monats-Diagramm erstellen
- protected function BuildFullYearChart($projects, $startDate, $dataBasedOnInvoices)
- {
- $start = new DateTimeImmutable($startDate);
- $end = new DateTimeImmutable('now');
- $interval = new DateInterval('P1M');
- $period = new PeriodMatcher($start, $end, $interval, 'm/Y');
- $labels = $period->getDates();
-
- $fullYearChart = new Chart('bar');
- $fullYearChart->addLabels($labels);
-
- foreach ($projects as $projectId => $projectAbbreviation) {
- if ($dataBasedOnInvoices) {
- $data = $this->GetFullYearChartDataBasedOnInvoices($projectId, $startDate);
- } else {
- $data = $this->GetFullYearChartDataBasedOnOrders($projectId, $startDate);
- }
- $matchedData = $period->matchData($data, 'monthyear', 'total');
- $dataset = new BarDataset($projectAbbreviation, $matchedData);
- $fullYearChart->addDataset($dataset);
- }
-
- return $fullYearChart;
- }
-
- // Wochen-Diagramm erstellen
- protected function BuildWeekChart($projects, $dataBasesOnInvoices)
- {
- $start = new DateTimeImmutable('-7 day');
- $end = new DateTimeImmutable('now + 1 day');
- $interval = new DateInterval('P1D');
- $period = new PeriodMatcher($start, $end, $interval, 'Y-m-d');
- $labels = $period->getDates('d.m.Y');
-
- $weekChart = new Chart('bar');
- $weekChart->addLabels($labels);
-
- foreach ($projects as $projectId => $projectAbbreviation) {
- if($dataBasesOnInvoices === true){
- $data = $this->GetWeekChartDataBasedOnInvoices($projectId);
- }else{
- $data = $this->GetWeekChartDataBasedOnOrders($projectId);
- }
-
- $matchedData = $period->matchData($data, 'datum', 'betrag');
- $dataset = new BarDataset($projectAbbreviation, $matchedData);
- $weekChart->addDataset($dataset);
- }
-
- return $weekChart;
- }
-}
+app=$app;
+ if($intern){
+ return;
+ }
+ $this->app->ActionHandlerInit($this);
+
+ $this->app->ActionHandler("list","VerkaufszahlenList");
+ $this->app->ActionHandler("details","VerkaufszahlenDetails");
+
+ $this->app->Tpl->Set('UEBERSCHRIFT','Verkaufszahlen');
+ $this->app->ActionHandlerListen($app);
+ }
+
+ public function Install()
+ {
+ $this->app->erp->CheckTable('verkaufszahlen_chart');
+ $this->app->erp->CheckColumn('id','int(11)','verkaufszahlen_chart','DEFAULT 0 NOT NULL AUTO_INCREMENT');
+ $this->app->erp->CheckColumn('aktiv', 'tinyint(1)', 'verkaufszahlen_chart', 'DEFAULT 1 NOT NULL');
+ $this->app->erp->CheckColumn('regs', 'tinyint(1)', 'verkaufszahlen_chart', 'DEFAULT 0 NOT NULL');
+ $this->app->erp->CheckColumn('monat', 'tinyint(1)', 'verkaufszahlen_chart', 'DEFAULT 1 NOT NULL');
+ $this->app->erp->CheckColumn('bezeichnung', 'varchar(255)', 'verkaufszahlen_chart', 'DEFAULT \'\' NOT NULL');
+ $this->app->erp->CheckColumn('bearbeiter', 'varchar(255)', 'verkaufszahlen_chart', 'DEFAULT \'\' NOT NULL');
+ $this->app->erp->CheckColumn('zeitstempel', 'timestamp', 'verkaufszahlen_chart','DEFAULT CURRENT_TIMESTAMP NOT NULL');
+ $this->app->erp->CheckColumn('sort','int(11)','verkaufszahlen_chart','DEFAULT 0 NOT NULL');
+ $this->app->erp->CheckTable('verkaufszahlen_chart_projekt');
+ $this->app->erp->CheckColumn('id','int(11)','verkaufszahlen_chart_projekt','DEFAULT 0 NOT NULL AUTO_INCREMENT');
+ $this->app->erp->CheckColumn('chart','int(11)','verkaufszahlen_chart_projekt','DEFAULT 0');
+ $this->app->erp->CheckColumn('projekt','int(11)','verkaufszahlen_chart_projekt','DEFAULT 0');
+ $this->app->erp->CheckColumn('aktiv', 'tinyint(1)', 'verkaufszahlen_chart_projekt', 'DEFAULT 1 NOT NULL');
+ $this->app->erp->CheckIndex('verkaufszahlen_chart_projekt',['chart','projekt']);
+
+ if(!$this->app->DB->Select('SELECT id FROM verkaufszahlen_chart WHERE aktiv = 1 LIMIT 1'))
+ {
+ $this->app->DB->Insert("INSERT INTO verkaufszahlen_chart (aktiv, bearbeiter) VALUES (1,'initial')");
+ }
+ }
+
+ /**
+ * @param $diagrammid
+ * @param bool $onlyids Wenn false Liste mit id, bezeichnung und Farbe, sonst einfaches Array mit Projekt ids
+ * @return array Aktive Projekte zum Diagramm
+ */
+ protected function GetDiagrammProjekte($diagrammid, $onlyids = false)
+ {
+ if($diagrammid > 0){
+ $projekte_arr = $this->app->DB->SelectArr(
+ "SELECT DISTINCT vcp.projekt, pr.abkuerzung, pr.farbe
+ FROM verkaufszahlen_chart_projekt vcp INNER JOIN projekt pr ON vcp.projekt = pr.id AND pr.geloescht = 0 AND vcp.aktiv = 1
+ WHERE vcp.chart = '" . $diagrammid . "' ORDER BY pr.abkuerzung"
+ );
+ }
+ if($diagrammid <= 0 || empty($projekte_arr)){
+ $projekte_arr = $this->app->DB->SelectArr(sprintf(
+ "SELECT p.id as projekt, p.abkuerzung, p.farbe
+ FROM projekt AS p WHERE p.verkaufszahlendiagram = '1' AND p.geloescht != '1' %s
+ ORDER BY p.abkuerzung",
+ $this->app->erp->ProjektRechte('id')
+ ));
+ }
+
+ if(!$onlyids)
+ {
+ return $projekte_arr;
+ }
+ if(empty($projekte_arr))
+ {
+ return array();
+ }
+ $ret = array();
+ foreach($projekte_arr as $v)
+ {
+ $ret[] = $v['projekt'];
+ }
+ return $ret;
+ }
+
+ protected function DrawDiagramm($target, $daten){
+ $this->app->Tpl->Set('DIAGRAMMWOCHE','');
+ $this->app->Tpl->Set('DIAGRAMMMONAT','');
+ $subwherea = null;
+
+ // Ermitteln ob es Projekte gibt für die Diagramme gezeichnet werden sollen
+
+ $projekte_arr = $this->GetDiagrammProjekte($daten['id']);
+ if(!empty($projekte_arr))
+ {
+ $ertesdatum = $this->app->DB->Select("SELECT DATE_SUB(date_format(now(),'%Y-%m-01'),INTERVAL 12 MONTH)");
+ foreach($projekte_arr as $k => $v)
+ {
+ $subwherea[] = $v['projekt'];
+ $idtoabkuerzung[$v['projekt']] = $v['abkuerzung'];
+ }
+
+ // Daten basierend auf Rechnungen oder Aufträgen?
+ $dataBasedOnInvoices = (bool)$daten['regs'];
+
+ // Wochendiagramm zusammenbauen
+ $weekChart = $this->BuildWeekChart($idtoabkuerzung, $dataBasedOnInvoices);
+ $weekRenderer = new HtmlRenderer($weekChart, '', 400, 120);
+ $this->app->Tpl->Set('DIAGRAMMWOCHE', $weekRenderer->render());
+
+ // 12-Monats-Diagramm anzeigen?
+ if($daten['monat']){
+ $yearChart = $this->BuildFullYearChart($idtoabkuerzung, $ertesdatum, $dataBasedOnInvoices);
+ $yearRenderer = new HtmlRenderer($yearChart, '', 400, 80);
+ $this->app->Tpl->Set('DIAGRAMMMONAT', $yearRenderer->render());
+ }
+
+ // Diagramm-Titel
+ if (empty($daten['bezeichnung'])){
+ $chartTitle = $daten['regs'] ? 'Gesamtübersicht Rechnungen / Gutschriften' : 'Gesamtübersicht Auftragseingang';
+ } else {
+ $chartTitle = $daten['bezeichnung'];
+ }
+ $this->app->Tpl->Set('BESCHRIFTUNG1', $chartTitle);
+ }
+
+ //heute
+
+ if($daten['regs'])
+ {
+ $this->app->Tpl->Set('BELEGTYP', 'Rechnungen / Gutschriften');
+ }else{
+ $this->app->Tpl->Set('BELEGTYP', 'Aufträge');
+ }
+
+ if($subwherea)
+ {
+ $pakete = $this->getPackages(
+ " v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d')
+ AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')
+ );
+ $this->app->Tpl->Set(
+ 'PAKETE',
+ $pakete
+ //$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d') AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')."")
+ );
+ }else{
+ $pakete = $this->getPackages(
+ " v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d')
+ ".$this->app->erp->ProjektRechte('l.projekt')
+ );
+ $this->app->Tpl->Set(
+ 'PAKETE',
+ $pakete
+ //$this->app->DB->Select("SELECT COUNT(v.id) FROM versand INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d') ".$this->app->erp->ProjektRechte('l.projekt')."")
+ );
+ }
+
+ if($daten['regs'])
+ {
+ if($subwherea)
+ {
+ $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,'.'SUM(erloes_netto)'." as erloes_netto2 FROM `rechnung` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='versendet' OR status='freigegeben' OR status ='storniert') AND projekt in (".implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
+ $data2 = $this->app->DB->SelectArr('SELECT SUM(-umsatz_netto) as umsatz_netto2,'.'SUM(-erloes_netto)'." as erloes_netto2 FROM `gutschrift` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='versendet' OR status='freigegeben') AND projekt in (".implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
+ $data[0]['umsatz_netto2'] += (float)str_replace(',','',$data2[0]['umsatz_netto2']);
+ $data[0]['erloes_netto2'] += (float)str_replace(',','',$data2[0]['erloes_netto2']);
+ }else{
+ $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,'.'SUM(erloes_netto)'." as erloes_netto2 FROM `rechnung` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='versendet' OR status='freigegeben' OR status ='storniert') ".$this->app->erp->ProjektRechte('projekt'));
+ $data2 = $this->app->DB->SelectArr('SELECT SUM(-umsatz_netto) as umsatz_netto2,'.'SUM(-erloes_netto)'." as erloes_netto2 FROM `gutschrift` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='versendet' OR status='freigegeben') ".$this->app->erp->ProjektRechte('projekt'));
+ $data[0]['umsatz_netto2'] += (float)str_replace(',','',$data2[0]['umsatz_netto2']);
+ $data[0]['erloes_netto2'] += (float)str_replace(',','',$data2[0]['erloes_netto2']);
+ }
+ }else{
+ if($subwherea)
+ {
+ $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2, '.'SUM(erloes_netto)'." as erloes_netto2 FROM `auftrag` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') AND projekt in (".implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
+ }else{
+ $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,'.'SUM(erloes_netto)'." as erloes_netto2 FROM `auftrag` WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') ".$this->app->erp->ProjektRechte('projekt'));
+ }
+ }
+
+ $einnahmen_auftrag = str_replace(',','',$data[0]['umsatz_netto2']);
+ $ausgaben_auftrag = str_replace(',','',(int) $data[0]['umsatz_netto2']) - (int) str_replace(',','',$data[0]['erloes_netto2']);
+
+ $deckungsbeitrag = (int) $einnahmen_auftrag - (int) $ausgaben_auftrag;
+
+ if ((int) $einnahmen_auftrag != 0) {
+ $deckungsbeitragprozent = $einnahmen_auftrag == 0?0:((int)$deckungsbeitrag / (int) $einnahmen_auftrag)*100;
+ } else {
+ $deckungsbeitragprozent = 0;
+ }
+
+ if($einnahmen_auftrag <=0) {
+ $einnahmen_auftrag='0.00';
+ }
+ $this->app->Tpl->Set('UMSATZ',number_format($einnahmen_auftrag,2,',','.').' €');
+ //SELECT e.preis,ap.menge,ap.bezeichnung,ap.artikel FROM auftrag auf LEFT JOIN auftrag_position ap ON ap.auftrag=auf.id RIGHT JOIN einkaufspreise e ON e.artikel=ap.artikel WHERE auf.datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND (auf.status='abgeschlossen' OR auf.status='freigegeben') AND (e.gueltig_bis > NOW() OR e.gueltig_bis!='0000-00-00') AND e.geloescht!=1 GROUP by e.artikel
+ $this->app->Tpl->Set('DECKUNGSBEITRAG',number_format($deckungsbeitrag,2,',','.') );
+ $this->app->Tpl->Set('DECKUNGSBEITRAGPROZENT',number_format($deckungsbeitragprozent,2,',','.'));
+ $this->app->Tpl->Parse('STATISTIKHEUTE','verkaufszahlen_statistik.tpl');
+
+ //gestern
+ if($subwherea)
+ {
+ $pakete = $this->getPackages(
+ " v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d')
+ AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')
+ );
+ $this->app->Tpl->Set(
+ 'PAKETE',
+ $pakete
+ //$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')."")
+ );
+ }else{
+ $pakete = $this->getPackages(
+ " v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d')
+ AND l.projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('l.projekt')
+ );
+ $this->app->Tpl->Set(
+ 'PAKETE',
+ $pakete
+ //$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') ".$this->app->erp->ProjektRechte('l.projekt')."")
+ );
+ }
+
+ if($daten['regs'])
+ {
+ if($subwherea)
+ {
+ $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2 FROM `rechnung` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),\'%Y-%m-%d\') AND ( status=\'versendet\' OR status=\'freigegeben\' OR status =\'storniert\') AND projekt in ('.implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
+ $data2 = $this->app->DB->SelectArr('SELECT SUM(-umsatz_netto) as umsatz_netto2,SUM(-erloes_netto) as erloes_netto2 FROM `gutschrift` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),\'%Y-%m-%d\') AND ( status=\'versendet\' OR status=\'freigegeben\') AND projekt in ('.implode(', ', $subwherea).') '.$this->app->erp->ProjektRechte('projekt'));
+ $data[0]['umsatz_netto2'] += $data2[0]['umsatz_netto2'];
+ $data[0]['erloes_netto2'] += $data2[0]['erloes_netto2'];
+ }else{
+ $data = $this->app->DB->SelectArr('SELECT SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2 FROM `rechnung` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),\'%Y-%m-%d\') AND ( status=\'versendet\' OR status=\'freigegeben\' OR status =\'storniert\') '.$this->app->erp->ProjektRechte('projekt'));
+ $data2 = $this->app->DB->SelectArr('SELECT SUM(-umsatz_netto) as umsatz_netto2,SUM(-erloes_netto) as erloes_netto2 FROM `gutschrift` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),\'%Y-%m-%d\') AND ( status=\'versendet\' OR status=\'freigegeben\') '.$this->app->erp->ProjektRechte('projekt'));
+ $data[0]['umsatz_netto2'] += $data2[0]['umsatz_netto2'];
+ $data[0]['erloes_netto2'] += $data2[0]['erloes_netto2'];
+ }
+ }else{
+ if($subwherea)
+ {
+ $data = $this->app->DB->SelectArr("SELECT
+ SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2 FROM `auftrag` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') AND projekt in (".implode(', ', $subwherea).") ".$this->app->erp->ProjektRechte('projekt'));
+ }else{
+ $data = $this->app->DB->SelectArr("SELECT
+ SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2 FROM `auftrag` WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') ".$this->app->erp->ProjektRechte('projekt')."");
+ }
+ }
+
+ // $umsatz = $data[0]['gesamtsumme2'];
+ $einnahmen_auftrag = $data[0]['umsatz_netto2'];
+ $ausgaben_auftrag = $data[0]['umsatz_netto2'] - $data[0]['erloes_netto2'];
+
+ $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
+ $deckungsbeitragprozent = $einnahmen_auftrag == 0?0:($deckungsbeitrag / $einnahmen_auftrag)*100;
+
+ if($einnahmen_auftrag <=0) {
+ $einnahmen_auftrag='0.00';
+ }
+ $this->app->Tpl->Set('UMSATZ',number_format($einnahmen_auftrag,2,',','.').' €');
+ //SELECT e.preis,ap.menge,ap.bezeichnung,ap.artikel FROM auftrag auf LEFT JOIN auftrag_position ap ON ap.auftrag=auf.id RIGHT JOIN einkaufspreise e ON e.artikel=ap.artikel WHERE auf.datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND (auf.status='abgeschlossen' OR auf.status='freigegeben') AND (e.gueltig_bis > NOW() OR e.gueltig_bis!='0000-00-00') AND e.geloescht!=1 GROUP by e.artikel
+ $this->app->Tpl->Set('DECKUNGSBEITRAG',number_format($deckungsbeitrag,2,',','.') );
+ $this->app->Tpl->Set('DECKUNGSBEITRAGPROZENT',number_format($deckungsbeitragprozent,2,',','.'));
+ $this->app->Tpl->Parse('STATISTIKGESTERN','verkaufszahlen_statistik.tpl');
+
+ $subwhereSql = $this->app->erp->ProjektRechte('a.projekt');
+ if(!empty($subwherea)) {
+ $subwhereSql .= sprintf(' AND a.projekt IN (%s) ', implode(', ', $subwherea));
+ }
+ list($imversand, $offen) = $this->getVersandStats($subwhereSql);
+
+ $this->app->Tpl->Set('IMVERSAND',number_format($imversand,0,',','.') );
+ $this->app->Tpl->Set('AUFTRAEGEOFFEN',number_format($offen,0,',','.'));
+ $this->app->Tpl->Parse('STATISTIKAUFTRAEGE','verkaufszahlen_statistik2.tpl');
+ $this->app->Tpl->Set('ID', $daten['id']);
+ $this->app->Tpl->Parse($target, 'verkaufszahlen_listdetail.tpl');
+ }
+
+ /**
+ * @param string $subwhere
+ * @param string $joinInvoice
+ * @param string $joinCreditnote
+ *
+ * @return float[]
+ */
+ public function getInvoiceStats($subwhere, $joinInvoice = '', $joinCreditnote = '')
+ {
+ $data = $this->app->DB->SelectRow(
+ 'SELECT SUM(r.umsatz_netto) as umsatz_netto2,SUM(r.erloes_netto) as erloes_netto2
+ FROM `rechnung` AS `r`
+ $joinInvoice
+ WHERE ( r.status=\'versendet\' OR r.status=\'freigegeben\' OR r.status =\'storniert\')
+ '.$subwhere
+ );
+ $data2 = $this->app->DB->SelectRow(
+ 'SELECT SUM(-r.umsatz_netto) as umsatz_netto2,SUM(-r.erloes_netto) as erloes_netto2
+ FROM `gutschrift` AS `r`
+ $joinCreditnote
+ WHERE
+ AND ( r.status=\'versendet\' OR r.status=\'freigegeben\') '
+ .$subwhere
+ );
+ $data['umsatz_netto2'] += $data2['umsatz_netto2'];
+ $data['erloes_netto2'] += $data2['erloes_netto2'];
+
+ $einnahmen_auftrag = $data['umsatz_netto2'];
+ $ausgaben_auftrag = $data['umsatz_netto2'] - $data['erloes_netto2'];
+
+ $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
+ $deckungsbeitragprozent = $einnahmen_auftrag == 0?0:($deckungsbeitrag / $einnahmen_auftrag)*100;
+
+ if($einnahmen_auftrag <=0) {
+ $einnahmen_auftrag=0;
+ }
+
+ return [(float)$einnahmen_auftrag, (float)$deckungsbeitrag, (float)$deckungsbeitragprozent];
+ }
+
+ /**
+ * @param string $subwhere
+ * @param string $join
+ *
+ * @return int
+ */
+ public function getPackages($subwhere, $join = '')
+ {
+ return (int)$this->app->DB->Select(
+ "SELECT COUNT(v.id)
+ FROM versand v
+ INNER JOIN lieferschein l ON v.lieferschein = l.id
+ $join
+ WHERE ".$subwhere
+ );
+ }
+
+ /**
+ * @param string $subwhere
+ *
+ * @return float[]
+ */
+ public function getOrderStats($subwhere)
+ {
+ $data = $this->app->DB->SelectRow(
+ "SELECT
+ SUM(umsatz_netto) as umsatz_netto2,SUM(erloes_netto) as erloes_netto2
+ FROM `auftrag`
+ WHERE ( status='abgeschlossen' OR status='freigegeben')
+ ".$subwhere
+ );
+ $einnahmen_auftrag = $data['umsatz_netto2'];
+ $ausgaben_auftrag = $data['umsatz_netto2'] - $data['erloes_netto2'];
+
+ $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
+ $deckungsbeitragprozent = $einnahmen_auftrag == 0?0:($deckungsbeitrag / $einnahmen_auftrag)*100;
+
+ if($einnahmen_auftrag <=0) {
+ $einnahmen_auftrag=0;
+ }
+
+ return [(float)$einnahmen_auftrag, (float)$deckungsbeitrag, (float)$deckungsbeitragprozent];
+ }
+
+ /**
+ * @param string $subwhere
+ *
+ * @return int[]
+ */
+ public function getVersandStats($subwhere) {
+
+ $imversand = $this->app->DB->Select(
+ "SELECT count(a.id)
+ FROM auftrag a
+ INNER JOIN lieferschein l ON a.id = l.auftragid
+ LEFT JOIN versand v ON l.id = v.lieferschein
+ WHERE v.abgeschlossen!='1' AND (tracking <> '' OR weitererlieferschein <> 1)
+ AND v.cronjob = 0 ".$subwhere
+ );
+ $offen = $this->app->DB->Select(
+ "SELECT count(a.id)
+ FROM auftrag a
+ WHERE a.status='freigegeben' ".$subwhere
+ );
+ return [
+ (int)$imversand, (int)$offen
+ ];
+ }
+
+ public function VerkaufszahlenList()
+ {
+ $cmd = $this->app->Secure->GetGET('cmd');
+ if($cmd === 'geteasytablelist') {
+ $element = $this->app->Secure->GetPOST('element');
+ $html = $this->getEasyTable($element);
+ echo json_encode(['element'=>$element,'html'=>$html]);
+ $this->app->ExitXentral();
+ }
+ if($cmd === 'getchart')
+ {
+ $el = (int)$this->app->Secure->GetPOST('el');
+ $arr = $this->app->DB->SelectRow("SELECT * FROM verkaufszahlen_chart WHERE id = '$el' LIMIT 1");
+ $projekte = null;
+ $ret = array('bezeichnung'=>'','regs'=>0,'monat'=>1);
+ if($arr) {
+ $ret = array('bezeichnung'=>$arr['bezeichnung'],'regs'=>$arr['regs'],'monat'=>$arr['monat']);
+ if($this->app->DB->Select("SELECT p.id FROM projekt p INNER JOIN verkaufszahlen_chart_projekt vcp ON p.id = vcp.projekt AND vcp.chart = '$el' WHERE p.geloescht <> 1 LIMIT 1")){
+ $projekte = $this->app->DB->SelectArr("SELECT p.id, vcp.aktiv FROM projekt p LEFT JOIN verkaufszahlen_chart_projekt vcp ON p.id = vcp.projekt AND vcp.chart = '$el' WHERE p.geloescht <> 1 ");
+ }
+ }
+ if(!$projekte)
+ {
+ $projekte = $this->app->DB->SelectArr('SELECT p.id, p.verkaufszahlendiagram as aktiv FROM projekt p WHERE p.geloescht <> 1 ');
+ }
+ if($projekte)
+ {
+ foreach($projekte as $k => $v){
+ $ret['projekte'][(int)$v['id']] = (int)$v['aktiv'];
+ }
+ }
+ $ret['id'] = $el;
+ echo json_encode($ret);
+ $this->app->ExitXentral();
+ }
+
+ if($cmd === 'savechart')
+ {
+ $ret = array('status'=>1);
+ $el = (int)$this->app->Secure->GetPOST('sid');
+ if(!$el)
+ {
+ $this->app->DB->Insert('INSERT INTO verkaufszahlen_chart (aktiv) VALUES (1)');
+ $el = $this->app->DB->GetInsertID();
+ }
+ $this->app->DB->Update("UPDATE verkaufszahlen_chart SET bezeichnung = '".$this->app->Secure->GetPOST('bezeichnung')."', bearbeiter = '".$this->app->DB->real_escape_string($this->app->User->GetName())."', monat = '".(int)$this->app->Secure->GetPOST('monat')."', regs = '".(int)$this->app->Secure->GetPOST('regs')."' WHERE id = '$el' LIMIT 1");
+ $projekte = $this->app->DB->Select('SELECT p.id FROM projekt p WHERE p.geloescht <> 1 ');
+ foreach($projekte as $pr)
+ {
+ $check = $this->app->DB->Select("SELECT id FROM verkaufszahlen_chart_projekt WHERE chart = '$el' AND projekt = '".$pr['id']."' LIMIT 1");
+ $projekt = $this->app->Secure->GetPOST('projekt');
+ if($check)
+ {
+ if($projekt && is_array($projekt) && in_array($pr['id'],$projekt))
+ {
+ $this->app->DB->Update("UPDATE verkaufszahlen_chart_projekt SET aktiv = 1 WHERE id = '$check' LIMIT 1");
+ }else{
+ $this->app->DB->Update("UPDATE verkaufszahlen_chart_projekt SET aktiv = 0 WHERE id = '$check' LIMIT 1");
+ }
+ }elseif($projekt && is_array($projekt) && in_array($pr['id'],$projekt)){
+ $this->app->DB->Insert("INSERT INTO verkaufszahlen_chart_projekt (chart, projekt, aktiv) VALUES ('$el','".$pr['id']."','1')");
+ }
+ }
+ echo json_encode($ret);
+ $this->app->ExitXentral();
+ }
+
+ if($cmd === 'deletechart')
+ {
+ $ret = array('status'=>1);
+ $el = (int)$this->app->Secure->GetPOST('sid');
+ if($el)
+ {
+ $this->app->DB->Delete("DELETE FROM verkaufszahlen_chart_projekt WHERE chart = '$el'");
+ $this->app->DB->Delete("DELETE FROM verkaufszahlen_chart WHERE id = '$el'");
+ }
+ echo json_encode($ret);
+ $this->app->ExitXentral();
+ }
+
+ if(!$this->app->DB->Select('SELECT id FROM verkaufszahlen_chart WHERE aktiv = 1 LIMIT 1'))
+ {
+ $this->Install();
+ }
+ $useJson = $this->useJson;
+ $this->VerkaufszahlenMenu();
+
+
+ $diagramme = $this->app->DB->SelectArr('SELECT * FROM verkaufszahlen_chart WHERE aktiv = 1 ORDER BY sort');
+
+ if(!empty($diagramme))
+ {
+ $projektefirst = $this->GetDiagrammProjekte($diagramme[0]['id'],true);
+ if(count($diagramme) <= 1)
+ {
+ $this->app->Tpl->Set('VORDEAKTIVIEREN','/*');
+ $this->app->Tpl->Set('NACHDEAKTIVIEREN','*/');
+ }
+ foreach($diagramme as $diagramm)
+ {
+ $this->DrawDiagramm('DIAGRAMME', $diagramm);
+ }
+ }else{
+ $projektefirst = array();
+ }
+
+
+ //$this->app->Tpl->Set('TABTEXT',"Verkaufszahlen");
+
+ $projekte_arr = $this->app->DB->SelectArr("SELECT id as projekt FROM projekt WHERE verkaufszahlendiagram='1' AND geloescht!='1' ".$this->app->erp->ProjektRechte('id').' order by abkuerzung');
+ if(!empty($projekte_arr)){
+ $cprojekte_arr = count($projekte_arr);
+ for ($i = 0; $i < $cprojekte_arr; $i++) {
+ $projekte[] = $projekte_arr[$i]['projekt'];
+
+ $abkuerzung = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='" . $projekte_arr[$i]['projekt'] . "' LIMIT 1");
+ $farbe = $this->app->DB->Select("SELECT farbe FROM projekt WHERE id='" . $projekte_arr[$i]['projekt'] . "' LIMIT 1");
+
+ if($farbe == '') {
+ $farbe = '#eee';
+ }
+
+ if($i < count($projekte_arr) - 1){
+ $this->app->Tpl->Add('PLOTLEGENDS', '{ label: "' . $abkuerzung . '", data: d' . ($i + 1) . ', color: "' . $farbe . '"},');
+ }
+ else{
+ $this->app->Tpl->Add('PLOTLEGENDS', '{ label: "' . $abkuerzung . '", data: d' . ($i + 1) . ', color: "' . $farbe . '"}');
+ }
+ }
+ }
+
+ $betraege = $this->app->DB->SelectArr("SELECT date_format(a.datum,'%Y-%m-%d') as datum,p.id, CEILING(SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))) as betrag
+ FROM auftrag_position ap LEFT JOIN auftrag a ON ap.auftrag=a.id
+ LEFT JOIN projekt p ON p.id=a.projekt WHERE a.status!='storniert' AND a.belegnr!='0' AND a.datum > date_sub(now(),INTERVAL 13 DAY) group by p.id,a.datum order by a.datum ,p.id");
+
+
+
+ $spalte = 0;
+ $daten = '';
+ $projekte_daten = array();
+ for ($zaehler = -12; $zaehler <= 0; $zaehler++) {
+ $daten .= "[$spalte,'".date('D', strtotime('+' . $zaehler . ' day')).' '.date('d.m', strtotime("+" . $zaehler . " day"))."']";
+
+ $tagdatum = date('Y-m-d', strtotime('+' . $zaehler . ' day'));
+
+
+ foreach($projekte as $value)
+ {
+ $betrag = '';
+ if(!empty($betraege)){
+ foreach($betraege as $betr)
+ {
+ if($betr['id'] == $value && $betr['datum'] == $tagdatum){
+ $betrag = $betr['betrag'];
+ }
+ }
+ }
+
+ if($betrag!=''){
+ $betrag = "'".$betrag."'";
+ }
+ else {
+ $betrag='0.0';
+ }
+
+ $projekte_daten[$value] .= "[$spalte,$betrag]";
+ }
+ if($zaehler<0)
+ {
+ $daten .= ',';
+ foreach($projekte as $value) {
+ $projekte_daten[$value] .= ',';
+ }
+ }
+ $spalte++;
+ }
+
+
+
+ $this->app->Tpl->Set('DATUM',"[$daten]");
+
+ $nummer = 1;
+ $var = '';
+ if(!empty($projekte)){
+ foreach ($projekte as $value) {
+ $var .= 'var d'.$nummer.' = [' . $projekte_daten[$value] . '];';
+ $nummer++;
+ }
+ }
+ $this->app->Tpl->Set('VARIABLEN',$var);
+
+ //Auftragseingang leztzten 2 Wochen
+ if(!$useJson){
+ $table = new EasyTable($this->app);
+ $arr = $this->getDetailQueries('TAGESUEBERSICHT');
+ $table->Query($arr);
+ if(!empty($table->datasets)){
+ $pakete = $this->getDetailQueries('TAGESUEBERSICHTPAKETE');
+ if($pakete){
+ foreach ($pakete as $paket) {
+ if($paket['pakete']){
+ foreach ($table->datasets as $k => $d) {
+ if($d['datum'] == $paket['datum']){
+ $table->datasets[$k]['pakete'] = $paket['pakete'];
+ }
+ }
+ }
+ }
+ }
+ }
+ $table->DisplayNew('TAGESUEBERSICHT', 'Pakete', 'noAction');
+ }
+ /* extend */
+
+ $summe = $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM auftrag_position ap INNER JOIN auftrag a ON ap.auftrag=a.id WHERE (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."");
+ $summe_gs = $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM gutschrift_position ap INNER JOIN gutschrift a ON ap.gutschrift=a.id WHERE (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."");
+
+ $summe30 = $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM auftrag_position ap INNER JOIN auftrag a ON ap.auftrag=a.id
+ WHERE a.datum > date_add(NOW(), interval -30 day) AND (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."");
+ $summe30_gs = $this->app->DB->Select("SELECT SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1))) FROM gutschrift_position ap INNER JOIN gutschrift a ON ap.gutschrift=a.id
+ WHERE a.datum > date_add(NOW(), interval -30 day) AND (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."");
+
+ $summemenge = count($this->app->DB->SelectArr("SELECT
+ COUNT(a.datum) FROM auftrag_position ap INNER JOIN auftrag a ON ap.auftrag=a.id WHERE (a.status!='storniert' and a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."
+ GROUP by a.datum, a.projekt "));
+
+ if($summemenge < 30)
+ {
+ $summe_gutschriften = $summe_gs;
+ $summe_auftrag = $summe;
+ $durchschnitt = ($summe-$summe_gs) / $summemenge;
+ $summe= number_format(($summe-$summe_gs),2);
+ $tage = $summemenge;
+ } else {
+ $summe_gutschriften = $summe30_gs;
+ $summe_auftrag = $summe30;
+ $durchschnitt = ($summe30-$summe30_gs) / 30; // wenn mehr als 30 tage
+ $summe= number_format(($summe30-$summe30_gs),2);
+ $tage = 30;
+ }
+
+ $summe_gutschriften = number_format($summe_gutschriften,2);
+ $summe_auftrag = number_format($summe_auftrag,2);
+
+ $durchschnitt = number_format($durchschnitt,2);
+ $this->app->Tpl->Set('EXTEND',"Summe: $summe_auftrag € (abzgl. Gutschriften $summe_gutschriften € = pro Tag $durchschnitt seit $tage Tagen)");
+
+
+ /* tages uebersicht detail */
+
+ $table = new EasyTable($this->app);
+
+ $tmp =
+
+"SELECT
+ DATE_FORMAT(a.datum,'%d.%m.%Y') as datum,p.abkuerzung as projekt, ".$this->app->erp->FormatPreis("SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))")." as Auftragseingang, COUNT(ap.id) as positionen,
+ CONCAT('Details') as id FROM auftrag_position ap INNER JOIN auftrag a ON ap.auftrag=a.id
+ LEFT JOIN projekt p ON p.id=a.projekt WHERE a.status!='storniert' ".$this->app->erp->ProjektRechte('a.projekt')." GROUP by a.datum DESC, a.projekt LIMIT 14";
+
+ $table->Query($tmp);
+
+ $table->DisplayNew('TAGESUEBERSICHTDETAIL','');
+
+ // top artikel
+ if(!$useJson) {
+ $table = new EasyTable($this->app);
+ $arr = $this->getDetailQueries('TOPARTIKEL');
+ $table->Query($arr);
+ $table->DisplayNew('TOPARTIKEL', "Bezeichnung", "noAction");
+ }
+
+ //heute
+
+ $this->app->Tpl->Set('PAKETE',$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(NOW(),'%Y-%m-%d') ".$this->app->erp->ProjektRechte('l.projekt').""));
+ $data = $this->app->DB->SelectArr("SELECT ifnull(SUM(umsatz_netto),0) as umsatz_netto2,ifnull(SUM(erloes_netto),0) as erloes_netto2 FROM `auftrag`
+ WHERE datum=DATE_FORMAT(NOW(),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') ".
+ $this->app->erp->ProjektRechte('projekt').
+ (!empty($projektefirst)? ' AND projekt in ('.implode(', ', $projektefirst).')' :''));
+ $einnahmen_auftrag = 0;
+ $ausgaben_auftrag = 0;
+ $deckungsbeitrag = 0;
+ $deckungsbeitragprozent = 0;
+ if(!empty($data)) {
+ $einnahmen_auftrag = $data[0]['umsatz_netto2'];
+ $ausgaben_auftrag = $data[0]['umsatz_netto2'] - $data[0]['erloes_netto2'];
+
+ $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
+ $deckungsbeitragprozent = $einnahmen_auftrag != 0? ($deckungsbeitrag / $einnahmen_auftrag) * 100:0;
+ }
+ if($einnahmen_auftrag <=0) {
+ $einnahmen_auftrag='0.00';
+ }
+ $this->app->Tpl->Set('UMSATZ',number_format($einnahmen_auftrag,2,',','.').' €');
+ $this->app->Tpl->Set('DECKUNGSBEITRAG',number_format($deckungsbeitrag,2,',','.') );
+ $this->app->Tpl->Set('DECKUNGSBEITRAGPROZENT',number_format($deckungsbeitragprozent,2,',','.'));
+ $this->app->Tpl->Parse('STATISTIKHEUTE','verkaufszahlen_statistik.tpl');
+
+ //gestern
+
+ $this->app->Tpl->Set('PAKETE',$this->app->DB->Select("SELECT COUNT(v.id) FROM versand v INNER JOIN lieferschein l ON v.lieferschein = l.id WHERE v.versendet_am=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') ".$this->app->erp->ProjektRechte('l.projekt').""));
+
+ $data = $this->app->DB->SelectArr("SELECT
+ ifnull(SUM(umsatz_netto),0) as umsatz_netto2,ifnull(SUM(erloes_netto),0) as erloes_netto2 FROM `auftrag`
+ WHERE datum=DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 day),'%Y-%m-%d') AND ( status='abgeschlossen' OR status='freigegeben') ".
+ $this->app->erp->ProjektRechte('projekt').
+ (!empty($projektefirst)? ' AND projekt in ('.implode(', ', $projektefirst).')' :''));
+
+ $einnahmen_auftrag = 0;
+ $ausgaben_auftrag = 0;
+ $deckungsbeitrag = 0;
+ $deckungsbeitragprozent = 0;
+ if(!empty($data)){
+ $einnahmen_auftrag = $data[0]['umsatz_netto2'];
+ $ausgaben_auftrag = $data[0]['umsatz_netto2'] - $data[0]['erloes_netto2'];
+
+ $deckungsbeitrag = $einnahmen_auftrag - $ausgaben_auftrag;
+ $deckungsbeitragprozent = $einnahmen_auftrag!=0? ($deckungsbeitrag / $einnahmen_auftrag) * 100:0;
+ }
+ if($einnahmen_auftrag <=0) {
+ $einnahmen_auftrag='0.00';
+ }
+ $this->app->Tpl->Set('UMSATZ',number_format($einnahmen_auftrag,2,',','.').' €');
+ $this->app->Tpl->Set('DECKUNGSBEITRAG',number_format($deckungsbeitrag,2,',','.') );
+ $this->app->Tpl->Set('DECKUNGSBEITRAGPROZENT',number_format($deckungsbeitragprozent,2,',','.'));
+ $this->app->Tpl->Parse('STATISTIKGESTERN','verkaufszahlen_statistik.tpl');
+
+ $projekte = $this->app->DB->SelectArr("SELECT id, abkuerzung FROM projekt WHERE geloescht = 0 ".$this->app->erp->ProjektRechte('id')." ORDER BY abkuerzung");
+ if(!empty($projekte)) {
+ foreach($projekte as $projekt) {
+ $this->app->Tpl->Add(
+ 'POPUPPROJEKTE',
+ '
+
+ '.
+ $projekt['abkuerzung'].'
+
+
'
+ );
+ }
+ }
+ $this->app->Tpl->Parse('TAB1','verkaufszahlen_list.tpl');
+ $this->app->Tpl->Parse('PAGE','tabview.tpl');
+ }
+
+ /**
+ * @param string $type
+ * @param int $seconds
+ *
+ * @return array|null
+ */
+ public function getDetailQueries($type, $seconds = 3600)
+ {
+ switch(strtoupper($type)) {
+ case 'TAGESUEBERSICHTPAKETE':
+ return $this->app->DB->SelectArrCache("SELECT DATE_FORMAT(v.versendet_am,'%d.%m.%Y') as datum,
+ count(v.id) as pakete
+ from versand v
+ INNER JOIN lieferschein l ON v.lieferschein = l.id
+ WHERE 1 ".$this->app->erp->ProjektRechte('l.projekt').' group by v.versendet_am',
+ $seconds, 'verkaufszahlen'
+ );
+ break;
+ case 'TAGESUEBERSICHT':
+ return $this->app->DB->SelectArrCache("SELECT
+ DATE_FORMAT(a.datum,'%d.%m.%Y') as datum,
+ ".$this->app->erp->FormatPreis('SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))',2)." as Auftragseingang ,
+ '' as pakete
+ FROM auftrag_position ap
+ INNER JOIN auftrag a ON ap.auftrag=a.id
+ WHERE (a.status='freigegeben' OR a.status='abgeschlossen') AND (a.belegnr!='0' OR a.belegnr!='') ".$this->app->erp->ProjektRechte('a.projekt')." GROUP by a.datum DESC LIMIT 30",
+ $seconds, 'verkaufszahlen'
+ );
+ break;
+ case 'TAGESUEBERSICHTDETAIL':
+ return $this->app->DB->SelectArrCache(
+ "SELECT
+ DATE_FORMAT(a.datum,'%d.%m.%Y') as datum,p.abkuerzung as projekt, ".$this->app->erp->FormatPreis("SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))", 2)." as 'Auftragseingang Summe', COUNT(ap.id) as positionen,
+ CONCAT('Details') as id FROM auftrag_position ap LEFT JOIN auftrag a ON ap.auftrag=a.id
+ LEFT JOIN projekt p ON p.id=a.projekt WHERE a.status!='storniert' ".$this->app->erp->ProjektRechte('a.projekt')." GROUP by a.datum DESC, a.projekt LIMIT 14",
+ $seconds, 'verkaufszahlen'
+ );
+ break;
+ case 'TAGESUEBERSICHTDETAILGESTERN':
+ return $this->app->DB->SelectArrCache(
+ "SELECT
+ DATE_FORMAT(a.datum,'%d.%m.%Y') as datum,p.abkuerzung as projekt, ".$this->app->erp->FormatPreis("SUM(ap.preis*ap.menge*(IF(ap.rabatt > 0, (100-ap.rabatt)/100, 1)))")." as 'Auftragseingang Summe', COUNT(ap.id) as positionen,
+ CONCAT('Details') as id FROM auftrag_position ap LEFT JOIN auftrag a ON ap.auftrag=a.id
+
+ LEFT JOIN projekt p ON p.id=a.projekt WHERE a.status!='storniert' ".$this->app->erp->ProjektRechte('a.projekt')." GROUP by a.datum DESC, a.projekt LIMIT 14",
+ $seconds, 'verkaufszahlen'
+ );
+ break;
+ case 'JAHR':
+ return $this->app->DB->SelectArrCache(
+ "
+ SELECT EXTRACT(MONTH FROM a.datum) as monat, EXTRACT(YEAR FROM a.datum) as jahr,
+ " . $this->app->erp->FormatPreis("(SELECT SUM(auf.gesamtsumme) FROM auftrag auf
+ WHERE EXTRACT(MONTH FROM auf.datum)=monat AND EXTRACT(YEAR FROM auf.datum)=jahr AND auf.status!='storniert' AND auf.status!='angelegt' " . $this->app->erp->ProjektRechte('auf.projekt') . " )") . " as auftraege,
+
+ " . $this->app->erp->FormatPreis("SUM(a.soll)") . " as rechnungen,
+ " . $this->app->erp->FormatPreis("(SELECT SUM(g.soll) FROM gutschrift g
+ WHERE EXTRACT(MONTH FROM g.datum)=monat AND EXTRACT(YEAR FROM g.datum)=jahr AND g.status!='storniert' AND g.status!='angelegt' " . $this->app->erp->ProjektRechte('g.projekt') . " )") . " as gutschriften,
+
+ " . $this->app->erp->FormatPreis("(SUM(a.soll) - IFNULL((SELECT SUM(g.soll) FROM gutschrift g
+ WHERE EXTRACT(MONTH FROM g.datum)=monat AND EXTRACT(YEAR FROM g.datum)=jahr AND g.status!='storniert' AND g.status!='angelegt'),0) " . $this->app->erp->ProjektRechte('g.projekt') . " )") . " as umsatz
+
+ FROM rechnung a WHERE a.status!='angelegt' " . $this->app->erp->ProjektRechte('a.projekt') . "
+ GROUP By monat,jahr ORDER by jahr DESC, monat DESC LIMIT 12",
+ $seconds, 'verkaufszahlen'
+ );
+ break;
+ case 'JAHRESUEBERSICHTPROJEKTE':
+ return $this->app->DB->SelectArrCache(
+ '
+ SELECT '.$this->app->erp->FormatPreis('SUM(a.soll)').' as rechnungen,
+ '.$this->app->erp->FormatPreis("IFNULL((SELECT SUM(g.soll) FROM gutschrift g WHERE g.status!='storniert' AND g.status!='angelegt' AND EXTRACT(YEAR FROM g.datum)=EXTRACT(YEAR FROM NOW()) AND g.projekt=p.id ".$this->app->erp->ProjektRechte('g.projekt')."),0)")." as gutschriften,
+ ".$this->app->erp->FormatPreis("SUM(a.soll)-IFNULL((SELECT SUM(g.soll) FROM gutschrift g WHERE g.status!='storniert' AND g.status!='angelegt' AND EXTRACT(YEAR FROM g.datum)=EXTRACT(YEAR FROM NOW()) AND g.projekt=p.id ".$this->app->erp->ProjektRechte('g.projekt')." ),0)")." as umsatz,
+ p.abkuerzung as projekt,COUNT(a.id) as anzahl_rechnungen FROM rechnung a LEFT JOIN projekt p ON p.id=a.projekt
+ WHERE a.status!='angelegt' AND a.status!='storniert' AND EXTRACT(YEAR FROM a.datum)=EXTRACT(YEAR FROM NOW()) ".$this->app->erp->ProjektRechte('a.projekt')."
+ GROUP By projekt ORDER by umsatz",
+ $seconds, 'verkaufszahlen'
+ );
+ break;
+ case 'GUTSCHRIFTJAHR':
+ return $this->app->DB->SelectArrCache(
+ "
+ SELECT EXTRACT(MONTH FROM a.datum) as month, EXTRACT(YEAR FROM a.datum) as year, FORMAT(SUM(a.soll),2)
+ FROM gutschrift a
+ WHERE (a.status!='storniert' AND a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."
+ GROUP By month,year ORDER by year DESC, month DESC",
+ $seconds, 'verkaufszahlen'
+ );
+ break;
+ case 'ANGEBOTJAHR':
+ return $this->app->DB->SelectArrCache(
+ "
+ SELECT EXTRACT(MONTH FROM a.datum) as month, EXTRACT(YEAR FROM a.datum) as year, FORMAT(SUM(ap.preis*ap.menge),2)
+ FROM angebot a LEFT JOIN angebot_position ap ON a.id=ap.angebot
+ WHERE (a.status!='storniert' AND a.status!='angelegt') ".$this->app->erp->ProjektRechte('a.projekt')."
+ GROUP By month,year ORDER by year DESC, month DESC",
+ $seconds, 'verkaufszahlen'
+ );
+ break;
+ case 'TOPARTIKEL':
+ return $this->app->DB->SelectArrCache(
+ "SELECT trim(SUM(ap.menge))+0 as menge,ap.nummer, ap.bezeichnung FROM auftrag_position ap LEFT JOIN artikel a ON a.id=ap.artikel INNER JOIN
+ auftrag auf ON ap.auftrag=auf.id WHERE auf.datum >= DATE_SUB(NOW(),INTERVAL 90 day) AND a.lagerartikel=1 ".$this->app->erp->ProjektRechte('auf.projekt')." GROUP BY ap.artikel ORDER by 1 DESC LIMIT 30",
+ $seconds, 'verkaufszahlen'
+ );
+ break;
+ }
+
+ return null;
+ }
+
+ /**
+ * @param string $element
+ *
+ * @return string
+ */
+ public function getEasyTable($element)
+ {
+ if(empty($element)) {
+ return '';
+ }
+ switch(strtoupper($element)) {
+ case 'TAGESUEBERSICHT':
+ $table = new EasyTable($this->app);
+ $arr = $this->getDetailQueries('TAGESUEBERSICHT');
+ $table->Query($arr);
+ if(!empty($table->datasets)){
+ $pakete = $this->getDetailQueries('TAGESUEBERSICHTPAKETE');
+ if($pakete){
+ foreach ($pakete as $paket) {
+ if($paket['pakete']){
+ foreach ($table->datasets as $k => $d) {
+ if($d['datum'] == $paket['datum']){
+ $table->datasets[$k]['pakete'] = $paket['pakete'];
+ }
+ }
+ }
+ }
+ }
+ }
+ return $table->DisplayNew('return', 'Pakete', 'noAction');
+ break;
+ case 'TAGESUEBERSICHTDETAILGESTERN':
+ case 'TAGESUEBERSICHTDETAIL':
+ $lastCol = 'Umsatz';
+ break;
+ case 'JAHRESUEBERSICHTPROJEKTE':
+ $lastCol = 'Anzahl Rechnungen';
+ break;
+ case 'TOPARTIKEL':
+ $lastCol = 'Bezeichnung';
+ break;
+ case 'ANGEBOTJAHR':
+ case 'GUTSCHRIFTJAHR':
+ case 'JAHR':
+ $lastCol = 'Jahr';
+ break;
+ default:
+ $lastCol = 'Umsatz';
+ break;
+ }
+ if(empty($lastCol)) {
+ return '';
+ }
+ $table = new EasyTable($this->app);
+ $table->Query($this->getDetailQueries($element));
+ return $table->DisplayNew('return', strtoupper($element),$lastCol,'noAction');
+ }
+
+ public function VerkaufszahlenDetails()
+ {
+ $cmd = $this->app->Secure->GetGET('cmd');
+ if($cmd === 'getdetails') {
+ $element = $this->app->Secure->GetPOST('element');
+ $html = $this->getEasyTable($element);
+ echo json_encode(['element'=>$element,'html'=>$html]);
+ $this->app->ExitXentral();
+ }
+ $this->VerkaufszahlenMenu();
+ $useJson = $this->useJson;
+
+ if(!$useJson){
+ /* tages uebersicht detail */
+ $table = new EasyTable($this->app);
+ $arr = $this->getDetailQueries('TAGESUEBERSICHTDETAIL');
+ $table->Query($arr);
+ $table->DisplayNew('TAGESUEBERSICHTDETAIL', '');
+ }
+
+ /* tages uebersicht detail */
+ /*
+ $table = new EasyTable($this->app);
+ $arr = $this->getDetailQueries('TAGESUEBERSICHTDETAILGESTERN');
+ $table->Query($arr);
+ $table->DisplayNew('TAGESUEBERSICHTDETAILGESTERN','');
+ $table = new EasyTable($this->app);
+ $table->Query('SELECT SUM(ap.menge) menge,ap.bezeichnung FROM auftrag_position ap INNER JOIN auftrag auf ON ap.auftrag = auf.id LEFT JOIN artikel a ON a.id=ap.artikel WHERE 1 '.$this->app->erp->ProjektRechte('auf.projekt').' GROUP BY ap.artikel ORDER by 1 DESC LIMIT 14');
+ //$table->Query("SELECT SUM(ap.menge) menge,ap.bezeichnung FROM auftrag_position ap LEFT JOIN artikel a ON a.id=ap.artikel WHERE a.lagerartikel=1 GROUP BY ap.artikel ORDER by 1 DESC LIMIT 14");
+ $table->DisplayNew('TOPARTIKEL','Umsatz','noAction');
+ */
+ /* umsatz gesamt */
+ if(!$useJson) {
+ $table = new EasyTable($this->app);
+ $arr = $this->getDetailQueries('JAHR');
+ $table->Query($arr);
+ $table->DisplayNew('JAHR', "Umsatz", "noAction");
+ }
+
+ // Umsatzanteile aktuelles Jahr (Rechnungen und Gutschriften)
+ $projektesummen = $this->app->DB->SelectArr(
+ "SELECT
+ SUM(r.soll) - IFNULL((SELECT SUM(g.soll) FROM gutschrift AS g WHERE g.status != 'storniert' AND g.status != 'angelegt' AND EXTRACT(YEAR FROM g.datum)=EXTRACT(YEAR FROM NOW()) AND g.projekt = p.id),0) AS summe,
+ IFNULL(p.abkuerzung, 'Ohne Projekt') AS projekt,
+ p.farbe AS farbe
+ FROM rechnung AS r LEFT JOIN projekt AS p ON p.id = r.projekt
+ WHERE r.status != 'storniert' AND r.status != 'angelegt' AND EXTRACT(YEAR FROM r.datum) = EXTRACT(YEAR FROM NOW())
+ ".$this->app->erp->ProjektRechte('r.projekt')."
+ GROUP By r.projekt"
+ );
+ if ($projektesummen === null) {
+ $projektesummen = [];
+ }
+
+ $colors = array_column($projektesummen, 'farbe');
+ $labels = array_column($projektesummen, 'projekt');
+ $data = array_column($projektesummen, 'summe');
+ $data = array_map('floatVal', $data);
+
+ $dataset = new PieDataset(date('Y'), $data);
+ $dataset->setColors($colors);
+
+ $projektsummenChart = new Chart('doughnut', $labels, [$dataset]);
+ $projektsummenRenderer = new HtmlRenderer($projektsummenChart, '', 400, 300, ['style' => 'max-width:400px;max-height:300px;']);
+ $this->app->Tpl->Set('UMSATZPIE', $projektsummenRenderer->render());
+
+
+ // jahres uebersicht projekte
+ if(!$useJson) {
+ $table = new EasyTable($this->app);
+ $arr = $this->getDetailQueries('JAHRESUEBERSICHTPROJEKTE');
+ $table->Query($arr);
+ $table->DisplayNew('JAHRESUEBERSICHTPROJEKTE', 'Anzahl Rechnungen', 'noAction');
+ }
+ /*
+ // gutschriften
+ $table = new EasyTable($this->app);
+ $arr = $this->getDetailQueries('GUTSCHRIFTJAHR');
+ $table->Query($arr);
+ $table->DisplayNew('GUTSCHRIFTJAHR','Jahr','noAction');
+
+
+ // angebot
+ $table = new EasyTable($this->app);
+ $arr = $this->getDetailQueries('ANGEBOTJAHR');
+ $table->Query($arr);
+ $table->DisplayNew('ANGEBOTJAHR','Jahr','noAction');*/
+
+
+ $this->app->Tpl->Parse('TAB1','verkaufszahlen_details.tpl');
+ $this->app->Tpl->Parse('PAGE','tabview.tpl');
+ }
+
+ public function VerkaufszahlenMenu()
+ {
+ $this->app->erp->Headlines('Verkaufszahlen');
+ $this->app->erp->MenuEintrag('index.php?module=verkaufszahlen&action=list','Übersicht');
+ $this->app->erp->MenuEintrag('index.php?module=verkaufszahlen&action=details','Details');
+ }
+
+ // Daten für 12-Monats-Diagramm, basierend auf Rechnungen und Gutschriften
+ protected function GetFullYearChartDataBasedOnInvoices($projectId, $startDate)
+ {
+ return $this->app->DB->SelectArr(
+ "SELECT r.monthyear, SUM(r.total) AS total
+ FROM (
+ (
+ SELECT DATE_FORMAT(r2.datum, '%m/%Y') AS monthyear,
+ (SUM(rp.preis * rp.menge * (100 - rp.rabatt) / 100)) AS total
+ FROM rechnung_position rp INNER JOIN rechnung r2 ON rp.rechnung = r2.id
+ WHERE r2.datum > '$startDate'
+ AND r2.projekt = '$projectId' ". $this->app->erp->ProjektRechte('r2.projekt') . "
+ GROUP BY `monthyear`
+ )
+ UNION ALL
+ (
+ SELECT DATE_FORMAT(r2.datum, '%m/%Y') AS monthyear,
+ -(SUM(rp.preis * rp.menge * (100 - rp.rabatt) / 100)) AS total
+ FROM gutschrift_position rp INNER JOIN gutschrift r2 ON rp.gutschrift = r2.id
+ WHERE r2.datum > '$startDate' AND r2.status <> 'storniert'
+ AND r2.projekt = '$projectId' " . $this->app->erp->ProjektRechte('r2.projekt') . "
+ GROUP BY `monthyear`
+ )
+ ) AS r
+ GROUP BY `monthyear`
+ ORDER BY `monthyear`"
+ );
+ }
+
+ // Daten für 12-Monats-Diagramm, basierend auf Aufträgen
+ protected function GetFullYearChartDataBasedOnOrders($projectId, $startDate)
+ {
+ return $this->app->DB->SelectArr(
+ "SELECT DATE_FORMAT(a.datum,'%m/%Y') AS monthyear,
+ (SUM(ap.preis * ap.menge * (100 - ap.rabatt) / 100)) AS total
+ FROM auftrag AS a
+ INNER JOIN auftrag_position AS ap ON a.id = ap.auftrag AND a.status <> 'storniert' AND a.belegnr <> '' AND a.datum > '$startDate'
+ WHERE a.projekt = '$projectId' " . $this->app->erp->ProjektRechte('a.projekt') . "
+ GROUP BY `monthyear`
+ ORDER BY `monthyear`"
+ );
+ }
+
+
+ // Daten für Wochendiagramm, basierend auf Rechnungen und Gutschriften
+ protected function GetWeekChartDataBasedOnInvoices($projectId)
+ {
+ return $this->app->DB->SelectArr(
+ "SELECT r.datum, SUM(r.betrag) AS betrag
+ FROM (
+ (
+ SELECT r2.datum, SUM(rp.preis * rp.menge * (100 - rp.rabatt) / 100) AS betrag
+ FROM rechnung_position AS rp
+ INNER JOIN rechnung AS r2 ON rp.rechnung = r2.id
+ WHERE r2.datum > date_sub(CURDATE(), INTERVAL 7 DAY)
+ AND r2.projekt = '$projectId' " . $this->app->erp->ProjektRechte('r2.projekt') . "
+ GROUP BY r2.datum
+ )
+ UNION ALL
+ (
+ SELECT r2.datum, -(SUM(rp.preis * rp.menge * (100 - rp.rabatt) / 100)) AS betrag
+ FROM gutschrift_position AS rp
+ INNER JOIN gutschrift AS r2 ON rp.gutschrift = r2.id
+ WHERE r2.datum > date_sub(CURDATE(), INTERVAL 7 DAY) AND r2.status <> 'storniert'
+ AND r2.projekt = '$projectId' " . $this->app->erp->ProjektRechte('r2.projekt') . "
+ GROUP BY r2.datum
+ )
+ ) AS r
+ GROUP BY r.datum
+ ORDER BY r.datum"
+ );
+ }
+
+ // Daten für Wochendiagramm, basierend auf Aufträgen
+ protected function GetWeekChartDataBasedOnOrders($projectId)
+ {
+ return $this->app->DB->SelectArr(
+ "SELECT a.datum,
+ SUM(ap.preis * ap.menge * (100 - ap.rabatt) / 100) AS betrag
+ FROM auftrag AS a
+ INNER JOIN auftrag_position AS ap ON a.id = ap.auftrag
+ AND a.status <> 'storniert' AND a.belegnr <> '' AND a.datum > DATE_SUB(CURDATE(), INTERVAL 30 DAY)
+ WHERE a.projekt = '$projectId' " . $this->app->erp->ProjektRechte('r2.projekt') . "
+ GROUP BY a.datum
+ ORDER BY a.datum"
+ );
+ }
+
+ // 12-Monats-Diagramm erstellen
+ protected function BuildFullYearChart($projects, $startDate, $dataBasedOnInvoices)
+ {
+ $start = new DateTimeImmutable($startDate);
+ $end = new DateTimeImmutable('now');
+ $interval = new DateInterval('P1M');
+ $period = new PeriodMatcher($start, $end, $interval, 'm/Y');
+ $labels = $period->getDates();
+
+ $fullYearChart = new Chart('bar');
+ $fullYearChart->addLabels($labels);
+
+ foreach ($projects as $projectId => $projectAbbreviation) {
+ if ($dataBasedOnInvoices) {
+ $data = $this->GetFullYearChartDataBasedOnInvoices($projectId, $startDate);
+ } else {
+ $data = $this->GetFullYearChartDataBasedOnOrders($projectId, $startDate);
+ }
+ $matchedData = $period->matchData($data, 'monthyear', 'total');
+ $dataset = new BarDataset($projectAbbreviation, $matchedData);
+ $fullYearChart->addDataset($dataset);
+ }
+
+ return $fullYearChart;
+ }
+
+ // Wochen-Diagramm erstellen
+ protected function BuildWeekChart($projects, $dataBasesOnInvoices)
+ {
+ $start = new DateTimeImmutable('-7 day');
+ $end = new DateTimeImmutable('now + 1 day');
+ $interval = new DateInterval('P1D');
+ $period = new PeriodMatcher($start, $end, $interval, 'Y-m-d');
+ $labels = $period->getDates('d.m.Y');
+
+ $weekChart = new Chart('bar');
+ $weekChart->addLabels($labels);
+
+ foreach ($projects as $projectId => $projectAbbreviation) {
+ if($dataBasesOnInvoices === true){
+ $data = $this->GetWeekChartDataBasedOnInvoices($projectId);
+ }else{
+ $data = $this->GetWeekChartDataBasedOnOrders($projectId);
+ }
+
+ $matchedData = $period->matchData($data, 'datum', 'betrag');
+ $dataset = new BarDataset($projectAbbreviation, $matchedData);
+ $weekChart->addDataset($dataset);
+ }
+
+ return $weekChart;
+ }
+}