OpenXE/www/pages/projekt.php
2022-05-30 16:21:01 +02:00

3698 lines
162 KiB
PHP

<?php
/*
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
*
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
*
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
* to obtain the text of the corresponding license version.
*
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*/
?>
<?php
use Xentral\Components\Exporter\Collection\DataCollection;
use Xentral\Components\Exporter\Collection\FormatterCollection;
use Xentral\Components\Exporter\Csv\CsvConfig;
use Xentral\Components\Exporter\Csv\CsvExporter;
use Xentral\Components\Http\JsonResponse;
include '_gen/projekt.php';
class Projekt extends GenProjekt {
var $app;
var $ebene=0;
var $voraengerbaum;
var $projektwaehrung="";
const MODULE_NAME = 'Project';
/** @var array $javascript */
public $javascript = [
'./classes/Modules/Task/www/js/task.js',
'./resources/js/lazyLoadComponent.js',
];
static function TableSearch(&$app, $name, $erlaubtevars)
{
switch($name)
{
case "projekt_kopie":
$allowed['projekt'] = array('create');
$heading = array('Abkürzung', 'Beschreibung', 'Kd-Nr.', 'Kunde', 'Men&uuml;');
$width = array('30%', '30%', '20%', '10%', '5%');
$findcols = array('p.abkuerzung', 'p.name', 'a.kundennummer', 'a.name', 'p.id');
$searchsql = array('p.abkuerzung', 'p.name', 'a.kundennummer', 'a.name');
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=projekt&action=create&schritt3=weiter&id=%value%\">" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/forward.svg\" border=\"0\"></a>" . "&nbsp;</td></tr></table>";
// SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS p.id, p.abkuerzung, p.name, a.kundennummer,a.name, p.id FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde ";
$where = " p.id > 0 ".$app->erp->ProjektRechte();
$count = "SELECT COUNT(p.id) FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde WHERE ".$where;
break;
case "projekt_mitarbeiterstundengeplant":
$allowed['projekt'] = array('dashboard');
$heading = array('Mitarbeiternummer','Mitarbeiter','Bezeichnung','Stunden','Stundenlohn','');
$width = array('20%','25%','20%','15%','14%','1%');
$findcols = array( 'a.mitarbeiternummer','a.name','tgz.bezeichnung','tgz.stunden','tgz.stundensatz', 'a.id');
$searchsql = array('a.mitarbeiternummer','a.name','tgz.bezeichnung','tgz.stunden','tgz.stundensatz', 'a.id');
$defaultorder = 1; //Optional wenn andere Reihenfolge gewuenscht
$defaultorderdesc = 1;
$teilprojekt = (int)$app->User->GetParameter("teilprojekt_geplante_zeiten_teilprojekt");
$id = (int)$app->Secure->GetGET('id');
$sql = "SELECT SQL_CALC_FOUND_ROWS a.id,a.mitarbeiternummer, a.name as name,
concat('<input onchange=\"changestundensatzname(',a.id,',$teilprojekt)\" type=\"text\" value=\"',ifnull(tgz.bezeichnung,ifnull((SELECT zk.beschreibung FROM zeiterfassung_kosten zk WHERE zk.adresse = a.id AND (zk.gueltig_ab = '0000-00-00' OR zk.gueltig_ab <= curdate()) ORDER by zk.gueltig_ab DESC LIMIT 1 ),'')),'\" name=\"stundensatzname_',a.id,'\" id=\"stundensatzname_',a.id,'\" />') ,
concat('<input onchange=\"changestundensatzname(',a.id,',$teilprojekt)\" type=\"text\" value=\"',ifnull(tgz.stunden,0),'\" name=\"stunden_',a.id,'\" id=\"stunden_',a.id,'\" />') ,
concat('<input onchange=\"changestundensatzname(',a.id,',$teilprojekt)\" type=\"text\" value=\"',ifnull(tgz.stundensatz,ifnull((SELECT zk.stundensatz FROM zeiterfassung_kosten zk WHERE zk.adresse = a.id AND (zk.gueltig_ab = '0000-00-00' OR zk.gueltig_ab <= curdate()) ORDER by zk.gueltig_ab DESC LIMIT 1 ),0)),'\" name=\"stundensatz_',a.id,'\" id=\"stundensatz_',a.id,'\" />')
, a.id as menu
FROM adresse a
INNER JOIN adresse_rolle a2 ON a2.adresse=a.id
INNER JOIN projekt p ON p.id=a2.projekt OR p.id = a.projekt
LEFT JOIN teilprojekt_geplante_zeiten tgz ON a.id = tgz.adresse AND tgz.teilprojekt = '$teilprojekt'";
$groupby = " group by a.id";
$where = " (a2.projekt='$id' AND (a2.bis='0000-00-00' OR a2.bis >= date(NOW())) AND a2.objekt like 'Projekt' AND a.geloescht != 1 AND mitarbeiternummer != '') OR not isnull(tgz.id) ";
$count = "SELECT count(distinct a.id) FROM adresse a
INNER JOIN adresse_rolle a2 ON a2.adresse=a.id
INNER JOIN projekt p ON p.id=a2.projekt OR p.id = a.projekt
LEFT JOIN teilprojekt_geplante_zeiten tgz ON a.id = tgz.adresse AND tgz.teilprojekt = '$teilprojekt'
WHERE $where";
break;
case "projekt_verbindlichkeiten":
$allowed['projekt'] = array('dashboard');
$id = (int)$app->Secure->GetGET('id');
$heading = array('','Nr', 'Teilprojekt', 'Lf-Nr.','Lieferant','RE-Datum','RE-Nr','Verwendungszweck','IBAN/BIC','Betrag (netto)', 'Betrag (brutto)', 'Skonto Bis', 'Zahlbar Bis', 'Skonto','Zahlweise','Bezahlt','Monitor', 'Men&uuml;');
$width = array('1%','5%', '5%', '5%', '20%', '5%','5%', '20%','10%', '10%','20%','5%', '5%', '1%', '1%', '1%', '8%');
$findcols = array('','v.belegnr', 'ap.aufgabe', 'a.lieferantennummer','a.name','v.rechnungsdatum','v.rechnung','v.verwendungszweck', "CONCAT('a.iban','/','a.swift')","if((SELECT SUM(bestellung_betrag_netto) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id'), ".$app->erp->FormatPreis("(SELECT SUM(bestellung_betrag_netto) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id')",2).",".$app->erp->FormatPreis("v.betrag-v.summenormal-v.summeermaessigt-v.summesatz3-v.summesatz4",2).")",
"if((SELECT SUM(bestellung_betrag) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id'), ".$app->erp->FormatPreis("(SELECT SUM(bestellung_betrag) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id')",2).",".$app->erp->FormatPreis("v.betrag",2).")",
'v.skontobis', 'v.zahlbarbis', 'v.skonto','v.zahlungsweise', "if(v.status='bezahlt','ja','nein')",'v.status', 'v.id');
$searchsql = array('a.lieferantennummer', 'ap.aufgabe', 'a.name', "DATE_FORMAT(v.rechnungsdatum, '%d.%m.%Y')","if(v.status='bezahlt','ja','nein')", 'v.rechnung','v.rechnung',"CONCAT('a.iban','/','a.swift')",'v.verwendungszweck',"if((SELECT SUM(bestellung_betrag_netto) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id'), ".$app->erp->FormatPreis("(SELECT SUM(bestellung_betrag_netto) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id')",2).",".$app->erp->FormatPreis("v.betrag-v.summenormal-v.summeermaessigt-v.summesatz3-v.summesatz4",2).")", "if((SELECT SUM(bestellung_betrag) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id'), ".$app->erp->FormatPreis("(SELECT SUM(bestellung_betrag) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id')",2).",".$app->erp->FormatPreis("v.betrag",2).")", 'v.kostenstelle','v.zahlungsweise');
$sumcol=array(10,11);
$datecols = array(5,12);
$defaultorder = 17;
$defaultorderdesc = 1;
$alignright = array(5,9,10,11,13);
$moreinfo=true;
$moreinfoaction = 'verbindlichkeit';
$menucol = 17;
$menu = "<table><tr><td nowrap><a target=\"_blank\" href=\"index.php?module=verbindlichkeit&action=edit&id=%value%\"><img border=\"0\" src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/forward.svg\"></a></td></tr></table>";
// SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS v.id, '<img src=./themes/{$app->Conf->WFconf[defaulttheme]}/images/details_open.png class=details>' as open,
v.belegnr as 'nr.', ap.aufgabe, a.lieferantennummer,a.name as lieferant,DATE_FORMAT(v.rechnungsdatum, '%d.%m.%Y'), if(v.betrag <0, CONCAT('<font color=red>',v.verwendungszweck,' ',if(v.rechnung!='','RE ',''),v.rechnung,'</font>'),v.rechnung),v.verwendungszweck,
CONCAT(if(a.iban='',CONCAT('<a href=\"index.php?module=adresse&action=edit&id=',a.id,'#tabs-2\" target=\"_blank\"><font color=red>fehlt - bitte nachtragen</font></a>'),a.iban),' / ',
if(a.swift='',CONCAT('<a href=\"index.php?module=adresse&action=edit&id=',a.id,'#tabs-2\" target=\"_blank\"><font color=red>fehlt - bitte nachtragen</font></a>'),a.swift)) as BIC,
if((SELECT SUM(bestellung_betrag_netto) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id'), ".$app->erp->FormatPreis("(SELECT SUM(bestellung_betrag_netto) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id')",2).",".$app->erp->FormatPreis("v.betrag-v.summenormal-v.summeermaessigt-v.summesatz3-v.summesatz4",2)."), if((SELECT SUM(bestellung_betrag) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id'), ".$app->erp->FormatPreis("(SELECT SUM(bestellung_betrag) FROM verbindlichkeit_bestellungen WHERE verbindlichkeit = v.id AND bestellung_projekt = '$id')",2).",".$app->erp->FormatPreis("v.betrag",2)."),
if(v.skontobis='0000-00-00','-',if(v.skontobis >=NOW(),
CONCAT('<font color=red>',DATE_FORMAT(v.skontobis,'%d.%m.%Y'),'</font>'),DATE_FORMAT(v.skontobis,'%d.%m.%Y'))) as skonto_bis,
if(v.zahlbarbis='0000-00-00','-',DATE_FORMAT(v.zahlbarbis,'%d.%m.%Y')) as zahlbar_bis,
if(v.skonto > 0,CONCAT(v.skonto,' %'),'-') as skonto, if(v.zahlungsweise='','rechnung',v.zahlungsweise), if(v.status='bezahlt','ja','nein'),
(" . $app->YUI->IconsSQLVerbindlichkeit() . ") as icons,
v.id FROM `verbindlichkeit` AS `v` LEFT JOIN adresse a ON v.adresse = a.id LEFT JOIN arbeitspaket ap ON v.teilprojekt = ap.id
";
// Fester filter
$where = " (v.projekt = '$id' OR v.id IN(SELECT DISTINCT v.id FROM verbindlichkeit v JOIN verbindlichkeit_bestellungen vb ON v.id = vb.verbindlichkeit WHERE vb.bestellung_projekt = '$id') ";
for($i = 1; $i <= 15; $i++)$where .= " OR v.bestellung".$i."projekt = '$id' ";
$where .= ") AND v.status_beleg != 'storniert' ";
// gesamt anzahl
$count = "SELECT COUNT(v.id) FROM `verbindlichkeit` AS `v` WHERE $where ";
break;
case 'projekttabelle':
$allowed['projekt'] = array('list');
$abgeschlossene = $app->YUI->TableSearchFilter($name, 12, 'abgeschlossene', 0,0,'checkbox');
$alle = $app->YUI->TableSearchFilter($name, 13, 'alle', 0,0,'checkbox');
$meine = $app->YUI->TableSearchFilter($name, 14, 'meine', 0,0,'checkbox');
$geplant = $app->YUI->TableSearchFilter($name, 15, 'geplant', 0,0,'checkbox');
// headings
$heading = array('','Kennung','Beschreibung','Kunden-Nr.','Kunde','Verantwortlicher');
$width = array('1%','8%', '20%','5%','15%', '15%');
$moreinfo = true;
$moreinfoaction='projektuebersicht';
$findcols = array('p.abkuerzung','p.name','a.kundennummer','a.name','p.verantwortlicher');
$defaultorder = 6;
$menu = "<table class=\"nopadding\" cellpadding=\"0\" cellspacing=\"0\">";
$menu .= "<tr>";
$menu .= "<td>";
$width[] = '8%';
$heading[] = '&Ouml;ffentlich';
$findcols[] = "if(p.oeffentlich,'ja','-')";
$searchsql = array('p.name', 'p.abkuerzung', 'a2.name', 'a.kundennummer', 'a.name',"if(p.oeffentlich,'ja','-')");
$heading[] = 'Men&uuml;';
$menucol = count($heading)-1;
$width[] = '1%';
$findcols[] = 'p.id';
$defaultorderdesc = 1;
$menu .= "<td>";
$menu .= "<a href=\"index.php?module=projekt&action=uebersicht&id=%value%\">";
$menu .= "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">";
$menu .= "</a>";
$menu .= "</td>";
$menu .= "<td>";
$menu .= "<a href=\"#\" onclick=DeleteDialog(\"index.php?module=projekt&action=delete&id=%value%\");>";
$menu .= "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">";
$menu .= "</a>";
$menu .= "</td>";
$menu .= "<td>";
$menu .= "<a href=\"#\" class=\"label-manager\" data-label-column-number=\"3\" data-label-reference-id=\"%value%\" data-label-reference-table=\"projekt\">";
$menu .= "<span class=\"label-manager-icon\"></span>";
$menu .= "</a>";
$menu .= "</td>";
$menu .= "</tr>";
$menu .= "</table>";
// SQL statement
$sql = "SELECT SQL_CALC_FOUND_ROWS p.id, '<img src=./themes/".$app->Conf->WFconf['defaulttheme']."/images/details_open.png class=details>' as open,";
$sql .= " p.abkuerzung, p.name, a.kundennummer,a.name, a2.name,";
$sql .= "if(p.oeffentlich,'ja','-') as oeffentlich, $freifeldsql
p.id as menu FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde LEFT JOIN adresse a2 ON p.verantwortlicher = a2.id ";
//if(p.status like 'abgeschlossen','abgeschlossen','offen') as status,
// fester filter
$where = " p.geloescht=0 " . $app->erp->ProjektRechte();
if($alle)
{
}elseif($geplant)
{
$where .= ' AND p.status like \'geplant\' ';
}elseif($abgeschlossene)
{
$where .= ' AND p.status like \'abgeschlossen\' ';
}else{
$where .= ' AND p.status not like \'geplant\' AND p.status not like \'abgeschlossen\' ';
}
if($meine){
$where .= " AND (p.verantwortlicher = '".$app->User->GetAdresse()."' OR (SELECT count(ar.id) FROM adresse_rolle ar WHERE ar.projekt = p.id AND ar.adresse = '".$app->User->GetAdresse()."' )) ";
}
$count = "SELECT COUNT(p.id) FROM projekt p WHERE $where";
break;
case "projekt_logbuch":
//$allowed['adresse'] = array('brief');
$heading = array('','Datum', 'Titel','Ansprechpartner','Projekt','Bearbeiter', 'Art', 'Gesendet','', 'Men&uuml;');
$width = array('1%','15%', '30%','10%','15%', '15%', '10%', '10%','1%', '1%');
$findcols = array('a.open','a.datum', 'a.title','a.ansprechpartner','a.abkuerzung', 'a.bearbeiter', 'a.art','a.gesendet','a.did','a.did');
$searchsql = array('a.datum', 'a.title','a.ansprechpartner','a.abkuerzung', 'a.bearbeiter','a.art','a.suchtext','a.internebezeichnung');
$defaultorder = 2; // sortiert nach dem oeffnen nach spalte 2
$defaultorderdesc = 1; // 0 = auftsteigend , 1 = absteigen (eventuell notfalls pruefen)
//index.php?module=adresse&action=korreseditpopup&id=%value% popup
$menu = "<center><span style=\"display:none;\">%value%</span><img src=\"themes/".$app->Conf->WFconf['defaulttheme']."/images/forward.svg\" border=\"0\" onclick=\"gotovorgang(this)\" style=\"cursor: pointer;\"></center>";
$moreinfo = true;
$doppelteids = true;
$moreinfoaction = 'brief';
$menucol = 9;
$cmd = $app->Secure->GetGET("cmd");
$id = (int)$app->Secure->GetGET("id");
$sql = '
SELECT
SQL_CALC_FOUND_ROWS a.id,
a.open,
a.datum,
if(ifnull(a.internebezeichnung,\'\') = \'\', a.title, concat(a.title,\'<br /><i style="color:grey">\',a.internebezeichnung,\'</i>\')),
a.ansprechpartner,
a.abkuerzung,
a.bearbeiter,
a.art,
a.gesendet,
a.pdf,
a.did
FROM
(
(
SELECT
d.id,"<img src=./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/details_open.png class=details>" as open,
CONCAT(DATE_FORMAT(d.datum, "%Y-%m-%d"), " ", IF(d.uhrzeit IS NULL OR DATE_FORMAT(d.uhrzeit, "%H:%i")="00:00", "", DATE_FORMAT(d.uhrzeit, "%H:%i")) ) as datum,
d.betreff as title,if(d.typ = \'email\',if(d.ansprechpartner <> \'\',d.ansprechpartner,d.email_an),d.ansprechpartner) as ansprechpartner,
p.abkuerzung as abkuerzung,
if(bearbeiter!="",bearbeiter,a2.name) as bearbeiter,
CONCAT(UCASE(LEFT(d.typ, 1)), SUBSTRING(d.typ, 2)) as art,
CONCAT(IF(d.sent = 1, "JA", "NEIN"),"<a data-type=dokumente data-id=", d.id, "></a>") as gesendet,
"" as pdf,
concat("1","-",d.id) as did,d.content as suchtext,d.internebezeichnung
FROM
dokumente d
LEFT JOIN projekt p ON p.id=d.projekt
LEFT JOIN adresse a2 ON a2.id=adresse_from
WHERE
p.id = '.$id.'
)
UNION ALL
(
SELECT
ds.id,"<img src=./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/details_open.png class=details>" as open,
CONCAT(DATE_FORMAT(ds.zeit, "%Y-%m-%d")," ", IF(DATE_FORMAT(ds.zeit, "%H:%i")="00:00", "", DATE_FORMAT(ds.zeit, "%H:%i"))) as datum,
ds.betreff COLLATE utf8_general_ci as title,ds.ansprechpartner COLLATE utf8_general_ci,
p.abkuerzung as abkuerzung,
ds.bearbeiter COLLATE utf8_general_ci,
CONCAT(UCASE(LEFT(ds.dokument, 1)), SUBSTRING(ds.dokument, 2),"<span style=\"display:none;\" class=\"editlink\">index.php?module=",ds.dokument,"&action=edit&id=",ds.parameter,"</span>") as art,
CONCAT(IF(ds.versendet = 1, "JA", "NEIN"),"<a data-type=dokumente_send data-id=", ds.id, "></a>") as gesendet,
concat("<a href=\"index.php?module=",ds.dokument,"&action=pdf&id=",ds.parameter,"\"><img src=./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/pdf.svg></a>") as pdf,
concat("2","-",ds.id) as did,ds.text COLLATE utf8_general_ci as suchtext,
ifnull(d1.internebezeichnung,
ifnull(d2.internebezeichnung,
ifnull(d3.internebezeichnung,
ifnull(d4.internebezeichnung,
ifnull(d5.internebezeichnung,
ifnull(d6.internebezeichnung,
\'\')))))) as internebezeichnung
FROM
dokumente_send ds
LEFT JOIN lieferschein d1 ON ds.parameter = d1.id AND ds.dokument = \'lieferschein\'
LEFT JOIN auftrag d2 ON ds.parameter = d2.id AND ds.dokument = \'auftrag\'
LEFT JOIN rechnung d3 ON ds.parameter = d3.id AND ds.dokument = \'rechnung\'
LEFT JOIN gutschrift d4 ON ds.parameter = d4.id AND ds.dokument = \'gutschrift\'
LEFT JOIN angebot d5 ON ds.parameter = d5.id AND ds.dokument = \'angebot\'
LEFT JOIN bestellung d6 ON ds.parameter = d6.id AND ds.dokument = \'bestellung\'
LEFT JOIN projekt p ON p.id=ds.projekt
WHERE
p.id = '.$id.'
)
UNION ALL
(
SELECT
k.id,"<img src=./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/details_open.png class=details>" as open,
CONCAT(DATE_FORMAT(k.von, "%Y-%m-%d")," ", IF(DATE_FORMAT(k.von, "%H:%i")="00:00", "", DATE_FORMAT(k.von, "%H:%i"))) as datum,
k.bezeichnung COLLATE utf8_general_ci as title,\'\' as ansprechpartner,
p.abkuerzung as abkuerzung,
a2.name,
"Kalender" as art,
CONCAT("<a data-type=kalender data-id=", k.id, "></a>") as gesendet,
"" as pdf,
concat("6","-",k.id) as did,k.beschreibung COLLATE utf8_general_ci as suchtext,\'\' as internebezeichnung
FROM
kalender_event k
LEFT JOIN adresse a2 ON k.adresseintern = a2.id
LEFT JOIN projekt p ON p.id=k.projekt
WHERE
p.id = '.$id.'
)
';
if(1){//$this->app->erp->RechteVorhanden('ticket','offene')){
$sql.= 'UNION ALL
(
SELECT
ticket.id,"<img src=./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/details_open.png class=details>" as open,
DATE_FORMAT(ticket.zeit, "%Y-%m-%d %H:%i") as datum,
concat(ticket.betreff COLLATE utf8_general_ci,if(ticket.notiz!=\'\',concat(\'<br /><i style="color:grey">\',ticket.notiz,\'</i>\'),\'\')) as title,ticket_nachricht.verfasser as ansprechpartner,
projekt.abkuerzung as abkuerzung,
ticket.bearbeiter,
CONCAT("Ticket") as art,
CONCAT("JA<a data-type=ticket_nachricht data-id=", ticket_nachricht.id, "></a>") as gesendet,
"" as pdf,
concat("3","-",ticket.id) as did,ticket_nachricht.text COLLATE utf8_general_ci as suchtext,\'\' as internebezeichnung
FROM
ticket
LEFT JOIN ticket_nachricht ON ticket.schluessel = ticket_nachricht.ticket
LEFT JOIN projekt ON projekt.id=ticket.projekt
WHERE
projekt.id = '.$id.'
)';
//if(ifnull(a.internebezeichnung,\'\') = \'\', a.title, concat(a.title,\'<br /><i style="color:grey">\',a.internebezeichnung,\'</i>\')),
$sql.= 'UNION ALL
(
SELECT
ticket.id,"<img src=./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/details_open.png class=details>" as open,
DATE_FORMAT(ticket_nachricht.zeitausgang, "%Y-%m-%d %H:%i") as datum,
concat(\'RE: \',ticket.betreff COLLATE utf8_general_ci,if(ticket.notiz!=\'\',concat(\'<br /><i style="color:grey">\',ticket.notiz,\'</i>\'),\'\')) as title,ticket_nachricht.verfasser as ansprechpartner,
projekt.abkuerzung as abkuerzung,
ticket.bearbeiter,
CONCAT("Ticket") as art,
CONCAT("JA<a data-type=ticket_nachricht data-id=", ticket_nachricht.id, "></a>") as gesendet,
"" as pdf,
concat("33","-",ticket.id) as did,ticket_nachricht.textausgang COLLATE utf8_general_ci as suchtext,\'\' as internebezeichnung
FROM
ticket
LEFT JOIN ticket_nachricht ON ticket.schluessel = ticket_nachricht.ticket
LEFT JOIN projekt ON projekt.id=ticket.projekt
WHERE
projekt = '.$id.'
)';
}
//if($this->app->erp->RechteVorhanden('webmail','list')){
$sql.= 'UNION ALL
(
SELECT
e.id,"<img src=./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/details_open.png class=details>" as open,
DATE_FORMAT(e.empfang, "%Y-%m-%d %H:%i") as datum,
e.subject COLLATE utf8_general_ci as title,\'\' as ansprechpartner,
p.abkuerzung COLLATE utf8_general_ci as abkuerzung,
"" as bearbeiter,
CONCAT("E-Mail Archiv") as art,
CONCAT("JA<a data-type=emailbackup_mails data-id=", e.id, "></a>") as gesendet,
"" as pdf,
concat("4","-",e.id) as did,ifnull(e.action,e.action_html) as suchtext,\'\' as internebezeichnung
FROM
emailbackup_mails e
LEFT JOIN projekt p ON p.id=e.projekt
WHERE
p.id = '.$id.'
)';
//}
if($app->erp->RechteVorhanden('wiedervorlage','list')){
$sql .='
UNION ALL
(
SELECT
w.id,"<img src=./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/details_open.png class=details>" as open,
CONCAT(DATE_FORMAT(datum_erinnerung, "%Y-%m-%d"), " ", IF(zeit_erinnerung IS NULL OR DATE_FORMAT(zeit_erinnerung, "%H:%i")="00:00", "", DATE_FORMAT(zeit_erinnerung, "%H:%i")) ) as datum,
w.bezeichnung COLLATE utf8_general_ci as title,\'\' as ansprechpartner,
p.abkuerzung COLLATE utf8_general_ci as abkuerzung,
adr.name COLLATE utf8_general_ci as bearbeiter,
CONCAT("Wiedervorlage") as art,
CONCAT("<a data-type=wiedervorlage data-id=", w.id, "></a>") as gesendet,
"" as pdf,
concat("5","-",w.id) as did,w.beschreibung COLLATE utf8_general_ci as suchtext,\'\' as internebezeichnung
FROM
wiedervorlage w left join adresse adr on w.bearbeiter = adr.id
LEFT JOIN projekt p ON p.id=w.projekt
WHERE
p.id = '.$id.'
)';
}
$sql .='
) a
';
$moreinfo = true;
$doppelteids = true;
$moreinfoaction = 'brief';
$menucol = 9;
if($cmd=="adresse_brief" && $id > 0) $adresseId = $id;
else
$adresseId = $app->User->GetParameter('adresse_brief_adresseId');
$count = '
SELECT
SUM(anzahl)
FROM
(
(
SELECT
COUNT(id) as anzahl
FROM
dokumente
WHERE
projekt = '.$id.'
)
UNION ALL
(
SELECT
COUNT(id) as anzahl
FROM
dokumente_send
WHERE
projekt = '.$id.'
)';
if(1){
$count .= '
UNION ALL
(
SELECT
COUNT(ticket.id) as anzahl
FROM
ticket
LEFT JOIN ticket_nachricht ON ticket.schluessel = ticket_nachricht.ticket
WHERE
projekt = '.$id.'
)';
}
$count .= '
UNION ALL
(
SELECT
COUNT(k.id) as anzahl
FROM
kalender_event k
LEFT JOIN adresse a2 ON k.adresseintern = a2.id
LEFT JOIN projekt p ON p.id=k.projekt
WHERE
p.id = '.$id.'
)';
if($app->erp->RechteVorhanden('wiedervorlage','list')){
$count .= '
UNION ALL
(
SELECT
COUNT(id) as anzahl
FROM
wiedervorlage
WHERE
projekt = '.$id.'
)';
}
$count .= '
) a
';
break;
case 'projekt_wiedervorlagen':
// START EXTRA checkboxen
//$columnfilter=true;
$allowed['wiedervorlage'] = array('list');
$id = (int)$app->Secure->GetGET("id");
$moreinfo = true;
$moreinfoaction = 'dashboardwiedervorlagen';
$where = '1 ';
$mitarbeiter = $app->User->GetParameter('table_wiedervorlage_mitarbeiter');
$wheremitarbeiter ='';
if($app->erp->RechteVorhanden('wiedervorlage','alle') ){
if($mitarbeiter<>0){
$wheremitarbeiter = " AND (w.adresse_mitarbeiter='" . $mitarbeiter . "' OR (w.adresse_mitarbeiter=0 AND w.bearbeiter='" . $mitarbeiter . "'))";
}else{
$wheremitarbeiter = ' ';
}
} else {
$wheremitarbeiter = " AND (w.adresse_mitarbeiter='".(int)$app->User->GetAdresse()."' OR (w.adresse_mitarbeiter=0 AND w.bearbeiter='".(int)$app->User->GetAdresse()."'))";
}
$where .= $wheremitarbeiter;
$where .= "AND w.projekt = '$id' ".$app->erp->ProjektRechte("w.projekt");
$viewId = (int)$app->User->GetParameter('table_wiedervorlage_view');
$where .= ($viewId > 0 ? " AND ws.view = '{$viewId}' " : " AND (ws.view = 0 OR w.stages = 0 OR (w.stages > 0 AND ws.id is NULL)) ");
$heading = array('','Fällig am', 'Titel','Kunde','Projekt', 'Melden bei','Volumen','Chance','Stage', 'Abschlussdatum');
$width = array('1%','10%', '30%','15%','5%','8%', '4%', '2%','8%','8%');
$findcols = array('open',
"if(
w.datum_erinnerung = date(now()),
concat('A',' ',w.datum_erinnerung,' ',w.zeit_erinnerung, ' ', DATE_FORMAT(w.datum_erinnerung, '%d.%m.%Y')),
if(w.datum_erinnerung < date(now()) AND w.datum_erinnerung <> '0000-00-00',
concat('B',' ', TIMESTAMPDIFF(SECOND, concat(w.datum_erinnerung,' ',w.zeit_erinnerung),'2999-01-01'), ' ', DATE_FORMAT(w.datum_erinnerung, '%d.%m.%Y'))
,concat('C',' ',w.datum_erinnerung,' ',w.zeit_erinnerung, ' ', DATE_FORMAT(w.datum_erinnerung, '%d.%m.%Y'))
)
)",
'w.bezeichnung','a3.name','if(p2.abkuerzung !="",p2.abkuerzung,IFNULL(p.abkuerzung,""))', 'IF(a4.name != "",a4.name,a2.name)','w.betrag','w.chance',"if(ws.kurzbezeichnung!='',ws.kurzbezeichnung,ws.name)",'w.datum_abschluss');
$searchsql = array('DATE_FORMAT(w.datum_erinnerung, "%d.%m.%Y")', 'w.bezeichnung','a3.name','if(p2.abkuerzung !="",p2.abkuerzung,IFNULL(p.abkuerzung,""))', 'IF(a4.name != "",a4.name,a2.name)',$app->erp->FormatPreis("w.betrag"),'w.chance',"if(ws.kurzbezeichnung!='',ws.kurzbezeichnung,ws.name)",'DATE_FORMAT(w.datum_abschluss, "%d.%m.%Y")');
$trcol = 10;
$defaultorder = 2;
$defaultorderdesc = 'asc';
$additionalFieldsSql = '';
$additionalAddressFields = $app->erp->getZusatzfelderAdresse();
$result = [];
for($i = 1; $i <= 10; $i++){
$property = (string)$app->erp->GetKonfiguration('wiedervorlagen_zusatzfeld'.$i.'_schluessel');
if (!empty($property)){
$result[$property] = $additionalAddressFields[$property];
}
}
$additionalFields = $result;
foreach ($additionalFields as $additionalProperty => $additionalLabel) {
$additionalFieldsSql .= 'a3.' . $additionalProperty . ' AS additional_' . $additionalProperty . ', ';
$searchsql[] = 'a3.' . $additionalProperty;
$findcols[] = 'a3.' . $additionalProperty;
$heading[] = str_replace(' ', '&nbsp;', $additionalLabel);
$width[] = '5%';
$trcol++;
}
$heading[] = 'tr';
$width[] = '0%';
$heading[] = '';
$width[] = '8%';
$findcols[] = 'w.id';
$searchsql[] = 'w.id';
$findcols[] = 'w.id';
$menucol = count($findcols)-1;
$menu = '<input type="hidden" value="%value%">';
$alignright = array(7,8);
$aligncenter = array(9);
$sql = 'SELECT SQL_CALC_FOUND_ROWS w.id,"<img src=./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/details_open.png class=details>" as open,
'.$app->YUI->Stroke("w.abgeschlossen",'DATE_FORMAT(datum_erinnerung, "%d.%m.%Y")').' as datum_ang,
concat('.$app->YUI->Redify('w.prio', $app->YUI->Stroke('w.abgeschlossen','w.bezeichnung')).',if(w.module=\'angebot\' AND w.parameter > 0,CONCAT(\' <a href="index.php?module=angebot&action=edit&id=\',w.parameter,\'"" target="_blank">(zum Angebot)</a>\'),if(w.module=\'ticket\' AND w.parameter > 0,CONCAT(\' <a href="index.php?module=ticket&action=assistent&id=\',w.parameter,\'"" target="_blank">(zum Ticket)</a>\'),\'\'))),
'.$app->YUI->Stroke('w.abgeschlossen','a3.name').',
'.$app->YUI->Stroke('w.abgeschlossen','if(p2.abkuerzung !="",p2.abkuerzung,IFNULL(p.abkuerzung,""))').' AS abkuerzung,
'.$app->YUI->Stroke('w.abgeschlossen','IF(a4.name != "",a4.name,a2.name)').',
'.$app->YUI->Stroke('w.abgeschlossen',$app->erp->FormatPreis('w.betrag')).',
'.$app->YUI->Stroke('w.abgeschlossen',"concat(w.chance,' %')").' AS chance,
'.$app->YUI->Stroke('w.abgeschlossen',"if(ws.kurzbezeichnung!='',ws.kurzbezeichnung,ws.name)").',
'.$app->YUI->Stroke("w.abgeschlossen",'DATE_FORMAT(datum_abschluss, "%d.%m.%Y")').' as datum_abschluss,
'.$additionalFieldsSql.'
if(w.datum_erinnerung = date(now()),\'#D2EC9D\',if(w.datum_erinnerung < date(now()) AND w.datum_erinnerung <> \'0000-00-00\',\'#F1B19F\',\'\')) as tr,
w.id
from wiedervorlage w
LEFT JOIN adresse a2 on w.bearbeiter = a2.id
LEFT JOIN adresse a3 on w.adresse = a3.id
LEFT JOIN adresse a4 ON w.adresse_mitarbeiter = a4.id
LEFT JOIN projekt p on a3.projekt = p.id
LEFT JOIN wiedervorlage_stages ws on ws.id = w.stages
LEFT JOIN projekt p2 on w.projekt = p2.id
';
break;
}
$erg = [];
foreach($erlaubtevars as $k => $v)
{
if(isset($$v)) {
$erg[$v] = $$v;
}
}
return $erg;
}
/** @var Application $app */
function __construct($app, $intern = false) {
$this->app=$app;
if($intern) {
return;
}
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("create","ProjektCreate");
$this->app->ActionHandler("edit","ProjektEdit");
$this->app->ActionHandler("list","ProjektList");
$this->app->ActionHandler("pdf","ProjektPDF");
$this->app->ActionHandler("delete","ProjektDelete");
$this->app->ActionHandler("dateien","ProjektDateien");
$this->app->ActionHandler("uebersicht","ProjektUebersicht");
$this->app->ActionHandler("zeit","ProjektZeit");
$this->app->ActionHandler("material","ProjektMaterial");
$this->app->ActionHandler("arbeitsnachweise","ProjektArbeitsnachweise");
$this->app->ActionHandler("arbeitsnachweispdf","ProjektArbeitsnachweisPDF");
$this->app->ActionHandler("arbeitspaket","ProjektArbeitspaket");
$this->app->ActionHandler("arbeitspaketeditpopup","ProjektArbeitspaketEditPopup");
$this->app->ActionHandler("arbeitspaketdelete","ProjektArbeitspaketDelete");
$this->app->ActionHandler("arbeitspaketdisable","ProjektArbeitspaketDisable");
$this->app->ActionHandler("arbeitspaketcopy","ProjektArbeitspaketCopy");
$this->app->ActionHandler("nextnumber","ProjektNextnumber");
$this->app->ActionHandler("delnumber","ProjektDelnumber");
$this->app->ActionHandler("getnextnumber","ProjektGetNextNumber");
$this->app->ActionHandler("neueaufgabe","ProjektNeueAufgabe");
$this->app->ActionHandler("artikeledit","ProjektArtikelEdit");
$this->app->ActionHandler("minidetailarbeitspaket","ProjektMiniDetailArbeitspaket");
$this->app->ActionHandler("plan","ProjektPlan");
$this->app->ActionHandler("kostenstellen","ProjektKostenstellen");
$this->app->ActionHandler("schaltung","ProjektSchaltung");
$this->app->ActionHandler("mitgliederdelete","ProjektMitgliederDelete");
$this->app->ActionHandler("copy","ProjektCopy");
$this->app->ActionHandler("minidetailprojektuebersicht", "ProjektuebersichtMinidetail");
$this->app->ActionHandler("projektlogbuch","ProjektLogbuch");
$this->app->ActionHandler("minidetailbrief","ProjektMiniDetailBrief");
$this->app->ActionHandler("briefpreview","ProjektBriefPreview");
$this->app->ActionHandlerListen($app);
}
function getStueckliste(&$ret, $artikel, $menge, $lvl = 0)
{
if($lvl > 6) {
return;
}
$parent = -1;
if(!empty($ret))$parent = count($ret)-1;
$stueckliste = $this->app->DB->SelectArr("SELECT id, menge, artikel,stuecklistevonartikel FROM stueckliste WHERE stuecklistevonartikel = '$artikel'");
if($stueckliste)
{
foreach($stueckliste as $art)
{
$art['menge'] = $art['menge'] * $menge;
$art['parent'] = -1;
if(is_array($ret)) {
$art['parent'] = $parent;
}
$ret[] = $art;
$res = $this->getStueckliste($ret, $art['artikel'], $art['menge'] , $lvl+1);
if($res)
{
foreach($res as $a)
{
$a['parent'] = $art['parent']+1;
$ret[] = $a;
}
unset($res);
}
}
}
}
function UpdateProjektartikelCache($id, $nurwe = false)
{
$artikel = $this->app->DB->Select("SELECT artikel FROM projekt_artikel WHERE id = '$id' LIMIT 1");
if(!$artikel)
{
return false;
}
if(!$nurwe)
{
$belege = array('PR'=>'produktion','AN'=>'angebot','AB'=>'auftrag','LS'=>'lieferschein','GS'=>'gutschrift','RE'=>'rechnung','PF'=>'preisanfrage','PRO','proformarechnung'); //WE Wareneingang
foreach($belege as $cache => $beleg)
{
$count = $this->app->DB->Select("SELECT sum(bp.menge) as co FROM $beleg"."_position bp INNER JOIN $beleg b ON bp.$beleg = b.id WHERE bp.teilprojekt > 0 AND bp.artikel = '$artikel' AND b.status!='storniert' AND b.status!='abgelehnt' AND b.status != 'angelegt' AND b.status != '' ".($cache != 'PRO'?" AND b.belegnr != '' ":''));
$this->app->DB->Update("UPDATE projekt_artikel SET cache_".$cache." = '$count' WHERE id = '$id' LIMIT 1");
}
$beleg = 'lieferschein';
$cache = 'WA';
$count = $this->app->DB->Select("SELECT sum(bp.geliefert) as co FROM $beleg"."_position bp INNER JOIN $beleg b ON bp.$beleg = b.id WHERE bp.teilprojekt > 0 AND bp.artikel = '$artikel' AND b.status!='storniert' AND b.status!='abgelehnt' AND b.status != 'angelegt' AND b.belegnr != ''");
$this->app->DB->Update("UPDATE projekt_artikel SET cache_".$cache." = '$count',lastcheck = now() WHERE id = '$id' LIMIT 1");
}
$count = $this->app->DB->SelectArr("SELECT sum(geliefert) as cogeliefert, sum(menge) as comenge FROM bestellung_position WHERE teilprojekt > 0 AND artikel = '$artikel' ");
if($count)
{
$count = reset($count);
$menge = $count['comenge'];
$geliefert = $count['cogeliefert'];
$this->app->DB->Update("UPDATE projekt_artikel SET cache_WE = '$geliefert', cache_BE = '$menge' WHERE id = '$id' LIMIT 1");
}
}
function ProjektNeueAufgabe()
{
$id = (int)$this->app->Secure->GetGET('id');
$aufgabe = $this->app->erp->CreateAufgabe(0,"");
$this->app->DB->Update("UPDATE aufgabe SET projekt='$id' WHERE id='$aufgabe'");
$this->app->Location->execute('index.php?module=aufgaben&action=edit&id='.$aufgabe);
}
function ProjektArtikelEdit()
{
$id = (int)$this->app->Secure->GetGET('id');
$artikelid = $this->app->DB->Select("SELECT artikel FROM projekt_artikel WHERE id='$id' LIMIT 1");
$this->app->Location->execute('index.php?module=artikel&action=edit&id='.$artikelid);
}
function ProjektCopy()
{
$id = (int)$this->app->Secure->GetGET('id');
if($id && $this->app->erp->UserProjektRecht($id))
{
$newid = $this->app->erp->CopyProjekt($id);
if($newid)
{
$msg = $this->app->erp->base64_url_encode("<div class=\"info\">Das Projekt wurde erfolgreich kopiert.</div>");
$this->app->Location->execute('index.php?module=projekt&action=list&msg='.$msg);
}
$msg = $this->app->erp->base64_url_encode("<div class=\"error\">Fehler beim Kopieren des Projekts.</div>");
}else{
$msg = $this->app->erp->base64_url_encode("<div class=\"error\">Fehlende Projektrechte: Das Projekt wurde nicht kopiert.</div>");
}
$this->app->Location->execute('index.php?module=projekt&action=list&msg='.$msg);
}
function ProjektMitgliederDelete()
{
$id = (int)$this->app->Secure->GetGET('id');
$projekt = (int)$this->app->DB->Select("SELECT projekt FROM adresse_rolle WHERE id = '$id' LIMIT 1");
$adresse = (int)$this->app->DB->Select("SELECT adresse FROM adresse_rolle WHERE id = '$id' LIMIT 1");
if($projekt && $adresse && $this->app->erp->UserProjektRecht($projekt))
{
$this->app->DB->Update("UPDATE adresse_rolle SET bis = DATE_SUB(curdate(),INTERVAL 1 DAY) WHERE objekt like 'Projekt' AND id = '$id' LIMIT 1");
}
$this->app->Location->execute('index.php?module=projekt&action=mitglieder&id='.$projekt);
}
function ProjektMitglieder()
{
$id = (int)$this->app->Secure->GetGET('id');
$this->app->Tpl->Set('ID',$id);
if($this->app->Secure->GetGET('cmd') === 'adresse')
{
$adresse = $this->app->DB->Select("SELECT adresse FROM adresse_rolle WHERE id = '$id' LIMIT 1");
$this->app->Location->execute('index.php?module=adresse&action=edit&id='.$adresse);
}
if($this->app->Secure->GetPOST('hinzufuegen'))
{
$adresse = explode(' ',$this->app->Secure->GetPOST('adresse'));
$adresse = (int)$adresse[0];
$rolle = $this->app->Secure->GetPOST('rolle');
$rollen = array('Kunde','Mitarbeiter','Mitglied','Lieferant');//'Projektleiter','Lieferant','Externer Mitarbeiter');
if($adresse && in_array($rolle, $rollen))
{
$check = $this->app->DB->Select("SELECT id FROM adresse_rolle WHERE adresse = '$adresse' AND projekt = '$id' AND objekt like 'Projekt' AND subjekt LIKE '$rolle' LIMIT 1");
if($check)
{
$this->app->DB->Update("UPDATE adresse_rolle SET von = curdate() WHERE id = '$check' AND von > curdate() LIMIT 1");
$this->app->DB->Update("UPDATE adresse_rolle SET bis = '0000-00-00' WHERE id = '$check' LIMIT 1");
}else{
$this->app->DB->Insert("INSERT INTO adresse_rolle (adresse, objekt, subjekt, projekt, praedikat, von, bis, parameter) VALUES ('$adresse','Projekt','$rolle','$id','von',now(),'0000-00-00','$id')");
}
$this->app->Tpl->Add('MESSAGE','<div class="info">Rolle '.$rolle.' angelegt</div>');
}
}
$this->ProjektMenu();
$projektabgeschlossen = false;
if($this->app->DB->Select("SELECT id FROM projekt WHERE id = '$id' AND status = 'abgeschlossen' LIMIT 1"))$projektabgeschlossen = true;
if($projektabgeschlossen)$this->app->Tpl->Set('BUTTONDISABLED',' disabled ');
$this->app->YUI->AutoComplete('adresse','adresse');
$this->app->YUI->TableSearch('TAB1',"projekt_mitglieder");
$this->app->Tpl->Parse('PAGE',"projekt_mitglieder.tpl");
}
/**
* @param int $projectId
*
* @return array
*/
protected function BuildProjectScheduleData($projectId)
{
$projectId = (int)$projectId;
$milestonesData = $this->GetProjectScheduleMilestonesData($projectId);
$packagesData = $this->GetProjectSchedulePackagesData($projectId);
$data = array_merge([$milestonesData], $packagesData);
return $data;
}
/**
* Arbeitspakete für Gantt-Diagramm laden
*
* @param int $projectId
*
* @return array
*/
protected function GetProjectSchedulePackagesData($projectId)
{
$projectId = (int)$projectId;
$colorClasses = [
'offen' => 'ganttGreen',
'aktiv' => 'ganttGreen',
'abgeschlossen' => 'ganttBlue',
'abgerechnet' => 'ganttBlue',
];
$data = [];
$packages = $this->app->DB->SelectArr(
sprintf(
"SELECT
ap.id, ap.aufgabe AS title, ap.beschreibung AS description, ap.status,
ap.farbe AS color,
ap.vorgaenger AS predecessor, ap.sort AS sorting,
ap.startdatum AS date_from, ap.abgabedatum AS date_to,
ad.name AS responsible_name,
IFNULL(
(SELECT COUNT(`id`) FROM `wiedervorlage` WHERE `subproject_id` = ap.id AND `abgeschlossen` = 0)
,0
)
AS `resubmissions_open`,
IFNULL(
(SELECT COUNT(`id`) FROM `wiedervorlage` WHERE `subproject_id` = ap.id AND `abgeschlossen` = 1)
,0
)
AS `resubmissions_closed` ,
IFNULL(
(SELECT COUNT(`id`) FROM `aufgabe` WHERE `teilprojekt` = ap.id AND `status` = 'offen')
,0
)
AS `tasks_open`,
IFNULL(
(SELECT COUNT(`id`) FROM `aufgabe` WHERE `teilprojekt` = ap.id AND `status` = 'abgeschlossen')
,0
)
AS `tasks_closed`
FROM `arbeitspaket` AS `ap`
LEFT JOIN `adresse` AS `ad` ON ap.adresse = ad.id AND ad.geloescht = 0
AND ad.mitarbeiternummer != '' AND ad.mitarbeiternummer != '0'
WHERE ap.geloescht != 1 AND ap.projektplanausblenden != 1 AND ap.projekt = %d
ORDER BY ap.vorgaenger, ap.sort, ap.aufgabe",
$projectId
)
);
$packages = $this->SortProjectSchedulePackagesData($packages);
foreach ($packages as $package) {
$label = '';
$customClass = array_key_exists($package['status'], $colorClasses) ? $colorClasses[$package['status']] : 'ganttGray';
$dateFrom = !empty($package['date_from']) && $package['date_from'] !== '0000-00-00' ? strtotime($package['date_from']) : null;
$dateTo = !empty($package['date_to']) && $package['date_to'] !== '0000-00-00' ? strtotime($package['date_to']) : null;
$package['responsible_name'] .= sprintf(
' %d/%d',
(int)$package['resubmissions_closed'] + (int)$package['tasks_closed'],
(int)$package['resubmissions_open'] + (int)$package['tasks_open']
);
if ($dateFrom === null && $dateTo === null) {
$customClass = 'ganttOrange';
$label = 'Kein Start und Abgabedatum gewählt';
$dateFrom = time();
$dateTo = time() + (60 * 60 * 24 * 7); // Sieben Tage
}
if ($dateFrom === null && $dateTo > 0) {
$customClass = 'ganttOrange';
$label = 'Startdatum fehlt';
$dateFrom = $dateTo - (60 * 60 * 24 * 7); // Sieben Tage
}
if ($dateFrom > 0 && $dateTo === null) {
$customClass = 'ganttOrange';
$label = 'Abgabedatum fehlt';
$dateTo = $dateFrom + (60 * 60 * 24 * 7); // Sieben Tage
}
if ($package['status'] === 'aktiv' || $package['status'] === 'offen') {
if(time() > $dateTo){
$customClass = 'ganttRed'; // Überfällig
}
}
$customColor = strtoupper($package['color']) !== '#FFFFFF' ? $package['color'] : null;
$isRootPackage = (int)$package['predecessor'] === 0;
$data[] = [
'name' => $isRootPackage ? $package['title'] : '',
'desc' => !$isRootPackage ? $package['title'] : '',
'values' => [[
'from' => '/Date(' . $dateFrom . '000)/',
'to' => '/Date(' . $dateTo . '000)/',
'label' => !empty($label) ? $label : $package['responsible_name'],
'customClass' => empty($customColor) ? $customClass : null,
'dataObj' => [
'type' => 'package',
'projectId' => $projectId,
'packageId' => (int)$package['id'],
'color' => $customColor,
'level' => count($package['parents']),
],
]],
];
}
return $data;
}
/**
* Meilensteine für Gantt-Diagramm laden
*
* @param int $projectId
*
* @return array
*/
protected function GetProjectScheduleMilestonesData($projectId)
{
$projectId = (int)$projectId;
$milestones = $this->app->DB->SelectArr(
"SELECT
e.id, e.bezeichnung AS title, e.beschreibung AS description, e.color,
e.von AS datetime_from, e.bis AS datetime_to
FROM kalender_event AS e
WHERE e.typ = 'meilenstein' AND e.projekt = '{$projectId}' AND e.von != '0000-00-00 00:00:00'
ORDER BY e.von ASC, e.bis ASC"
);
$values = [];
foreach ($milestones as $milestone) {
$datetimeFrom = strtotime($milestone['datetime_from']);
$datetimeTo = !empty($milestone['datetime_to']) && $milestone['datetime_to'] !== '0000-00-00 00:00:00' ? strtotime($milestone['datetime_to']) : $datetimeFrom + (60 * 60 * 8);
$values[] = [
'from' => '/Date(' . $datetimeFrom . '000)/',
'to' => '/Date(' . $datetimeTo . '000)/',
'label' => $milestone['title'],
'dataObj' => [
'type' => 'milestone',
'projectId' => $projectId,
'milestoneId' => (int)$milestone['id'],
'color' => !empty($milestone['color']) && strtoupper($milestone['color']) !== '#FFFFFF' ? $milestone['color'] : '#0B8092',
],
];
}
return [
'name' => 'Meilensteine',
'values' => $values,
];
}
/**
* Arbeitspakete für Gantt-Diagramm sortieren; anhand der Projekt-Hirarchie
*
* @param array $packages
*
* @return array
*/
protected function SortProjectSchedulePackagesData($packages)
{
foreach ($packages as &$package) {
$package['parents'] = $this->GetProjectSchedulePackageParents($package['id'], $packages, []);
$package['parents'] = array_reverse($package['parents']);
$parentsWithPadding = array_map(function ($parentId) {
return str_pad($parentId, 3, '0', STR_PAD_LEFT);
}, $package['parents']);
$package['path'] = implode('-', $parentsWithPadding);
}
unset($package);
// Rebuild array: Sort by path
$paths = array_column($packages, 'path');
$result = array_combine($paths, $packages);
ksort($result);
// Drop index; only needed for sorting
return array_values($result);
}
/**
* Alle Eltern eines Arbeitspaketes finden; bzw. deren Sortierungswert
*
* @param int $childId
* @param array $packages
* @param array $foundParents
*
* @return array
*/
protected function GetProjectSchedulePackageParents($childId, array $packages, array $foundParents = [])
{
$childId = (int)$childId;
foreach ($packages as $package) {
if ((int)$package['id'] === $childId) {
$parentId = (int)$package['predecessor'];
$foundParents[] = (int)$package['sorting'];
$foundParents = $this->GetProjectSchedulePackageParents($parentId, $packages, $foundParents);
}
}
return $foundParents;
}
/**
* Projektplan für alle Projekte als CSV-Download senden
*
* @return void
*/
protected function SendOverviewProjectScheduleCsvDownload()
{
$projects = $this->app->DB->SelectArr("SELECT p.id FROM projekt AS p WHERE p.status != 'abgeschlossen'");
$overview = [];
foreach ($projects as $project) {
$packages = $this->FetchProjectScheduleForCsvDownload($project['id']);
$overview = array_merge($overview, $packages);
}
$this->GenerateCsvDownloadFromPackages($overview);
}
/**
* Projektplan für einzelnes Projekt als CSV-Download senden
*
* @param int $projectId
*
* @return void
*/
protected function SendSingleProjectScheduleCsvDownload($projectId)
{
$projectId = (int)$projectId;
$packages = $this->FetchProjectScheduleForCsvDownload($projectId);
$this->GenerateCsvDownloadFromPackages($packages);
}
/**
* @param int $projectId
*
* @return array
*/
protected function FetchProjectScheduleForCsvDownload($projectId)
{
$projectId = (int)$projectId;
$packages = $this->app->DB->SelectArr(
"SELECT
ap.id, ap.aufgabe AS title, ap.beschreibung AS description, ap.status, ap.farbe AS color,
ap.vorgaenger AS predecessor, ap.sort AS sorting, ap.startdatum AS date_from, ap.abgabedatum AS date_to,
ad.name AS person_name, ad.mitarbeiternummer AS person_number,
p.id AS project_id, p.name AS project_name, p.abkuerzung AS project_abbr
FROM arbeitspaket AS ap
INNER JOIN projekt AS p ON ap.projekt = p.id
LEFT JOIN adresse AS ad ON ap.adresse = ad.id
WHERE ap.geloescht != 1 AND ap.projektplanausblenden != 1 AND ap.projekt = '{$projectId}'
ORDER BY ap.vorgaenger, ap.sort, ap.aufgabe"
);
$packages = $this->SortProjectSchedulePackagesData($packages);
return $packages;
}
/**
* @param array $packages
*
* @return void
*/
protected function GenerateCsvDownloadFromPackages($packages)
{
$colNames = [
'Projekt-Kürzel',
'Projekt-Name',
'Arbeitspaket',
'Beschreibung',
'Status',
'Startdatum',
'Abgabedatum',
'Mitarbeiter-Nr',
'Mitarbeiter-Name',
];
$packagesCollection = new FormatterCollection($packages, function ($package) {
$dateFrom = !empty($package['date_from']) && $package['date_from'] !== '0000-00-00' ? strtotime($package['date_from']) : null;
$dateTo = !empty($package['date_to']) && $package['date_to'] !== '0000-00-00' ? strtotime($package['date_to']) : null;
return [
$package['project_abbr'],
$package['project_name'],
$package['title'],
$package['description'],
$package['status'],
$dateFrom !== null ? date('d.m.Y', $dateFrom) : '',
$dateTo !== null ? date('d.m.Y', $dateTo) : '',
(string)$package['person_number'],
(string)$package['person_name'],
];
});
$config = new CsvConfig(';', '"');
$exporter = new CsvExporter($config);
$data = new DataCollection([$colNames], $packagesCollection);
$handle = $exporter->exportToResource('php://memory', $data);
rewind($handle);
$stat = fstat($handle);
header('Cache-Control: must-revalidate');
header('Pragma: must-revalidate');
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="projektplan.csv"');
header('Content-Length: ' . $stat['size']);
fpassthru($handle);
fclose($handle);
$this->app->ExitXentral();
}
function ProjektDelnumber()
{
$id = $this->app->Secure->GetGET("id");
$nummer = $this->app->Secure->GetGET("nummer");
$cmd = $this->app->Secure->GetGET("cmd");
$projekt = $this->app->DB->SelectArr("SELECT * from projekt where id = '$id' LIMIT 1");
if($projekt)
{
$projekt = reset($projekt);
if(isset($projekt['next_'.$cmd]))$this->app->DB->Update("UPDATE projekt set ".'next_'.$cmd."='' where id = '$id'");
}
$this->app->Location->execute('index.php?module=projekt&action=edit&id='.$id.'#tabs-4');
}
function ProjektNextnumber()
{
$id = (int)$this->app->Secure->GetGET('id');
$nummer = $this->app->Secure->GetGET('nummer');
$cmd = $this->app->Secure->GetGET('cmd');
$projekt = $this->app->DB->SelectRow(sprintf('SELECT * from projekt where id = %d LIMIT 1',$id));
if($cmd != '' && !empty($projekt))
{
if(isset($projekt['next_'.$cmd])){
$this->app->DB->Update(
sprintf(
"UPDATE projekt set `%s` = '%s' where id = %d"
,'next_'.$cmd, $nummer, $id
)
);
}
}
$this->app->Location->execute('index.php?module=projekt&action=edit&id='.$id.'#tabs-4');
}
function ProjektGetNextNumber()
{
$id = $this->app->Secure->GetGET('id');
$projekt = $this->app->DB->SelectArr(sprintf('SELECT * from projekt where id = %d LIMIT 1', $id));
if($projekt)
{
echo json_encode($projekt[0]);
}
$this->app->ExitXentral();
}
function ProjektArbeitsnachweisPDF()
{
$date = $this->app->Secure->GetGET('date');
$Brief = new ArbeitsnachweisPDF($this->app);
$Brief->GetArbeitsnachweis($date);
$Brief->displayDocument();
$this->app->ExitXentral();
}
function ProjektPlan()
{
$id = $this->app->Secure->GetGET('id');
$this->ProjektMenu();
$startarbeitspaket = 0;
$baumtiefe = $this->ProjektPlanRekrusiv($id,$startarbeitspaket);
$arbeitspakete = $this->ProjektPlanArbeitspaketeinReihenfolge($id,$baumtiefe);
asort($arbeitspakete);
$beschreibung = $this->app->DB->Select("SELECT beschreibung FROM projekt WHERE id='".$id."'");
$this->app->Tpl->Add('TAB1',"<h1>&Uuml;bersicht</h1><br><style>.border {border: 1px solid black;}</style>");
$this->app->Tpl->Add('TAB1',"<table width=700><tr><td>".nl2br($beschreibung)."</td></tr></table><br>");
$this->app->Tpl->Add('TAB1',"<h1>Umfang</h1><br>");
$this->app->Tpl->Add('TAB1',"<table border=0 class=border cellspacing=0 cellpadding=3 width=\"65%\">");
$pos = 1;
foreach($arbeitspakete as $key=>$value)
{
$arbeitspaketeArr = $this->app->DB->SelectRow(sprintf('SELECT * FROM arbeitspaket WHERE id= %d ', (int)$key));
$aufgabe = $arbeitspaketeArr['aufgabe'];
$vorgaenger = $arbeitspaketeArr['vorgaenger'];
$art = $arbeitspaketeArr['art'];
if($art==='meilenstein'){
$this->app->Tpl->Add('TAB1', "<tr><td width=20 class=border>$pos</td><td width=300 class=border><b>" . $aufgabe . "</b></td>");
}
else{
$this->app->Tpl->Add('TAB1', "<tr><td width=20 class=border>$pos</td><td width=300 class=border>" . $aufgabe . "</td>");
}
$painted=false;
for($j=0;$j<$baumtiefe;$j++)
{
if($vorgaenger==$this->voraengerbaum[$j] && $painted==false){
$this->app->Tpl->Add('TAB1',"<td width=20 class=border><b>X</b></td>");
$painted=true;
}
else{
$this->app->Tpl->Add('TAB1', "<td width=20 class=border>&nbsp;</td>");
}
}
$this->app->Tpl->Add('TAB1',"</tr>");
$pos++;
}
$this->app->Tpl->Add('TAB1',"</table><br><br>");
$this->app->Tpl->Add('TAB1',"<h1>Details</h1><br>");
$pos = 1;
foreach($arbeitspakete as $key=>$value)
{
$aufgabe = $this->app->DB->Select("SELECT aufgabe FROM arbeitspaket WHERE id='".$key."'");
$vorgaenger = $this->app->DB->Select("SELECT vorgaenger FROM arbeitspaket WHERE id='".$key."'");
$art = $this->app->DB->Select("SELECT UPPER(art) FROM arbeitspaket WHERE id='".$key."'");
$beschreibung = $this->app->DB->Select("SELECT beschreibung FROM arbeitspaket WHERE id='".$key."'");
$vorgaenger_aufgabe = $this->app->DB->Select("SELECT aufgabe FROM arbeitspaket WHERE id='".$vorgaenger."'");
$abgabe_bis = $this->app->DB->Select("SELECT DATE_FORMAT(abgabedatum,'%d.%m.%Y') FROM arbeitspaket WHERE id='".$key."'");
$startdatum = $this->app->DB->Select("SELECT DATE_FORMAT(startdatum,'%d.%m.%Y') FROM arbeitspaket WHERE id='".$key."'");
if($abgabe_bis!=="00.00.0000" && $abgabe_bis!="")
$abgabe_bis = "<br>Abgabe bis $abgabe_bis";
$zeit_geplant = $this->app->DB->Select("SELECT zeit_geplant FROM arbeitspaket WHERE id='".$key."'");
$kosten_geplant = $this->app->DB->Select("SELECT kosten_geplant FROM arbeitspaket WHERE id='".$key."'");
$gesamt_zeit = $gesamt_zeit + $zeit_geplant;
$gesamt_kosten = $gesamt_kosten + $kosten_geplant;
if($zeit_geplant==="0.00") $zeit_geplant="-"; else $zeit_geplant=$zeit_geplant." h";
if($kosten_geplant==="0.00") $kosten_geplant="-"; else $kosten_geplant = $kosten_geplant." ".$this->projektwaehrung;
if($art==='MEILENSTEIN')
{
$kostentabelle = 'Meilenstein (keine Kosten)';
} else {
$kostentabelle = "<table border=0 width=200>
<tr><td>Stunden:</td><td>$zeit_geplant</td></tr>
<tr><td>oder Fixkosten:</td><td>$kosten_geplant</td></tr>
</table>";
}
$this->app->Tpl->Add('TAB1',"<br><h2>".$pos.". $aufgabe ($art)</h2><br>
<table border=0 cellpadding=5 width=700 class=border>
<tr><td><b>Beschreibung:</b></td><td><b>Aufwand:</b></td></tr>
<tr valign=top><td width=420>".nl2br($beschreibung)."</td><td>
$kostentabelle
$abgabe_bis
</td></tr></table>");
$pos++;
}
//Material
$this->app->Tpl->Add('TAB1',"<h1>Material</h1>");
$material = $this->app->DB->SelectArr("SELECT * FROM arbeitspaket
WHERE projekt='$id' AND art='material'");
if(!empty($material)){
foreach($material as $materialRow) {
$aufgabe = $materialRow['aufgabe'];
$beschreibung = $materialRow['beschreibung'];
$kosten_geplant = $materialRow['kosten_geplant'];
$this->app->Tpl->Add('TAB1', "
<table border=0 cellpadding=5 width=700 class=border>
<tr><td><b>Material:</b>$aufgabe</td><td><b>Kosten:</b></td></tr>
<tr valign=top><td width=420>" . nl2br($beschreibung) . "</td><td>
<table border=0 width=200>
<tr><td>Komplett:</td><td>$kosten_geplant " . $this->projektwaehrung . "</td></tr>
</table>
</td></tr></table><br>");
$gesamt_kosten = $gesamt_kosten + $kosten_geplant;
}
}
$stundensatz = "65";
$gesamt = $gesamt_kosten + $gesamt_zeit*$stundensatz;
$this->app->Tpl->Add('TAB1',"<h1>Kosten</h1>
<table border=0 cellpadding=5 width=700 class=border>
<tr><td>Gesamt:</td></tr>
<tr valign=top><td>
<table border=0 width=100%>
<tr><td width=430>Stunden:</td><td>$gesamt_zeit h (&#225; $stundensatz ".$this->projektwaehrung.")</td></tr>
<tr><td>externe Kosten:</td><td>$gesamt_kosten ".$this->projektwaehrung."</td></tr>
<tr><td>Gesamt:</td><td><b>$gesamt ".$this->projektwaehrung."</b>&nbsp;(zzgl. gesetzl. MwSt.)</td></tr>
</table>
</td></tr></table>
");
$this->app->Tpl->Set('TABTEXT',"Projektplan");
$this->app->Tpl->Parse('PAGE',"tabview.tpl");
}
function ProjektPlanArbeitspaketeinReihenfolge($id,$baumtiefe)
{
$arbeitspakete = $this->app->DB->SelectArr("SELECT * FROM arbeitspaket WHERE projekt='$id' AND art!='material'");
if(empty($arbeitspakete)) {
return [];
}
$reihenfolge = array();
foreach($arbeitspakete as $arbeitspaket)
{
for($j=0;$j<$baumtiefe;$j++)
{
if($arbeitspaket['vorgaenger']==$this->voraengerbaum[$j]){
$reihenfolge[$arbeitspaket['id']]=$j;
$j=$baumtiefe;
}
}
}
return $reihenfolge;
}
function ProjektPlanRekrusiv($projekt,$id)
{
$arbeitspakete = $this->app->DB->SelectArr("SELECT * FROM arbeitspaket
WHERE projekt='$projekt' AND vorgaenger='".$id."' AND art!='material'");
if(empty($arbeitspakete)) {
return 0;
}
$anzahl = 0;
foreach($arbeitspakete as $arbeitspaket)
{
$this->voraengerbaum[]=$arbeitspaket['vorgaenger'];
$anzahl++;
$anzahl = $anzahl + $this->ProjektPlanRekrusiv($projekt,$arbeitspaket['id']);
}
return $anzahl;
}
function ProjektPDF()
{
$id = $this->app->Secure->GetGET('id');
// $belegnr = $this->app->DB->Select("SELECT belegnr FROM angebot WHERE id='$id' LIMIT 1");
// if(is_numeric($belegnr) && $belegnr!=0)
if($id > 0){
$Brief = new ProjektPDF($this->app);
$Brief->GetProjekt($id);
$Brief->displayDocument();
} //else
// $this->app->Tpl->Set(MESSAGE,"<div class=\"error\">Noch nicht freigegebene Angeboten k&ouml;nnen nicht als PDF betrachtet werden.!</div>");
$this->ProjektList();
}
function ProjektDelete()
{
$ref = $_SERVER['HTTP_REFERER'];
$id = $this->app->Secure->GetGET('id');
if(is_numeric($id) && $id > 0) {
$this->app->DB->Delete("DELETE FROM projekt WHERE id='$id' LIMIT 1");
$this->app->DB->Delete("DELETE FROM geschaeftsbrief_vorlagen WHERE projekt='$id'");
}
$this->app->Location->execute($ref);
}
function getProjektArtikel($id)
{
$arbeitspakete = null;
$this->getProjektBaum($arbeitspakete, 0, $id, '', null, true);
$artikel = null;
$ind = $this->getProjektArtikelBaum($artikel, 0, $id, 0);
$i = 0;
foreach($arbeitspakete as $paket)
{
$i++;
if($i < count($arbeitspakete))
{
$tmp = null;
$ind = $this->getProjektArtikelBaum($tmp, 0, $id, $paket['id'],'',$ind);
if($tmp)
{
foreach($tmp as $v)$artikel[] = $v;
unset($tmp);
}
}
}
return $artikel;
}
function getProjektArtikelBaum(&$artikel, $parent, $projekt, $teilprojekt, $nr = '', $i = 0)
{
$res = $this->app->DB->SelectArr("SELECT pa.*, a.nummer, a.name_de FROM projekt_artikel pa LEFT JOIN artikel a ON pa.artikel = a.id WHERE pa.parent = '$parent' AND pa.projekt = '$projekt' AND pa.teilprojekt = '$teilprojekt' ORDER by pa.sort, a.name_de");
if($res)
{
foreach($res as $k => $v)
{
$i++;
$v['nr_alt'] = $v['nr'];
if($nr != '')
{
$v['nr'] = $nr.'.'.$i;
}else{
$v['nr'] = $i;
}
$artikel[] = $v;
$this->getProjektArtikelBaum($artikel, $v['id'], $projekt, $teilprojekt, $v['nr']);
}
}
return $i;
}
function getProjektBaum(&$projekte, $vorgaenger, $projekt, $nr = '', $liste = null, $onlynummertitel = false)
{
if($liste === null)
{
for($i = 0; $i <= 22; $i++) {
$liste[] = 0;
}
}
$zeit_summiert = $liste[0];
$gebucht_summiert = $liste[1];
$kosten_summiert = $liste[2];
$abgerechnet_summiert = $liste[3];
$offen_summiert = $liste[4];
$gesamt_zeit_ek_geplant = $liste[5];
$gesamt_zeit_ek_gebucht = $liste[6];
$gesamt_zeit_ek_offen = $liste[7];
$gesamt_zeit_vk_geplant = $liste[8];
$gesamt_zeit_vk_gebucht = $liste[9];
$gesamt_zeit_vk_offen = $liste[10];
$gesamt_artikel_ek_geplant = $liste[11];
$gesamt_artikel_ek_gebucht = $liste[12];
$gesamt_artikel_ek_offen = $liste[13];
$gesamt_artikel_vk_geplant = $liste[14];
$gesamt_artikel_vk_gebucht = $liste[15];
$gesamt_artikel_vk_offen = $liste[16];
$gesamt_rohertrag_zeit = $liste[17];
$gesamt_rohertrag_artikel = $liste[18];
$gesamt_rohertrag_gesamt = $liste[19];
$gesamt_rohertrag_zeit_geplant = $liste[20];
$gesamt_rohertrag_artikel_geplant = $liste[21];
$gesamt_rohertrag_gesamt_geplant = $liste[22];
$res = $this->app->DB->SelectArr("SELECT * FROM arbeitspaket WHERE geloescht != 1 AND vorgaenger = '$vorgaenger' AND projekt = '$projekt' ORDER by sort, aufgabe");
if($res)
{
$i = 0;
foreach($res as $k => $v)
{
$i++;
if($nr != '')
{
$v['nr'] = $nr.'.'.$i;
}else{
$v['nr'] = $i;
}
if(!$onlynummertitel)
{
if($v['adresse'])
{
$v['verantwortlicher'] = $this->app->DB->Select("SELECT name FROM adresse WHERE id = '".$v['adresse']."' LIMIT 1");
}else{
$v['verantwortlicher'] = '';
}
$zeit_summiert += $v['zeit_geplant'];
if($v['artikel_geplant']){
$v['nummer'] = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = '".$v['artikel_geplant']."' LIMIT 1");
/*$v['BE'] = $this->app->DB->Select("SELECT sum(bp.menge) FROM bestellung b INNER JOIN bestellung_position bp ON b.id = bp.bestellung WHERE bp.artikel = '".$v['artikel_geplant']."' ");
$v['PR'] = $this->app->DB->Select("SELECT sum(bp.menge) FROM produktion b INNER JOIN produktion_position bp ON b.id = bp.produktion WHERE bp.artikel = '".$v['artikel_geplant']."' ");
$v['AN'] = $this->app->DB->Select("SELECT sum(bp.menge) FROM angebot b INNER JOIN angebot_position bp ON b.id = bp.angebot WHERE bp.artikel = '".$v['artikel_geplant']."' ");
$v['AB'] = $this->app->DB->Select("SELECT sum(bp.menge) FROM auftrag b INNER JOIN auftrag_position bp ON b.id = bp.auftrag WHERE bp.artikel = '".$v['artikel_geplant']."' ");
$v['LS'] = $this->app->DB->Select("SELECT sum(bp.menge) FROM lieferschein b INNER JOIN lieferschein_position bp ON b.id = bp.lieferschein WHERE bp.artikel = '".$v['artikel_geplant']."' ");
$v['RE'] = $this->app->DB->Select("SELECT sum(bp.menge) FROM rechnung b INNER JOIN rechnung_position bp ON b.id = bp.rechnung WHERE bp.artikel = '".$v['artikel_geplant']."' ");
$v['GS'] = $this->app->DB->Select("SELECT sum(bp.menge) FROM gutschrift b INNER JOIN gutschrift_position bp ON b.id = bp.gutschrift WHERE bp.artikel = '".$v['artikel_geplant']."' ");*/
if(!$v['BE'])$v['BE'] = '-';
if(!$v['PR'])$v['PR'] = '-';
if(!$v['AN'])$v['AN'] = '-';
if(!$v['AB'])$v['AB'] = '-';
if(!$v['LS'])$v['LS'] = '-';
if(!$v['RE'])$v['RE'] = '-';
if(!$v['GS'])$v['GS'] = '-';
}else{
$v['nummer'] = '-';
$v['BE'] = '-';
$v['PR'] = '-';
$v['AN'] = '-';
$v['AB'] = '-';
$v['LS'] = '-';
$v['RE'] = '-';
$v['GS'] = '-';
}
$v['status'] = strtoupper($v['status']);
$v['zeit_gebucht'] = ((int)$this->app->DB->Select("SELECT sum( TIME_TO_SEC( TIMEDIFF( bis, von ) )) FROM `zeiterfassung` WHERE arbeitspaket = '".$v['id']."' "))/3600;
$v['zeit_abgerechnet'] = ((int)$this->app->DB->Select("SELECT sum( TIME_TO_SEC( TIMEDIFF( bis, von ) )) FROM `zeiterfassung` WHERE arbeitspaket = '".$v['id']."' AND abgerechnet = 1"))/3600;
//$v['zeit_abgerechnet'] = ((int)$this->app->DB->Select("SELECT sum( TIME_TO_SEC( TIMEDIFF( bis, von ) )) FROM `zeiterfassung` WHERE arbeitspaket = '".$v['id']."' AND abgerechnet = 1"))/3600;
//$v['zeit_offen'] = ((int)$this->app->DB->Select("SELECT sum( TIME_TO_SEC( TIMEDIFF( bis, von ) )) FROM `zeiterfassung` WHERE arbeitspaket = '".$v['id']."' AND status <> 'abgeschlossen' "))/3600;
$v['zeit_offen'] = $v['zeit_geplant'] - ((int)$this->app->DB->Select("SELECT sum( TIME_TO_SEC( TIMEDIFF( bis, von ) )) FROM `zeiterfassung` WHERE arbeitspaket = '".$v['id']."'"))/3600;;
$gebucht_summiert += $v['zeit_gebucht'];
$abgerechnet_summiert += $v['zeit_abgerechnet'];
$offen_summiert += $v['zeit_offen'];
$v['zeit_ek_geplant'] = $v['ek_geplant']*($v['kalkulationbasis'] === 'pauschale'?1:$v['zeit_geplant']);
$v['zeit_ek_gebucht'] = 0;//$v['ek_geplant']*($v['kalkulationbasis'] == 'pauschale'?1:$v['zeit_gebucht']);
if($v['zeit_gebucht'])
{
$stundenmitstundensatz = (float)$this->app->DB->Select("SELECT sum( TIME_TO_SEC( TIMEDIFF( bis, von ) ) / 3600) FROM `zeiterfassung` WHERE arbeitspaket = '".$v['id']."' AND stundensatz > 0");
$zeitmitstundensatz = (float)$this->app->DB->Select("SELECT sum( TIME_TO_SEC( TIMEDIFF( bis, von ) ) / 3600 * stundensatz ) FROM `zeiterfassung` WHERE arbeitspaket = '".$v['id']."' AND stundensatz > 0");
if($v['kalkulationbasis'] === 'pauschale')
{
$v['zeit_ek_gebucht'] = $zeitmitstundensatz+(($v['zeit_gebucht']-$stundenmitstundensatz) / ($v['zeit_geplant']?$v['zeit_geplant']:1))*$v['ek_geplant'];
}else{
$v['zeit_ek_gebucht'] = $zeitmitstundensatz+($v['zeit_gebucht']-$stundenmitstundensatz)*$v['ek_geplant'];
}
}
$v['zeit_ek_offen'] = $v['ek_geplant']*($v['kalkulationbasis'] === 'pauschale'?($v['zeit_ek_gebucht'] > 0?0:1):$v['zeit_offen']);
$v['zeit_vk_geplant'] = $v['vk_geplant']*($v['vkkalkulationbasis'] === 'pauschale'?1:$v['zeit_geplant']);
$v['zeit_vk_gebucht'] = 0;//$v['vk_geplant']*($v['vkkalkulationbasis'] == 'pauschale'?1:$v['zeit_gebucht']);
$v['zeit_vk_offen'] = $v['vk_geplant']*($v['vkkalkulationbasis'] === 'pauschale'?($v['zeit_vk_gebucht'] > 0?0:1):$v['zeit_offen']);
$v['rohertrag_zeit'] = $v['zeit_vk_geplant'] - $v['zeit_ek_gebucht'];
$v['rohertrag_zeit_geplant'] = $v['zeit_vk_geplant'] - $v['zeit_ek_geplant'];
$artikelliste = $this->app->DB->SelectArr("SELECT pa.* FROM projekt_artikel pa INNER JOIN artikel a ON pa.artikel = a.id WHERE pa.projekt = '$projekt' AND pa.teilprojekt = '".$v['id']."' AND a.geloescht <> 1 AND a.nummer <> 'DEL'");
$v['artikel_vk_geplant'] = 0;
$v['artikel_vk_gebucht'] = 0;
$v['artikel_ek_geplant'] = 0;
$v['artikel_ek_gebucht'] = 0;
if($artikelliste)
{
foreach($artikelliste as $art)
{
if($art['kalkulationbasis'] === 'prostueck')
{
if($art['showinmonitoring'])$v['artikel_vk_geplant'] += $art['vk_geplant'] * $art['geplant'];
if($art['showinmonitoring'])$v['artikel_ek_geplant'] += $art['ek_geplant'] * $art['geplant'];
$vk_geplant = $v['vk_geplant'];
$ek_geplant = $v['ek_geplant'];
}else{
$vk_geplant = 0;
$ek_geplant = 0;
if($art['showinmonitoring'])$v['artikel_vk_geplant'] += $art['vk_geplant'];
if($art['showinmonitoring'])$v['artikel_ek_geplant'] += $art['ek_geplant'];
if($art['geplant'] > 0)
{
$vk_geplant = $art['vk_geplant'] / $art['geplant'];
$ek_geplant = $art['ek_geplant'] / $art['geplant'];
}
}
if($vk_geplant)
{
$v['artikel_vk_gebucht'] += (float)$this->app->DB->Select("SELECT sum(rp.menge) FROM rechnung r INNER JOIN rechnung_position rp ON r.id = rp.rechnung AND rp.artikel = '".$art['artikel']."' AND r.status != 'storniert' AND r.status != 'angelegt' AND rp.teilprojekt = '".$v['id']."'");
$v['artikel_vk_gebucht'] -= (float)$this->app->DB->Select("SELECT sum(rp.menge) FROM gutschrift r INNER JOIN gutschrift_position rp ON r.id = rp.gutschrift AND rp.artikel = '".$art['artikel']."' AND r.status != 'storniert' AND r.status != 'angelegt' AND rp.teilprojekt = '".$v['id']."'");
}
if($ek_geplant)
{
$v['artikel_ek_gebucht'] += (float)$this->app->DB->Select("SELECT sum(rp.menge) FROM bestellung r INNER JOIN bestellung_position rp ON r.id = rp.bestellung AND rp.artikel = '".$art['artikel']."' AND r.status != 'storniert' AND r.status != 'angelegt' AND rp.teilprojekt = '".$v['id']."'");
}
}
}
$v['artikel_ek_offen'] = $v['artikel_ek_geplant']-$v['artikel_ek_gebucht'];
$v['artikel_vk_offen'] = $v['artikel_vk_geplant']-$v['artikel_vk_gebucht'];
$v['rohertrag_artikel'] = $v['artikel_vk_gebucht'] - $v['artikel_ek_gebucht'];
$v['rohertrag_gesamt'] = $v['rohertrag_zeit']+$v['rohertrag_artikel'];
$v['rohertrag_artikel_geplant'] = $v['artikel_vk_geplant'] - $v['artikel_ek_geplant'];
$v['rohertrag_gesamt_geplant'] = $v['rohertrag_zeit_geplant']+$v['rohertrag_artikel_geplant'];
$v['prognose_artikel'] = $v['artikel_vk_geplant']-$v['artikel_ek_geplant'];
$v['prognose_zeit'] = $v['zeit_vk_geplant'] - $v['zeit_ek_gebucht'];
$v['prognose_zeit_geplant'] = $v['zeit_vk_geplant'] - $v['zeit_ek_geplant'];
$v['prognose_gesamt'] = $v['prognose_artikel'] + $v['prognose_zeit_geplant'];
$gesamt_artikel_ek_gebucht += $v['artikel_ek_gebucht'];
$gesamt_artikel_ek_offen += $v['artikel_ek_offen'];
$gesamt_artikel_ek_geplant += $v['artikel_ek_geplant'];
$gesamt_artikel_vk_gebucht += $v['artikel_vk_gebucht'];
$gesamt_artikel_vk_offen += $v['artikel_vk_offen'];
$gesamt_artikel_vk_geplant += $v['artikel_vk_geplant'];
$gesamt_zeit_ek_gebucht += $v['zeit_ek_gebucht'];
$gesamt_zeit_ek_offen += $v['zeit_ek_offen'];
$gesamt_zeit_ek_geplant += $v['zeit_ek_geplant'];
$gesamt_zeit_vk_gebucht += $v['zeit_vk_gebucht'];
$gesamt_zeit_vk_offen += $v['zeit_vk_offen'];
$gesamt_zeit_vk_geplant += $v['zeit_vk_geplant'];
$gesamt_rohertrag_artikel += $v['rohertrag_artikel'];
$gesamt_rohertrag_zeit += $v['rohertrag_zeit'];
$gesamt_rohertrag_gesamt += $v['rohertrag_gesamt'];
$gesamt_rohertrag_artikel_geplant += $v['rohertrag_artikel_geplant'];
$gesamt_rohertrag_zeit_geplant += $v['rohertrag_zeit_geplant'];
$gesamt_rohertrag_gesamt_geplant += $v['rohertrag_gesamt_geplant'];
$v['prognose_artikel'] = number_format($v['prognose_artikel'],2,'.','');
$v['prognose_zeit'] = number_format($v['prognose_zeit'],2,'.','');
$v['prognose_zeit_geplant'] = number_format($v['prognose_zeit_geplant'],2,'.','');
$v['prognose_gesamt'] = number_format($v['prognose_gesamt'],2,'.','');
$v['rohertrag_zeit'] = number_format($v['rohertrag_zeit'],2,'.','');
$v['rohertrag_artikel'] = number_format($v['rohertrag_artikel'],2,'.','');
$v['rohertrag_gesamt'] = number_format($v['rohertrag_gesamt'],2,'.','');
$v['rohertrag_zeit_geplant'] = number_format($v['rohertrag_zeit_geplant'],2,'.','');
$v['rohertrag_artikel_geplant'] = number_format($v['rohertrag_artikel_geplant'],2,'.','');
$v['rohertrag_gesamt_geplant'] = number_format($v['rohertrag_gesamt_geplant'],2,'.','');
$v['zeit_ek_geplant'] = number_format($v['zeit_ek_geplant'],2,'.','');
$v['zeit_ek_gebucht'] = number_format($v['zeit_ek_gebucht'],2,'.','');
$v['zeit_ek_offen'] = number_format($v['zeit_ek_offen'],2,'.','');
$v['zeit_vk_geplant'] = number_format($v['zeit_vk_geplant'],2,'.','');
$v['zeit_vk_gebucht'] = number_format($v['zeit_vk_gebucht'],2,'.','');
$v['zeit_vk_offen'] = number_format($v['zeit_vk_offen'],2,'.','');
$v['artikel_vk_geplant'] = number_format($v['artikel_vk_geplant'],2,'.','');
$v['artikel_vk_gebucht'] = number_format($v['artikel_vk_gebucht'],2,'.','');
$v['artikel_vk_offen'] = number_format($v['artikel_vk_offen'],2,'.','');
$v['artikel_ek_geplant'] = number_format($v['artikel_ek_geplant'],2,'.','');
$v['artikel_ek_gebucht'] = number_format($v['artikel_ek_gebucht'],2,'.','');
$v['artikel_ek_offen'] = number_format($v['artikel_ek_offen'],2,'.','');
$v['zeit_gebucht'] = number_format($v['zeit_gebucht'],2,'.','');
$v['zeit_abgerechnet'] = number_format($v['zeit_abgerechnet'],2,'.','');
$v['gebucht_summiert'] = $v['zeit_gebucht'];//number_format($gebucht_summiert,2,'.','');
$v['abgerechnet_summiert'] = number_format($abgerechnet_summiert,2,'.','');
$v['zeit_offen'] = number_format($v['zeit_offen'],2,'.','');
$v['zeit_summiert'] = number_format($v['zeit_geplant'],2,'.','') ; //number_format($zeit_summiert,2,'.','');
$kosten_summiert += (float)$v['kosten_geplant'];
$v['kosten_geplant'] = number_format($v['kosten_geplant'],2,',','.');
}
$projekteindex = empty($projekte)?0:count($projekte);
// checken ob es so besser ist
//foreach($v as $v_key=>$v_value)
// if(trim(strip_tags($v[$v_key]))=="0.00") $v[$v_key]="";
$v['editierbar'] = true;
if($v['zeit_geplant'] > 0 && $this->app->DB->Select("SELECT id FROM `teilprojekt_geplante_zeiten` WHERE teilprojekt = '".$v['id']."' AND stundensatz > 0 AND stunden > 0 LIMIT 1"))
{
$v['editierbar'] = false;
}
$projekte[] = $v;
$oldgebucht_summiert = $gebucht_summiert;
$oldzeit_summiert = $zeit_summiert;
$anzahlteilprojekte = count($projekte);
$liste = $this->getProjektBaum($projekte, $v['id'], $projekt, $v['nr'],
array($zeit_summiert,$gebucht_summiert, $kosten_summiert, $abgerechnet_summiert,$offen_summiert
,$gesamt_zeit_ek_geplant,$gesamt_zeit_ek_gebucht,$gesamt_zeit_ek_offen
,$gesamt_zeit_vk_geplant,$gesamt_zeit_vk_gebucht,$gesamt_zeit_vk_offen
,$gesamt_artikel_ek_geplant,$gesamt_artikel_ek_gebucht,$gesamt_artikel_ek_offen
,$gesamt_artikel_vk_geplant,$gesamt_artikel_vk_gebucht,$gesamt_artikel_vk_offen
,$gesamt_rohertrag_zeit,$gesamt_rohertrag_artikel,$gesamt_rohertrag_gesamt
,$gesamt_rohertrag_zeit_geplant,$gesamt_rohertrag_artikel_geplant,$gesamt_rohertrag_gesamt_geplant
), $onlynummertitel);
if(count($projekte) == $anzahlteilprojekte)
{
//$projekte[count($projekte)-1]['editierbar'] = true;
}
$zeit_summiert = $liste[0];
$gebucht_summiert = $liste[1];
$kosten_summiert = $liste[2];
$abgerechnet_summiert = $liste[3];
$offen_summiert = $liste[4];
$gesamt_zeit_ek_geplant = $liste[5];
$gesamt_zeit_ek_gebucht = $liste[6];
$gesamt_zeit_ek_offen = $liste[7];
$gesamt_zeit_vk_geplant = $liste[8];
$gesamt_zeit_vk_gebucht = $liste[9];
$gesamt_zeit_vk_offen = $liste[10];
$gesamt_artikel_ek_geplant = $liste[11];
$gesamt_artikel_ek_gebucht = $liste[12];
$gesamt_artikel_ek_offen = $liste[13];
$gesamt_artikel_vk_geplant = $liste[14];
$gesamt_artikel_vk_gebucht = $liste[15];
$gesamt_artikel_vk_offen = $liste[16];
$gesamt_rohertrag_zeit = $liste[17];
$gesamt_rohertrag_artikel = $liste[18];
$gesamt_rohertrag_gesamt = $liste[19];
$gesamt_rohertrag_zeit_geplant = $liste[20];
$gesamt_rohertrag_artikel_geplant = $liste[21];
$gesamt_rohertrag_gesamt_geplant = $liste[22];
$projekte[$projekteindex]['gebucht_summiert'] += $gebucht_summiert - $oldgebucht_summiert;
$projekte[$projekteindex]['gebucht_summiert'] = number_format($projekte[$projekteindex]['gebucht_summiert'],2,',','.');
$projekte[$projekteindex]['zeit_summiert'] += $zeit_summiert - $oldzeit_summiert;
$projekte[$projekteindex]['zeit_summiert'] = number_format($projekte[$projekteindex]['zeit_summiert'],2,',','.');
}
}
if($vorgaenger == 0)
{
if(isset($v))unset($v);
$v['nr'] = '';
$v['aufgabe'] = '<b>Summe Gesamt</b>';
$v['nummer'] = '-';
$v['BE'] = '-';
$v['PR'] = '-';
$v['AN'] = '-';
$v['AB'] = '-';
$v['LS'] = '-';
$v['RE'] = '-';
$v['GS'] = '-';
$v['zeit_summiert'] = '<b>'.number_format($zeit_summiert,2).'</b>';
$v['zeit_geplant'] = $v['zeit_summiert'];
$v['gebucht_summiert'] = '<b>'.number_format($gebucht_summiert,2).'</b>';
$v['zeit_gebucht'] = '<b>'.number_format($gebucht_summiert,2).'</b>';
$v['zeit_offen'] = '<b>'.number_format($offen_summiert,2).'</b>';
$v['zeit_abgerechnet'] = '<b>'.number_format($abgerechnet_summiert,2).'</b>';
$v['kosten_geplant'] = '<b>'.number_format($kosten_summiert,2,',','.').'</b>';
$v['rohertrag_zeit'] = '<b'.($gesamt_rohertrag_zeit < 0?' style="color:red;"':'').'>'.number_format($gesamt_rohertrag_zeit,2,'.','').'</b>';
$v['rohertrag_artikel'] = '<b'.($gesamt_rohertrag_artikel < 0?' style="color:red;"':'').'>'.number_format($gesamt_rohertrag_artikel,2,'.','').'</b>';
$v['rohertrag_gesamt'] = '<b'.($gesamt_rohertrag_gesamt < 0?' style="color:red;"':'').'>'.number_format($gesamt_rohertrag_gesamt,2,'.','').'</b>';
$v['rohertrag_zeit_geplant'] = '<b'.($gesamt_rohertrag_zeit_geplant < 0?' style="color:red;"':'').'>'.number_format($gesamt_rohertrag_zeit_geplant,2,'.','').'</b>';
$v['rohertrag_artikel_geplant'] = '<b'.($gesamt_rohertrag_artikel_geplant < 0?' style="color:red;"':'').'>'.number_format($gesamt_rohertrag_artikel_geplant,2,'.','').'</b>';
$v['rohertrag_gesamt_geplant'] = '<b'.($gesamt_rohertrag_gesamt_geplant < 0?' style="color:red;"':'').'>'.number_format($gesamt_rohertrag_gesamt_geplant,2,'.','').'</b>';
$prognose_artikel = $gesamt_artikel_vk_geplant - $gesamt_artikel_ek_geplant;
$prognose_zeit = $gesamt_zeit_vk_geplant - $gesamt_zeit_ek_gebucht;
$prognose_zeit_geplant = $gesamt_zeit_vk_geplant - $gesamt_zeit_ek_geplant;
$prognose_gesamt = $prognose_artikel + $prognose_zeit_geplant;
$v['zeit_ek_geplant'] = '<b>'.number_format($gesamt_zeit_ek_geplant,2,'.','').'</b>';
$v['zeit_ek_gebucht'] = '<b>'.number_format($gesamt_zeit_ek_gebucht,2,'.','').'</b>';
$v['zeit_ek_offen'] = '<b'.($gesamt_zeit_ek_offen < 0?' style="color:red;"':'').'>'.number_format($gesamt_zeit_ek_offen,2,'.','').'</b>';
$v['zeit_vk_geplant'] = '<b>'.number_format($gesamt_zeit_vk_geplant,2,'.','').'</b>';
$v['zeit_vk_gebucht'] = '<b>'.number_format($gesamt_zeit_vk_gebucht,2,'.','').'</b>';
$v['zeit_vk_offen'] = '<b'.($gesamt_zeit_vk_offen < 0?' style="color:red;"':'').'>'.number_format($gesamt_zeit_vk_offen,2,'.','').'</b>';
$v['artikel_ek_geplant'] = '<b>'.number_format($gesamt_artikel_ek_geplant,2,'.','').'</b>';
$v['artikel_ek_gebucht'] = '<b>'.number_format($gesamt_artikel_ek_gebucht,2,'.','').'</b>';
$v['artikel_ek_offen'] = '<b'.($gesamt_artikel_ek_offen < 0?' style="color:red;"':'').'>'.number_format($gesamt_artikel_ek_offen,2,'.','').'</b>';
$v['artikel_vk_geplant'] = '<b>'.number_format($gesamt_artikel_vk_geplant,2,'.','').'</b>';
$v['artikel_vk_gebucht'] = '<b>'.number_format($gesamt_artikel_vk_gebucht,2,'.','').'</b>';
$v['artikel_vk_offen'] = '<b'.($gesamt_artikel_vk_offen < 0?' style="color:red;"':'').'>'.number_format($gesamt_artikel_vk_offen,2,'.','').'</b>';
$v['prognose_artikel'] = '<b'.($prognose_artikel < 0?' style="color:red;"':'').'>'.number_format($prognose_artikel,2,'.','').'</b>';
$v['prognose_zeit'] = '<b'.($prognose_zeit < 0?' style="color:red;"':'').'>'.number_format($prognose_zeit,2,'.','').'</b>';
$v['prognose_zeit_geplant'] = '<b'.($prognose_zeit_geplant < 0?' style="color:red;"':'').'>'.number_format($prognose_zeit_geplant,2,'.','').'</b>';
$v['prognose_gesamt'] = '<b'.($prognose_gesamt < 0?' style="color:red;"':'').'>'.number_format($prognose_gesamt,2,'.','').'</b>';
$projekte[] = $v;
}
$result = array($zeit_summiert,$gebucht_summiert,$kosten_summiert,$abgerechnet_summiert,$offen_summiert,$gesamt_zeit_ek_geplant,$gesamt_zeit_ek_gebucht,$gesamt_zeit_ek_offen
,$gesamt_zeit_vk_geplant,$gesamt_zeit_vk_gebucht,$gesamt_zeit_vk_offen
,$gesamt_artikel_ek_geplant,$gesamt_artikel_ek_gebucht,$gesamt_artikel_ek_offen
,$gesamt_artikel_vk_geplant,$gesamt_artikel_vk_gebucht,$gesamt_artikel_vk_offen
,$gesamt_rohertrag_zeit,$gesamt_rohertrag_artikel,$gesamt_rohertrag_gesamt
,$gesamt_rohertrag_zeit_geplant,$gesamt_rohertrag_artikel_geplant,$gesamt_rohertrag_gesamt_geplant
);
return $result;
}
function ProjektArbeitspaketMonitor($id)
{
$arbeitspaket = $this->app->DB->SelectRow("SELECT * FROM arbeitspaket WHERE id = '$id' LIMIT 1");
if(empty($arbeitspaket)) {
return '';
}
$check = 0;
$budget = 0;
$termin = 0;
if($arbeitspaket['status'] !== 'abgeschlossen' && $arbeitspaket['status'] !== 'abgerechnet')
{
if(empty($arbeitspaket['abgabedatum']) || $arbeitspaket['abgabedatum'] == '0000-00-00' || $this->app->DB->Select("select '".$arbeitspaket['abgabedatum']."' >= date(now())"))
{
$termin = 1;
}else{
$termin = 2;
}
if(round(((int)$this->app->DB->Select("SELECT sum( TIME_TO_SEC( TIMEDIFF( bis, von ) )) FROM `zeiterfassung` WHERE arbeitspaket = '".$id."' "))/3600,2) > $arbeitspaket['zeit_geplant'])
{
$check = 2;
}else{
$check = 1;
}
$bestellungsumme = $this->app->DB->Select("SELECT sum(bp.preis*bp.menge) FROM bestellung_position bp INNER JOIN projekt_artikel pa ON pa.artikel = bp.artikel AND pa.teilprojekt = '$id'");
if(($bestellungsumme > $arbeitspaket['kosten_geplant']) && $arbeitspaket['kosten_geplant'] > 0)
{
$budget = 2;
}else{
$budget = 1;
}
}
return '<img src="./themes/new/images/'.($check==0?'grey':($check==1?'checkgo':'checkstop')).'.png" title="'.($check==0?'Teilprojekt abgeschlossen / abgerechnet':($check==1?'Gebuchte Zeit noch in geplanter Zeit':'Gebuchte Zeit nicht in geplanter Zeit')).'"><img src="./themes/new/images/'.($termin==0?'grey':($termin==1?'termingo':'terminstop')).'.png" title="'.($termin==0?'Teilprojekt abgeschlossen / abgerechnet':($termin==1?'Keine Termine &uuml;berschritten':'Termine wurden &uuml;berschritten')).'"><img src="./themes/new/images/'.($budget==0?'grey':($budget==1?'kreditlimitgo':'kreditlimitstop')).'.png" title="'.($budget==0?'Teilprojekt abgeschlossen / abgerechnet':($budget==1?'Material im Budget':'Budget wurde &uuml;berschritten')).'">';
}
function ProjektUebersicht()
{
$id = (int)$this->app->Secure->GetGET('id');
$this->ProjektMenu();
$speichern = $this->app->Secure->GetPOST('speichern');
if($speichern!='')
{
$kunde = $this->app->Secure->GetPOST("kunde");
$verantwortlicher = $this->app->Secure->GetPOST("verantwortlicher");
$kundennummer = strstr($kunde,' ',true);
$mitarbeiternummer = strstr($verantwortlicher,' ',true);
$kundeid = $this->app->DB->Select("SELECT id FROM adresse WHERE kundennummer!='' AND kundennummer='$kundennummer' AND geloescht!=1 LIMIT 1");
$verantwortlicherid = $mitarbeiternummer;//$this->app->DB->Select("SELECT id FROM adresse WHERE mitarbeiternummer!='' AND mitarbeiternummer='$mitarbeiternummer' AND geloescht!=1 LIMIT 1");
$allowed = "/[^a-zA-Z0-9._-]/";
$this->app->Secure->POST["abkuerzung"] = preg_replace($allowed,"",$this->app->Secure->POST["abkuerzung"]);
$this->app->Secure->POST["abkuerzung"]=substr(strtoupper($this->app->Secure->POST["abkuerzung"]),0,20);
$error = false;
// pruefe ob es die Abzuerung schon gibt
$checkprojekt = $this->app->DB->Select("SELECT COUNT(id) FROM projekt WHERE abkuerzung='".$this->app->Secure->POST["abkuerzung"]."' AND abkuerzung!='' AND id!='$id' ");
if($checkprojekt > 0)
{
$checkprojekt++;
$this->app->Secure->POST["abkuerzung"]=$this->app->Secure->POST["abkuerzung"]."-".$checkprojekt;
$msg = $this->app->erp->base64_url_encode("<div class=\"warning\">Die Kennung gibt es bereits. Es wurde automatisch eine Folgenummer angelegt.</div>");
$error = true;
}
if($this->app->Secure->POST["abkuerzung"]=="")
{
$kennung = $this->app->DB->Select("SELECT COUNT(id) FROM projekt WHERE abkuerzung LIKE 'PROJEKT%' ") + 1;
$this->app->Secure->POST["abkuerzung"]="PROJEKT-".$kennung;
$msg = $this->app->erp->base64_url_encode("<div class=\"warning\">Die Kennung ist ein Pflichtfeld. Es wurde eine automatische Kennung vergeben.</div>");
$error = true;
}
$this->app->FormHandler->FormUpdateDatabase("projekt",$id);
$this->app->DB->Update("UPDATE projekt SET kunde='$kundeid', verantwortlicher='$verantwortlicherid' WHERE id='$id' LIMIT 1");
if($msg!="")
{
header("Location: index.php?module=projekt&action=uebersicht&id=$id&msg=$msg");
exit;
}
}
$this->app->FormHandler->FormGetVars("projekt",$id);
$data = $this->app->DB->SelectArr("SELECT CONCAT(a.kundennummer,' ',a.name) as kunde, CONCAT(a2.id,' ',a2.name) as mitarbeiter, status FROM projekt p
LEFT JOIN adresse a ON a.id=p.kunde LEFT JOIN adresse a2 ON a2.id=p.verantwortlicher WHERE p.id='$id' LIMIT 1");
if(isset($data[0]))
{
$this->app->Tpl->Set('KUNDE',$data[0]['kunde']);
$this->app->Tpl->Set('VERANTWORTLICHER',$data[0]['mitarbeiter']);
switch($data[0]['status']){
case 'gestartet':
case 'geplant':
case 'abgeschlossen':
$this->app->Tpl->Set("STATUS".strtoupper($data[0]['status']),' selected="selected" ');
break;
}
}
for($i = 0; $i <= 10; $i++)
{
$n1 = 'projektfreifeld'.$i.'typ';
$n2 = 'projektfreifeld'.$i.'spalte';
$n3 = 'projektfreifeld'.$i.'sort';
$freifeldtyp[$i] = $this->app->erp->Firmendaten($n1);
$freifeldspalte[$i] = $this->app->erp->Firmendaten($n2);
$freifeldsort[$i] = $this->app->erp->Firmendaten($n3);
if($freifeldspalte[$i] > 0)
{
$spalte[$freifeldspalte[$i]][$i]['index'] = $i;
$spalte[$freifeldspalte[$i]][$i]['sort'] = $freifeldsort[$i];
$sort[$freifeldspalte[$i]][$i] = $freifeldsort[$i];
}
}
$s = 1;
// array_multisort($sort[$s], SORT_ASC, $spalte[$s]);
$tmpi = 0;
$output = '';
foreach($spalte[$s] as $k => $v)
{
$tmpi++;
$bez = $this->app->erp->Firmendaten('projektfreifeld'.$v['index']);
if($freifeldtyp[$v['index']] === 'select')
{
$optionen = null;
$beza = explode('|', $bez);
$bez = trim($beza[0]);
if(count($beza) > 1)
{
for($inds = 1; $inds < count($beza); $inds++)$optionen[] = trim($beza[$inds]);
}
}
if(empty($bez))$bez = 'Freifeld '.$v['index'];
$output .= "<tr><td>".$bez.":</td><td>";
switch($freifeldtyp[$v['index']])
{
case 'checkbox':
if($speichern!="" && $this->app->Secure->GetPOST('freifeld'.$v['index'])==""){
$this->app->DB->Update("UPDATE projekt SET freifeld".$v['index']."='0' WHERE id = '$id' LIMIT 1");
}
$output .= '<input type="checkbox" name="freifeld'.$v['index'].'" id="freifeld'.$v['index'].'" value="1" '.($this->app->DB->Select("SELECT freifeld".$v['index']." FROM projekt WHERE id = '$id' LIMIT 1")?' checked="checked" ':'').' />';
break;
case 'mehrzeilig':
$output .= '<textarea cols="40" name="freifeld'.$v['index'].'" id="freifeld'.$v['index'].'">'.$this->app->DB->Select("SELECT freifeld".$v['index']." FROM projekt WHERE id = '$id' LIMIT 1").'</textarea>';
break;
case 'datum':
$output .='<input type="text" size="10" id="freifeld'.$v['index'].'" name="freifeld'.$v['index'].'" value="'.$this->app->DB->Select("SELECT freifeld".$v['index']." FROM projekt WHERE id = '$id' LIMIT 1").'" />';
$this->app->YUI->DatePicker('freifeld'.$v['index']);
break;
case 'select':
$output .= '<select name="freifeld'.$v['index'].'" id="freifeld'.$v['index'].'">';
$tmpv = $this->app->DB->Select("SELECT freifeld".$v['index']." FROM projekt WHERE id = '$id' LIMIT 1");
if(isset($optionen) && $optionen)
{
$found = false;
foreach($optionen as $ov)
{
$ovvalue=$ov;
if(strpos($ov,'=>') !== false) {
list($ov, $ovvalue) = explode('=>', $ov);
}
if($ovvalue == $tmpv)
{
$found = true;
break;
}
}
if(!$found)$output .= '<option>'.$tmpv.'</option>';
foreach($optionen as $ov)
{
$ovvalue=$ov;
if(strpos($ov,'=>') !== false) {
list($ov, $ovvalue) = explode('=>', $ov);
}
$output .= '<option'.($tmpv == $ovvalue?' selected':'').' value="'.$ovvalue.'">'.$ov.'</option>';
}
}else{
$output .= '<option>'.$tmpv.'</option>';
}
$output .= '</select>';
break;
default:
$output .= '<input type="text" size="30" id="freifeld'.$v['index'].'" name="freifeld'.$v['index'].'" value="'.$this->app->DB->Select("SELECT freifeld".$v['index']." FROM projekt WHERE id = '$id' LIMIT 1").'" />';
break;
}
$output .= "</td></tr>";
}
$this->app->Tpl->Set("FREIFELDER",$output);
$this->app->YUI->AutoComplete("abkuerzung","projektname",1);
$this->app->YUI->AutoComplete("kunde","kunde");
$this->app->YUI->AutoComplete("verantwortlicher","adresse");
$this->app->YUI->CkEditor("beschreibung","belege");
$this->app->YUI->CkEditor("sonstiges","internal");
$this->app->Tpl->Parse('PAGE','projekt_uebersicht.tpl');
}
function ProjektMiniDetailArbeitspaket()
{
$this->ProjektMiniDetailTeilprojekt();
}
function ProjektMiniDetailTeilprojekt()
{
$this->app->Tpl->Output("projekt_minidetail_teilprojekt.tpl");
$this->app->ExitXentral();
/*
$id = $this->app->Secure->GetGET("id");
$projekt = $this->app->DB->Select("SELECT projekt FROM arbeitspaket WHERE id='$id'");
$beschreibung = $this->app->DB->Select("SELECT beschreibung FROM arbeitspaket WHERE id='$id'");
$vorgaenger = $this->app->DB->Select("SELECT vorgaenger FROM arbeitspaket WHERE id='$id'");
$vorgaenger_aufgabe = $this->app->DB->Select("SELECT aufgabe FROM arbeitspaket WHERE id='$vorgaenger'");
$this->app->Tpl->Set('VORGAENGER',$vorgaenger_aufgabe);
$this->app->Tpl->Set('BESCHREIBUNG',nl2br($beschreibung));
$this->app->Tpl->Set('PROJEKT',$projekt);
$this->app->Tpl->Set('ID',$id);
$table = new EasyTable($this->app);
$table->Query("
SELECT
CONCAT('<input type=\"checkbox\" checked name=\"z_id[]\" value=\"',z.id,'\">') as '',
DATE_FORMAT(z.bis, GET_FORMAT(DATE,'EUR')) AS Datum,
DATE_FORMAT(z.von,'%H:%i') as von, DATE_FORMAT(z.bis,'%H:%i') as bis,
FORMAT(TIME_TO_SEC(TIMEDIFF(z.bis, z.von))/3600,2) AS Dauer,
a.name as Mitarbeiter,
IF(LENGTH(z.aufgabe) > 40, CONCAT('<a title=\"',z.aufgabe,'\" style=\"font-weight:normal\">',LEFT(z.aufgabe, 37), '...</a>'),
CONCAT('<a title=\"',z.aufgabe,'\" style=\"font-weight:normal\">',z.aufgabe,'</a>')) as Taetigkeit,
CONCAT(v.nummer,' ',v.beschreibung) as verrechnungsart,
if(z.arbeitsnachweis > 0,CONCAT('<a href=\"index.php?module=arbeitsnachweis&action=edit&id=',z.arbeitsnachweis,'\" target=\"_blank\">gebucht</a>'),'-') as arbeitsnachweis,
CONCAT('<a href=\"#\" onclick=\"if(!confirm(\'Wirklich stornieren?\')) return false; else window.location.href=\'index.php?module=zeiterfassung&action=list&do=stornieren&lid=', z.id, '&back=projekt&back_id=$projekt\'\"><img src=\"./themes/new/images/delete.svg\"></a>&nbsp;<a href=\"index.php?module=zeiterfassung&action=create&id=', z.id, '&back=projekt&back_id=$projekt\" ><img src=\"./themes/new/images/edit.svg\"></a>')
FROM zeiterfassung z
LEFT JOIN adresse a ON a.id=z.adresse
LEFT JOIN adresse b ON b.id=z.adresse_abrechnung
LEFT JOIN projekt p ON p.id=z.projekt
LEFT JOIN arbeitspaket ap ON z.arbeitspaket=ap.id
LEFT JOIN verrechnungsart v ON v.nummer=z.verrechnungsart
WHERE z.arbeitspaket='$id' AND (z.arbeitsnachweis IS NULL OR z.arbeitsnachweis=0) AND ist_abgerechnet!=1 AND abgerechnet!=1 ORDER by z.von
");
$table->DisplayNew('OFFENEZEIT', "Menü","Action");
$table->Query("
SELECT
DATE_FORMAT(z.bis, GET_FORMAT(DATE,'EUR')) AS Datum,
DATE_FORMAT(z.von,'%H:%i') as von, DATE_FORMAT(z.bis,'%H:%i') as bis,
FORMAT(TIME_TO_SEC(TIMEDIFF(z.bis, z.von))/3600,2) AS Dauer,
a.name as Mitarbeiter,
IF(LENGTH(z.aufgabe) > 40, CONCAT('<a title=\"',z.aufgabe,'\" style=\"font-weight:normal\">',LEFT(z.aufgabe, 37), '...</a>'),
CONCAT('<a title=\"',z.aufgabe,'\" style=\"font-weight:normal\">',z.aufgabe,'</a>')) as Taetigkeit,
CONCAT(v.nummer,' ',v.beschreibung) as verrechnungsart,
if(z.arbeitsnachweis > 0,CONCAT('<a href=\"index.php?module=arbeitsnachweis&action=edit&id=',z.arbeitsnachweis,'\" target=\"_blank\">gebucht</a>'),'-') as arbeitsnachweis,
CONCAT('<a href=\"#\" onclick=\"if(!confirm(\'Wirklich stornieren?\')) return false; else window.location.href=\'index.php?module=zeiterfassung&action=list&do=stornieren&lid=', z.id, '&back=projekt&back_id=$projekt\'\"><img src=\"./themes/new/images/delete.svg\"></a>&nbsp;<a href=\"index.php?module=zeiterfassung&action=create&id=', z.id, '&back=projekt&back_id=$projekt\" ><img src=\"./themes/new/images/edit.svg\"></a>')
FROM zeiterfassung z
LEFT JOIN adresse a ON a.id=z.adresse
LEFT JOIN adresse b ON b.id=z.adresse_abrechnung
LEFT JOIN projekt p ON p.id=z.projekt
LEFT JOIN arbeitspaket ap ON z.arbeitspaket=ap.id
LEFT JOIN verrechnungsart v ON v.nummer=z.verrechnungsart
WHERE z.arbeitspaket='$id' AND (z.arbeitsnachweis >0 OR z.ist_abgerechnet=1 OR z.abgerechnet=1) ORDER by z.von
");
$table->DisplayNew('GEBUCHTEZEIT', "Menü","Action");
$this->app->Tpl->Set('ID',$id);
$this->app->Tpl->Output("projekt_minidetail_teilprojekt.tpl");
exit;*/
}
function ProjektDateien()
{
$id = $this->app->Secure->GetGET("id");
$this->ProjektMenu();
$this->app->Tpl->Add('UEBERSCHRIFT'," (Dateien)");
$this->app->YUI->DateiUpload('PAGE',"Projekt",$id);
}
function ProjektZeit()
{
$id = $this->app->Secure->GetGET("id");
$sid = $this->app->Secure->GetGET("sid");
$this->ProjektMenu();
$this->app->YUI->TableSearch('TAB1',"projektzeiterfassung");
$this->app->Tpl->Add('TAB1',"<br><table width=\"100%\"><tr><td align=\"center\">
<input type=\"submit\" value=\"Auftrag erzeugen\" name=\"auftragsubmit\">
<input type=\"submit\" value=\"Status: Archiv / Freigabe\" name=\"auftragsubmit\">
<!-- <input type=\"submit\" value=\"Rechnung erzeugen\" name=\"rechnungsubmit\">-->
</td></tr></table><br></form>");
$this->app->Tpl->Parse('PAGE',"zeiterfassunguebersicht.tpl");
/*
// $auftragsubmit = $this->app->Secure->GetPOST("auftragsubmit");
$lieferscheinsubmit = $this->app->Secure->GetPOST("lieferscheinsubmit");
$z_id = $this->app->Secure->GetPOST("z_id");
if($lieferscheinsubmit !="") {
// print_r($z_id);
$adresse = $this->app->DB->Select("SELECT kunde FROM projekt WHERE id='$id' LIMIT 1");
// $lieferschein = $this-app->erp->CreateLieferschein($adresse);
for($i=0;$i<count($z_id);$i++)
{
$single_z_id = $z_id[$i];
//$dauer = $this->app->DB->Select("SELECT TIME_TO_SEC(TIMEDIFF(z.bis, z.von))/3600 AS Dauer FROM zeiterfassung z WHERE z.id='".$single_z_id."'");
//echo $dauer."<br>";
$this->app->DB->Select("UPDATE zeiterfassung SET ist_abgerechnet='1', abgerechnet='1' WHERE id='".$single_z_id."'");
}
}
// $rechnungsubmit = $this->app->Secure->GetPOST("rechnungsubmit");
$this->app->Tpl->Set(TABTEXT,"Zeiterfassung");
$tmp = $this->app->DB->SelectArr("SELECT * FROM arbeitspaket WHERE projekt='$id'");
$options="<option>Alle</option>";
if($sid=="ohne")
$options.="<option value=\"ohne\">Ohne</option>";
else
$options.="<option value=\"ohne\">Ohne</option>";
for($i=0;$i<count($tmp);$i++)
{
if($sid==$tmp[$i][id])$checked="selected"; else $checked="";
$options .="<option value=\"".$tmp[$i][id]."\" $checked>".$tmp[$i][aufgabe]."</option>";
}
$this->app->Tpl->Add(INHALT,"
<script>
$(function(){
// bind change event to select
$('#dynamic_select').bind('change', function () {
var url = $(this).val(); // get selected value
if (url) { // require a URL
window.location = 'index.php?module=projekt&action=zeit&id=$id&sid='+url; // redirect
}
return false;
});
});
</script>
<table width=\"100%\"><tr><td align=\"center\">Auswahl Unterprojekt/Arbeitspaket: <select id=\"dynamic_select\">$options</select></td></tr></table><br>
<form action=\"\" method=\"post\">[EASYTABLE]");
if($sid >0)
$subwhere = " AND ap.id='$sid'";
$table = new EasyTable($this->app);
$table->Query("SELECT
if(z.abgerechnet,'&nbsp;&nbsp;-',CONCAT('<input type=\"checkbox\" value=\"',z.id,'\" name=\"z_id[]\" checked>')) as 'übernehmen',
DATE_FORMAT(z.bis, GET_FORMAT(DATE,'EUR')) AS Datum,
a.name as mitarbeiter,
DATE_FORMAT(z.von,'%H:%i') as start, DATE_FORMAT(z.bis,'%H:%i') as ende,
TIMEDIFF(z.bis, z.von) AS Dauer,
ap.aufgabe as 'unterprojekt/Aufgabe',
z.aufgabe as Taetigkeit,
if(abgerechnet,'ja','nein') as abgrechnet,
CONCAT('<a href=\"index.php?module=zeiterfassung&action=create&id=',z.id,'&back=projekt&back_id=$id&back_sid=$sid\"><img src=\"themes/new/images/edit.svg\"></a>&nbsp;
<a href=\"#\" onclick=\"if(!confirm(\'Wirklich stornieren?\')) return false; else window.location.href=\'index.php?module=zeiterfassung&action=list&do=stornieren&back=projekt&back_id=$id&back_sid=$sid&lid=',z.id,'\'\"><img src=\"themes/new/images/delete.svg\"></a>&nbsp;') as Menü
FROM zeiterfassung z LEFT JOIN adresse a ON a.id=z.adresse LEFT JOIN arbeitspaket ap ON z.arbeitspaket=ap.id
WHERE z.projekt=$id $subwhere
ORDER BY 7,Datum, bis DESC
");
$table->DisplayNew(EASYTABLE, "Menü","noAction");
$summe = $this->app->DB->Select("SELECT
SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(z.bis, z.von))))
FROM zeiterfassung z LEFT JOIN adresse a ON a.id=z.adresse LEFT JOIN arbeitspaket ap ON z.arbeitspaket=ap.id
WHERE z.projekt=$id $subwhere");
//$this->app->Tpl->Add(INHALT,"<br>Summe offen: $summe Summe gesamt: $summegesamt<br>");
//$this->app->Tpl->Add(INHALT,"Summe offen: $summeeur ".$this->projektwaehrung);
//$this->app->Tpl->Add(INHALT,"Summe offen: $summeeur ".$this->projektwaehrung);
$this->app->Tpl->Add(EXTEND,"Summe: $summe");
$this->app->Tpl->Add(INHALT,"<br><table width=\"100%\"><tr><td align=\"center\">
<!--<input type=\"submit\" value=\"Auftrag erzeugen\" name=\"auftragsubmit\">-->
<input type=\"submit\" value=\"Arbeitszeiten freigeben\" name=\"lieferscheinsubmit\">
<!-- <input type=\"submit\" value=\"Rechnung erzeugen\" name=\"rechnungsubmit\">-->
</td></tr></table><br></form>");
$this->app->Tpl->Parse(TAB1,"projekt_zeiterfassung.tpl");
$this->app->Tpl->Parse(PAGE,"tabview.tpl");
*/
}
function ProjektMaterial()
{
$id = $this->app->Secure->GetGET("id");
$this->app->Tpl->Set('TABTEXT',"Materialeinsatz");
$this->app->Tpl->Set('SUBSUBHEADING',"Positionen aus Bestellungen");
$table = new EasyTable($this->app);
$table->Query("SELECT bp.bezeichnunglieferant as artikel, a.name as lieferant,b.belegnr as bestellung, bp.menge, bp.preis,menge*preis as gesamt, if(bp.abgerechnet,'ja','nein') as rechnung FROM bestellung_position bp
LEFT JOIN bestellung b ON bp.bestellung=b.id LEFT JOIN adresse a ON b.adresse=a.id WHERE bp.projekt='$id' ORDER By bp.bestellung");
$table->DisplayNew('MATERIAL', "abgerechnet","noAction");
$summe = $this->app->DB->Select("SELECT SUM(menge*preis) FROM bestellung_position WHERE projekt='$id' AND abgerechnet!='1' ORDER By bestellung");
$summevk= $this->ProjektOffenesMaterial($id);
//$summegesamt = $summe;
$this->app->Tpl->Add('MATERIAL',"<br>Summe offen: $summe ");
$this->app->Tpl->Add('MATERIAL',"<br>Summe offen: $summevk ");
$this->app->Tpl->Parse('TAB1',"rahmen70.tpl");
$this->app->Tpl->Set('SUBSUBHEADING',"Positionen aus Lieferungen");
$table = new EasyTable($this->app);
$table->Query("SELECT bp.menge, bp.bezeichnung as artikel, bp.seriennummer, b.belegnr as lieferschein, if(bp.abgerechnet,'ja','nein') as rechnung FROM lieferschein_position bp
LEFT JOIN lieferschein b ON bp.lieferschein=b.id LEFT JOIN adresse a ON b.adresse=a.id WHERE b.projekt='$id' ORDER By bp.lieferschein");
$table->DisplayNew('MATERIAL', "abgerechnet","noAction");
//$summe = $this->app->DB->Select("SELECT SUM(menge*preis) FROM bestellung_position WHERE projekt='$id' AND abgerechnet!='1' ORDER By bestellung");
//$summegesamt = $summe;
//$this->app->Tpl->Add(INHALT,"<br>Summe offen: $summe Summe gesamt: $summegesamt<br>");
$this->app->Tpl->Set('SUBSUBHEADING',"Material im Lager");
$table = new EasyTable($this->app);
$table->Query("SELECT DISTINCT a.name_de as artikel, a.nummer, lp.kurzbezeichnung as regal, lpi.menge, a.hersteller FROM lager_platz_inhalt lpi
LEFT JOIN artikel a ON a.id=lpi.artikel LEFT JOIN lager_platz lp ON lpi.lager_platz=lp.id WHERE a.projekt='$id' GROUP BY a.id");
$table->DisplayNew('MATERIAL', "abgerechnet","noAction");
//$summe = $this->app->DB->Select("SELECT SUM(menge*preis) FROM bestellung_position WHERE projekt='$id' AND abgerechnet!='1' ORDER By bestellung");
//$summegesamt = $summe;
//$this->app->Tpl->Add(INHALT,"<br>Summe offen: $summe Summe gesamt: $summegesamt<br>");
}
function ProjektOffenesMaterial($id)
{
$summe = $this->app->DB->Select("SELECT SUM(menge*preis) FROM bestellung_position WHERE projekt='$id' AND abgerechnet!='1' ORDER By bestellung");
$summevk= $summe*((100 + $this->app->erp->GetStandardMarge())/100);
//$summegesamt = $summe;
return $summevk;
}
function ProjektOffeneZeit($id)
{
$summe = $this->app->DB->Select("SELECT FORMAT(SUM(TIMEDIFF(z.bis, z.von))/10000,2) FROM zeiterfassung z LEFT JOIN arbeitspaket ap ON z.arbeitspaket = ap.id AND ap.projekt = '$id' WHERE (z.art='' OR z.art='Arbeit') AND (z.projekt='$id' OR not isnull(ap.id)) AND z.abgerechnet!='1'");
$summeeur = $summe*$this->app->erp->GetStandardStundensatz();
return $summeeur;
}
function ProjektSchaltung()
{
$id = $this->app->Secure->GetGET("id");
$this->ProjektMenu();
$this->app->Tpl->Add('UEBERSCHRIFT'," (Schaltung)");
$this->app->Tpl->Set('PAGE',"
<br>Neues Teilprojekt anlegen: <br>
Name:<input type=text value=\"KUBUS 3B\"><br>Budget: <input type=text><br>Liefertermin: <input type=text value=>
<br><br>
<br><br>
<table border=1><tr><td>Teilprojekt</td><td>Aktion</td></tr>
<tr><td>Prototyp 1 KUBUS 3B</td><td><a>BOM</a>&nbsp;<a>Lagerbestand</a>&nbsp;<a>Bestellung</a>&nbsp;<a>Datenblaetter</a>&nbsp;<a>Schaltplan u. Layout</a>&nbsp;<a>Projekt Charter</a></td>
<tr><td>SNOM Stick</td><td><a>BOM</a>&nbsp;<a>Lagerbestand</a>&nbsp;<a>Bestellung</a>&nbsp;<a>Datenblaetter</a>&nbsp;<a>Schaltplan u. Layout</a>&nbsp;<a>Projekt Charter</a></td>
</table>
<br><br>
Prototyp 1 (inkl. eagle, stuecklisten, fertigungsauftrag fuer prototype, prueflisten, lagerbestand, bestellungsauftrag usw..)<br>Budget<br>Kostenstellen (ende mit 1)");
}
function ProjektKostenstellen()
{
$id = $this->app->Secure->GetGET("id");
$this->ProjektMenu();
$this->app->Tpl->Add('UEBERSCHRIFT'," (Kostenstellen)");
$summezeit = $this->ProjektOffeneZeit($id);
$summevk = $this->ProjektOffenesMaterial($id);
$kosten = $summezeit + $summevk;
/*
$this->app->Tpl->Set('KOSTEN',money_format('€ %!n',$kosten));
$this->app->Tpl->Set('SUMMEZEIT',money_format('€ %!n',$summezeit));
$this->app->Tpl->Set('SUMMEVK',money_format('€ %!n',$summevk));
*/
$this->ProjektMaterial();
$this->app->Tpl->Parse('PAGE',"projekt_kostenstellen.tpl");
}
/**
* @return array
*/
public function getDataToCopyFromFormular()
{
$data = [];
$postKeys = array_keys($this->app->Secure->POST);
foreach($postKeys as $postKey) {
$postKeySplitted = explode('_', $postKey);
if(isset($postKeySplitted[1])) {
$itemId = (int)$postKeySplitted[1];
switch($postKeySplitted[0]) {
case 'arbeitspaket':
case 'artikel':
case 'aufgaben':
case 'adressrollen':
case 'wiedervorlagen':
$data[$postKeySplitted[0]][] = $itemId;
break;
}
}
}
return $data;
}
/**
* @param int $fromId
* @param int $toId
*/
public function copyProjectData($fromId, $toId)
{
$data = $this->getDataToCopyFromFormular();
$this->app->erp->CopyProjektDaten($fromId, $toId, $data);
$msg = $this->app->erp->base64_url_encode("<div class=\"info\">Das Projekt wurde erfolgreich kopiert.</div>");
$this->app->Location->execute('index.php?module=projekt&action=uebersicht&id='.$toId.'&msg='.$msg);
exit;
}
/**
* @param string $shortName
*
* @return mixed|string|null
*/
public function getProjectIdByProjectShortName($shortName)
{
return $this->app->DB->Select(sprintf("SELECT `id` FROM `projekt` WHERE `abkuerzung` = '%s' LIMIT 1", $shortName));
}
public function handleCopyProjectFromFormSubmit()
{
if($this->app->Secure->GetPOST('speichern') && $this->app->Secure->GetPOST('prkopieren')) {
$fromId = $this->app->Secure->GetGET('id');
$toId = $this->app->Secure->GetPOST('toid');
$data = $this->getDataToCopyFromFormular();
$this->app->erp->CopyProjektDaten($fromId, $toId, $data);
$msg = $this->app->erp->base64_url_encode("<div class=\"info\">Das Projekt wurde erfolgreich kopiert.</div>");
$this->app->Location->execute('index.php?module=projekt&action=uebersicht&id='.$toId.'&msg='.$msg);
}
}
/**
* @param int $customerId
*
* @return array|string[]
*/
public function getNextProjectShortCutByCustomer($customerId)
{
$shortCode = null;
if(empty($customerId)) {
return ['shortcode' => $shortCode, 'error' => 'Kein Kunde ausgew&auml;lt.'];
}
$customerNumber = $this->app->DB->Select(
sprintf(
'SELECT a.kundennummer FROM `adresse` AS `a` WHERE a.id = %d LIMIT 1',
$customerId
)
);
if(empty($customerNumber)) {
return ['shortcode' => $shortCode, 'error' => 'Keine Kundennummer gefunden.'];
}
$shortCodes = $this->app->DB->SelectFirstCols(
sprintf(
"SELECT `abkuerzung` FROM `projekt` WHERE `abkuerzung` LIKE '%s.%%'",
$this->app->DB->real_escape_string($customerNumber)
)
);
if(empty($shortCodes)) {
return ['shortcode' => $customerNumber.'.1'];
}
$newShortCodeIndex = 1;
$length = 1;
foreach($shortCodes as $dbShortCode) {
$oldShortCode = substr($dbShortCode, strlen($customerNumber)+1);
if(strlen($oldShortCode) > $length) {
$length = strlen($oldShortCode);
}
$oldShortCode = 1 + (int)$oldShortCode;
if($newShortCodeIndex < $oldShortCode) {
$newShortCodeIndex = $oldShortCode;
}
}
return [
'shortcode' =>
$customerNumber.'.'
.(strlen($newShortCodeIndex) < $length ?str_repeat('0', $length-strlen($newShortCodeIndex)):'')
.$newShortCodeIndex
];
}
/**
* @return array
*/
public function getProjectCreateErrorMessagesByForm()
{
$error = [];
$kunde = (int)$this->app->Secure->GetPOST('kunde');
$abkuerzung = $this->app->Secure->GetPOST('abkuerzung');
$typ = $this->app->Secure->GetPOST('typ');
if($typ === 'manuell' || $typ === 'kundennummer' || $typ === 'fortlaufend') {
switch($typ) {
case 'kundennummer':
$customerInfo = $this->getNextProjectShortCutByCustomer($kunde);
if(!empty($customerInfo['error'])) {
$error[] = $customerInfo['error'];
}
break;
}
}
$checkabkuerzung = 0;
if($typ !== 'fortlaufend') {
$checkabkuerzung = $this->app->DB->Select("SELECT `id` FROM `projekt` WHERE `abkuerzung` = '$abkuerzung' LIMIT 1");
}
if($checkabkuerzung > 0 && $this->app->Secure->GetPOST('typ')==='manuell') {
$error[] = 'Abkürzung schon vorhanden. Bitte eine andere wählen.';
}
if($this->app->Secure->GetPOST('name')==''){
$error[] = 'Bitte geben Sie eine Bezeichung an.';
}
if($this->app->Secure->GetPOST('abkuerzung')=='' && $this->app->Secure->GetPOST('typ')==='manuell') {
$error[] = 'Bitte geben Sie eine Kennung an.';
}
return $error;
}
public function ProjektCreate()
{
if($this->app->Secure->GetPOST('speichern') && $this->app->Secure->GetPOST('prkopieren')) {
$this->handleCopyProjectFromFormSubmit();
}
$isJsonResponse = $this->app->Secure->GetGET('fromjson');
$isSaveForm = $this->app->Secure->GetPOST('save') == 1;
if($isJsonResponse && $isSaveForm) {
$error = $this->getProjectCreateErrorMessagesByForm();
if($error) {
$this->app->User->SetParameter('task_project_id', 0);
return new JsonResponse(['error' => implode('<br />', $error)]);
}
$abkuerzung = $this->app->Secure->GetPOST('abkuerzung');
$typ = $this->app->Secure->GetPOST('typ');
$customerId = (int)$this->app->Secure->GetPOST('kunde');
if($typ === 'kundennummer') {
$customerInfo = $this->getNextProjectShortCutByCustomer($customerId);
$abkuerzung = $customerInfo['shortcode'];
}
elseif($typ === 'fortlaufend') {
$abkuerzung = $this->app->erp->GetNextNummer('projektnummer');
}
$check = $this->finishCreateProject($abkuerzung, 0);
if($check <= 0) {
return new JsonResponse(
['error' => 'Es gab einen Fehler. Das Projekt konnte nicht angelegt werden.']
);
}
$this->app->User->SetParameter('task_project_id', $check);
return new JsonResponse(['id' => $check]);
}
$this->app->erp->MenuEintrag('index.php?module=projekt&action=list', 'Zur&uuml;ck zur &Uuml;bersicht');
$schritt2 = $this->app->Secure->GetPOST('schritt2');
$schritt3 = $this->app->Secure->GetGET('schritt3');
$auswahl = $this->app->Secure->GetPOST('auswahl');
if($schritt3=='') {
$schritt3 = $this->app->Secure->GetPOST('schritt3');
}
if($schritt2 !== '' && $auswahl==='neu') {
$schritt2 = '';
$schritt3 = 'weiter';
}
if($schritt2 == '' && $schritt3 == '') {
$this->app->Tpl->Parse('PAGE', 'projekt_create_step1.tpl');
return;
}
if($schritt2!='') {
$this->app->YUI->TableSearch('TAB1', 'projekt_kopie', 'show', '', '', basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', 'projekt_create_step2.tpl');
return;
}
// auswahl projekt
$id = $this->app->Secure->GetGET('id');
if($id > 0) {
$dbValues = $this->app->DB->SelectRow(sprintf('SELECT * FROM `projekt` WHERE `id` = %d', $id));
if(strpos($dbValues['abkuerzung'], '.') !== false) {
$numericind = strlen($dbValues['abkuerzung']);
$fortlaufennach = '';
for($i = $numericind -1; $i > 0 ; $i--) {
if(!is_numeric($dbValues['abkuerzung'][$i])){
break;
}
$fortlaufennach = $dbValues['abkuerzung'][$i].$fortlaufennach;
}
$fortlaufendvor = '';
if($i > 0) {
$fortlaufendvor = substr($dbValues['abkuerzung'], 0, $i + 1);
}
if($fortlaufennach == '') {
$fortlaufennach = 1;
}
$fortlaufennachlen = strlen($fortlaufennach);
while(!empty($this->getProjectIdByProjectShortName($fortlaufendvor.$fortlaufennach))) {
$fortlaufennach++;
if(strlen($fortlaufennach) < $fortlaufennachlen) {
$fortlaufennach = str_repeat('0',$fortlaufennachlen-strlen($fortlaufennach)).$fortlaufennach;
}
}
$dbValues['abkuerzung'] = $fortlaufendvor.$fortlaufennach;
}
else{
$dbValues['abkuerzung'] = $dbValues['abkuerzung'] . '-1';
}
$this->app->Tpl->Set('NAME', $dbValues['name']);
$this->app->Tpl->Set(
'KUNDE',
$this->app->DB->Select(
sprintf(
"SELECT CONCAT(`id`,' ',`name`) FROM `adresse` WHERE `id` = %d",
$dbValues['kunde']
)
)
);
$this->app->Tpl->Set(
'VERANTWORTLICHER',
$this->app->DB->Select(
sprintf("SELECT CONCAT(`id`,' ',`name`) FROM `adresse` WHERE `id` = %d",
$dbValues['verantwortlicher'])
)
);
$this->app->Tpl->Set('ABKUERZUNG', $dbValues['abkuerzung']);
$this->app->Tpl->Set('BESCHREIBUNG', $dbValues['beschreibung']);
$this->app->Tpl->Set('PROJEKT', $dbValues['projekt']);
$this->app->Tpl->Set('STATUS', $dbValues['status']);
$typ = $this->app->Secure->GetPOST('typ');
if($typ === 'manuell' || $typ === 'kundennummer' || $typ === 'fortlaufend') {
$this->app->Tpl->Set(strtoupper($typ),' checked="checked" ');
}
else{
$this->app->Tpl->Set('MANUELL',' checked="checked" ');
}
}
else {
$name = $this->app->Secure->GetPOST('name');
$kunde = $this->app->Secure->GetPOST('kunde');
$verantwortlicher = $this->app->Secure->GetPOST('verantwortlicher');
$abkuerzung = $this->app->Secure->GetPOST('abkuerzung');
$beschreibung = $this->app->Secure->GetPOST('beschreibung');
$projekt = $this->app->Secure->GetPOST('projekt');
$status = $this->app->Secure->GetPOST('status');
$this->app->Tpl->Set('NAME', $name);
$this->app->Tpl->Set('KUNDE', $kunde);
$this->app->Tpl->Set('VERANTWORTLICHER', $verantwortlicher);
$this->app->Tpl->Set('ABKUERZUNG', $abkuerzung);
$this->app->Tpl->Set('BESCHREIBUNG', $beschreibung);
$this->app->Tpl->Set('PROJEKT', $projekt);
$this->app->Tpl->Set('STATUS', $status);
$typ = $this->app->Secure->GetPOST('typ');
if($typ === 'manuell' || $typ === 'kundennummer' || $typ === 'fortlaufend') {
$this->app->Tpl->Set(strtoupper($typ),' checked="checked" ');
switch($typ) {
case 'manuell':
//nichts weiter zu tun
break;
case 'kundennummer':
if($kunde) {
$customerNumber = $this->app->DB->Select(
sprintf('SELECT `kundennummer` FROM `adresse` WHERE `id` = %d LIMIT 1', $kunde)
);
if($customerNumber == '') {
$error[]="Keine Kundennummer gefunden.";
}
else{
$shortCodes = $this->app->DB->SelectFirstCols(
sprintf(
"SELECT `abkuerzung` FROM `projekt` WHERE `abkuerzung` LIKE '%s'",
$this->app->DB->real_escape_string($customerNumber).'.%'
)
);
if(!empty($shortCodes)) {
$postFixNumber = 1;
$postFixStringLength = 1;
foreach($shortCodes as $shortCode) {
$dbPostFixNumber = substr($shortCode, strlen($customerNumber) + 1);
if(strlen($dbPostFixNumber) > $postFixStringLength) {
$postFixStringLength = strlen($dbPostFixNumber);
}
$newPostFixNumber = 1 + (int)$dbPostFixNumber;
if($postFixNumber < $newPostFixNumber) {
$postFixNumber = $newPostFixNumber;
}
}
$postFixNumberString = (string)$postFixNumber;
if(strlen($postFixNumberString) < $postFixStringLength) {
$prefixZeroCounts = $postFixStringLength - strlen($postFixNumberString);
$postFixNumberString = str_repeat('0', $prefixZeroCounts) .$postFixNumberString;
}
$abkuerzung = $customerNumber . '.' . $postFixNumberString;
}
else{
$abkuerzung = $customerNumber . '.1';
}
}
}else{
$error[]="Kein Kunde ausgew&auml;lt.";
}
break;
case 'fortlaufend':
$abkuerzung = $this->app->erp->GetNextNummer('projektnummer');
break;
}
}
else{
$this->app->Tpl->Set('MANUELL',' checked="checked" ');
}
}
// pruefe ob es abkuerzung schon gibt
if($isSaveForm) {
$checkabkuerzung = $this->app->DB->Select("SELECT p.id FROM `projekt` AS `p` WHERE p.abkuerzung = '$abkuerzung' LIMIT 1");
if($checkabkuerzung > 0 && $this->app->Secure->GetPOST('typ')==='manuell'){
$error[] = 'Abkürzung schon vorhanden. Bitte eine andere wählen.';
}
if($this->app->Secure->GetPOST('name')==''){
$error[] = 'Bitte geben Sie eine Bezeichung an.';
}
if($this->app->Secure->GetPOST("abkuerzung")=='' && $this->app->Secure->GetPOST('typ')==='manuell'){
$error[] = 'Bitte geben Sie eine Kennung an.';
}
if(empty($error)) {
$check = $this->finishCreateProject($abkuerzung);
if($check > 0) {
$oldProjectId = (int)$this->app->Secure->GetGET('id');
if($oldProjectId > 0){
$this->createAdditionalInputForCopyProjects($oldProjectId,$check);
return;
}
$msg = $this->app->erp->base64_url_encode("<div class=\"info\">Das Projekt wurde erfolgreich angelegt.</div>");
$this->app->Location->execute("index.php?module=projekt&action=uebersicht&id=$check&msg=$msg");
}
else{
$msg = $this->app->erp->base64_url_encode("<div class=\"error\">Es gab einen Fehler. Das Projekt konnte nicht angelegt werden.</div> ");
$this->app->Location->execute("index.php?module=projekt&action=list&msg=$msg");
}
}
}
if(!empty($error)) {
foreach($error as $errorMessage) {
$this->app->Tpl->Add('MESSAGE', '<div class="error">'.$errorMessage.'</div>');
}
}
$this->app->Tpl->Add(
'STATUSSEL',
$this->getProjectStatusSelect()
);
$this->app->YUI->AutoComplete('kunde', 'adresse');
$this->app->YUI->AutoComplete('verantwortlicher', 'adresse');
$this->app->YUI->CkEditor('beschreibung', 'belege');
$this->app->Tpl->Parse('TAB1', 'projekt_create_step3.tpl');
$this->app->Tpl->Parse('PAGE', 'projekt_create_step_form.tpl');
}
/**
* @param null|string $statusSelected
*
* @return string
*/
public function getProjectStatusSelect($statusSelected = null)
{
$html = '';
if($statusSelected === null) {
$statusSelected = (string)$this->app->Secure->GetPOST('status');
}
if(empty($statusSelected)) {
$statusSelected = 'gestartet';
}
foreach(['geplant','gestartet','abgeschlossen'] as $status) {
$html .= '<option'.($statusSelected === $status?' selected="selected" ':'').'>'.$status.'</option>';
}
return $html;
}
/**
* @var string $abkuerzung
* @var int|null $id
*
* @return int
*/
public function finishCreateProject($abkuerzung, $id = null): int
{
$data = [];
$data['name'] = $this->app->Secure->GetPOST('name');
$data['kunde'] = $this->app->Secure->GetPOST('kunde');
$data['verantwortlicher'] = explode(' ', $this->app->Secure->GetPOST('verantwortlicher'));
$data['verantwortlicher'] = (int)reset($data['verantwortlicher']);
if($data['verantwortlicher'] <= 0) {
$data['verantwortlicher'] = $this->app->User->GetAdresse();
}
$data['abkuerzung'] = $this->app->Secure->GetPOST('abkuerzung');
$data['beschreibung'] = $this->app->Secure->GetPOST('beschreibung');
$data['projekt'] = $this->app->Secure->GetPOST('projekt');
$data['status'] = $this->app->Secure->GetPOST('status');
$data['farbe'] = $this->app->Secure->GetPOST('farbe');
if($data['farbe'] === 'false') {
$data['farbe'] = '';
}
if($abkuerzung==''){
$abkuerzung = $data['abkuerzung'];
}
$allowed = "/[^a-zA-Z0-9._-]/";
$abkuerzung = preg_replace($allowed, '', $abkuerzung);
$abkuerzung = substr(strtoupper($abkuerzung),0,20);
if($abkuerzung) {
$data['abkuerzung'] = $abkuerzung;
}
// kopieren oder anlegen
if($id === null) {
$id = $this->app->Secure->GetGET('id');
}
if($id > 0) {
$check = $this->app->erp->CopyProjekt($id);
if($check > 0){
$this->app->DB->Update(
"UPDATE `projekt`
SET `name` = '" . $data['name'] . "', `abkuerzung` = '" . $data['abkuerzung'] . "',
`kunde` = '" . $data['kunde'] . "', `verantwortlicher` = '" . $data['verantwortlicher'] . "',
`beschreibung` = '" . $data['beschreibung'] . "', `status` = '" . $data['status'] . "'
WHERE `id` = '$check'
LIMIT 1"
);
$this->addUserToProjectToUserAddressRole($check);
if($this->app->erp->Firmendaten('projektoeffentlich')) {
$this->app->DB->Update("UPDATE projekt SET oeffentlich = 1 WHERE id = '$check' LIMIT 1");
}
}
}
else {
$check = $this->createProjectFromData($data);
$this->addUserToProjectToUserAddressRole($check);
}
return (int)$check;
}
/**
* @param int $oldProjectId
* @param int $copyProjectId
* @return bool
*/
public function createAdditionalInputForCopyProjects(int $oldProjectId, int $copyProjectId): bool
{
$hasAdditionalInput = false;
$this->app->Tpl->Set('TOID',$copyProjectId);
}
/**
* @param int $projectId
*/
public function addUserToProjectToUserAddressRole($projectId)
{
if(empty($projectId) || $this->app->erp->UserProjektRecht($projectId)) {
return;
}
$this->app->DB->Insert(
sprintf(
"INSERT INTO `adresse_rolle`
(`adresse`, `subjekt`, `praedikat`, `objekt`, `parameter`, `von`, `projekt`)
VALUES (%d, 'Mitglied', 'von', 'Projekt', '%d', NOW(), '%d')",
$this->app->User->GetAdresse(), $projectId, $projectId
)
);
}
/**
* @param array $data
*
* @return int
*/
public function createProjectFromData($data) {
if(empty($data['waehrung'])) {
$data['waehrung'] = $this->app->erp->Firmendaten('waehrung');
}
if(empty($data['steuersatz_normal'])) {
$data['steuersatz_normal'] = $this->app->erp->Firmendaten('steuersatz_normal');
}
if(empty($data['steuersatz_ermaessigt'])) {
$data['steuersatz_ermaessigt'] = $this->app->erp->Firmendaten('steuersatz_ermaessigt');
}
if($this->app->erp->Firmendaten('projektoeffentlich')) {
$data['oeffentlich'] = 1;
}
$this->app->DB->Insert(
sprintf(
"INSERT INTO `projekt`
(`name`, `abkuerzung`, `kunde`, `verantwortlicher`, `beschreibung`, `status`, `waehrung`,
`steuersatz_normal`, `steuersatz_ermaessigt`, `oeffentlich`, `farbe`)
VALUES
('%s', '%s', %d, '%s', '%s', '%s','%s', %f, %f, %d, '%s')",
$data['name'], $data['abkuerzung'], $data['kunde'], $data['verantwortlicher'], $data['beschreibung'],
(empty($data['status'])?'gestartet':$data['status']), $data['waehrung'],
$data['steuersatz_normal'], $data['steuersatz_ermaessigt'], (int)!empty($data['oeffentlich']),
$data['farbe']
)
);
return (int)$this->app->DB->GetInsertID();
}
function ProjektList()
{
$this->app->erp->MenuEintrag("index.php?module=projekt&action=list","&Uuml;bersicht");
$this->app->erp->MenuEintrag("index.php?module=projekt&action=schedule","Projektplan");
$this->app->erp->MenuEintrag("index.php?module=projekt&action=create","Neues Projekt anlegen");
$this->app->YUI->TableSearch('TAB1','projekttabelle', 'show','','',basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE',"projektuebersicht.tpl");
}
function ProjektMenu($id="")
{
if($id=="")
$id = $this->app->Secure->GetGET("id");
//$nummer = $this->app->Secure->GetPOST("nummer");
$data = $this->app->DB->SelectArr("SELECT p.abkuerzung as abk,p.name as projekt_name, a.kundennummer, a.name as kunde
FROM projekt p LEFT JOIN adresse a ON a.id=p.kunde WHERE p.id='$id' LIMIT 1");
$data = reset($data);
$this->app->Tpl->Add('KURZUEBERSCHRIFT2',$data['abk']." ".$data['projekt_name']." ".$data['kundennummer']." ".$data['kunde']);
$this->app->erp->MenuEintrag("index.php?module=projekt&action=uebersicht&id=$id","&Uuml;bersicht");
$anzahldateien = $this->app->erp->AnzahlDateien("Projekt",$id);
if($anzahldateien > 0) $anzahldateien = " (".$anzahldateien.")"; else $anzahldateien="";
$this->app->erp->MenuEintrag("index.php?module=projekt&action=dateien&id=$id","Dateien".$anzahldateien);
// if($this->app->erp->Version()!="stock")
// $this->app->erp->MenuEintrag("index.php?module=projekt&action=arbeitspaket&id=$id","Teilprojekte / Arbeitspakete");
// $this->app->Tpl->Add(TABS,"<li><a href=\"index.php?module=projekt&action=edit&id=$id\">Adressen</a></li>");
//$this->app->Tpl->Add(TABS,"<li><a href=\"index.php?module=projekt&action=schaltung&id=$id\">Schaltungen</a></li>");
//$this->app->Tpl->Add(TABS,"<li><a href=\"index.php?module=projekt&action=edit&id=$id\">Kosten</a></li>");
//$this->app->Tpl->Add(TABS,"<li><a href=\"index.php?module=projekt&action=edit&id=$id\">Wareneingang</a></li>");
// $this->app->erp->MenuEintrag("index.php?module=projekt&action=zeit&id=$id","Zeiterfassung");
// $this->app->erp->MenuEintrag("index.php?module=projekt&action=arbeitsnachweise&id=$id","Arbeitsnachweise");
//$this->app->erp->MenuEintrag("index.php?module=projekt&action=kostenstellen&id=$id","Kostenstellen");
// if($this->app->erp->Version()!="stock")
// $this->app->erp->MenuEintrag("index.php?module=projekt&action=kostenstellen&id=$id","Kostenstellen");
//$this->app->Tpl->Add(TABS,"<a href=\"index.php?module=projekt&action=kosten&id=$id\">idGesamtkalkulation</a>&nbsp;");
// $this->app->erp->MenuEintrag("index.php?module=projekt&action=pdf&id=$id","PDF");
// if($this->app->erp->Version()!="stock")
// $this->app->erp->MenuEintrag("index.php?module=projekt&action=plan&id=$id","Projektplan");
$this->app->erp->MenuEintrag("index.php?module=projekt&action=edit&id=$id","Einstellungen");
$this->app->erp->MenuEintrag("index.php?module=projekt&action=list","Zur&uuml;ck zur &Uuml;bersicht");
$this->app->erp->RunMenuHook('projekt');
//$this->app->erp->MenuEintrag("index.php?module=projekt&action=statistik&id=$id","Statistik");
}
function ProjektArbeitsnachweise()
{
$this->ProjektMenu();
$this->app->YUI->TableSearch('TAB1',"arbeitsnachweiseprojekt");
$this->app->Tpl->Set('TABTEXT',"Arbeitsnachweise");
$this->app->Tpl->Parse('PAGE',"tabview.tpl");
}
function ArbeitspaketReadDetails($index,&$ref)
{
}
function ProjektArbeitspaket()
{
$this->ProjektMenu();
$id = (int)$this->app->Secure->GetGET("id");
$pakete = $this->app->DB->SelectArr("SELECT * FROM arbeitspaket WHERE projekt = '$id' ORDER by vorgaenger, sort, id");
if($pakete)
{
$oldvorgaenger = -1;
foreach($pakete as $paket)
{
if($paket['sort'] == 0)
{
$newsort = 1+(int)$this->app->DB->Select("SELECT max(sort) FROM arbeitspaket WHERE projekt = '$id' AND vorgaenger = '".$paket['vorgaenger']."'");
$this->app->DB->Update("UPDATE arbeitspaket SET sort = '$newsort' WHERE id = '".$paket['id']."' LIMIT 1");
}
}
}
$abgerechnet = $this->app->Secure->GetPOST("abgerechnet");
$this->app->Tpl->Parse('MANUELLCHECKBOX',"checkbox.tpl");
$this->app->Tpl->Add('OFFENE',
"<center>
<input type=\"submit\" value=\"markierte Teilprojekte mit Zeitangabe in Rechnung oder Auftrag &uuml;berf&uuml;hren\" name=\"inklzeit\">
<input type=\"submit\" value=\"markierte Teilprojekte ohne Zeitangabe in Rechnung oder Auftrag &uuml;berf&uuml;hren\">
<br>
<br>
<input type=\"submit\" value=\"als abgerechnet markieren\" name=\"abgerechnetmarkiert\">
<input type=\"submit\" value=\"als offen markieren\" name=\"offenmarkiert\">
</center>");
if($abgerechnet!="")
{
$zid = $this->app->Secure->GetPOST("z_id");
for($i=0;$i<count($zid);$i++)
{
$zid_i = (int)$zid[$i];
$this->app->DB->Update("UPDATE zeiterfassung SET ist_abgerechnet=1, abgerechnet=1 WHERE id='$zid_i' LIMIT 1");
}
}
// neues arbeitspaket
$widget = new WidgetArbeitspaket($this->app,'TAB2');
$widget->form->SpecialActionAfterExecute("none",
"index.php?module=projekt&action=arbeitspaket&id=$id#tabs-1");
$this->app->Tpl->Set('TMPSCRIPT',"<script type=\"text/javascript\">$(document).ready(function(){ $('#tabs').tabs('select', 1); });</script>");
$widget->Create();
// easy table mit arbeitspaketen YUI als template
$this->app->YUI->TableSearch('TAB1',"projektzeiterfassung");
$tmp = $this->app->DB->Select("SELECT SUM(zeit_geplant) FROM arbeitspaket WHERE projekt='$id'");
//$this->app->Tpl->Add('TAB1',"<div class=\"info\">Kontigent Projekt (mit abgeschlossenen) geplant: $tmp</div>");
$this->app->Tpl->Parse('PAGE',"arbeitspaketeuebersicht.tpl");
}
function ProjektArbeitspaketEditPopup()
{
//$frame = $this->app->Secure->GetGET("frame");
$id = $this->app->Secure->GetGET("id");
$sid = $this->app->Secure->GetGET("sid");
$this->app->Tpl->Set('OPENDISABLE',"<!--");
$this->app->Tpl->Set('CLOSEDISABLE',"-->");
$sid = $this->app->DB->Select("SELECT projekt FROM arbeitspaket WHERE id='$id' LIMIT 1");
// $this->ProjektMenu($sid);
$abk= $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='$sid' LIMIT 1");
$name= $this->app->DB->Select("SELECT name FROM projekt WHERE id='$sid' LIMIT 1");
$this->app->Tpl->Add('KURZUEBERSCHRIFT',"Projekt $abk");
$this->app->Tpl->Add('KURZUEBERSCHRIFT2',$name);
$this->app->erp->MenuEintrag("index.php?module=projekt&action=arbeitspaket&id=$sid","Zur&uuml;ck zur &Uuml;bersicht");
$this->app->Tpl->Set('ABBRECHEN',"<input type=\"button\" value=\"Abbrechen\" onclick=\"window.location.href='index.php?module=projekt&action=arbeitspaket&id=$sid';\">");
$widget = new WidgetArbeitspaket($this->app,'TAB1');
$widget->form->SpecialActionAfterExecute("close_refresh",
"index.php?module=projekt&action=arbeitspaket&id=$sid#tabs-1");
$widget->Edit();
$this->app->Tpl->Add('TAB2',"Sie bearbeiten gerade ein Arbeitspaket. Erst nach dem Speichern k&ouml;nnen neue Arbeitspakete angelegt werden.");
$this->app->Tpl->Parse('PAGE',"arbeitspaketeuebersicht.tpl");
}
function ProjektArbeitspaketDisable()
{
// $this->ArtikelMenu();
$id = $this->app->Secure->GetGET("id");
$sid = $this->app->DB->Select("SELECT projekt FROM arbeitspaket WHERE id='$id' LIMIT 1");
$this->app->DB->Update("UPDATE arbeitspaket SET abgenommen=1,abgenommen_von='".$this->app->User->GetID()."' WHERE id='$id' LIMIT 1");
header("Location: index.php?module=projekt&action=arbeitspaket&id=".$sid);
exit;
}
function DeleteArbeitspaket($id)
{
$id = (int)$id;
if(!$this->app->erp->RechteVorhanden('projekt','arbeitspaketdelete'))return false;
$id = $this->app->DB->Select("SELECT id FROM arbeitspaket WHERE id = '$id' LIMIT 1");
$sid = $this->app->DB->Select("SELECT projekt FROM arbeitspaket WHERE id='$id' LIMIT 1");
if(!$id || !$sid)return false;
$vorgaenger = (int)$this->app->DB->Select("SELECT vorgaenger FROM arbeitspaket WHERE id='$id' LIMIT 1");
if($vorgaenger)$this->app->DB->Update("UPDATE arbeitspaket SET vorgaenger = '$vorgaenger' WHERE projekt = '$sid' AND vorgaenger = '$id'");
$this->app->DB->Delete("DELETE FROM arbeitspaket WHERE id='$id' LIMIT 1");
return true;
}
function ProjektArbeitspaketDelete()
{
// $this->ArtikelMenu();
$id = $this->app->Secure->GetGET("id");
$sid = $this->app->DB->Select("SELECT projekt FROM arbeitspaket WHERE id='$id' LIMIT 1");
$this->DeleteArbeitspaket($id);
header("Location: index.php?module=projekt&action=arbeitspaket&id=".$sid);
exit;
}
function ProjektArbeitspaketCopy()
{
$id = $this->app->Secure->GetGET("id");
$id = $this->app->DB->MysqlCopyRow("arbeitspaket","id",$id);
$this->app->DB->Update("UPDATE arbeitspaket SET geloescht='0', abgenommen='0', abgenommen_von='0', abgenommen_bemerkung='' WHERE id='$id' LIMIT 1");
//$this->app->DB->Update("UPDATE einkaufspreise SET geloescht='1' WHERE id='$id' LIMIT 1");
$sid = $this->app->DB->Select("SELECT projekt FROM arbeitspaket WHERE id='$id' LIMIT 1");
header("Location: index.php?module=projekt&action=arbeitspaket&id=".$sid);
exit;
}
function ProjektKalender()
{
$this->ProjektMenu();
if($this->app->Secure->GetPOST('submitForm') == 1)
{
$id = (int)$this->app->Secure->GetGET("id");
$eventid = $this->app->Secure->GetPOST("eventid");
$titel = $this->app->Secure->GetPOST("titel");
$datum = $this->app->Secure->GetPOST("datum");
$datum_bis = $this->app->Secure->GetPOST("datum_bis");
$allday = $this->app->Secure->GetPOST("allday");
$public = $this->app->Secure->GetPOST("public");
$erinnerung = $this->app->Secure->GetPOST("erinnerung");
$von = $this->app->Secure->GetPOST("von");
$bis = $this->app->Secure->GetPOST("bis");
$beschreibung = $this->app->Secure->GetPOST("beschreibung");
$ort = $this->app->Secure->GetPOST("ort");
$adresse = $this->app->Secure->GetPOST("adresse");
$adresseintern = $this->app->Secure->GetPOST("adresseintern");
$projekt = $this->app->Secure->GetPOST("projekt");
$personen = $this->app->Secure->GetPOST("personen");
if($personen == '')$personen = null;
$color = $this->app->Secure->GetPOST("color");
$mode = $this->app->Secure->GetPOST('mode');
$von_datum = $this->app->String->Convert("$datum $von", "%1.%2.%3 %4:%5", "%3-%2-%1 %4:%5");
$bis_datum = $this->app->String->Convert("$datum_bis $bis", "%1.%2.%3 %4:%5", "%3-%2-%1 %4:%5");
if($allday=='1') {
$von_datum = $this->app->String->Convert("$datum 00:00", "%1.%2.%3 %4:%5", "%3-%2-%1 %4:%5");
$bis_datum = $this->app->String->Convert("$datum_bis 00:00", "%1.%2.%3 %4:%5", "%3-%2-%1 %4:%5");
//$bis_datum = $datum_bis;
}
$adresse = trim($adresse);
$rest = explode(" ",$adresse);
$rest = $rest[0];
$adresse = $this->app->DB->Select("SELECT id FROM adresse WHERE id='$rest' AND geloescht=0 LIMIT 1");
$adresseintern = trim($adresseintern);
$rest = explode(" ",$adresseintern);
$rest = $rest[0];
$adresseintern = $this->app->DB->Select("SELECT id FROM adresse WHERE id='$rest' AND geloescht=0 LIMIT 1");
$projekt = trim($projekt);
$projekt = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung='$projekt' AND abkuerzung!='' LIMIT 1");
if($mode=="new") {
$this->app->DB->Insert("INSERT INTO kalender_event (ort,bezeichnung,beschreibung, von, bis, allDay, color, public,adresse,adresseintern,angelegtvon,erinnerung,projekt,typ)
VALUES ('$ort','$titel', '$beschreibung','$von_datum', '$bis_datum', '$allday', '$color', '$public','$adresse','$adresseintern','".$this->app->User->GetAdresse()."','$erinnerung','$projekt','meilenstein')");
$event = $this->app->DB->GetInsertID();
$calendarActionType = 'added';
$this->app->erp->RunHook('kalender_event_hook', 2, $event, $calendarActionType);
}elseif($mode == "edit")
{
$check = $this->app->DB->Select("SELECT id FROM kalender_event WHERE id='$eventid' AND projekt = '$id' AND typ = 'meilenstein' LIMIT 1");
if($check)
{
$this->app->DB->Update("UPDATE kalender_event SET ort='$ort',bezeichnung='$titel', beschreibung='$beschreibung',von='$von_datum', bis='$bis_datum',
allDay='$allday', color='$color', public='$public',adresse='$adresse',adresseintern='$adresseintern',erinnerung='$erinnerung' WHERE id='$eventid' LIMIT 1");
$calendarActionType = 'modified';
$this->app->erp->RunHook('kalender_event_hook', 2, $eventid, $calendarActionType);
$this->app->DB->Delete("DELETE FROM kalender_user WHERE event='$eventid'");
$event = $eventid;
}else{
$mode = "";
}
}
if(!in_array($this->app->User->GetID(),$personen))
{
$personen[]=$this->app->User->GetID();
}
// Schreibe Personen
if(is_numeric($event) && is_array($personen) && count($personen) && $mode!="delete" && $mode != "") {
for($p=0;$p<count($personen);$p++)
$this->app->DB->Insert("INSERT INTO kalender_user (event, userid) VALUES ('$event', '{$personen[$p]}')");
}
}
$cmd = $this->app->Secure->GetGET('cmd');
if($cmd == 'getkalender')
{
$id = $this->app->Secure->GetGET('id');
$data['write'] = 0;
if(strpos($id, 'task'))
{
$id = (int)str_replace('task','',$id);
$kalenderevent = $this->app->DB->SelectArr("SELECT id, ort, bezeichnung AS titel, beschreibung, von, bis, allDay, color, public,erinnerung,adresse,adresseintern,projekt, typ FROM kalender_event WHERE id='$id' LIMIT 1");
if($kalenderevent)
{
$data = reset($kalenderevent);
$data['write'] = 0;
$data['projekt'] = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id = '".$data['projekt']."' LIMIT 1");
if($data['typ'] == 'meilenstein')$data['write'] = 1;
$personen = $this->app->DB->SelectArr("SELECT DISTINCT ku.userid, a.name FROM kalender_user AS ku
LEFT JOIN user AS u ON u.id=ku.userid
LEFT JOIN adresse a ON a.id=u.adresse
WHERE ku.event='$id' ORDER BY u.username ");
$data['personen'] = $personen;
}
}
echo json_encode($data);
exit;
}
$user = $this->app->User->GetID();
$users = $this->app->DB->SelectArr("SELECT u.id, a.name as description FROM user u LEFT JOIN adresse a ON a.id=u.adresse WHERE u.activ='1' AND u.kalender_ausblenden!=1 ORDER BY u.username");
for($i=0; $i<count($users);$i++){
$user_out .= "<option value=\"{$users[$i]['id']}\" $select>{$users[$i]['description']}</option>";
}
$this->app->Tpl->Set('PERSONEN', $user_out);
$this->app->Tpl->Set('LINKADRESSE',"<a href=\"#\" onclick=\"splitstring = document.getElementById('adresse').value; felder = splitstring.split(' ', 3); if( felder[0] > 0) window.location.href='index.php?module=adresse&action=brief&id=' + felder[0];\" style=\"font-weight:normal;text-decoration:underline; position:absolute;margin-top:5px;margin-left:5px;\"><img src=\"themes/new/images/forward.svg\"></a>");
$id = (int)$this->app->Secure->GetGET("id");
$this->app->Tpl->Set('PROJEKTNAME', $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id = '$id' LIMIT 1"));
//$this->app->Tpl->Set('COLORS', $this->ColorPicker());
$this->app->YUI->ColorPicker("color");
$this->app->YUI->AutoComplete("adresse","adresse");
$this->app->YUI->AutoComplete("adresseintern","adresse");
$this->app->YUI->AutoComplete("projekt","projektname",1);
$this->app->YUI->DatePicker("datum");
$this->app->YUI->DatePicker("datum_bis");
$projektabgeschlossen = false;
if($this->app->DB->Select("SELECT id FROM projekt WHERE id = '$id' AND status = 'abgeschlossen' LIMIT 1"))$projektabgeschlossen = true;
if($projektabgeschlossen)
{
$this->app->Tpl->Set('VORSPEICHERN','/*');
$this->app->Tpl->Set('NACHSPEICHERN','*/');
$this->app->Tpl->Set('EDITABLE', 'false');
}else{
$this->app->Tpl->Set('EDITABLE', 'true');
}
$this->app->Tpl->Parse('TAB1',"projekt_dashboard_zeitplanung.tpl");
$this->app->Tpl->Parse('PAGE',"tabview.tpl");
}
function ProjektTagebuch()
{
$this->ProjektMenu();
$this->app->Tpl->Parse('PAGE',"projekt_tagebuch.tpl");
}
function ProjektuebersichtMinidetail(){
$id = $this->app->Secure->GetGET('id');
$arbeitsschritttabelle = new EasyTable($this->app);
$arbeitsschritttabelle->Query("SELECT p.belegnr AS produktion, pa.sort AS nr, pa.name AS arbeitsanweisung, '',
a.name AS 'geplanter Mitarbeiter',
CONCAT(
IF(pa.einzelzeit >= 3600,
CONCAT(FLOOR(pa.einzelzeit / 3600),':',
IF( MOD( pa.einzelzeit,3600)<360,'0','')),''
),
FLOOR(MOD(pa.einzelzeit,3600)/60 ),
':',
IF(MOD(pa.einzelzeit,60) < 10,'0',''),
MOD(pa.einzelzeit,60), ' min'
) as einzelzeit, pa.status
FROM produktion_arbeitsanweisung pa
LEFT JOIN adresse a ON pa.geplanter_mitarbeiter = a.id
JOIN produktion p ON pa.produktion = p.id
WHERE pa.status = 'gestartet' AND p.projekt = '$id' AND p.status = 'gestartet'
ORDER BY p.id, pa.sort");
$arbeitsschritttabelle->DisplayNew("ARBEITSSCHRITTE","Status","noAction");
$aufgabentabelle = new EasyTable($this->app);
$aufgabentabelle->Query("SELECT a.aufgabe, ap.aufgabe AS teilprojekt, adr.name as mitarbeiter,
if(a.abgabe_bis,DATE_FORMAT(abgabe_bis,'%d.%m.%Y'),'') as 'Abgabe-Termin', a.status
FROM aufgabe a
LEFT JOIN projekt p ON p.id=a.projekt
LEFT JOIN adresse adr ON a.adresse=adr.id
LEFT JOIN arbeitspaket ap ON ap.id=a.teilprojekt
WHERE a.projekt = '$id' AND a.status = 'offen'");
$aufgabentabelle->DisplayNew("AUFGABEN", "Status", "noAction");
$where = '';
for($i=1;$i<=10;$i++){
$where .= " (name = 'projektfreifeld".$i."' AND IFNULL((SELECT 1 FROM firmendaten_werte WHERE name = 'projektfreifeld".$i."spalte' AND wert > 0 LIMIT 1),0)) OR";
}
$where = rtrim($where, " OR");
$freifeldbez = $this->app->DB->SelectArr("SELECT wert, name FROM firmendaten_werte WHERE".$where);
$freifelder = array();
foreach ($freifeldbez as $value){
$freifelder[$value['name']] = $value['wert'];
}
for ($i=1;$i<=count($freifelder);$i++) {
if($freifelder['projektfreifeld'.$i] === ''){
$freifelder['projektfreifeld'.$i] = 'Freifeld '.$i;
}
}
$freifeldtable = "<table>";
for($i=1;$i<=10;$i++){
if(array_key_exists('projektfreifeld'.$i, $freifelder)){
$freifeldbla = $this->app->DB->Select("SELECT freifeld$i FROM projekt WHERE id = '$id' LIMIT 1");
$freifeldtable .= "<tr>";
$freifeldtable .= "<td><b>".$freifelder['projektfreifeld'.$i]."</b>:</td><td>".$freifeldbla."</td>";
$freifeldtable .= "</tr>";
}
}
$freifeldtable .= "</table>";
$this->app->Tpl->Set("PROJEKTFREIFELDER", $freifeldtable);
$this->app->Tpl->Output("projektuebersicht_minidetail.tpl");
exit;
}
function ProjektEdit()
{
$this->ProjektMenu();
$id = $this->app->Secure->GetGET("id");
$cmd = $this->app->Secure->GetPOST("cmd");
$mode = $this->app->Secure->GetPOST("mode");
if($cmd=="setup" && $mode > 0 && $id > 0)
{
$this->ProjektSetup($id,$mode);
echo json_encode('success');
$this->app->ExitXentral();
}
$this->app->Tpl->Set('TMPSCRIPT',"");
$allowed = "/[^a-zA-Z0-9._-]/";
$this->app->Secure->POST["abkuerzung"] = preg_replace($allowed,"",$this->app->Secure->POST["abkuerzung"]);
$this->app->Secure->POST["abkuerzung"]=substr(strtoupper($this->app->Secure->POST["abkuerzung"]),0,20);
$abkuerzung = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='$id' LIMIT 1");
if($abkuerzung=="")
{
$tmp_abkuerzung = $this->app->DB->Select("SELECT MAX(abkuerzung) FROM projekt");
$tmp_abkuerzung = $this->app->erp->CalcNextNummer($tmp_abkuerzung);
$this->app->DB->Update("UPDATE projekt SET abkuerzung='$tmp_abkuerzung' WHERE id='$id' LIMIT 1");
}
parent::ProjektEdit();
if($this->app->Secure->GetPOST("speichern")!="")
{
if($this->app->Secure->GetGET("msg")=="")
{
$msg = $msg.$this->app->Tpl->Get('MESSAGE');
$msg = base64_encode($msg);
} else {
$msg = base64_encode($msg);
}
$this->app->Location->execute("index.php?module=projekt&action=edit&id=$id&msg=$msg");
exit;
}
}
function ProjektSetup($project,$mode)
{
$data['kommissionierverfahren']="lieferscheinlager"; //OK
$data['multiorderpicking']=0; //OK
$data['autodruckrechnungstufe1']=0; //OK
$data['kommissionierlauflieferschein']=0; //OK
$data['autodruckrechnungstufe1mail']=0; //OK
$data['exportdruckrechnungstufe1']=0; //OK
$data['autodruckkommissionierscheinstufe1']=0; //OK
$data['kommissionierlistestufe1']=0; //OK
$data['rechnungerzeugen']=0; //OK
$data['lieferscheinedrucken']=0; //OK
$data['auftragdrucken']=0; //OK
$data['paketmarkedrucken']=0; //OK
$data['autodruckrechnung']=0; //OK
$data['exportdruckrechnung']=0; //OK
$data['print_proformainvoice']=0; //OK
$data['automailversandbestaetigung']=0; //OK
$data['automailrechnung']=0; //OK
$data['autodrucklieferschein']=0; //OK
$data['autodruckanhang']=0; //OK
$data['paketmarkeautodrucken']=0; //OK
$data['autodruckrechnungdoppel']=0; //OK
$data['druckennachtracking']=0; //OK
$data['autodruckrechnungstufe1menge']=1; //OK
$data['exportdruckrechnungstufe1menge']=3; //OK
$data['autodruckkommissionierscheinstufe1menge']=1; //OK
$data['kommissionierlistestufe1menge']=1; //OK
$data['lieferscheinedruckenmenge']=1; //OK
$data['auftragdruckenmenge']=1; //OK
$data['autodruckrechnungmenge']=1; //OK
$data['exportdruckrechnungmenge']=3; //OK
$data['proformainvoice_amount']=3; //OK
$data['autodrucklieferscheinmenge']=1; //OK
switch($mode)
{
case 1:
$data['kommissionierverfahren']="lieferscheinlager"; //OK
$data['autodruckrechnungstufe1mail']=1; //OK
$data['lieferscheinedrucken']=1; //OK
$data['paketmarkedrucken']=1; //OK
break;
case 2:
$data['kommissionierverfahren']="lieferscheinscan"; //OK
$data['kommissionierlistestufe1']=1; //OK
$data['rechnungerzeugen']=1; //OK
$data['automailversandbestaetigung']=1; //OK
$data['automailrechnung']=1; //OK
$data['autodrucklieferschein']=1; //OK
$data['paketmarkeautodrucken']=1; //OK
$data['druckennachtracking']=1; //OK
break;
case 3:
$data['kommissionierverfahren']="lieferscheinscan";
$data['multiorderpicking']=1; //OK
$data['rechnungerzeugen']=1; //OK
$data['automailversandbestaetigung']=1; //OK
$data['automailrechnung']=1; //OK
$data['autodrucklieferschein']=1; //OK
$data['paketmarkeautodrucken']=1; //OK
$data['druckennachtracking']=1; //OK
break;
case 4:
//$data['kommissionierverfahren']="";
break;
}
foreach($data as $name => $value)
{
$this->app->DB->Update("UPDATE projekt SET $name='$value' WHERE id='$project' LIMIT 1");
}
return;
}
function ProjektLogbuch()
{
$cmd = $this->app->Secure->GetGET('cmd');
$id = (int)$this->app->Secure->GetGET('id');
if($cmd == 'goto'){
$antwort = array('success' => 0, 'data' => 'Rechte für Vorgang nicht ausreichend');
$art = $this->app->Secure->GetGET('art');
switch ($art) {
case '1':
case '2':
case '4':
if($this->app->erp->RechteVorhanden('adresse', 'brief')){
if($art == 2){
$adressid = $this->app->DB->Select("SELECT adresse FROM dokumente_send WHERE id = '$id' LIMIT 1");
}else{
$adressid = $this->app->DB->Select("SELECT adresse_to FROM dokumente WHERE id = '$id' LIMIT 1"); // evtl. nur bei 1 bei notiz
}
$antwort['data'] = "?module=adresse&action=brief&id=$adressid";
$antwort['success'] = 1;
}
break;
case '5':
$adressid = $this->app->DB->Select("SELECT adresse FROM wiedervorlage WHERE id = '$id' LIMIT 1");
if($adressid > 0){
if($this->app->erp->RechteVorhanden('adresse', 'brief')){
$antwort['data'] = "?module=adresse&action=brief&id=$adressid";
$antwort['success'] = 1;
}
}else{
if($this->app->erp->RechteVorhanden('wiedervorlage', 'list')){
$antwort['data'] = "?module=wiedervorlage&action=list";
$antwort['success'] = 1;
}
}
break;
case '3':
case '33':
if($this->app->erp->RechteVorhanden('ticket', 'assistent')){
$antwort['data'] = "?module=ticket&action=assistent&id=$id";
$antwort['success'] = 1;
}
break;
case '6':
if($this->app->erp->RechteVorhanden('kalender', 'list')){
$antwort['data'] = "?module=kalender&action=list";
$antwort['success'] = 1;
}
break;
default:
$antwort['data'] = "Unbekannte Vorgangsart";
break;
}
echo json_encode($antwort);
exit;
}
//$this->app->Tpl->Set('ID',$id);
}
function ProjektMiniDetailBrief($parsetarget = "", $menu = true)
{
$doppelteids = $this->app->Secure->GetGET("id");
$ids = preg_split('/\-/',$doppelteids);
if(count($ids) > 1)
{
$typ = (int)$ids[0];
$id = (int)$ids[1];
switch($typ)
{
case '1':
$this->ProjektBriefPreview('dokumente',$id,false);
break;
case '2':
$this->ProjektBriefPreview('dokumente_send',$id,false);
break;
case '5':
$this->ProjektBriefPreview('wiedervorlage',$id,false);
break;
case '6':
$this->ProjektBriefPreview('kalender',$id,false);
break;
}
}
exit;
}
function ProjektBriefPreview($type = '', $id = '', $json = true) {
if(!$type)$type = $this->app->Secure->GetGET('type');
if(!$id)$id = $this->app->Secure->GetGET('id');
$query = '';
if ($type) {
switch ($type) {
case 'dokumente':
$query .= '
SELECT
id,
DATE_FORMAT(datum, "%d.%m.%Y") as datum,
betreff,
content
FROM
dokumente
WHERE
id = ' . $id . '
';
break;
case 'dokumente_send':
$query .= '
SELECT
id,
DATE_FORMAT(zeit, "%d.%m.%Y") as datum,
betreff,
text as content
FROM
dokumente_send
WHERE
id = ' . $id . '
';
break;
case 'wiedervorlage':
$query .= '
SELECT
id,
DATE_FORMAT(datum_angelegt, "%d.%m.%Y") as datum,
DATE_FORMAT(datum_erinnerung, "%d.%m.%Y") as datum_erinnerung,
DATE_FORMAT(zeit_angelegt,"%H:%i") as zeit_angelegt,
zeit_erinnerung,
bezeichnung as betreff,
beschreibung as content
FROM
wiedervorlage
WHERE
id = ' . $id . '
';
break;
case 'kalender':
$query .= '
SELECT
id,
DATE_FORMAT(von, "%d.%m.%Y") as datum,
DATE_FORMAT(bis, "%d.%m.%Y") as datumbis,
DATE_FORMAT(von, "%H:%i:%s") as uhrzeit,
DATE_FORMAT(bis, "%H:%i:%s") as uhrzeitbis,
allDay,
public,
adresseintern,
bezeichnung as betreff,
beschreibung as content
FROM
kalender_event
WHERE
id = ' . $id . '
';
break;
}
}
$res = $this->app->DB->SelectArr($query);
if ($res) {
$res = reset($res);
/*
if (isset($res['content'])) {
$res['content'] = '<input type="button" onclick="briefDrucken(' . $res['id'] . ');" value="Drucken"><br><br>'.nl2br($res['content']);
}
*/
}
if(isset($res['datum']) && !$tickets)
{
$res['content'] = '<b>Angelegt am: '.$res['datum'].(isset($res['zeit_angelegt'])?' '.$res['zeit_angelegt']:'')."</b><br />".$res['content'];
}
if($json)
{
echo json_encode($res);
} else {
//$ausg = "<h2>".$res['datum'].' '.$res['betreff']."</h2>".nl2br($res['content']);
if($res['content']=="") $res['content']="Kein Inhalt vorhanden";
if($this->app->DB->Select("SELECT COUNT(id) FROM datei_stichwoerter ds WHERE ds.subjekt='anhang' AND ds.objekt='dokument' AND ds.parameter='$id'") > 0 && $this->app->erp->RechteVorhanden("dateien","send"))
{
$table = new EasyTable($this->app);
$table->Query("SELECT d.titel,ds.id FROM datei_stichwoerter ds LEFT JOIN datei d ON d.id=ds.datei WHERE ds.subjekt='anhang' AND ds.objekt='dokument' AND ds.parameter='$id' ORDER by ds.sort");
$res['content'] .= $table->DisplayNew('return',"<a href=\"index.php?module=dateien&action=send&id=%value%\"><img src=\"./themes/new/images/download.svg\"></a>");
}
if($this->app->erp->isHTML($res['content']))
$ausg = $res['content'];
else
$ausg = nl2br($res['content']);
echo $ausg;
}
exit;
}
function ProjektDashboardMinidetailWiedervorlagen(){
/** @var wiedervorlage $obj */
$obj=$this->app->erp->LoadModul('wiedervorlage');
if(!empty($obj))
{
$obj->WiedervorlageMinidetail();
}else {
$this->app->ExitXentral();
}
}
}