diff --git a/www/pages/projekt.php b/www/pages/projekt.php
index db0c3f80..8c16df25 100644
--- a/www/pages/projekt.php
+++ b/www/pages/projekt.php
@@ -1,3703 +1,3698 @@
-
" . "" . " Conf->WFconf['defaulttheme']}/images/forward.svg\" border=\"0\"> " . " ";
-
- // 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(' ') ,
- concat(' ') ,
- concat(' ')
- , 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ü');
- $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 = "";
-
- // SQL statement
- $sql = "SELECT SQL_CALC_FOUND_ROWS v.id, ' 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('',v.verwendungszweck,' ',if(v.rechnung!='','RE ',''),v.rechnung,' '),v.rechnung),v.verwendungszweck,
- CONCAT(if(a.iban='',CONCAT('fehlt - bitte nachtragen '),a.iban),' / ',
- if(a.swift='',CONCAT('fehlt - bitte nachtragen '),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('',DATE_FORMAT(v.skontobis,'%d.%m.%Y'),' '),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('8%', '20%','5%','15%', '15%');
- $moreinfo = true;
- $moreinfoaction='projektuebersicht';
- $findcols = array('p.abkuerzung','p.name','a.kundennummer','a.name','p.verantwortlicher');
-
- $defaultorder = 6;
- $menu = "";
-
- // SQL statement
- $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, ' 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ü');
- $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 = "%value% Conf->WFconf['defaulttheme']."/images/forward.svg\" border=\"0\" onclick=\"gotovorgang(this)\" style=\"cursor: pointer;\"> ";
-
- $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,\'\',a.internebezeichnung,\' \')),
- a.ansprechpartner,
- a.abkuerzung,
- a.bearbeiter,
- a.art,
- a.gesendet,
- a.pdf,
- a.did
- FROM
- (
- (
- SELECT
- d.id," 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")," ") 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," 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),"index.php?module=",ds.dokument,"&action=edit&id=",ds.parameter," ") as art,
- CONCAT(IF(ds.versendet = 1, "JA", "NEIN")," ") as gesendet,
- concat(" Conf->WFconf['defaulttheme'] . '/images/pdf.svg> ") 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," 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(" ") 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," 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(\'\',ticket.notiz,\' \'),\'\')) as title,ticket_nachricht.verfasser as ansprechpartner,
- projekt.abkuerzung as abkuerzung,
- ticket.bearbeiter,
- CONCAT("Ticket") as art,
- CONCAT("JA ") 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,\'\',a.internebezeichnung,\' \')),
- $sql.= 'UNION ALL
- (
- SELECT
- ticket.id," 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(\'\',ticket.notiz,\' \'),\'\')) as title,ticket_nachricht.verfasser as ansprechpartner,
-
- projekt.abkuerzung as abkuerzung,
- ticket.bearbeiter,
- CONCAT("Ticket") as art,
- CONCAT("JA ") 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," 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 ") 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," 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(" ") 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(' ', ' ', $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 = ' ';
-
- $alignright = array(7,8);
- $aligncenter = array(9);
-
- $sql = 'SELECT SQL_CALC_FOUND_ROWS w.id," 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(\' (zum Angebot) \'),if(w.module=\'ticket\' AND w.parameter > 0,CONCAT(\' (zum Ticket) \'),\'\'))),
- '.$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("Das Projekt wurde erfolgreich kopiert.
");
- $this->app->Location->execute('index.php?module=projekt&action=list&msg='.$msg);
- }
- $msg = $this->app->erp->base64_url_encode("Fehler beim Kopieren des Projekts.
");
- }else{
- $msg = $this->app->erp->base64_url_encode("Fehlende Projektrechte: Das Projekt wurde nicht kopiert.
");
- }
- $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','Rolle '.$rolle.' angelegt
');
- }
- }
-
- $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',"Übersicht ");
-
- $this->app->Tpl->Add('TAB1'," ");
- $this->app->Tpl->Add('TAB1',"Umfang ");
- $this->app->Tpl->Add('TAB1',"");
-
- $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', "$pos " . $aufgabe . " ");
- }
- else{
- $this->app->Tpl->Add('TAB1', "$pos " . $aufgabe . " ");
- }
-
- $painted=false;
- for($j=0;$j<$baumtiefe;$j++)
- {
- if($vorgaenger==$this->voraengerbaum[$j] && $painted==false){
- $this->app->Tpl->Add('TAB1',"X ");
- $painted=true;
- }
- else{
- $this->app->Tpl->Add('TAB1', " ");
- }
- }
- $this->app->Tpl->Add('TAB1'," ");
- $pos++;
- }
- $this->app->Tpl->Add('TAB1',"
");
-
-
- $this->app->Tpl->Add('TAB1',"Details ");
-
- $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 = " 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 = "
- Stunden: $zeit_geplant
- oder Fixkosten: $kosten_geplant
-
";
-
- }
- $this->app->Tpl->Add('TAB1',"".$pos.". $aufgabe ($art)
-
- Beschreibung: Aufwand:
- ".nl2br($beschreibung)."
- $kostentabelle
-
- $abgabe_bis
-
");
- $pos++;
- }
-
-
- //Material
- $this->app->Tpl->Add('TAB1',"Material ");
-
- $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', "
-
- Material: $aufgabeKosten:
- " . nl2br($beschreibung) . "
-
- Komplett: $kosten_geplant " . $this->projektwaehrung . "
-
-
");
-
- $gesamt_kosten = $gesamt_kosten + $kosten_geplant;
- }
- }
-
- $stundensatz = "65";
-
- $gesamt = $gesamt_kosten + $gesamt_zeit*$stundensatz;
-
- $this->app->Tpl->Add('TAB1',"Kosten
-
-
- Gesamt:
-
-
- Stunden: $gesamt_zeit h (á $stundensatz ".$this->projektwaehrung.")
- externe Kosten: $gesamt_kosten ".$this->projektwaehrung."
- Gesamt: $gesamt ".$this->projektwaehrung." (zzgl. gesetzl. MwSt.)
-
-
- ");
-
- $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,"Noch nicht freigegebene Angeboten können nicht als PDF betrachtet werden.!
");
-
- $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'] = 'Summe Gesamt ';
- $v['nummer'] = '-';
- $v['BE'] = '-';
- $v['PR'] = '-';
- $v['AN'] = '-';
- $v['AB'] = '-';
- $v['LS'] = '-';
- $v['RE'] = '-';
- $v['GS'] = '-';
- $v['zeit_summiert'] = ''.number_format($zeit_summiert,2).' ';
- $v['zeit_geplant'] = $v['zeit_summiert'];
- $v['gebucht_summiert'] = ''.number_format($gebucht_summiert,2).' ';
- $v['zeit_gebucht'] = ''.number_format($gebucht_summiert,2).' ';
- $v['zeit_offen'] = ''.number_format($offen_summiert,2).' ';
- $v['zeit_abgerechnet'] = ''.number_format($abgerechnet_summiert,2).' ';
- $v['kosten_geplant'] = ''.number_format($kosten_summiert,2,',','.').' ';
- $v['rohertrag_zeit'] = ''.number_format($gesamt_rohertrag_zeit,2,'.','').' ';
- $v['rohertrag_artikel'] = ''.number_format($gesamt_rohertrag_artikel,2,'.','').' ';
- $v['rohertrag_gesamt'] = ''.number_format($gesamt_rohertrag_gesamt,2,'.','').' ';
-
- $v['rohertrag_zeit_geplant'] = ''.number_format($gesamt_rohertrag_zeit_geplant,2,'.','').' ';
- $v['rohertrag_artikel_geplant'] = ''.number_format($gesamt_rohertrag_artikel_geplant,2,'.','').' ';
- $v['rohertrag_gesamt_geplant'] = ''.number_format($gesamt_rohertrag_gesamt_geplant,2,'.','').' ';
- $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'] = ''.number_format($gesamt_zeit_ek_geplant,2,'.','').' ';
- $v['zeit_ek_gebucht'] = ''.number_format($gesamt_zeit_ek_gebucht,2,'.','').' ';
- $v['zeit_ek_offen'] = ''.number_format($gesamt_zeit_ek_offen,2,'.','').' ';
- $v['zeit_vk_geplant'] = ''.number_format($gesamt_zeit_vk_geplant,2,'.','').' ';
- $v['zeit_vk_gebucht'] = ''.number_format($gesamt_zeit_vk_gebucht,2,'.','').' ';
- $v['zeit_vk_offen'] = ''.number_format($gesamt_zeit_vk_offen,2,'.','').' ';
-
- $v['artikel_ek_geplant'] = ''.number_format($gesamt_artikel_ek_geplant,2,'.','').' ';
- $v['artikel_ek_gebucht'] = ''.number_format($gesamt_artikel_ek_gebucht,2,'.','').' ';
- $v['artikel_ek_offen'] = ''.number_format($gesamt_artikel_ek_offen,2,'.','').' ';
- $v['artikel_vk_geplant'] = ''.number_format($gesamt_artikel_vk_geplant,2,'.','').' ';
- $v['artikel_vk_gebucht'] = ''.number_format($gesamt_artikel_vk_gebucht,2,'.','').' ';
- $v['artikel_vk_offen'] = ''.number_format($gesamt_artikel_vk_offen,2,'.','').' ';
- $v['prognose_artikel'] = ''.number_format($prognose_artikel,2,'.','').' ';
- $v['prognose_zeit'] = ''.number_format($prognose_zeit,2,'.','').' ';
- $v['prognose_zeit_geplant'] = ''.number_format($prognose_zeit_geplant,2,'.','').' ';
- $v['prognose_gesamt'] = ''.number_format($prognose_gesamt,2,'.','').' ';
-
- $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 ' ';
- }
-
- 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("Die Kennung gibt es bereits. Es wurde automatisch eine Folgenummer angelegt.
");
- $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("Die Kennung ist ein Pflichtfeld. Es wurde eine automatische Kennung vergeben.
");
- $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 .= "".$bez.": ";
- 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 .= ' app->DB->Select("SELECT freifeld".$v['index']." FROM projekt WHERE id = '$id' LIMIT 1")?' checked="checked" ':'').' />';
- break;
- case 'mehrzeilig':
- $output .= '';
- break;
- case 'datum':
- $output .=' ';
- $this->app->YUI->DatePicker('freifeld'.$v['index']);
- break;
-
- case 'select':
- $output .= '';
- $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 .= ''.$tmpv.' ';
- foreach($optionen as $ov)
- {
- $ovvalue=$ov;
- if(strpos($ov,'=>') !== false) {
- list($ov, $ovvalue) = explode('=>', $ov);
- }
- $output .= ''.$ov.' ';
- }
- }else{
- $output .= ''.$tmpv.' ';
- }
- $output .= ' ';
- break;
- default:
- $output .= ' ';
- break;
- }
- $output .= " ";
- }
-
- $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(' ') 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('',LEFT(z.aufgabe, 37), '... '),
- CONCAT('',z.aufgabe,' ')) as Taetigkeit,
- CONCAT(v.nummer,' ',v.beschreibung) as verrechnungsart,
-
- if(z.arbeitsnachweis > 0,CONCAT('gebucht '),'-') as arbeitsnachweis,
-
- CONCAT(' ')
- 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('',LEFT(z.aufgabe, 37), '... '),
- CONCAT('',z.aufgabe,' ')) as Taetigkeit,
- CONCAT(v.nummer,' ',v.beschreibung) as verrechnungsart,
-
- if(z.arbeitsnachweis > 0,CONCAT('gebucht '),'-') as arbeitsnachweis,
-
- CONCAT(' ')
- 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'," ");
-
- $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;$iapp->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." ";
- $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="Alle ";
-
- if($sid=="ohne")
- $options.="Ohne ";
- else
- $options.="Ohne ";
-
- for($i=0;$i".$tmp[$i][aufgabe]."";
-
- }
-
- $this->app->Tpl->Add(INHALT,"
-
-
- Auswahl Unterprojekt/Arbeitspaket: $options
- ");
-
- $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'," Summe offen: $summe ");
- $this->app->Tpl->Add('MATERIAL'," 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," Summe offen: $summe Summe gesamt: $summegesamt ");
-
-
-
- $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," Summe offen: $summe Summe gesamt: $summegesamt ");
- }
-
- 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',"
- Neues Teilprojekt anlegen:
- Name: Budget: Liefertermin:
-
-
-
-
- Prototyp 1 (inkl. eagle, stuecklisten, fertigungsauftrag fuer prototype, prueflisten, lagerbestand, bestellungsauftrag usw..) Budget 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("Das Projekt wurde erfolgreich kopiert.
");
- $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("Das Projekt wurde erfolgreich kopiert.
");
- $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ä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(' ', $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ück zur Ü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ä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("Das Projekt wurde erfolgreich angelegt.
");
- $this->app->Location->execute("index.php?module=projekt&action=uebersicht&id=$check&msg=$msg");
-
- }
- else{
- $msg = $this->app->erp->base64_url_encode("Es gab einen Fehler. Das Projekt konnte nicht angelegt werden.
");
- $this->app->Location->execute("index.php?module=projekt&action=list&msg=$msg");
- }
- }
- }
-
- if(!empty($error)) {
- foreach($error as $errorMessage) {
- $this->app->Tpl->Add('MESSAGE', ''.$errorMessage.'
');
- }
- }
- $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 .= ''.$status.' ';
- }
-
- 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","Ü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","Ü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,"Adressen ");
- //$this->app->Tpl->Add(TABS,"Schaltungen ");
- //$this->app->Tpl->Add(TABS,"Kosten ");
- //$this->app->Tpl->Add(TABS,"Wareneingang ");
- // $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,"idGesamtkalkulation ");
- // $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ück zur Ü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',
- "
-
-
-
-
-
-
- ");
-
- if($abgerechnet!="")
- {
- $zid = $this->app->Secure->GetPOST("z_id");
- for($i=0;$iapp->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',"");
-
- $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',"Kontigent Projekt (mit abgeschlossenen) geplant: $tmp
");
-
- $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',"");
-
-
- $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ück zur Übersicht");
- $this->app->Tpl->Set('ABBRECHEN'," ");
-
- $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ö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;$papp->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{$users[$i]['description']}";
- }
- $this->app->Tpl->Set('PERSONEN', $user_out);
-
-
- $this->app->Tpl->Set('LINKADRESSE'," 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;\"> ");
- $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, ag.bezeichnung,
- 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
- LEFT JOIN arbeitsplatzgruppen ag ON pa.arbeitsplatzgruppe = ag.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 = "";
- 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 .= "";
- $freifeldtable .= "".$freifelder['projektfreifeld'.$i]." :".$freifeldbla." ";
- $freifeldtable .= " ";
- }
- }
- $freifeldtable .= "
";
-
- $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'] = ' '.nl2br($res['content']);
- }
- */
- }
- if(isset($res['datum']) && !$tickets)
- {
- $res['content'] = 'Angelegt am: '.$res['datum'].(isset($res['zeit_angelegt'])?' '.$res['zeit_angelegt']:'')." ".$res['content'];
- }
-
- if($json)
- {
- echo json_encode($res);
- } else {
- //$ausg = "".$res['datum'].' '.$res['betreff']." ".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'," ");
- }
-
- 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();
- }
- }
-
-
-}
+" . "" . " Conf->WFconf['defaulttheme']}/images/forward.svg\" border=\"0\"> " . " ";
+
+ // 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(' ') ,
+ concat(' ') ,
+ concat(' ')
+ , 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ü');
+ $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 = "";
+
+ // SQL statement
+ $sql = "SELECT SQL_CALC_FOUND_ROWS v.id, ' 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('',v.verwendungszweck,' ',if(v.rechnung!='','RE ',''),v.rechnung,' '),v.rechnung),v.verwendungszweck,
+ CONCAT(if(a.iban='',CONCAT('fehlt - bitte nachtragen '),a.iban),' / ',
+ if(a.swift='',CONCAT('fehlt - bitte nachtragen '),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('',DATE_FORMAT(v.skontobis,'%d.%m.%Y'),' '),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 = "";
+
+ // SQL statement
+ $sql = "SELECT SQL_CALC_FOUND_ROWS p.id, ' 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ü');
+ $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 = "%value% Conf->WFconf['defaulttheme']."/images/forward.svg\" border=\"0\" onclick=\"gotovorgang(this)\" style=\"cursor: pointer;\"> ";
+
+ $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,\'\',a.internebezeichnung,\' \')),
+ a.ansprechpartner,
+ a.abkuerzung,
+ a.bearbeiter,
+ a.art,
+ a.gesendet,
+ a.pdf,
+ a.did
+ FROM
+ (
+ (
+ SELECT
+ d.id," 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")," ") 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," 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),"index.php?module=",ds.dokument,"&action=edit&id=",ds.parameter," ") as art,
+ CONCAT(IF(ds.versendet = 1, "JA", "NEIN")," ") as gesendet,
+ concat(" Conf->WFconf['defaulttheme'] . '/images/pdf.svg> ") 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," 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(" ") 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," 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(\'\',ticket.notiz,\' \'),\'\')) as title,ticket_nachricht.verfasser as ansprechpartner,
+ projekt.abkuerzung as abkuerzung,
+ ticket.bearbeiter,
+ CONCAT("Ticket") as art,
+ CONCAT("JA ") 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,\'\',a.internebezeichnung,\' \')),
+ $sql.= 'UNION ALL
+ (
+ SELECT
+ ticket.id," 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(\'\',ticket.notiz,\' \'),\'\')) as title,ticket_nachricht.verfasser as ansprechpartner,
+
+ projekt.abkuerzung as abkuerzung,
+ ticket.bearbeiter,
+ CONCAT("Ticket") as art,
+ CONCAT("JA ") 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," 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 ") 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," 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(" ") 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(' ', ' ', $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 = ' ';
+
+ $alignright = array(7,8);
+ $aligncenter = array(9);
+
+ $sql = 'SELECT SQL_CALC_FOUND_ROWS w.id," 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(\' (zum Angebot) \'),if(w.module=\'ticket\' AND w.parameter > 0,CONCAT(\' (zum Ticket) \'),\'\'))),
+ '.$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("Das Projekt wurde erfolgreich kopiert.
");
+ $this->app->Location->execute('index.php?module=projekt&action=list&msg='.$msg);
+ }
+ $msg = $this->app->erp->base64_url_encode("Fehler beim Kopieren des Projekts.
");
+ }else{
+ $msg = $this->app->erp->base64_url_encode("Fehlende Projektrechte: Das Projekt wurde nicht kopiert.
");
+ }
+ $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','Rolle '.$rolle.' angelegt
');
+ }
+ }
+
+ $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',"Übersicht ");
+
+ $this->app->Tpl->Add('TAB1'," ");
+ $this->app->Tpl->Add('TAB1',"Umfang ");
+ $this->app->Tpl->Add('TAB1',"");
+
+ $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', "$pos " . $aufgabe . " ");
+ }
+ else{
+ $this->app->Tpl->Add('TAB1', "$pos " . $aufgabe . " ");
+ }
+
+ $painted=false;
+ for($j=0;$j<$baumtiefe;$j++)
+ {
+ if($vorgaenger==$this->voraengerbaum[$j] && $painted==false){
+ $this->app->Tpl->Add('TAB1',"X ");
+ $painted=true;
+ }
+ else{
+ $this->app->Tpl->Add('TAB1', " ");
+ }
+ }
+ $this->app->Tpl->Add('TAB1'," ");
+ $pos++;
+ }
+ $this->app->Tpl->Add('TAB1',"
");
+
+
+ $this->app->Tpl->Add('TAB1',"Details ");
+
+ $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 = " 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 = "
+ Stunden: $zeit_geplant
+ oder Fixkosten: $kosten_geplant
+
";
+
+ }
+ $this->app->Tpl->Add('TAB1',"".$pos.". $aufgabe ($art)
+
+ Beschreibung: Aufwand:
+ ".nl2br($beschreibung)."
+ $kostentabelle
+
+ $abgabe_bis
+
");
+ $pos++;
+ }
+
+
+ //Material
+ $this->app->Tpl->Add('TAB1',"Material ");
+
+ $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', "
+
+ Material: $aufgabeKosten:
+ " . nl2br($beschreibung) . "
+
+ Komplett: $kosten_geplant " . $this->projektwaehrung . "
+
+
");
+
+ $gesamt_kosten = $gesamt_kosten + $kosten_geplant;
+ }
+ }
+
+ $stundensatz = "65";
+
+ $gesamt = $gesamt_kosten + $gesamt_zeit*$stundensatz;
+
+ $this->app->Tpl->Add('TAB1',"Kosten
+
+
+ Gesamt:
+
+
+ Stunden: $gesamt_zeit h (á $stundensatz ".$this->projektwaehrung.")
+ externe Kosten: $gesamt_kosten ".$this->projektwaehrung."
+ Gesamt: $gesamt ".$this->projektwaehrung." (zzgl. gesetzl. MwSt.)
+
+
+ ");
+
+ $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,"Noch nicht freigegebene Angeboten können nicht als PDF betrachtet werden.!
");
+
+ $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'] = 'Summe Gesamt ';
+ $v['nummer'] = '-';
+ $v['BE'] = '-';
+ $v['PR'] = '-';
+ $v['AN'] = '-';
+ $v['AB'] = '-';
+ $v['LS'] = '-';
+ $v['RE'] = '-';
+ $v['GS'] = '-';
+ $v['zeit_summiert'] = ''.number_format($zeit_summiert,2).' ';
+ $v['zeit_geplant'] = $v['zeit_summiert'];
+ $v['gebucht_summiert'] = ''.number_format($gebucht_summiert,2).' ';
+ $v['zeit_gebucht'] = ''.number_format($gebucht_summiert,2).' ';
+ $v['zeit_offen'] = ''.number_format($offen_summiert,2).' ';
+ $v['zeit_abgerechnet'] = ''.number_format($abgerechnet_summiert,2).' ';
+ $v['kosten_geplant'] = ''.number_format($kosten_summiert,2,',','.').' ';
+ $v['rohertrag_zeit'] = ''.number_format($gesamt_rohertrag_zeit,2,'.','').' ';
+ $v['rohertrag_artikel'] = ''.number_format($gesamt_rohertrag_artikel,2,'.','').' ';
+ $v['rohertrag_gesamt'] = ''.number_format($gesamt_rohertrag_gesamt,2,'.','').' ';
+
+ $v['rohertrag_zeit_geplant'] = ''.number_format($gesamt_rohertrag_zeit_geplant,2,'.','').' ';
+ $v['rohertrag_artikel_geplant'] = ''.number_format($gesamt_rohertrag_artikel_geplant,2,'.','').' ';
+ $v['rohertrag_gesamt_geplant'] = ''.number_format($gesamt_rohertrag_gesamt_geplant,2,'.','').' ';
+ $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'] = ''.number_format($gesamt_zeit_ek_geplant,2,'.','').' ';
+ $v['zeit_ek_gebucht'] = ''.number_format($gesamt_zeit_ek_gebucht,2,'.','').' ';
+ $v['zeit_ek_offen'] = ''.number_format($gesamt_zeit_ek_offen,2,'.','').' ';
+ $v['zeit_vk_geplant'] = ''.number_format($gesamt_zeit_vk_geplant,2,'.','').' ';
+ $v['zeit_vk_gebucht'] = ''.number_format($gesamt_zeit_vk_gebucht,2,'.','').' ';
+ $v['zeit_vk_offen'] = ''.number_format($gesamt_zeit_vk_offen,2,'.','').' ';
+
+ $v['artikel_ek_geplant'] = ''.number_format($gesamt_artikel_ek_geplant,2,'.','').' ';
+ $v['artikel_ek_gebucht'] = ''.number_format($gesamt_artikel_ek_gebucht,2,'.','').' ';
+ $v['artikel_ek_offen'] = ''.number_format($gesamt_artikel_ek_offen,2,'.','').' ';
+ $v['artikel_vk_geplant'] = ''.number_format($gesamt_artikel_vk_geplant,2,'.','').' ';
+ $v['artikel_vk_gebucht'] = ''.number_format($gesamt_artikel_vk_gebucht,2,'.','').' ';
+ $v['artikel_vk_offen'] = ''.number_format($gesamt_artikel_vk_offen,2,'.','').' ';
+ $v['prognose_artikel'] = ''.number_format($prognose_artikel,2,'.','').' ';
+ $v['prognose_zeit'] = ''.number_format($prognose_zeit,2,'.','').' ';
+ $v['prognose_zeit_geplant'] = ''.number_format($prognose_zeit_geplant,2,'.','').' ';
+ $v['prognose_gesamt'] = ''.number_format($prognose_gesamt,2,'.','').' ';
+
+ $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 ' ';
+ }
+
+ 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("Die Kennung gibt es bereits. Es wurde automatisch eine Folgenummer angelegt.
");
+ $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("Die Kennung ist ein Pflichtfeld. Es wurde eine automatische Kennung vergeben.
");
+ $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 .= "".$bez.": ";
+ 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 .= ' app->DB->Select("SELECT freifeld".$v['index']." FROM projekt WHERE id = '$id' LIMIT 1")?' checked="checked" ':'').' />';
+ break;
+ case 'mehrzeilig':
+ $output .= '';
+ break;
+ case 'datum':
+ $output .=' ';
+ $this->app->YUI->DatePicker('freifeld'.$v['index']);
+ break;
+
+ case 'select':
+ $output .= '';
+ $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 .= ''.$tmpv.' ';
+ foreach($optionen as $ov)
+ {
+ $ovvalue=$ov;
+ if(strpos($ov,'=>') !== false) {
+ list($ov, $ovvalue) = explode('=>', $ov);
+ }
+ $output .= ''.$ov.' ';
+ }
+ }else{
+ $output .= ''.$tmpv.' ';
+ }
+ $output .= ' ';
+ break;
+ default:
+ $output .= ' ';
+ break;
+ }
+ $output .= " ";
+ }
+
+ $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(' ') 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('',LEFT(z.aufgabe, 37), '... '),
+ CONCAT('',z.aufgabe,' ')) as Taetigkeit,
+ CONCAT(v.nummer,' ',v.beschreibung) as verrechnungsart,
+
+ if(z.arbeitsnachweis > 0,CONCAT('gebucht '),'-') as arbeitsnachweis,
+
+ CONCAT(' ')
+ 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('',LEFT(z.aufgabe, 37), '... '),
+ CONCAT('',z.aufgabe,' ')) as Taetigkeit,
+ CONCAT(v.nummer,' ',v.beschreibung) as verrechnungsart,
+
+ if(z.arbeitsnachweis > 0,CONCAT('gebucht '),'-') as arbeitsnachweis,
+
+ CONCAT(' ')
+ 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'," ");
+
+ $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;$iapp->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." ";
+ $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="Alle ";
+
+ if($sid=="ohne")
+ $options.="Ohne ";
+ else
+ $options.="Ohne ";
+
+ for($i=0;$i".$tmp[$i][aufgabe]."";
+
+ }
+
+ $this->app->Tpl->Add(INHALT,"
+
+
+ Auswahl Unterprojekt/Arbeitspaket: $options
+ ");
+
+ $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'," Summe offen: $summe ");
+ $this->app->Tpl->Add('MATERIAL'," 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," Summe offen: $summe Summe gesamt: $summegesamt ");
+
+
+
+ $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," Summe offen: $summe Summe gesamt: $summegesamt ");
+ }
+
+ 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',"
+ Neues Teilprojekt anlegen:
+ Name: Budget: Liefertermin:
+
+
+
+
+ Prototyp 1 (inkl. eagle, stuecklisten, fertigungsauftrag fuer prototype, prueflisten, lagerbestand, bestellungsauftrag usw..) Budget 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("Das Projekt wurde erfolgreich kopiert.
");
+ $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("Das Projekt wurde erfolgreich kopiert.
");
+ $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ä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(' ', $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ück zur Ü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ä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("Das Projekt wurde erfolgreich angelegt.
");
+ $this->app->Location->execute("index.php?module=projekt&action=uebersicht&id=$check&msg=$msg");
+
+ }
+ else{
+ $msg = $this->app->erp->base64_url_encode("Es gab einen Fehler. Das Projekt konnte nicht angelegt werden.
");
+ $this->app->Location->execute("index.php?module=projekt&action=list&msg=$msg");
+ }
+ }
+ }
+
+ if(!empty($error)) {
+ foreach($error as $errorMessage) {
+ $this->app->Tpl->Add('MESSAGE', ''.$errorMessage.'
');
+ }
+ }
+ $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 .= ''.$status.' ';
+ }
+
+ 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","Ü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","Ü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,"Adressen ");
+ //$this->app->Tpl->Add(TABS,"Schaltungen ");
+ //$this->app->Tpl->Add(TABS,"Kosten ");
+ //$this->app->Tpl->Add(TABS,"Wareneingang ");
+ // $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,"idGesamtkalkulation ");
+ // $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ück zur Ü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',
+ "
+
+
+
+
+
+
+ ");
+
+ if($abgerechnet!="")
+ {
+ $zid = $this->app->Secure->GetPOST("z_id");
+ for($i=0;$iapp->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',"");
+
+ $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',"Kontigent Projekt (mit abgeschlossenen) geplant: $tmp
");
+
+ $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',"");
+
+
+ $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ück zur Übersicht");
+ $this->app->Tpl->Set('ABBRECHEN'," ");
+
+ $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ö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;$papp->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{$users[$i]['description']}";
+ }
+ $this->app->Tpl->Set('PERSONEN', $user_out);
+
+
+ $this->app->Tpl->Set('LINKADRESSE'," 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;\"> ");
+ $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, ag.bezeichnung,
+ 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
+ LEFT JOIN arbeitsplatzgruppen ag ON pa.arbeitsplatzgruppe = ag.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 = "";
+ 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 .= "";
+ $freifeldtable .= "".$freifelder['projektfreifeld'.$i]." :".$freifeldbla." ";
+ $freifeldtable .= " ";
+ }
+ }
+ $freifeldtable .= "
";
+
+ $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'] = ' '.nl2br($res['content']);
+ }
+ */
+ }
+ if(isset($res['datum']) && !$tickets)
+ {
+ $res['content'] = 'Angelegt am: '.$res['datum'].(isset($res['zeit_angelegt'])?' '.$res['zeit_angelegt']:'')." ".$res['content'];
+ }
+
+ if($json)
+ {
+ echo json_encode($res);
+ } else {
+ //$ausg = "".$res['datum'].' '.$res['betreff']." ".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'," ");
+ }
+
+ 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();
+ }
+ }
+
+
+}