";
// 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 = "
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',"
");
$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 .= '';
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="";
if($sid=="ohne")
$options.="";
else
$options.="";
for($i=0;$i".$tmp[$i][aufgabe]."";
}
$this->app->Tpl->Add(INHALT,"
Auswahl Unterprojekt/Arbeitspaket:
");
$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:
");
// $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'] = '