Subversion Repositories public

Compare Revisions

Ignore whitespace Rev 3 → Rev 4

/pm/trunk/plan.php
0,0 → 1,5474
<?
require_once('version.inc');
require_once('dbaccess.inc');
require_once('language.inc');
require_once('header.inc');
require_once('helper.inc');
require_once('crypt.inc');
require_once('settings.inc');
 
$drm = array(true, false, false, false, true, true, true);
 
$knopf = 0;
$func = $_REQUEST['func'];
$editplan = $_REQUEST['editplan'];
$viewplan = $_REQUEST['viewplan'];
$deleteplan = $_REQUEST['deleteplan'];
$editcopy = $_REQUEST['editcopy'];
$taskadd = $_REQUEST['taskadd'];
$deletetask = $_REQUEST['deletetask'];
$edittask = $_REQUEST['edittask'];
$addmi = $_REQUEST['addmi'];
$addmidel = $_REQUEST['addmidel'];
$addmiadd = $_REQUEST['addmiadd'];
$moveup = $_REQUEST['moveup'];
$movedown = $_REQUEST['movedown'];
 
if (isset($editplan)) {
$headline = 20;
$pl_num = $editplan;
} else {
$pl_num = 0;
}
 
if (isset($deleteplan)) {
$headline = 21;
}
 
if (isset($_REQUEST['no'])) {
$headline = 9;
}
 
# Planungsmenue
//if (isset($_REQUEST['plan'])) { $knopf = 2; $headline = 9; $menu = 2; }
if (isset($_REQUEST['plan'])) { $knopf = 2; $headline = 20; $menu = 2; }
 
if (isset($_REQUEST['plneu'])) { $knopf = 10; $headline = 19; }
if (isset($_REQUEST['plchange'])) { $knopf = 11; $headline = 20; }
if (isset($_REQUEST['plumplan'])) { $knopf = 12; }
 
require_once('menu.inc');
require_once('knumber.inc');
require_once('class_tasknum.inc');
 
$ab_datum = 0;
 
# Folgende Funktion zeigt in einer Tabelle die Planstammdaten an, welche
# mit Hilfe der Buttons in der ersten Spalte bearbeitet werden koennen.
#
# Es handelt sich dabei um die Liste der Plaene, die zur Betrachtung oder
# auch zur Bearbeitung stehen. Der Projektleiter sieht alle Plaene, bei
# denen er Projektleiter ist und der Administrator sieht immer alle
# Plaene.
#
function ShowPlan($rstufe, $menu, $unum, $plnum=0) {
global $rstufe;
global $unum;
global $phase;
global $pmlight;
global $statusbericht;
global $menu;
global $headline;
global $func;
global $pj_lock;
global $dtformatshort;
 
# Als erstes wird eine Auswahlbox angezeigt, in der der User die
# Anzeige ein wenig individualisieren kann.
$ps_1 = $_REQUEST['ps_1'];
$ps_2 = $_REQUEST['ps_2'];
$ps_3 = $_REQUEST['ps_3'];
$ps_4 = $_REQUEST['ps_4'];
$ps_5 = $_REQUEST['ps_5'];
$ps_6 = $_REQUEST['ps_6'];
$sx_prnum = $_REQUEST['sx_prnum'];
$sx_prname = $_REQUEST['sx_prname'];
 
if ($func != "SHOWPLAN") {
$ps_1 = 1;
$ps_2 = 1;
$ps_4 = 1;
}
 
$db = OpenDB();
?>
<form name="stati" method="post" action="plan.php" onChange="javascript:this.submit()">
<input type="hidden" name="menu" value="<? echo "$menu"; ?>">
<input type="hidden" name="headline" value="<? echo "$headline"; ?>">
<input type="hidden" name="plchange" value="1">
<input type="hidden" name="func" value="SHOWPLAN">
<table class="input">
<tr>
<th class="sel" colspan=2><? Output($db, 23, "Pl&auml;ne mit folgendem Status anzeigen"); ?></th>
<th class="sel" colspan=2><? Output($db, 24, "Projektsuche"); ?></th>
</tr>
<tr>
<td><? Output($db, 25, "In Erstellung:"); ?></td>
<td><input type="checkbox" name="ps_1" value="1" <? if ($ps_1) echo "checked"; ?>></td>
<td class="input_l">Projektnummer:</td>
<td><input type="text" name="sx_prnum" value="<? echo "$sx_prnum"; ?>" size=8 maxlength=16></td>
</tr>
<?
if (!$pmlight) {
?>
<tr>
<td><? Output($db, 26, "Freigegeben:"); ?></td>
<td><input type="checkbox" name="ps_2" value="1" <? if ($ps_2) echo "checked"; ?>></td>
<td rowspan=4 class="input_l">Projektname:</td>
<td rowspan=4 valign="top"><input type="text" name="sx_prname" value="<? echo "$sx_prname"; ?>" size=20 mxlength=100></td>
</tr>
<?
}
?>
<tr>
<td><? Output($db, 27, "Aktiv:"); ?></td>
<td><input type="checkbox" name="ps_4" value="1" <? if ($ps_4) echo "checked"; ?>></td>
<?
if ($pmlight) {
?>
<td rowspan=3 class="input_l"><? Output($db, 28, "Projektname:"); ?></td>
<td rowspan=3 valign="top"><input type="text" name="sx_prname" value="<? echo "$sx_prname"; ?>" size=20 mxlength=100></td>
<?
}
?>
</tr>
<tr>
<td><? Output($db, 29, "Inaktiv:"); ?></td>
<td><input type="checkbox" name="ps_5" value="1" <? if ($ps_5) echo "checked"; ?>></td>
</tr>
<tr>
<td><? Output($db, 30, "Abgeschlossen:"); ?></td>
<td><input type="checkbox" name="ps_6" value="1" <? if ($ps_6) echo "checked"; ?>></td>
</tr>
<tr>
<td class="sel" colspan = 4><center>
<?
Button(GetMessage($db, 31, "Selektion durchf&uuml;hren"), "stati");
?>
</center></td>
</tr>
</table>
</form>
<?
if (!isset($ps_1) && !isset($ps_2) && !isset($ps_3) && !isset($ps_4) && !isset($ps_5) && !isset($ps_6)) {
echo "<p class=\"cry\">" . Output($db, 32, "Es wurden keine Pl&auml;ne gefunden!") . "</p>\n";
return;
}
 
$old_prnum = 0;
$db = OpenDB();
$dtdb = GetDBDateFormat(true);
$query = "select pl_num, pl_lfd, pl_prnum, pl_status, pr_name, ";
$query .= "pr_status, to_char(pl_date, '$dtdb'), pl_comment ";
$query .= "from plan, project where pr_num = pl_prnum ";
 
if ($rstufe == 2)
$query .= "and pr_pl = $unum ";
 
if (isset($sx_prnum) && strlen($sx_prnum) > 0)
$query .= "and pr_num = $sx_prnum ";
else if (isset($sx_prname) && strlen($sx_prname) > 0)
$query .= "and pr_name ilike '$sx_prname%' ";
 
$query .= "and pr_status = 0 and pl_status in (";
$komma = false;
 
if ($ps_1) {
$query .= "1";
$komma = true;
}
 
if ($ps_2) {
if ($komma)
$query .= ",";
 
$query .= "2";
$komma = true;
}
 
if ($ps_3) {
if ($komma)
$query .= ",";
 
$query .= "3";
$komma = true;
}
 
if ($ps_4) {
if ($komma)
$query .= ",";
 
$query .= "4";
$komma = true;
}
 
if ($ps_5) {
if ($komma)
$query .= ",";
 
$query .= "5";
$komma = true;
}
 
if ($ps_6) {
if ($komma)
$query .= ",";
 
$query .= "6";
$komma = true;
}
 
$query .= ") ";
$query .= "order by pl_prnum asc, pl_lfd desc";
$result = QueryDB($db, $query);
 
if (!$result) {
include('footer.inc');
return;
}
 
$numrows = numrowsDB($result);
$nav = "menu=$menu&headline=9&ps_1=$ps_1&ps_2=$ps_2&ps_3=$ps_3&ps_4=$ps_4&ps_5=$ps_5&ps_6=$ps_6";
 
if ($numrows > 0) {
echo "<form name=\"plan\" action=\"plan.php\" method=\"post\">\n";
echo "<input type=\"hidden\" name=\"pl_num\" value=\"$plnum\">\n";
echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
echo "<input type=\"hidden\" name=\"headline\" value=\"9\">\n";
echo "<input type=\"hidden\" name=\"ps_1\" value=\"$ps_1\">\n";
echo "<input type=\"hidden\" name=\"ps_2\" value=\"$ps_2\">\n";
echo "<input type=\"hidden\" name=\"ps_3\" value=\"$ps_3\">\n";
echo "<input type=\"hidden\" name=\"ps_4\" value=\"$ps_4\">\n";
echo "<input type=\"hidden\" name=\"ps_5\" value=\"$ps_5\">\n";
echo "<input type=\"hidden\" name=\"ps_6\" value=\"$ps_6\">\n";
 
if ($plnum > 0) {
echo "<input type=\"hidden\" name=\"func\" value=\"UpdatePlan\">\n";
}
?>
<table class="sel">
<tr>
<th class="sel"><? Output($db, 33, "Aktion"); ?></th>
<th class="sel"><? Output($db, 34, "Lfd.Nr."); ?></th>
<th class="sel"><? Output($db, 35, "Proj.Nr."); ?></th>
<th class="sel"><? Output($db, 36, "Projektbezeichnung"); ?></th>
<th class="sel"><? Output($db, 37, "Planstatus"); ?></th>
<th class="sel"><? Output($db, 403, "Abg. bis"); ?></th>
<?
if ($statusbericht) {
echo " <th class=\"sel\">" . GetMessage($db, 38, "Statusbericht") . "</th>";
} else {
echo " <th class=\"sel\">" . GetMessage($db, 39, "Beschreibung") . "</th>";
}
?>
</tr>
<?php
$old_plnum = 0;
$oo_prnum = 0;
$row = 0;
$inp_com = false;
 
while ($row < $numrows) {
$data = fetchDB($result, $row);
$pl_num = $data[0];
$pl_lfd = $data[1];
$pl_prnum = $data[2];
$pl_status = $data[3];
$pr_name = $data[4];
$ks_status = $data[5];
$pl_date = $data[6];
$pl_comment = $data[7];
 
if ($oo_prnum != $pl_prnum)
$old_pllfd = $pl_lfd;
 
# Pruefen, ob bereits IST-Buchungen vorgenommen wurden. Wenn ja,
# dann darf der Plan nicht mehr geloescht werden koennen!
#
$query = "select wd_num from wdone, task where ";
$query .= "wd_prnum = $pl_prnum and ta_num = wd_task and ";
$query .= "ta_plnum = $pl_num";
 
if (!($resta = QueryDB($db, $query)))
return;
 
if (numrowsDB($resta) <= 0)
$del = true;
else
$del = false;
 
echo "<tr><td class=\"selakt\"><table border=0 cellspacing=0 cellpadding=0><tr>";
 
if ($pl_status < 3 && $old_prnum != $pl_prnum) {
echo "<td><a href=\"#\" onClick=\"javascript:MoveTo('plan.php','editplan=$pl_num&$nav')\"><img src=\"image/edit.png\" border=0 alt=\"Edit\"></a></td>";
$old_prnum = $pl_prnum;
$inp_com = true;
} else {
echo "<td><a href=\"#\" onClick=\"javascript:MoveTo('plan.php','viewplan=$pl_num&$nav')\"><img src=\"image/view.png\" width=15 height=15 border=0 alt=\"View\"></a></td>";
}
 
if ($del && $pl_status < 4 && ($rstufe == 1 || $rstufe == 2))
echo "<td><a href=\"#\" onClick=\"javascript:MoveTo('plan.php','deleteplan=$pl_num&$nav')\"><img src=\"image/editdelete.png\" border=0 alt=\"Delete\"></a></td>";
 
if ($pl_status > 1 && $pl_status < 5) {
echo "<td><a href=\"#\" onClick=\"javascript:MoveTo('plan.php','editcopy=$pl_num&pl_prnum=$pl_prnum&pl_status=1&$nav')\"><img src=\"image/editcopy.png\" border=0 alt=\"Copy\"></a></td>";
 
if (!$pj_lock)
echo "<td><a href=\"#\" onClick=\"javascript:MoveTo('plan.php','func=LockM&pl_num=$pl_num&pl_prnum=$pl_prnum&pl_status=$pl_status&$nav')\"><img src=\"image/month.png\" border=0 alt=\"Copy\"></a></td>";
}
 
echo "</tr></table>";
echo "</td>\n<td class=\"selnum\">$pl_lfd</td>\n<td class=\"selnum\">$pl_prnum</td>\n";
 
if ($inp_com) {
echo "<td class=\"sel\">";
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','editplan=$pl_num&$nav')\">";
echo "$pr_name</a></td>\n";
$inp_com = false;
} else
echo "<td class=\"sel\">$pr_name</td>\n";
 
if ($plnum == $pl_num) {
echo "<td sel=\"sel\"><select name=\"pl_status\">\n";
$status = $_REQUEST['pl_status'];
 
if ($status == 3)
$j = 4;
else
$j = 1;
 
for ($i = $j; $i <= 6; $i++) {
if (($i == 2 && $pmlight) || $i == 3 || $i == 5)
continue;
 
if ($rstufe == 2 && $status == 6 && $i == 1)
continue;
 
if ($status == $i)
echo "<option value=\"$i\" selected>";
else
echo "<option value=\"$i\">";
 
switch ($i) {
case 1: Output($db, 40, "In Erstellung (&auml;nderbar, nicht bebuchbar)"); break;
case 2: Output($db, 41, "Freigegeben (&auml;nderbar, bebuchbar)"); break;
// case 3: echo "Wartet auf Genehmigung"; break;
case 4: Output($db, 42, "Aktiv (nicht &auml;nderbar, bebuchbar)"); break;
case 5: Output($db, 43, "Inaktiv (nicht &auml;nderbar, nicht bebuchbar)"); break;
case 6: Output($db, 44, "Abgeschlossen (Projekt ist abgeschlossen)"); break;
// default: echo "In Erstellung";
}
 
echo "</option>\n";
}
 
echo "</select>";
Button(GetMessage($db, 45, "Speichern"), "plan");
echo "</td>\n";
} else if ($oo_prnum != $pl_prnum && $old_pllfd >= $pl_lfd) {
echo "<td class=\"sel\">";
 
// if ($pl_status < 4 || $rstufe == 1 || $rstufe == 4) {
echo "<a href=\"#\" onClick=";
echo "\"javascript:MoveTo('plan.php','pl_num=$pl_num&pl_status=$pl_status&func=EditPlStatus&$nav')\">\n";
// }
 
switch ($pl_status) {
case 1: Output($db, 85, "In Erstellung"); break;
case 2: Output($db, 86, "Freigegeben"); break;
case 3: echo "Wartet auf Genehmigung"; break;
case 4: Output($db, 87, "Aktiv"); break;
case 5: Output($db, 88, "Inaktiv"); break;
case 6: Output($db, 89, "Abgeschlossen"); break;
default: Output($db, 85, "In Erstellung");
}
 
// if ($pl_status < 4)
echo "</a>";
 
echo "</td>";
$oo_prnum = $pl_prnum;
$inp_com = true;
} else {
echo "<td class=\"sel\">\n";
 
switch ($pl_status) {
case 1: Output($db, 85, "In Erstellung"); break;
case 2: Output($db, 86, "Freigegeben"); break;
case 3: echo "Wartet auf Genehmigung"; break;
case 4: Output($db, 87, "Aktiv"); break;
case 5: Output($db, 88, "Inaktiv"); break;
case 6: Output($db, 89, "Abgeschlossen"); break;
default: Output($db, 85, "In Erstellung");
}
 
echo "</td>\n";
}
 
# Letzter Teilprojektabschluss
$query = "select ab_datum from abschluss where ";
$query .= "ab_prnum = $pl_prnum order by ab_datum desc";
 
if (!($resab = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
if (numrowsDB($resab) > 0) {
$data = fetchDB($resab, 0);
$ab_datum = $data[0];
$dt = gmdate($dtformatshort, $ab_datum);
} else
$dt = "";
 
echo "<td class=\"selnum\">$dt</td>\n";
 
# Kommentar / Beschreibung / Statusbericht
if ($statusbericht) {
$query = "select ps_prstat from planstatus where ";
$query .= "ps_prnum = $pl_prnum and ps_status = true and ";
$query .= "ps_plnum = $pl_num ";
$query .= "order by ps_lfd desc";
 
if (!($resps = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$anzps = numrowsDB($resps);
 
if ($anzps > 0) {
$data = fetchDB($resps, 0);
$ps_prstat = $data[0];
} else
$ps_prstat = 3;
 
echo "<td class=\"sel\">$pl_date&nbsp;&nbsp;<img src=\"";
 
switch ($ps_prstat) {
case 0: echo "image/cool.gif\" alt=\"Gruen"; break;
case 1: echo "image/shocked.gif\" alt=\"Gelb"; break;
case 2: echo "image/sad.gif\" alt=\"Rot"; break;
default: echo "image/huh.gif\" alt=\"Undefiniert";
}
 
echo "\" width=17 height=17>";
 
if ($inp_com && $pl_status > 1 && $pl_status < 5) {
echo "&nbsp;&nbsp;<a href=\"#\" ";
echo "onClick=\"javascript:MoveTo('plan.php','func=PLANSTATUS&pr_num=$pl_prnum&pl_num=$pl_num&$nav')\">";
echo "<img src=\"image/edit.png\" border=0 alt=\"Statusbericht\"></a>";
} else if ($pl_status > 4) {
echo "&nbsp;&nbsp;<a href=\"#\" ";
echo "onClick=\"javascript:MoveTo('plan.php','func=PLANSTATUS&lock=1&pr_num=$pl_prnum&pl_num=$pl_num&$nav')\">";
echo "<img src=\"image/view.png\" border=0 alt=\"Statusbericht ansehen\" width=15 height=15></a>";
}
 
echo "</td>\n";
$inp_com = false;
} else {
echo "<td class=\"sel\"><table border=0 cellspacing=0 cellpadding=0><tr><td>$pl_date&nbsp;&nbsp;</td><td>";
$inp_com = false;
echo substr($pl_comment, 0, 30);
echo "</td></tr></table></td>\n";
}
 
echo "</tr>\n";
$row++;
}
 
echo "</table>\n";
 
if ($plnum > 0)
echo "</form>\n";
} else {
echo "<p class=\"cry\">" . GetMessage($db, 32, "Es wurden keine Pl&auml;ne gefunden!") . "</p>\n";
}
 
closeDB($db);
}
 
function AskClosePlan($anz) {
$headline = $_REQUEST['headline'];
$menu = $_REQUEST['menu'];
$pl_num = $_REQUEST['pl_num'];
$pl_status = $_REQUEST['pl_status'];
$nav = "pl_num=$pl_num&pl_status=$pl_status&menu=$menu&func=WriteStatus&headline=21";
?>
<br>
<form action="plan.php" method="post">
<table border=2 class="alarm">
<tr><td colspan=2><big><? Output(-1, 46, "Warnung!"); ?></big><br><br>
<? Output(-1, 47, "
Es existieren noch %d Tasks, die noch nicht zu Ende sind.<br>
Wenn Sie diesen Plan nun abschliessen, k&ouml;nnen Sie keine
IST-Buchungen mehr auf dieses Projekt vornehmen. Sobald ein Plan
abgeschlossen ist, ist das gesamte Projekt abgeschlossen!
<br><br>
Wollen Sie wirklich dieses Projekt abschliessen?", $anz);
?>
</td>
</tr>
<tr>
<td><center><input type="button" name="yes" value="<? Output(-1, 48, "Projekt Abschliessen"); ?>" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
<td><center><input type="button" name="no" value="<? Output(-1, 49, "Abbruch"); ?>" onClick="javascript:MoveTo('plan.php','no=no&<? echo "$nav"; ?>')"></center></td>
</tr>
</table>
</form>
<?php
}
 
# Folgende Funktion schreibt den (eventuell) geaenderten Status eines Plans
# in die Datenbank.
#
function UpdatePlan($write=false) {
global $rstufe;
global $phase;
global $pmlight;
global $language;
global $unum;
 
if ($rstufe != 1 && $rstufe != 2) {
Error(GetMessage(-1, 50, "Berechtigungsfehler!"));
return false;
}
 
$pl_num = $_REQUEST['pl_num'];
$pl_status = $_REQUEST['pl_status'];
 
if (!isset($pl_num) || $pl_num <= 0) {
Error(GetMessage(-1, 341, "Interner Fehler: Plannummer fehlt!"));
return false;
}
 
if (!isset($pl_status) || $pl_status < 1 || $pl_status > 6) {
Error(GetMessage(-1, 379, "Interner Fehler: Fehlender oder ung&uuml;ltiger Status!"));
return false;
}
 
$db = OpenDB();
 
# Bevor wir den Planstatus von 6 tatsaechlich schreiben pruefen wir, ob
# nicht noch ein Task des Plans offen ist. Ist dem so, warnen wir den
# User und weisen ihn auf die Konsequenzen hin.
if (!$write && $pl_status == 6) {
$today = time();
$query = "select count(*) from task where ";
$query .= "ta_plnum = $pl_num and ta_start+(ta_duration*86400) > $today and ";
$query .= "ta_level > 1";
 
if (!($result = QueryDB($db, $query)))
return false;
 
$data = fetchDB($result, 0);
$anz = $data[0];
 
if ($anz > 0) {
AskClosePlan($anz);
return true;
}
}
 
# Handelt es sich um den Planstatus 1 pruefen wir, ob der Plan
# zuvor nicht bereits einen anderen Status hatte und wenn ja, ob
# IST-Buchungen vorgenommen wurden. Trifft das zu, darf der Status
# nicht auf 1 gesetzt werden.
if ($pl_status == 1) {
$query = "select count(*) from wdone, task where ";
$query .= "ta_plnum = $pl_num and wd_task = ta_num";
 
if (!($result = QueryDB($db, $query)))
return false;
 
$data = fetchDB($result, 0);
$anz = $data[0];
 
if ($anz > 0) {
Error(GetMessage($db, 380, "Auf diesem Plan sind bereits IST-Buchungen vorhanden! Der Planstatus kann daher nicht auf \"In Erstellung\" zur&uuml;ck gesetzt werden!"));
return false;
}
}
 
# In der strikten Periodensicht ($pmlight == true), darf der Status nur
# dann auf > 1 gesetzt werden, wenn es einen Kommentar zum Plan gibt.
# Falls es also keinen Kommentar gibt, wird dieser automatisch erzeugt.
#
if ($pmlight && $pl_status > 1) {
$query = "select pl_comment from plan where pl_num = $pl_num";
 
if (!($result = QueryDB($db, $query)))
return false;
 
$data = fetchDB($result, 0);
$pl_comment = $data[0];
 
if (!isset($pl_comment) || strlen($pl_comment) <= 0) {
$query = "select mi_nname, mi_vname from mitarbeiter where mi_num = $unum";
 
if (!($resmi = QueryDB($db, $query)))
return false;
 
$data = fetchDB($resmi, 0);
$mi_nname = $data[0];
$mi_vname = $data[0];
 
$query = "update plan set pl_comment = '";
$query .= GetMessageLang($db, $language, 381, "Statusänderung durch %s", "$mi_nname $mi_vname");
$query .= "' where pl_num = $pl_num";
 
if (!QueryDB($db, $query))
return false;
 
Error(GetMessage($db, 382, "Der fehlende Kommentar zum Plan wurde automatisch eingef&uuml;gt!"));
}
}
 
$query = "update plan set pl_status = $pl_status ";
 
if ($pl_status == 4)
$query .= ", pl_date = current_timestamp ";
 
$query .= "where pl_num = $pl_num";
 
if (!TQueryDB($db, $query)) {
closeDB($db);
return false;
}
 
# Handelt es sich nicht um den ersten Plan eines Projekts,
# muessen alle aelteren Instanzen auf Inaktiv gesetzt werden.
# Ausgenommen sind Plaene die Abgeschlossen sind (Status = 6).
# Status 1 darf nur dann gesetzt werden koennen, wenn der
# Plan noch keine IST-Buchungen hat. Ein neuerliches setzen
# von Status 1 bewirkt, dass der folgende Plan auf 4 gesetzt
# wird.
$query = "select pl_prnum from plan where pl_num = $pl_num";
 
if (!($result = QueryDB($db, $query)))
return false;
 
$data = fetchDB($result, 0);
$pl_prnum = $data[0];
 
$query = "select pl_num, pl_status from plan where ";
$query .= "pl_prnum = $pl_prnum and pl_num != $pl_num ";
$query .= "order by pl_lfd desc";
// $query .= "and pl_status != 6 order by pl_lfd desc";
 
if (!($result = QueryDB($db, $query)))
return false;
 
$numrows = numrowsDB($result);
$status = ($pl_status == 6) ? 6 : 5;
 
if ($numrows > 0) {
QueryDB($db, "begin");
$j = 0;
 
while ($j < $numrows) {
$data = fetchDB($result, $j);
$pl_num = $data[0];
$pst = $data[1];
 
if ($j == 0 && $status != 6 && $pl_status == 1)
$query = "update plan set pl_status = 4, pl_date = current_timestamp ";
else
$query = "update plan set pl_status = $status ";
 
$query .= "where pl_num = $pl_num";
 
if ($pst != $status || ($j == 0 && $status != 6 && $pl_status == 1)) {
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
}
 
$j++;
}
 
QueryDB($db, "commit");
}
 
closeDB($db);
return true;
}
 
# Folgende Funktion speichert die zuvor erfassten Planstammdaten. Da die
# Erfassung ohnehin nur mittels ComboBox (select) moeglich ist, kann eine
# Plausibilitaetspruefung entfallen.
#
function SaveNewPlan() {
global $phase;
global $unum;
 
$pl_prnum = $_REQUEST['pl_prnum'];
$pl_status = $_REQUEST['pl_status'];
$te_num = $_REQUEST['te_num'];
 
$db = OpenDB();
#
# Zunaechst muessen wir die laufende Nummer (pl_lfd) ermitteln...
#
$query = "select pl_lfd, pl_status, pl_num from plan where ";
$query .= "pl_prnum = $pl_prnum order by pl_lfd desc";
 
if (!($respl = QueryDB($db, $query))) {
closeDB($db);
return 0;
}
 
$numrows = numrowsDB($respl);
 
if ($numrows > 0) {
$data = fetchDB($respl, 0);
$pl_lfd = $data[0] + 1;
} else {
$pl_lfd = 1;
}
 
$query = "select co_plan from counter";
$result = QueryDB($db, $query);
$data = fetchDB($result, 0);
$pl_num = $data[0] + 1;
 
QueryDB($db, "begin");
$query = "insert into plan (pl_num, pl_lfd, pl_prnum, pl_status) ";
$query .= "values ($pl_num, $pl_lfd, $pl_prnum, $pl_status)";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return 0;
}
 
$query = "update counter set co_plan = $pl_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return 0;
}
 
# Handelt es sich nicht um den ersten Plan eines Projekts,
# muessen alle aelteren Instanzen auf Inaktiv gesetzt werden.
# Ausgenommen sind Plaene die Abgeschlossen sind (Status = 6)
if ($numrows > 0 && $pl_status > 1) {
$j = 0;
 
while ($j < $numrows) {
$data = fetchDB($respl, $j);
$plstatus = $data[1];
$plnum = $data[2];
 
if ($plstatus != 6) {
$query = "update plan set pl_status = 5, pl_date = current_timestamp ";
$query .= "where pl_num = $plnum";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return 0;
}
}
 
$j++;
}
}
 
QueryDB($db, "commit");
 
# Wenn ein Template ausgewaehlt wurde, muss es ausgelesen werden
# und als Plan angelegt werden.
if (isset($te_num) && $te_num > 0) {
$query = "select co_task from counter";
$result = QueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return 0;
}
 
$data = fetchDB($result, 0);
$co_task = $data[0];
 
$query = "select pt_lfd, pt_level, pt_name, pt_color, pt_meeting, ";
$query .= "pt_phase from ptemp where pt_tnum = $te_num ";
$query .= "order by pt_lfd";
$result = QueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return 0;
}
 
$numrows = numrowsDB($result);
$row = 0;
QueryDB($db, "begin");
 
while ($row < $numrows) {
$data = fetchDB($result, $row);
$pt_lfd = $data[0];
$pt_level = $data[1];
$pt_name = addslashes($data[2]);
$pt_color = $data[3];
$pt_meeting = $data[4];
$pt_phase = $data[5];
 
if ($pt_meeting == "t")
$pt_meeting = 1;
else
$pt_meeting = 0;
 
$ta_start = time();
$co_task++;
$query = "insert into task (ta_num, ta_plnum, ta_id, ta_name, ";
$query .= "ta_color, ta_shape, ta_meeting, ta_start, ";
$query .= "ta_duration, ta_complete, ta_priority, ta_level, ";
$query .= "ta_phase) values ($co_task, $pl_num, $pt_lfd, ";
$query .= "'$pt_name', $pt_color, '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0',";
$query .= "$pt_meeting, $ta_start, 1, 0, 1, $pt_level, $pt_phase)";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return 0;
}
 
$row++;
}
 
$query = "update counter set co_task = $co_task";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return 0;
}
 
QueryDB($db, "commit");
}
 
Journal(300, "plan.php: SaveNewPlan: plan=$pl_num", $db);
closeDB($db);
return $pl_num;
}
 
# Folgende Funktion zeigt die Erfassungsmaske fuer einen Task an. Es muss
# die interne Datensatznummer des Plans uebergeben werden auf die sich der
# Task bezieht und die ID, also die laufende Nummer. Diese laufende Nummer
# stellt sicher, das die Tasks immer in der richtigen Reihenfolge angezeigt
# werden.
#
function AddTask($ta_plnum, $ta_id) {
$menu = $_REQUEST['menu'];
global $unum;
global $rstufe;
global $phase;
global $VisualDate;
global $pmlight;
global $verrmodul;
 
if (!isset($ta_plnum) || $ta_plnum <= 0) {
Error(GetMessage(-1, 22, "Error: Interner Fehler!<br>Funktion AddTask fehlt Parameter 1!"));
return;
}
 
$db = OpenDB();
# Projektnummer und Projektname ermitteln
$query = "select plan.pl_prnum, project.pr_name from plan, project ";
$query .= "where plan.pl_num = $ta_plnum and ";
$query .= "project.pr_num = plan.pl_prnum";
$result = QueryDB($db, $query);
$data = fetchDB($result, 0);
$pl_prnum = $data[0];
$pr_name = $data[1];
 
# Finden des vorhergehenden Tasks um den Level vorzuschlagen.
$query = "select ta_level, ta_meeting, ta_phase from task where ta_plnum = $ta_plnum and ";
$query .= "ta_id < $ta_id order by ta_id desc";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
if (numrowsDB($result) > 0) {
$data = fetchDB($result, 0);
$level = $data[0];
$ta_meeting = $data[1];
$ta_phase = $data[2];
 
if ($level == 1)
$level = 2;
} else {
$level = 1;
$ta_meeting = 0;
$ta_phase = 0;
}
?>
<br>
<form name="Task" action="plan.php" method="post">
<input type="hidden" name="ta_plnum" value="<? echo "$ta_plnum"; ?>">
<input type="hidden" name="headline" value="20">
<input type="hidden" name="menu" value="<? echo "$menu"; ?>">
<input type="hidden" name="ta_id" value="<? echo "$ta_id"; ?>">
<input type="hidden" name="func" value="SaveTask">
<?
if (!$verrmodul)
echo "<input type=\"hidden\" name=\"ta_risiko\" value=\"0\">\n";
?>
<table class="input">
<tr>
<th class="sel" colspan=2><? Output($db, 1, "Projekt:"); echo "$pl_prnum $pr_name"; ?></th>
</tr>
<tr>
<td>Level:</td>
<td>
<?
echo "<input type=\"text\" class=\"inputmust\" name=\"ta_level\" value=\"$level\" ";
 
if ($ta_meeting)
echo "onBlur=\"NumRange(this,1,$level)\" ";
else
echo "onBlur=\"NumRange(this,1,99)\" ";
 
echo "size=2 maxlength=2>";
?>
</td>
</tr>
<tr>
<td><? Output($db, 2, "Taskname:"); ?></td>
<td><input type="text" class="inputmust" name="ta_name" size=40 maxlength=50></td>
</tr>
<?
if (!$pmlight) { ?>
<tr>
<td><? Output($db, 3, "Farbe:"); ?></td>
<td><input type="text" class="inputmust" name="ta_color" value="ffffcc" size=8 maxlength=6>
<?php
echo "<button type=\"button\" onClick=\"javascript:open_window('plan.php?unum=$unum&rstufe=$rstufe&header=1&func=GetColor', 'Farbwahl', 217, 57)\">";
echo "<img src=\"image/coloredit.png\" border=0 width=15 height=15 alt=\"Farbwahl\"></button>";
echo "</td>\n</tr>\n";
} else {
echo "<input type=\"hidden\" name=\"ta_color\" value=\"ffffcc\">\n";
}
?>
<tr>
<td><? Output($db, 4, "Meilenstein:"); ?></td>
<td><input type="checkbox" name="ta_meeting" value="1" onChange="javascript:if (this.checked == true) {document.Task.ende.value = document.Task.start.value;}"></td>
</tr>
<?php
if ($phase == 1) {
echo "<tr><td>" . GetMessage($db, 5, "Phase:") . "</td>\n<td>";
$query = "select kp_num, kp_phase from key_phase order by kp_num";
$result = QueryDB($db, $query);
 
if (!result)
return;
 
$numrows = numrowsDB($result);
$row = 0;
echo "<select name=\"ta_phase\">\n";
 
while ($row < $numrows) {
$data = fetchDB($result, $row);
$kp_num = $data[0];
$kp_phase = $data[1];
 
if ($kp_num == $ta_phase)
echo "<option value=\"$kp_num\" selected>$kp_num. $kp_phase</option>\n";
else
echo "<option value=\"$kp_num\">$kp_num. $kp_phase</option>\n";
 
$row++;
}
 
echo "</td></tr>\n";
} else {
$ta_phase = 0;
}
?>
<tr>
<td><? Output($db, 6, "Startdatum (%s):", $VisualDate); ?></td>
<td><input type="text" class="inputmust" name="start" onChange="javascript:CheckDate(this, false)" onBlur="javascript:if (document.Task.ta_meeting.checked == true) {document.Task.ende.value = this.value;}" size=10 maxlength=10>
<input type="button" value="..." onClick="javascript:open_window('calendar.php?header=1&target=window.opener.document.Task.start', 'Calendar', 200, 250)">
</td>
</tr>
<tr>
<td><? Output($db, 7, "Endedatum (%s):", $VisualDate); ?></td>
<td><input type="text" class="inputmust" name="ende" onChange="javascript:var stat = CheckDate(this, false);if (stat == true) {CheckDateOrder(document.Task.start, this);}" size=10 maxlength=10>
<input type="button" value="..." onClick="javascript:open_window('calendar.php?header=1&target=window.opener.document.Task.ende', 'Calendar', 200, 250)">
</td>
</tr>
<?
if ($verrmodul) {
?>
<tr>
<td><? Output($db, 8, "Risikoaufschlag:"); ?></td>
<td><input type="text" name="ta_risiko" value="0" onBlur="javascript:NumRange(this,0,100)" size="3" maxlength=3>%</td>
</tr>
<?
}
?>
<tr>
<td><? Output($db, 9, "Bereits erledigt:"); ?></td>
<td><input type="text" name="ta_complete" value="0" size=3 maxlength=3>%</td>
</tr>
<tr>
<td><? Output($db, 10, "Priorit&auml;t:"); ?></td>
<td><select name="ta_priority">
<option value="0"><? Output($db, 11, "Niedrig"); ?></option>
<option value="1" selected><? Output($db, 12, "Normal"); ?></option>
<option value="2"><? Output($db, 13, "Hoch"); ?></option>
</select>
</td>
</tr>
<tr>
<td><? Output($db, 14, "Abh&auml;ngigkeit:"); ?></td>
<td><select name="ta_depend">
<option selected></option>
<?php
SelectTask($ta_plnum, true);
closeDB($db);
?>
</select>
<select name="ta_deptype">
<option value="2"><? Output(-1, 15, "Ende-Beginn"); ?></option>
<option value="3"><? Output(-1, 16, "Ende-Ende"); ?></option>
<option value="4"><? Output(-1, 17, "Beginn-Ende"); ?></option>
<option value="1"><? Output(-1, 18, "Beginn-Beginn"); ?></option>
</select>
</td>
</tr>
<tr>
<td valign="top"><? Output(-1, 19, "Kommentar:"); ?></td>
<td><textarea name="ta_notiz" rows=5 cols=60></textarea></td>
</tr>
<tr>
<td class="selnf" colspan=2>
<table border=0 cellspacing=0 cellpadding=0><tr><td>
<?
Button(GetMessage(-1, 20, "Task Speichern"), "Task");
echo "</td><td>&nbsp;&nbsp;</td><td>";
ButtonLink(GetMessage(-1, 21, "Zur&uuml;ck"), "plan.php", "editplan=$ta_plnum&menu=$menu&headline=20");
?>
</td></tr></table>
</td>
</tr>
</table>
<br>
<?php
echo "</form>\n";
}
 
# Folgende Funktion zeigt die Erfassungsmaske fuer einen Task an. Es muss
# die interne Datensatznummer des Plans uebergeben werden auf die sich der
# Task bezieht.
#
function EditTask($ta_num) {
global $dtformatshort;
global $VisualDate;
global $verrmodul;
global $ab_datum;
 
$menu = $_REQUEST['menu'];
global $unum;
global $rstufe;
global $phase;
global $numphase;
global $pmlight;
 
$db = OpenDB();
$query = "select ta_plnum, ta_id, ta_depend, ta_deptype, ta_name, ";
$query .= "ta_color, ta_meeting, ta_start, ta_duration, ta_complete, ";
$query .= "ta_priority, ta_level, ta_phase, ta_notiz, ta_risiko from task ";
$query .= "where ta_num = $ta_num";
 
$result = QueryDB($db, $query);
$numrows = numrowsDB($result);
 
if ($numrows != 1) {
Error(GetMessage($db, 340, "Interner Fehler: Task \"%d\" existiert nicht!", $ta_num));
return;
}
 
$data = fetchDB($result, 0);
$ta_plnum = $data[0];
$ta_id = $data[1];
$ta_depend = $data[2];
$ta_deptype = $data[3];
$ta_name = $data[4];
$ta_color = $data[5];
$ta_meeting = $data[6];
$ta_start = $data[7];
$ta_duration = $data[8];
$ta_complete = $data[9];
$ta_priority = $data[10];
$ta_level = $data[11];
$ta_phase = $data[12];
$ta_notiz = $data[13];
$ta_risiko = $data[14];
$color = dechex($ta_color);
$len = strlen($color);
 
while ($len < 6) {
$color = "0" . $color;
$len++;
}
 
# Ermitteln, ob der Task bereits Mitarbeiter zugewiesen hat. In
# diesem Fall darf der Level nicht geaendert werden und es darf
# kein Meilenstein werden.
$query = "select count(*) from allocation where al_task = $ta_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$data = fetchDB($result, 0);
$anz = $data[0];
 
$query = "select plan.pl_prnum, project.pr_name from plan, project ";
$query .= "where plan.pl_num = $ta_plnum and ";
$query .= "project.pr_num = plan.pl_prnum";
$result = QueryDB($db, $query);
$data = fetchDB($result, 0);
$pl_prnum = $data[0];
$pr_name = $data[1];
echo "<p class=\"cry\">" . GetMessage($db, 1, "Projekt:") . " $pl_prnum $pr_name</p>";
# Datum des letzten Teilprojektabschluss ermitteln
$query = "select ab_datum from abschluss where ";
$query .= "ab_prnum = $pl_prnum order by ab_datum desc";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
if (numrowsDB($result) > 0) {
$data = fetchDB($result, 0);
$ab_datum = $data[0];
} else
$ab_datum = 0;
 
# Start des Tasks ermitteln. Gibt es breits IST-Buchungen auf
# diesen Plan, dann darf der Start des Tasks nicht nach die erste
# IST-Buchung geschoben werden.
$query = "select wd_datum from wdone where ";
$query .= "wd_task = $ta_num and wd_datum <= $ta_start ";
$query .= "order by wd_datum";
 
if (!($reswd = QueryDB($db, $query)))
return;
 
$rows = numrowsDB($reswd);
 
if ($rows > 0) {
$data = fetchDB($reswd, 0);
$wd_datum = $data[0];
}
# Finden der folgenden Tasks um im Falle eines Ordners automatisch
# das richtige Beginn- und Endedatum zu setzen.
$query = "select ta_level, ta_meeting, ta_start,";
$query .= "ta_start+ta_duration*86400 from task where ";
$query .= "ta_plnum = $ta_plnum and ta_id > $ta_id order by ta_id";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$tstart = 0;
$tend = 0;
 
if (($rows = numrowsDB($result)) > 0) {
$j = 0;
 
while ($j < $rows) {
$data = fetchDB($result, $j);
$xlevel = $data[0];
$xmeeting = $data[1];
$xstart = $data[2];
$xend = $data[3];
 
if ($xlevel <= $ta_level)
break;
 
if ($tstart == 0 || $tstart > $xstart)
$tstart = $xstart;
 
if ($tend < $xend) {
if ($xmeeting) {
if ($tend < $xstart)
$tend = $xstart;
} else
$tend = $xend;
}
 
$j++;
}
}
?>
<br>
<form name="Task" action="plan.php" method="post">
<input type="hidden" name="ta_num" value="<? echo "$ta_num"; ?>">
<input type="hidden" name="ta_plnum" value="<? echo "$ta_plnum"; ?>">
<input type="hidden" name="headline" value="20">
<input type="hidden" name="menu" value="<? echo "$menu"; ?>">
<input type="hidden" name="ta_id" value="<? echo "$ta_id"; ?>">
<input type="hidden" name="folder" value="0">
<?
if ($tstart > 0) {
echo "<input type=\"hidden\" name=\"start\" value=\"". gmdate($dtformatshort, $tstart) . "\">\n";
echo "<input type=\"hidden\" name=\"folder\" value=\"1\">\n";
} else
echo "<input type=\"hidden\" name=\"folder\" value=\"0\">\n";
 
if ($tend > 0)
echo "<input type=\"hidden\" name=\"ende\" value=\"". gmdate($dtformatshort, $tend) . "\">\n";
 
if ($anz > 0 || $tstart > 0 || $tend > 0)
echo "<input type=\"hidden\" name=\"ta_level\" value=\"$ta_level\">\n";
 
if (!$verrmodul)
echo "<input type=\"hidden\" name=\"ta_risiko\" value=\"0\">\n";
?>
<input type="hidden" name="func" value="SaveTask">
 
<table class="input">
<tr>
<td>Level:</td>
<?
if ($anz > 0 || $tstart > 0 || $tend > 0) {
?>
<td><b><? echo "$ta_level"; ?></b></td>
<? } else { ?>
<td><input type="text" class="inputmust" name="ta_level" value="<? echo "$ta_level"; ?>" onBlur="NumRange(this,1,99)" size=2 maxlength=2></td>
<? } ?>
</tr>
<tr>
<td>Taskname:</td>
<td><input type="text" class="inputmust" name="ta_name" value="<? echo htmlentities($ta_name); ?>" size=40 maxlength=50></td>
</tr>
<?
if (!$pmlight) { ?>
<tr>
<td>Farbe:</td>
<td><input type="text" name="ta_color" value="<? echo "$color"; ?>" size=8 maxlength=6>
<?php
echo "<button type=\"button\" onClick=\"javascript:open_window('plan.php?header=1&func=GetColor', 'Farbwahl', 217, 57)\">";
echo "<img src=\"image/coloredit.png\" border=0 width=15 height=15 alt=\"Farbwahl\"></button>";
echo "</td></tr>\n";
} else {
echo "<input type=\"hidden\" name=\"ta_color\" value=\"ffffcc\">\n";
}
?>
<tr>
<td>Meilenstein:</td>
<?php
if ($ta_meeting) {
echo "<td><input type=\"checkbox\" name=\"ta_meeting\" value=\"1\" checked ";
} else {
echo "<td><input type=\"checkbox\" name=\"ta_meeting\" value=\"1\" ";
}
 
echo "onChange=\"javascript:if (this.checked == true) {document.Task.ende.value = document.Task.start.value;}\" ";
 
if ($anz > 0 || $tstart > 0 || $tend > 0)
echo "disabled";
 
echo "></td>\n";
?>
</tr>
<?php
if ($phase == 1) {
echo "<tr><td>Phase:</td>\n<td>";
$query = "select kp_num, kp_phase from key_phase order by kp_num";
$result = QueryDB($db, $query);
 
if (!$result)
return;
 
$numrows = numrowsDB($result);
$row = 0;
echo "<select name=\"ta_phase\">\n";
 
while ($row < $numrows) {
$data = fetchDB($result, $row);
$kp_num = $data[0];
$kp_phase = $data[1];
 
if ($ta_phase == $kp_num)
echo "<option value=\"$kp_num\" selected>$kp_num. $kp_phase</option>\n";
else
echo "<option value=\"$kp_num\">$kp_num. $kp_phase</option>\n";
 
$row++;
}
 
echo "</td></tr>\n";
}
?>
<tr>
<td><? Output($db, 6, "Startdatum (%s):", $VisualDate); ?></td>
<?php
# Wenn $tstart > 0 ist, dann handelt es sich um einen Ordner!
if ($tstart > 0)
$tm = gmdate($dtformatshort, $tstart);
else
$tm = gmdate($dtformatshort, $ta_start);
 
echo " <td><input type=\"text\" class=\"inputmust\" ";
 
if ($tstart > 0 || ($tstart > 0 && $tstart <= $ab_datum) || ($tstart <= 0 && $ta_start <= $ab_datum)) {
echo "disabled ";
$disabled = true;
} else {
echo "onChange=\"javascript:var stat = CheckDate(this, false);if (stat == true && document.Task.ta_meeting.checked == true) {document.Task.ende.value = this.value;}\" ";
$disabled = false;
}
 
echo "name=\"start\" value=\"$tm\" size=10 maxlength=10>\n";
 
if ($tend > 0)
$te = $tend;
else
$te = $ta_start + ($ta_duration * 86400);
 
$tem = gmdate($dtformatshort, $te);
 
if ($tstart == 0 && !$disabled) {
?>
<input type="button" value="..." onClick="javascript:open_window('calendar.php?header=1&edit=<? echo "$ta_start"; ?>&target=window.opener.document.Task.start', 'Calendar', 200, 250); document.Task.start.focus()">
<?
} else if ($tstart == 0) {
?>
<input type="hidden" name="start" value="<? echo "$tm"; ?>">
<?
}
?>
</td>
</tr>
<tr>
<td><? Output($db, 7, "Endedatum (%s):", $VisualDate); ?></td>
<td><input type="text" class="inputmust" name="ende" value="<? echo "$tem"; ?>" <? if ($tend > 0) echo "disabled"; ?> onChange="javascript:erg = CheckDate(this, false);if (erg == true) {CheckDateOrder(document.Task.start, this);}" size=10 maxlength=10>
<?
if ($tend == 0) {
?>
<input type="button" value="..." onClick="javascript:open_window('calendar.php?header=1&target=window.opener.document.Task.ende', 'Calendar', 200, 250); document.Task.ende.focus()">
<?
} else {
?>
<input type="hidden" name="ende" value="<? echo "$tem"; ?>">
<?
}
?>
</td>
</tr>
<?
if ($verrmodul) {
?>
<tr>
<td>Risikoaufschlag:</td>
<td><input type="text" name="ta_risiko" value="<? echo "$ta_risiko"; ?>" onBlur="javascript:NumRange(this,0,100)" size="3" maxlength=3>%</td>
</tr>
<?
}
?>
<tr>
<td>Bereits erledigt:</td>
<td><input type="text" name="ta_complete" value="<? echo "$ta_complete"; ?>" size=3 maxlength=3>%</td>
</tr>
<tr>
<td>Priorit&auml;t:</td>
<td><select name="ta_priority">
<option value="0" <? if ($ta_priority == 0) echo "selected"; ?>>Niedrig</option>
<option value="1" <? if ($ta_priority == 1) echo "selected"; ?>>Normal</option>
<option value="2" <? if ($ta_priority == 2) echo "selected"; ?>>Hoch</option>
</select>
</td>
</tr>
<tr>
<td>Abh&auml;ngigkeit:</td>
<td colspan=2><select name="ta_depend">
<?php
if (strlen($ta_depend) == 0 || $ta_depend == 0) {
echo "<option selected></option>\n";
} else {
echo "<option></option>\n";
}
 
$query = "select ta_num, ta_name, ta_id, ta_level, ta_depend, ta_meeting, ta_phase from task where ta_plnum = $ta_plnum order by ta_id";
$result = QueryDB($db, $query);
$numrows = numrowsDB($result);
$row = 0;
$snum = "1";
$olevel = 0;
$db2 = OpenDB();
 
while ($row < $numrows) {
$data = fetchDB($result, $row);
$num = $data[0];
$name = $data[1];
$id = $data[2];
$level = $data[3];
$depend = $data[4];
$meeting = $data[5];
$tphase = $data[6];
 
$query = "select ta_level from task where ta_plnum = $ta_plnum and ta_id > $id order by ta_id";
$result2 = QueryDB($db2, $query);
$nr = numrowsDB($result2);
 
if ($nr > 0) {
$data = fetchDB($result2, 0);
$xlevel = $data[0];
} else {
$xlevel = $ta_level;
}
 
if ($olevel == 0) {
$lev = 0;
$olevel = $level;
$dir = -3;
} else if ($olevel < $level) {
$lev = $level - 1;
$olevel = $level;
$dir = -3;
} else if ($olevel == $level) {
$lev = $level - 1;
$dir = 0;
} else if ($olevel > $level) {
$lev = $level - 1;
$olevel = $level;
$dir = -1;
}
 
$snum = kNumber($snum, $lev, $dir);
 
if ($phase == 1 && $numphase == 1) {
$sarr = explode(".", $snum);
$sarr[0] = $tphase;
$snum = implode(".", $sarr);
}
 
if ($ta_depend > 0 && $ta_depend == $id) {
echo "<option value=\"$id\" selected>$snum $name</option>\n";
} else {
if (!$meeting && $level > 1 && $xlevel <= $level)
echo "<option value=\"$id\">$snum $name</option>\n";
}
 
$row++;
}
?>
</select>
<select name="ta_deptype">
<option value="2" <? if ($ta_deptype == 2) echo "selected"; ?>>Ende-Beginn</option>
<option value="3" <? if ($ta_deptype == 3) echo "selected"; ?>>Ende-Ende</option>
<option value="4" <? if ($ta_deptype == 4) echo "selected"; ?>>Beginn-Ende</option>
<option value="1" <? if ($ta_deptype == 1) echo "selected"; ?>>Beginn-Beginn</option>
</select>
</td>
</tr>
<tr>
<td valign="top">Kommentar:</td>
<td colspan=2><textarea name="ta_notiz" rows=5 cols=60><? echo htmlentities($ta_notiz); ?></textarea></td>
</tr>
<tr>
<td class="selnf" colspan=2>
<table border=0 cellspacing=0 cellpadding=0><tr><td>
<?
Button("Task Speichern", "Task");
echo "</td><td>&nbsp;&nbsp;</td><td>";
ButtonLink("Zur&uuml;ck", "plan.php", "editplan=$ta_plnum&menu=$menu&headline=20");
?>
</td></tr></table>
</td>
</tr>
</table>
<br>
<?php
echo "</form>\n";
closeDB($db);
}
 
# Folgende Funktion laesst die Auswahl einer Farbe zu, die dann in ein
# bestimmtes Feld der Maske "Task" geschrieben wird (function AddTask).
# Die Funktion wird ueber ein Java Script innerhalb eines eigenen Fensters
# aufgerufen. Neben einer Farbtafel enthaelt das Fenster noch einen Button
# ueber den es sich schliessen laesst.
#
function GetColor() {
?>
<map name="farbe">
<area shape="rect" coords="1,1,26,10" href="javascript:Farb('255','128','128')">
<area shape="rect" coords="28,1,53,10" href="javascript:Farb('255','255','128')">
<area shape="rect" coords="55,1,80,10" href="javascript:Farb('128','255','128')">
<area shape="rect" coords="82,1,107,10" href="javascript:Farb('0','255','128')">
<area shape="rect" coords="109,1,134,10" href="javascript:Farb('128','255','255')">
<area shape="rect" coords="136,1,161,10" href="javascript:Farb('0','128','255')">
<area shape="rect" coords="163,1,188,10" href="javascript:Farb('255','128','192')">
<area shape="rect" coords="190,1,215,10" href="javascript:Farb('255','128','255')">
<area shape="rect" coords="1,12,26,21" href="javascript:Farb('255','0','0')">
<area shape="rect" coords="28,12,53,21" href="javascript:Farb('255','255','0')">
<area shape="rect" coords="55,12,80,21" href="javascript:Farb('128','255','0')">
<area shape="rect" coords="82,12,107,21" href="javascript:Farb('0','255','64')">
<area shape="rect" coords="109,12,134,21" href="javascript:Farb('0','255','255')">
<area shape="rect" coords="136,12,161,21" href="javascript:Farb('0','128','192')">
<area shape="rect" coords="163,12,188,21" href="javascript:Farb('128','128','192')">
<area shape="rect" coords="190,12,215,21" href="javascript:Farb('255','0','255')">
<area shape="rect" coords="1,23,26,32" href="javascript:Farb('128','64','64')">
<area shape="rect" coords="28,23,53,32" href="javascript:Farb('255','128','64')">
<area shape="rect" coords="55,23,80,32" href="javascript:Farb('0','255','0')">
<area shape="rect" coords="82,23,107,32" href="javascript:Farb('0','128','128')">
<area shape="rect" coords="109,23,134,32" href="javascript:Farb('0','64','128')">
<area shape="rect" coords="136,23,161,32" href="javascript:Farb('128','128','255')">
<area shape="rect" coords="163,23,188,32" href="javascript:Farb('128','0','64')">
<area shape="rect" coords="190,23,215,32" href="javascript:Farb('255','0','128')">
<area shape="rect" coords="1,34,26,43" href="javascript:Farb('128','0','0')">
<area shape="rect" coords="28,34,53,43" href="javascript:Farb('255','128','0')">
<area shape="rect" coords="55,34,80,43" href="javascript:Farb('0','128','0')">
<area shape="rect" coords="82,34,107,43" href="javascript:Farb('0','128','64')">
<area shape="rect" coords="109,34,134,43" href="javascript:Farb('0','0','255')">
<area shape="rect" coords="136,34,161,43" href="javascript:Farb('0','0','160')">
<area shape="rect" coords="163,34,188,43" href="javascript:Farb('128','0','128')">
<area shape="rect" coords="190,34,215,43" href="javascript:Farb('128','0','255')">
<area shape="rect" coords="1,45,26,54" href="javascript:Farb('64','0','0')">
<area shape="rect" coords="28,45,53,54" href="javascript:Farb('128','64','0')">
<area shape="rect" coords="55,45,80,54" href="javascript:Farb('0','64','0')">
<area shape="rect" coords="82,45,107,54" href="javascript:Farb('0','64','64')">
<area shape="rect" coords="109,45,134,54" href="javascript:Farb('0','0','128')">
<area shape="rect" coords="136,45,161,54" href="javascript:Farb('0','0','64')">
<area shape="rect" coords="163,45,188,54" href="javascript:Farb('64','0','64')">
<area shape="rect" coords="190,45,215,54" href="javascript:Farb('64','0','128')">
<area shape="rect" coords="1,56,26,65" href="javascript:Farb('0','0','0')">
<area shape="rect" coords="28,56,53,65" href="javascript:Farb('128','128','0')">
<area shape="rect" coords="55,56,80,65" href="javascript:Farb('128','128','64')">
<area shape="rect" coords="82,56,107,65" href="javascript:Farb('128','128','128')">
<area shape="rect" coords="109,56,134,65" href="javascript:Farb('64','128','128')">
<area shape="rect" coords="136,56,161,65" href="javascript:Farb('192','192','192')">
<area shape="rect" coords="163,56,188,65" href="javascript:Farb('64','64','64')">
<area shape="rect" coords="190,56,215,65" href="javascript:Farb('255','255','255')">
</map>
<img src="image/farben.png" width="217" height="67" border="0" vspace="3" alt="" usemap="#farbe">
<form name="schliessen">
<?
ButtonProg("Schliessen", "self.close()");
// <input type="button" name="close" value="Schliessen" onClick="javascript:self.close()">
echo "</form>\n";
}
 
# Die folgenden zwei Funktionen loeschen einen bestehenden Plan
# und alle damit verknpften Tasks. Neben dem Superuser darf das auch
# vom Projektleiter durchgefuehrt werden.
#
function AskDelete($pl_num) {
global $phase;
 
$headline = $_REQUEST['headline'];
$menu = $_REQUEST['menu'];
$nav = "pl_num=$pl_num&menu=$menu&func=DeletePlan&headline=21";
?>
<br>
<form action="plan.php" method="post">
<table border=2 class="alarm">
<tr><td colspan=2><big>Warnung!</big><br><br>
Sie sind im Begriff alle erfassten Tasks dieses Plans zu
l&ouml;schen!<br><br>
Wollen Sie wirklich diesen Plan mit allen Daten
unwiederbringlich l&ouml;schen?<br>
</td>
</tr>
<tr>
<td><center><input type="button" name="yes" value="L&ouml;schen" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
<td><center><input type="button" name="no" value="Abbruch" onClick="javascript:MoveTo('plan.php','no=no&<? echo "$nav"; ?>')"></center></td>
</tr>
</table>
</form>
<?php
}
 
function DeletePlan() {
global $phase;
 
$pl_num = $_REQUEST['pl_num'];
$db = OpenDB();
QueryDB($db, "begin");
$query = "select ta_num from task where ta_plnum = $pl_num";
$result = QueryDB($db, $query);
 
if (!result) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
$numrows = numrowsDB($result);
$row = 0;
 
while ($row < $numrows) {
$data = fetchDB($result, $row);
$ta_num = $data[0];
$query = "delete from allocation where al_task = $ta_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
$row++;
}
 
$query = "delete from task where ta_plnum = $pl_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
$query = "delete from plan where pl_num = $pl_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
QueryDB($db, "commit");
Journal(101, "plan.php: DeletePlan: pl_num=$pl_num", $db);
closeDB($db);
return true;
}
 
# Die folgenden zwei Funktionen loeschen einen bestehenden Task
# und alle damit verknpften Mitarbeiter. Neben dem Superuser darf das auch
# vom Projektleiter durchgefuehrt werden.
#
function AskDeleteTask($ta_num) {
global $phase;
 
$headline = $_REQUEST['headline'];
$menu = $_REQUEST['menu'];
$ta_plnum = $_REQUEST['ta_plnum'];
$nav = "ta_num=$ta_num&ta_plnum=$ta_plnum&func=DeleteTask&menu=$menu&headline=21";
 
$db = OpenDB();
$query = "select plan.pl_prnum, project.pr_name from plan, project ";
$query .= "where plan.pl_num = $ta_plnum and project.pr_num = plan.pl_prnum";
$result = QueryDB($db, $query);
$data = fetchDB($result, 0);
$pl_prnum = $data[0];
$pr_name = $data[1];
echo "<p class=\"cry\">Projekt: $pl_prnum $pr_name</p>";
closeDB($db);
?>
<br>
<form action="plan.php" method="post">
<table border=2 class="alarm">
<tr><td colspan=2><big>Warnung!</big><br><br>
Sie sind im Begriff einen Task mit allen seinen Abh&auml;ngigkeiten
zu l&ouml;schen!<br><br>
Wollen Sie wirklich diesen Task unwiederbringlich l&ouml;schen?<br>
</td>
</tr>
<tr>
<td><center><input type="button" name="yes" value="L&ouml;schen" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
<td><center><input type="button" name="no" value="Abbruch" onClick="javascript:MoveTo('plan.php','no=no&<? echo "$nav"; ?>')"></center></td>
</tr>
</table>
</form>
<?php
}
 
function DeleteTask() {
global $phase;
 
$ta_num = $_REQUEST['ta_num'];
 
if (!isset($ta_num) || $ta_num < 1) {
Error("Interner Fehler: DeleteTask: Tasknummer fehlt oder ist ung&uuml;ltig!");
return false;
}
 
$db = OpenDB();
# Fuer das E-Journal brauchen wir die Plan- und Projektnummer!
$query = "select pl_num, pl_prnum, ta_name from task, plan where ";
$query .= "pl_num = ta_plnum and ta_num = $ta_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return false;
}
 
$data = fetchDB($result, 0);
$pl_num = $data[0];
$pl_prnum = $data[1];
$ta_name = $data[2];
 
QueryDB($db, "begin");
$query = "delete from allocation where al_task = $ta_num";
$result = QueryDB($db, $query);
 
if (!$result) {
QueryDB($db, "rollback");
Error("SQL-Error: $query");
closeDB($db);
return false;
}
 
$query = "delete from task where ta_num = $ta_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
Error("SQL-Error: $query");
closeDB($db);
return false;
}
 
QueryDB($db, "commit");
Journal(100, "plan.php: DeleteTask: ta_num=$ta_num $ta_name, pl_num=$pl_num, Projekt: $pl_prnum", $db);
closeDB($db);
return true;
}
 
# Die folgenden zwei Funktionen loeschen einen bestehenden Task
# und alle damit verknpften Mitarbeiter. Neben dem Superuser darf das auch
# vom Projektleiter durchgefuehrt werden.
#
function AskDeleteMa() {
global $phase;
global $dtformatshort;
 
$headline = $_REQUEST['headline'];
$menu = $_REQUEST['menu'];
$pl_num = $_REQUEST['pl_num'];
$al_task = $_REQUEST['al_task'];
$ressource = $_REQUEST['ressource'];
$nav = "al_task=$al_task&pl_num=$pl_num&ressource=$ressource&func=DeleteMa&menu=$menu&headline=$headline";
 
$db = OpenDB();
$query = "select plan.pl_prnum, project.pr_name from plan, project ";
$query .= "where plan.pl_num = $pl_num and project.pr_num = plan.pl_prnum";
$result = QueryDB($db, $query);
$data = fetchDB($result, 0);
$pl_prnum = $data[0];
$pr_name = $data[1];
echo "<p class=\"cry\">Projekt: $pl_prnum $pr_name</p>";
 
$query = "select ta_name, ta_start, ta_duration from task ";
$query .= "where ta_num = $al_task";
$result = QueryDB($db, $query);
$data = fetchDB($result, 0);
$ta_name = $data[0];
$ta_start = $data[1];
$ta_duration = $data[2];
 
$query = "select am_hours, am_role, am_nname, am_vname ";
$query .= "from allocmi where am_task = $al_task and am_ressource = $ressource";
$result = QueryDB($db, $query);
$rows = 0;
$numrows = numrowsDB($result);
 
?>
<br>
<form action="plan.php" method="post">
<table border=2 class="alarm">
<tr><td colspan=2><big>Warnung!</big><br><br>
Sie sind im Begriff einen Mitarbeiter von einem Task
zu l&ouml;schen!<br>
<center><table border=1><tr>
<td class="tbhead">Taskname</td>
<td class="tbhead">Dauer</td>
<td class="tbhead">Start</td></tr>
<?php
echo "<tr><td>$ta_name</td>\n";
echo "<td>$ta_duration</td>\n";
$dt = gmdate($dtformatshort, $ta_start);
echo "<td>$dt</td></tr>\n";
echo "</table></center>\n";
 
echo "<center><p>";
 
while ($rows < $numrows) {
$data = fetchDB($result, $rows);
$am_hours = $data[0];
$am_role = $data[1];
$am_nname = $data[2];
$am_vname = $data[3];
 
if ($rows == 0) {
echo "$am_nname $am_vname, $am_role: ";
printf("%s", FormatNum($am_hours, 3));
}
else
printf(", %s", FormatNum($am_hours, 3));
 
$rows++;
}
 
echo "</p></center>\n";
closeDB($db);
?>
Wollen Sie wirklich diesen Mitarbeiter unwiederbringlich l&ouml;schen?<br>
</td>
</tr>
<tr>
<td><center><input type="button" name="yes" value="L&ouml;schen" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
<td><center><input type="button" name="no" value="Abbruch" onClick="javascript:MoveTo('plan.php','no=no&<? echo "$nav"; ?>')"></center></td>
</tr>
</table>
</form>
<?php
}
 
function DeleteMa() {
$al_task = $_REQUEST['al_task'];
$ressource = $_REQUEST['ressource'];
 
$db = OpenDB();
QueryDB($db, "begin");
$query = "delete from allocation where al_task = $al_task and ";
$query .= "al_ressource = $ressource";
$result = QueryDB($db, $query);
 
if (!result) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
QueryDB($db, "commit");
Journal(105, "plan.php: DeleteMa: ressource=$ressource; task=$al_task", $db);
closeDB($db);
return true;
}
 
# Folgende Funktion wird von SaveTask() aufgerufen.
# Der Aufruf erfolgt, wenn bei einem Task das Startdatum so geaendert
# wurde, dass es gegenueber dem Alten in der Vergangenheit liegt. Ist das
# der Fall, koennen die betroffenen Perioden der zugeordneten Mitarbeiter
# geloescht werden.
#
function AskObsoleteMA() {
global $menu;
global $headline;
global $phase;
 
$ta_num = $_REQUEST['ta_num'];
$ta_plnum = $_REQUEST['ta_plnum'];
$ta_id = $_REQUEST['ta_id'];
$ta_level = $_REQUEST['ta_level'];
$ta_name = $_REQUEST['ta_name'];
$ta_color = $_REQUEST['ta_color'];
$ta_meeting = $_REQUEST['ta_meeting'];
$start = $_REQUEST['start'];
$ende = $_REQUEST['ende'];
$ta_duration = $_REQUEST['ta_duration'];
$ta_complete = $_REQUEST['ta_complete'];
$ta_priority = $_REQUEST['ta_priority'];
$ta_depend = $_REQUEST['ta_depend'];
$ta_deptype = $_REQUEST['ta_deptype'];
$ta_notiz = $_REQUEST['ta_notiz'];
 
if ($phase)
$ta_phase = $_REQUEST['ta_phase'];
else
$ta_phase = 0;
 
if (!isset($ta_meeting))
$ta_meeting = 0;
 
echo "<form name=\"obsolete\" action=\"plan.php\" method=\"post\">\n";
echo "<input type=\"hidden\" name=\"ta_num\" value=\"$ta_num\">\n";
echo "<input type=\"hidden\" name=\"ta_plnum\" value=\"$ta_plnum\">\n";
echo "<input type=\"hidden\" name=\"ta_id\" value=\"$ta_id\">\n";
echo "<input type=\"hidden\" name=\"ta_level\" value=\"$ta_level\">\n";
echo "<input type=\"hidden\" name=\"ta_name\" value=\"$ta_name\">\n";
echo "<input type=\"hidden\" name=\"ta_color\" value=\"$ta_color\">\n";
echo "<input type=\"hidden\" name=\"ta_meeting\" value=\"$ta_meeting\">\n";
echo "<input type=\"hidden\" name=\"ta_duration\" value=\"$ta_duration\">\n";
echo "<input type=\"hidden\" name=\"ta_complete\" value=\"$ta_complete\">\n";
echo "<input type=\"hidden\" name=\"ta_priority\" value=\"$ta_priority\">\n";
echo "<input type=\"hidden\" name=\"ta_depend\" value=\"$ta_depend\">\n";
echo "<input type=\"hidden\" name=\"ta_deptype\" value=\"$ta_deptype\">\n";
echo "<input type=\"hidden\" name=\"ta_phase\" value=\"$ta_phase\">\n";
echo "<input type=\"hidden\" name=\"ta_notiz\" value=\"$ta_notiz\">\n";
echo "<input type=\"hidden\" name=\"start\" value=\"$start\">\n";
echo "<input type=\"hidden\" name=\"ende\" value=\"$ende\">\n";
echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
echo "<input type=\"hidden\" name=\"headline\" value=\"$headline\">\n";
echo "<input type=\"hidden\" name=\"func\" value=\"SaveObsoleteTask\">\n";
?>
<center>
<table border=2 class="alarm" width="50%">
<tr>
<td colspan=2><big>Hinweis!</big><br><br>
<?
Output(-1, 351,
" Sie haben das Start&minus; bzw. Endedatum des Tasks
ge&auml;ndert. Diesem Task sind jedoch bereits Mitarbeiter
zugeordnet, deren Perioden nun (teilweise) au&szlig;erhalb des
Zeitraums des Tasks fallen w&uuml;rden.<br><br>
Wenn Sie folgende Frage mit <b>JA</b> beantworten, werden jene
Perioden geloescht, die au&szlig;erhalb des Taskzeitraums liegen!<br><br>
Wollen Sie die Perioden der zugeordneten Mitarbeiter die au&szlig;erhalb des
Taskzeitraums liegen wirklich loeschen?");
?>
</td>
</tr>
<tr>
<?
echo "<td align=\"center\">";
Button("Ja", "obsolete");
echo "</td><td align=\"center\">";
ButtonLink("Abbrechen", "plan.php", "editplan=$ta_plnum&menu=$menu&headline=$headline");
echo "</td>";
?>
</tr>
</table>
</center>
</form>
<?php
}
 
function SaveTask($doit=false) {
global $phase;
$ta_num = $_REQUEST['ta_num'];
$ta_plnum = $_REQUEST['ta_plnum'];
$ta_id = $_REQUEST['ta_id'];
$ta_level = $_REQUEST['ta_level'];
$ta_name = $_REQUEST['ta_name'];
$ta_color = $_REQUEST['ta_color'];
$ta_meeting = $_REQUEST['ta_meeting'];
$start = $_REQUEST['start'];
$end = $_REQUEST['ende'];
$ta_duration = $_REQUEST['ta_duration'];
$ta_complete = $_REQUEST['ta_complete'];
$ta_priority = $_REQUEST['ta_priority'];
$ta_depend = $_REQUEST['ta_depend'];
$ta_deptype = $_REQUEST['ta_deptype'];
$ta_notiz = $_REQUEST['ta_notiz'];
$ta_risiko = $_REQUEST['ta_risiko'];
$folder = $_REQUEST['folder'];
 
if ($phase)
$ta_phase = $_REQUEST['ta_phase'];
else
$ta_phase = 0;
 
# Plausibilitaetspruefungen
$err = 0;
 
if (!isset($ta_plnum) || $ta_plnum < 1) {
Error(GetMessage(-1, 341, "Interner Fehler: Plannummer fehlt!"));
$err = 1;
}
 
if (!isset($ta_id) || $ta_id < 1) {
Error(GetMessage(-1, 342, "Interner Fehler: Keine oder ung&uuml;ltige ID-Nummer!"));
$err = 1;
}
 
if (strlen($ta_name) < 1) {
Error(GetMessage(-1, 343, "Ein Task muss einen Namen haben!"));
$err = 1;
}
 
if (strlen($ta_color) != 6) {
Error(GetMessage(-1, 344, "Ung&uuml;ltiger Farbcode! Standard (hellgelb) wurde gesetzt!"));
$ta_color = "ffffcc";
}
 
if (!isset($ta_meeting)) {
$ta_meeting = 0;
}
 
if (!isset($ta_risiko) || $ta_meeting)
$ta_risiko = 0;
 
if (strlen($start) < 8 || str_wordcount($start) != 3) {
Error(GetMessage(-1, 345, "Ung&uuml;ltiges Startdatum! (%s)", $start));
$err = 1;
}
 
if (!$ta_meeting && (strlen($end) < 8 || str_wordcount($end) != 3)) {
Error(GetMessage(-1, 346, "Ung&uuml;ltiges Endedatum! (%s)", $end));
$err = 1;
}
 
$db = OpenDB();
# Datum des letzten Teilprojektabschlusses ermitteln.
$query = "select pl_prnum from plan where pl_num = $ta_plnum";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return false;
}
 
$data = fetchDB($result, 0);
$pl_prnum = $data[0];
$query = "select ab_datum from abschluss where ab_prnum = $pl_prnum ";
$query .= "order by ab_Datum desc";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return false;
}
 
if (numrowsDB($result) > 0) {
$data = fetchDB($result, 0);
$ab_datum = $data[0];
} else
$ab_datum = 0;
 
# Pruefen ob die eingegebenen Datum korrekt sind.
$dt = explode(".", $start);
$ta_start = gmmktime(0, 0, 0, $dt[1], $dt[0], $dt[2]);
 
// if (isset($ta_num) && $ta_num > 0 && $ta_start <= $ab_datum) {
// Error(GetMessage($db, 349, "Das Startdatum darf nicht vor dem Datum des letzten Teilprojektabschlu&szlig; sein!"));
// $err = 1;
// }
 
if (!$ta_meeting) {
$dt = explode(".", $end);
$ta_end = gmmktime(0, 0, 0, $dt[1], $dt[0], $dt[2]);
} else
$ta_end = $ta_start;
 
if ($ta_meeting == 0 && $ta_start > $ta_end) {
Error(GetMessage(-1, 347, "Das Startdatum darf nicht gr&ouml;&szlig;er als das Endedatum sein!"));
$err = 1;
}
 
// if (!$err && isset($ta_num) && $ta_num > 0 && $ta_end <= $ab_datum) {
// Error(GetMessage($db, 350, "Das Endedatum darf nicht vor dem Datum des letzten Teilprojektabschlu&szlig; sein!"));
// $err = 1;
// }
 
if (!isset($ta_depend) || strlen($ta_depend) == 0) {
$ta_depend = 0;
}
 
if ($ta_complete > 100) {
$ta_complete = 100;
}
 
# Wenn der vorhergehende Task, sofern einer existiert, ein Meilenstein
# ist, dann darf der Level des folgenden Tasks nicht hoeher sein.
$query = "select ta_level, ta_meeting from task where ";
$query .= "ta_plnum = $ta_plnum and ta_id < $ta_id order by ta_id desc";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return false;
}
 
if (numrowsDB($result) > 0) {
$data = fetchDB($result, 0);
$level = $data[0];
$meeting = $data[1];
 
if ($meeting && !$ta_meeting && $ta_level > $level) {
Error(GetMessage($db, 348, "Der \"Level\" ist au&szlig;erhalb des g&uuml;ltigen Bereichs!"));
$err = 1;
}
}
 
if ($ta_level < 1 || $ta_level > 99) {
Error(GetMessage($db, 348, "Der \"Level\" ist au&szlig;erhalb des g&uuml;ltigen Bereichs!"));
$err = 1;
}
 
if ($err == 1) {
closeDB($db);
return false;
}
 
# Umwandlungen
$ta_color = hexdec($ta_color);
 
if (!$ta_meeting)
$ta_duration = ($ta_end - $ta_start) / 86400;
else
$ta_duration = 0;
 
# Aendern wir einen bestehenden Datensatz, oder speichern wir einen
# neuen?
if (isset($ta_num) && $ta_num > 0) { // neuer Datensatz?
$query = "select ta_start, ta_duration from task where ta_num = $ta_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return false;
}
 
$numrows = numrowsDB($result);
 
# Pruefen ob das eventuell geaenderte Startdatum nicht in einer
# zukuenftigen Periode liegt und bereits zugewiesene Mitarbeiter
# in der Luft haengen wuerden. Ist das der Fall, muss der User
# darauf hingewiesen werden und, wenn er es will, die nicht mehr
# zugeordneten Mitarbeiter geloescht werden.
#
if ($numrows == 1 && !$doit) {
$data = fetchDB($result, 0);
$old_tastart = $data[0];
$old_taduration = $data[1];
$oend = $old_tastart + ($old_taduration * 86400);
$dend = $ta_start + ($ta_duration * 86400);
 
# Prufen, ob das Start- oder Endedatum geaendert wurde und wenn
# ja, dann duerfen die neuen Datum nicht juenger als das letzte
# Datum des Teilprojektabschluss sein.
 
if (!$folder && (($old_tastart != $ta_start && $ta_start <= $ab_datum) ||
($old_taduration != $ta_duration && $dend <= $ab_datum))) {
Error(GetMessage($db, 352, "Das Startdatum und/oder das Endedatum darf nicht vor dem Datum des letzten Teilabschluss sein!"));
closeDB($db);
return false;
}
 
# Pruefen, ob die neuen Start- oder Endedatum keine in der Luft
# haengenden Planwerte hinterlassen.
if (PerDateComp($ta_start, $old_tastart) < 0 ||
PerDateComp($oend, $dend) < 0) {
$query = "select al_num, al_pstart from allocation where ";
$query .= "al_task = $ta_num and (al_pstart < $ta_start or ";
$query .= "al_pstart > $dend)";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return false;
}
 
$rows = numrowsDB($result);
 
if ($rows > 0) { // Gibt es MA unterhalb von ta_start?
AskObsoleteMA();
closeDB($db);
require('footer.inc');
exit();
}
}
} /* else
$numrows = 0;
*/
# Gibt es den Datensatz bereits, dann aendern wir ihn.
if ($numrows == 1) {
if ($doit) {
$dend = $ta_start + ($ta_duration * 86400);
QueryDB($db, "begin");
$query = "delete from allocation where al_task = $ta_num and ";
$query .= "(al_pstart < $ta_start or al_pstart > $dend)";
 
if (!QueryDB($db, $query)) {
closeDB($db);
return false;
}
}
 
$query = "update task set ta_name = '$ta_name', ta_color = '$ta_color',";
$query .= "ta_meeting = $ta_meeting, ta_start = $ta_start,";
$query .= "ta_duration = $ta_duration, ta_complete = $ta_complete,";
$query .= "ta_priority = $ta_priority, ta_level = $ta_level,";
$query .= "ta_depend = $ta_depend, ta_deptype = $ta_deptype,";
 
if ($phase == 1)
$query .= "ta_plnum = $ta_plnum, ta_id = $ta_id, ta_phase = $ta_phase,";
else
$query .= "ta_plnum = $ta_plnum, ta_id = $ta_id,";
 
$query .= "ta_notiz = '$ta_notiz', ta_risiko = $ta_risiko where ta_num = $ta_num";
 
if (!QueryDB($db, $query)) {
if ($doit)
QueryDB($db, "rollback");
 
closeDB($db);
return false;
}
 
if ($doit)
QueryDB($db, "commit");
 
closeDB($db);
return true;
}
}
 
# Der Datensatz existiert nicht und deshalb fuegen wir ihn ein. Es
# muss jedoch geprueft werden, ob die ID bereits existiert. Existiert
# sie, muessen alle IDs >= #ta_id um 1 erhoeht werden und der
# Datensatz anschliessend eingefuegt werden.
$query = "select ta_id from task where ta_plnum = $ta_plnum and ta_id = $ta_id";
$result = QueryDB($db, $query);
$numrows = numrowsDB($result);
 
if ($numrows == 1) {
# Alle IDs um 1 nach hinten schieben!
$query = "select ta_num, ta_id from task where ta_plnum = $ta_plnum and ta_id >= $ta_id order by ta_id desc";
$result = QueryDB($db, $query);
$numrows = numrowsDB($result);
$row = 0;
$db2 = OpenDB();
 
while ($row < $numrows) {
$data = fetchDB($result, $row);
$num = $data[0];
$id = $data[1] + 1;
$query = "update task set ta_id = $id where ta_num = $num";
 
if (!TQueryDB($db2, $query)) {
Error("SQL-Error: $query");
closeDB($db);
closeDB($db2);
return false;
}
 
$row++;
}
 
closeDB($db2);
}
 
# Nun wird der neue Datensatz tatsaechlich geschrieben.
$query = "select co_task from counter";
$result = QueryDB($db, $query);
$data = fetchDB($result, 0);
$ta_num = $data[0] + 1;
$ta_hash = md5($ta_num);
 
QueryDB($db, "begin");
$query = "insert into task (ta_num, ta_plnum, ta_id, ta_depend,";
$query .= "ta_deptype, ta_name, ta_color, ta_shape, ta_meeting,";
$query .= "ta_start, ta_duration, ta_complete, ta_fixed_start,";
$query .= "ta_priority, ta_level, ta_phase, ta_notiz, ta_hash, ta_risiko) values (";
$query .= "$ta_num, $ta_plnum, $ta_id, $ta_depend, $ta_deptype,";
$query .= "'$ta_name', $ta_color, '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0',";
$query .= "$ta_meeting, $ta_start, $ta_duration, $ta_complete,";
 
if ($phase == 1)
$query .= "0, $ta_priority, $ta_level, $ta_phase, '$ta_notiz', '$ta_hash', $ta_risiko)";
else
$query .= "0, $ta_priority, $ta_level, 0, '$ta_notiz', '$ta_hash', $ta_risiko)";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
Error("SQL-Error: $query");
closeDB($db);
return false;
}
 
$query = "update counter set co_task = $ta_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
Error("SQL-Error: $query");
closeDB($db);
return false;
}
 
QueryDB($db, "commit");
Journal(300, "plan.php: SaveTask: task=$ta_num", $db);
closeDB($db);
return true;
}
 
function AddMiAdd() {
global $periode;
global $phase;
global $role;
 
$al_task = $_REQUEST['al_task'];
$al_ressource = $_REQUEST['al_ressource'];
$al_hours = $_REQUEST['al_hours'];
 
if ($role)
$al_role = $_REQUEST['al_role'];
 
$al_pstart = $_REQUEST['al_pstart'];
 
if ($phase)
$al_phase = $_REQUEST['al_phase'];
else
$al_phase = 0;
 
$al_hours = str_replace(",", ".", $al_hours);
 
if ($al_hours <= 0 || $al_hours > 99.999) {
Error("Error: Die Projekttage (PT) m&uuml;ssen im Bereich 1 bis 99,999 sein!<br>\n");
return false;
}
 
$db = OpenDB();
$query = "select co_allocation from counter";
$result = QueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return false;
}
 
$data = fetchDB($result, 0);
$co_allocation = $data[0] + 1;
$mon = gmdate("n", $al_pstart);
$year = gmdate("Y", $al_pstart);
 
switch ($periode) {
case 1: $al_pduration = 364; break;
case 2: $al_pduration = 91; break;
case 3: $al_pduration = daysinmonth($mon, $year); break;
case 4: $al_pduration = 1; break;
default: $al_pduration = daysinmonth($mon, $year); break;
}
 
QueryDB($db, "begin");
 
if (!$phase)
$al_phase = 0;
 
$query = "insert into allocation (al_num, al_task, al_ressource,";
 
if ($role)
$query .= "al_hours, al_phase, al_role, al_pstart, al_pduration) ";
else
$query .= "al_hours, al_phase, al_pstart, al_pduration) ";
 
$query .= "values ($co_allocation, $al_task,";
 
if ($role)
$query .= "$al_ressource, $al_hours, $al_phase, $al_role,";
else
$query .= "$al_ressource, $al_hours, $al_phase, ";
 
$query .= "$al_pstart, $al_pduration)";
$result = QueryDB($db, $query);
 
if (!$result) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
$query = "update counter set co_allocation = $co_allocation";
$result = QueryDB($db, $query);
 
if (!$result) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
QueryDB($db, "commit");
Journal(202, "plan.php: AddMiAdd: task=$al_task; ressource=$al_ressource", $db);
closeDB($db);
return true;
}
 
function AddMiDel($al_num) {
global $unum;
global $rstufe;
 
$db = OpenDB();
$query = "delete from allocation where al_num = $al_num";
$result = TQueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return false;
}
 
Journal(105, "plan.php: AddMiDel: al_num=$al_num", $db);
closeDB($db);
return true;
}
 
# Folgende Funktion ermittelt die Summe aller Planwerte eines bestimmten
# Mitarbeiters in einer bestimmten Periode.
#
function GetRessource($db, $mi_num, $periode) {
$mon = gmdate("n", $periode);
$year = gmdate("Y", $periode);
$per_start = gmmktime(0, 0, 0, $mon, 1, $year);
$per_end = gmmktime(0, 0, 0, $mon, daysinmonth($mon, $year), $year);
$query = "select sum(al_hours) from allocation, task, plan where ";
$query .= "ta_num = al_task and pl_num = ta_plnum and pl_status in (2,4) and ";
$query .= "al_ressource = $mi_num and al_pstart between $per_start and $per_end";
 
if (!($result = QueryDB($db, $query)))
return -1;
 
$data = fetchDB($result, 0);
return $data[0];
}
 
function PrintMa($db, $dstart, $dend, $al_task, $color, $pl_num, $ressource, $lock=false) {
global $periode;
global $einheit;
global $menu;
global $phase;
global $role;
global $verrmodul;
global $stdwhg;
global $ab_datum;
global $rstufe;
 
$nav = "pl_num=$pl_num&al_task=$al_task&menu=$menu&headline=20";
$query = "select am_num, am_task, am_ressource, am_hours, am_pstart,";
$query .= "am_pduration, am_role, am_krnum, am_nname, am_vname, am_phase ";
$query .= "from allocmi where am_task = $al_task order by ";
$query .= "am_nname, am_vname, am_pstart";
$erg = QueryDB($db, $query);
 
if (!$erg)
return 0;
 
$erganz = numrowsDB($erg);
$ergrow = 0;
$oressource = 0;
$dt = 0;
$sum = 0;
$total = 0;
$brutto = 0;
 
while ($ergrow < $erganz) {
$data = fetchDB($erg, $ergrow);
$am_num = $data[0];
$am_task = $data[1];
$am_ressource = $data[2];
$am_hours = $data[3];
$am_pstart = $data[4];
$am_pduration = $data[5];
$am_role = $data[6];
$am_krnum = $data[7];
$am_nname = $data[8];
$am_vname = $data[9];
$am_phase = $data[10];
 
# Wenn das Verrechnungsmodul aktiv ist, benoetigen wir den
# Tagsatz des Mitarbeiters.
if ($oressource != $am_ressource) {
if ($oressource != 0) {
$ed = GetEDate($einheit, $ta_start, $ta_duration);
 
if ($dt < $ed) {
while (PerDateComp($dt, $ed) >= 0) {
if ($oressource == $ressource) {
$res_hours = GetRessource($db, $ressource, $dt);
$pts = GetPT($dt);
$mon = gmdate("n", $dt);
$year = gmdate("Y", $dt);
$nm = "dt_0_" . (string)$mon;
$nm .= "_" . (string)$year;
 
if ($dt > $ab_datum || $rstufe == 1) {
echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6 ";
echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
} else {
echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
}
}
else
echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
 
$dt = IncDate($periode, $dt);
}
}
 
while (PerDateComp($dt, $dend) >= 0) {
$dt = IncDate($periode, $dt);
echo "<td class=\"sel\">&nbsp;</td>";
}
 
printf ("<td class=\"selnum\"><b>%s</b></td>\n", FormatNum($sum, 3));
$total += $sum;
 
if ($verrmodul) {
echo "<td class=\"sel\">&nbsp;</td>";
printf ("<td class=\"selnum\">%s</td>", FormatNum($brutto, 2));
echo "<td class=\"sel\">&nbsp;</td>";
echo "<td class=\"sel\">&nbsp;</td>";
}
 
$sum = 0;
$brutto = 0;
echo "</tr>\n";
}
 
# Starrer Zeilenbegin ...
echo "<tr>\n";
# Button
echo "<td class=\"selakt\">";
 
if (!$lock && $am_ressource == $ressource) {
echo "<a name=\"edit\"></a>\n"; # Einsprungpunkt
echo "<form name=\"PrintMa\" action=\"plan.php\" method=\"post\">\n";
echo "<input type=\"hidden\" name=\"pl_num\" value=\"$pl_num\">\n";
echo "<input type=\"hidden\" name=\"ressource\" value=\"$am_ressource\">\n";
echo "<input type=\"hidden\" name=\"ta_num\" value=\"$al_task\">\n";
echo "<input type=\"hidden\" name=\"al_phase\" value=\"$am_phase\">\n";
echo "<input type=\"hidden\" name=\"al_role\" value=\"$am_krnum\">\n";
echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
echo "<input type=\"hidden\" name=\"headline\" value=\"20\">\n";
echo "<input type=\"hidden\" name=\"func\" value=\"SaveUpMa\">\n";
/* echo "<button type=\"submit\" name=\"submit\">";
echo "<img src=\"image/new.png\" border=0 alt=\"Speichern\">";
echo "</button>\n";
*/
ButtonImage("filesave.png", "PrintMa", "Speichern");
} else if (!$lock) {
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php',";
echo "'ressource=$am_ressource&func=UpdateMa&$nav#edit')\">";
echo "<img src=\"image/edit.png\" border=0 alt=\"Update\"></a>";
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php',";
echo "'ta_num=$am_task&ressource=$am_ressource&func=AskDeleteMa&$nav')\">";
echo "<img src=\"image/editdelete.png\" border=0 alt=\"Loeschen\"></a>";
} else
echo "&nbsp;";
 
echo "</td>\n";
# Nummerierung
echo "<td class=\"sel\">&nbsp;</td>\n";
# Ressource
echo "<td colspan=2 class=\"sel\" width=\"20%\"> </td>\n";
echo "<td class=\"sel\"><i>$am_nname $am_vname";
if ($role)
echo ", $am_role";
 
echo "</i></td>\n";
# Tasklaenge mit Einheit
echo "<td colspan=3 class=\"sel\">&nbsp;</td>\n";
# Mitarbeiterrolle
 
# if ($role)
# echo "<td class=\"sel\">$am_role</td>\n";
 
# Zellen bis zum Taskanfang schreiben
$query = "select ta_start, ta_duration from task where ta_num = $am_task";
 
if (!($res = QueryDB($db, $query))) {
Error(GetMessage($db, 339, "Keinen dazupassenden Task gefunden!"));
return 0;
}
 
$data = fetchDB($res, 0);
$ta_start = $data[0];
$ta_duration = $data[1];
$dt = $dstart;
 
while (PerDateComp($dt, $ta_start) > 0) {
$dt = IncDate($periode, $dt);
echo "<td class=\"sel\">&nbsp;</td>";
}
 
# Falls wir Eingabezeilen benoetigen die vor dem ersten
# gespeicherten Task beginnen, schreiben wir diese hier.
if ($ressource == $am_ressource && $ta_start < $am_pstart) {
while (PerDateComp($dt, $am_pstart) > 0) {
$res_hours = GetRessource($db, $ressource, $dt);
$pts = GetPT($dt);
$mon = gmdate("n", $dt);
$year = gmdate("Y", $dt);
$nm = "dt_0_" . (string)$mon;
$nm .= "_" . (string)$year;
 
if ($dt > $ab_datum || $rstufe == 1) {
echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6 ";
echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
} else
echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
 
$dt = IncDate($periode, $dt);
}
}
 
$oressource = $am_ressource;
}
 
# Rest der Zeile schreiben
$PerStart = GetPeriode($am_pstart);
$pyear = gmdate("Y", $am_pstart);
$PerAkt = GetPeriode($dt);
$tyear = gmdate("Y", $dt);
 
# Wenn das Verrechnungsmodul aktiv ist, benoetigen wir den
# Tagsatz des Mitarbeiters zum aktuellen Datum.
if ($verrmodul) {
$query = "select tg_amount, tg_whg from tagsatz where ";
$query .= "tg_minum = $am_ressource and tg_valid_from <= to_date('" . gmdate("d.m.Y", $dt) . "','DD.MM.YYYY') and ";
$query .= "(tg_valid_to >= to_date('" . gmdate("d.m.Y", GetUltimo($dt)) . "','DD.MM.YYYY') or tg_valid_to is NULL) ";
$query .= "order by tg_valid_from, tg_valid_to";
 
if (!($resver = QueryDB($db, $query)))
return 0;
 
if (numrowsDB($resver) > 0) {
$data = fetchDB($resver, 0);
$tg_amount = $data[0];
$tg_whg = $data[1];
} else {
$tg_amount = 0.0;
$tg_whg = $stdwhg;
}
}
 
if ($ressource == $am_ressource) {
$tm = gmdate("j.n.Y", $dt);
$ad = explode(".", $tm);
$res_hours = GetRessource($db, $ressource, $dt);
$pts = GetPT($dt);
 
if ($PerStart == $PerAkt) {
$nm = "dt_" . (string)$am_num . "_" . (string)$ad[1];
$nm .= "_" . (string)$ad[2];
 
if ($dt > $ab_datum || $rstufe == 1) {
printf("<td class=\"sel\"><input type=\"text\" name=\"$nm\" value=\"%s\" size=6 maxlength=6 ", FormatNum($am_hours, 3));
echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
} else {
echo "<td style=\"background-color: #$color; border: 1px solid black; text-align: right;\">";
echo FormatNum($am_hours, 3) . "</td>\n";
}
 
$sum += $am_hours;
$brutto += $am_hours * $tg_amount;
$ergrow++;
} else {
$nm = "dt_0_" . (string)$ad[1];
$nm .= "_" . (string)$ad[2];
 
if ($dt > $ab_datum || $rstufe == 1) {
echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6 ";
echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
} else
echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
}
} else {
if ($PerStart == $PerAkt && $pyear == $tyear) {
printf ("<td style=\"background-color: #$color; border: 1px solid black; text-align:right;\">%s</td>\n", FormatNum($am_hours, 3));
$sum += $am_hours;
$brutto += $am_hours * $tg_amount;
$ergrow++;
} else
echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
}
 
$dt = IncDate($periode, $dt);
}
 
if ($erganz > 0) {
$ed = GetEDate($einheit, $ta_start, $ta_duration);
 
if ($dt < $ed) {
while (PerDateComp($dt, $ed) >= 0) {
if ($oressource == $ressource) {
$res_hours = GetRessource($db, $am_ressource, $dt);
$pts = GetPT($dt);
$mon = gmdate("n", $dt);
$year = gmdate("Y", $dt);
$nm = "dt_0_" . (string)$mon;
$nm .= "_" . (string)$year;
 
if ($dt > $ab_datum || $rstufe == 1) {
echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6 \n";
echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
} else
echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
}
else
echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
 
$dt = IncDate($periode, $dt);
}
}
 
while (PerDateComp($dt, $dend) >= 0) {
$dt = IncDate($periode, $dt);
echo "<td class=\"sel\">&nbsp;</td>";
}
 
printf ("<td class=\"selnum\"><b>%s</b></td>\n", FormatNum($sum, 3));
$total += $sum;
 
if ($verrmodul) {
echo "<td class=\"sel\">&nbsp;</td>";
printf ("<td class=\"selnum\">%s</td>", FormatNum($brutto, 2));
echo "<td class=\"sel\">&nbsp;</td>";
echo "<td class=\"sel\">&nbsp;</td>";
}
 
echo "</tr>\n";
 
if ($am_ressource == $ressource)
echo "</form>\n";
}
 
return $total;
}
 
# Liefert den Level des Tasks vor dem angegebenen. Existiert kein Task
# davor, wird -1 zurueckgegeben.
#
function GetPreviousLevel($db, $ta_num) {
$query = "select ta_id, ta_plnum from task where ta_num = $ta_num";
 
if (!($result = QueryDB($db, $query)))
return -1;
 
$data = fetchDB($result, 0);
$ta_id = $data[0];
$ta_plnum = $data[1];
$query = "select ta_level from task where ta_plnum = $ta_plnum ";
$query .= "and ta_num != $ta_num and ta_id < $ta_id ";
$query .= "order by ta_id desc";
 
if (!($result = QueryDB($db, $query)))
return -1;
 
if (numrowsDB($result) <= 0)
return -1;
 
$data = fetchDB($result, 0);
return $data[0];
}
 
# Liefert den Level des Tasks nach dem angegebenen. Existiert kein Task
# danach, wird -1 zurueckgegeben.
#
function GetNextLevel($db, $ta_num) {
$query = "select ta_id, ta_plnum from task where ta_num = $ta_num";
 
if (!($result = QueryDB($db, $query)))
return -1;
 
$data = fetchDB($result, 0);
$ta_id = $data[0];
$ta_plnum = $data[1];
$query = "select ta_level from task where ta_plnum = $ta_plnum ";
$query .= "and ta_num != $ta_num and ta_id > $ta_id ";
$query .= "order by ta_id";
 
if (!($result = QueryDB($db, $query)))
return -1;
 
if (numrowsDB($result) <= 0)
return -1;
 
$data = fetchDB($result, 0);
return $data[0];
}
 
# Folgende Funktion liefert den vorhergehenden, oder den nachfolgenden Task,
# mit welchem getauscht werden kann. Es handelt sich also um einen Task
# des selben Levels.
#
function GetReplaceTask($db, $ta_num, $dir) {
$query = "select ta_id, ta_plnum, ta_level from task where ta_num = $ta_num";
 
if (!($result = QueryDB($db, $query)))
return -1;
 
$data = fetchDB($result, 0);
$ta_id = $data[0];
$ta_plnum = $data[1];
$ta_level = $data[2];
$query = "select ta_num from task where ta_plnum = $ta_plnum ";
$query .= "and ta_num != $ta_num and ta_level = $ta_level and ta_id ";
 
if ($dir > 0) // 0 = Rueckwaerts, 1 = Vorwaerts
$query .= "> ";
else
$query .= "< ";
 
$query .= "$ta_id order by ta_id";
 
if ($dir == 0)
$query .= " desc";
 
if (!($result = QueryDB($db, $query)))
return -1;
 
if (numrowsDB($result) <= 0)
return -1;
 
$data = fetchDB($result, 0);
return $data[0];
}
 
# Die Funktion tauscht die Reihen folge eines Tasks, so das ein Task nach
# oben oder unten verschoben werden kann.
#
function MoveTask($ta_num, $dir) {
$db = OpenDB();
$query = "select ta_id, ta_plnum, ta_level from task where ta_num = $ta_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return false;
}
 
$data = fetchDB($result, 0);
$ta_id = $data[0];
$ta_plnum = $data[1];
$ta_level = $data[2];
$query = "select ta_num, ta_id from task where ta_plnum = $ta_plnum and ";
$query .= "ta_level = $ta_level and ";
 
if ($dir < 0) {
$query .= "ta_num != $ta_num and ta_id < $ta_id ";
$query .= "order by ta_id desc";
} else {
$query .= "ta_num != $ta_num and ta_id > $ta_id ";
$query .= "order by ta_id";
}
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return false;
}
 
if (numrowsDB($result) <= 0) {
Error("Interner Fehler: In der gew&auml;hlten Richtung existiert kein geeigneter Task!");
closeDB($db);
return false;
}
 
$data = fetchDB($result, 0);
$ta_num1 = $data[0];
$ta_id1 = $data[1];
 
# Tauschen der Tasks
QueryDB($db, "begin");
$query = "update task set ta_id = -1 where ta_num = $ta_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
$query = "update task set ta_id = $ta_id where ta_num = $ta_num1";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
$query = "update task set ta_id = $ta_id1 where ta_num = $ta_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
QueryDB($db, "commit");
closeDB($db);
return true;
}
 
# Folgenden Funktionen erlauben die Erfassung von Plaenen, wobei die
# einzelnen Perioden dargestellt werden, welche mit individuellen Zeiten
# gefuellt werden koennen.
# Es wird immer der Zeitraum vom Start des Projekts bis zu seinem Ende
# dargestellt. Bei sehr langen Projekten oder sehr kleinen Perioden, kann
# die Tabelle durchaus sehr breit werden.
#
function PlanPeriode($pl_num, $ta_num, $ressource, $new=false, $lock=false) {
global $rstufe;
global $unum;
global $periode;
global $verteil;
global $einheit;
global $menu;
global $phase;
global $dtformatshort;
global $role;
global $pmlight;
global $stdwhg;
global $verrmodul;
global $ab_datum;
 
if ($pl_num <= 0) {
Error(GetMessage(-1, 327, "Interner Fehler: Es wurde keine Plannummer an \"PlanPeriode\" &uuml;bergeben!"));
return;
}
 
if ($rstufe != 1 && $rstufe != 2) {
Error(GetMessage(-1, 50, "Berechtigungsfehler!"));
return;
}
 
if (!isset($ta_num))
$ta_num = 0;
 
if (!isset($ressource))
$ressource = 0;
else if ($ressource > 0)
$tanum = $ta_num;
 
if ($lock && $new)
$new = false;
 
$db = OpenDB();
$query = "select pr_name, pl_prnum, mi_nname, mi_vname from ";
$query .= "plan, project, mitarbeiter where pl_num = $pl_num and ";
$query .= "pr_num = pl_prnum and mi_num = pr_pl";
$result = QueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return;
}
 
$data = fetchDB($result, 0);
$pr_name = $data[0];
$pl_prnum = $data[1];
$mi_nname = $data[2];
$mi_vname = $data[3];
 
# Ermitteln des letzten Abschlussdatums fuer das aktuelle Projekt
$query = "select ab_datum from abschluss where ";
$query .= "ab_prnum = $pl_prnum ";
$query .= "order by ab_datum desc";
 
if (!($resab = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
if (numrowsDB($resab) > 0) {
$data = fetchDB($resab, 0);
$ab_datum = $data[0];
} else
$ab_datum = 0;
 
# Zeichnen der fixen Kopfspalten.
if ($new) {
$id = $_REQUEST['ta_num'];
 
if (!isset($id))
$id = 0;
?>
<form name="plan" action="plan.php" method="post">
<input type="hidden" name="menu" value="<? echo "$menu"; ?>">
<input type="hidden" name="headline" value="20">
<input type="hidden" name="pl_num" value="<? echo "$pl_num"; ?>">
<?php
}
 
# Eingabezeile fuer den Plankommentar anzeigen.
$query = "select pl_comment from plan where pl_num = $pl_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$data = fetchDB($result, 0);
$pl_comment = $data[0];
 
if (!$lock && !$new) {
echo "<form name=\"plcomment\" aktion=\"plan.php\" method=\"post\">\n";
echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
echo "<input type=\"hidden\" name=\"headline\" value=\"20\">\n";
echo "<input type=\"hidden\" name=\"pl_num\" value=\"$pl_num\">\n";
echo "<input type=\"hidden\" name=\"func\" value=\"COMMENT\">\n";
}
 
echo "<table class=\"input\">\n";
echo "<tr><td>" . GetMessage($db, 1, "Projekt:") . "</td><td>$pl_prnum $pr_name</td></tr>\n";
echo "<tr><td>" . GetMessage($db, 328, "Projektleiter:") . "</td><td>$mi_nname $mi_vname</td></tr>\n";
echo "<tr><td>" . GetMessage($db, 19, "Kommentar:") . "</td>\n";
 
if (!$lock && !$new) {
if ($pmlight)
$class = " class=\"inputmust\"";
 
echo "<td><input type=\"text\"$class name=\"pl_comment\" ";
echo "value=\"" . htmlentities($pl_comment) . "\" onChange=\"javascript:document.plcomment.submit()\" ";
 
if ($pmlight)
echo "size=\"30\" maxlength=\"30\"></td>\n";
else
echo "size=\"80\" maxlength=\"255\"></td>\n";
} else {
echo "<td>$pl_comment</td>\n";
}
 
echo "</tr></table>\n";
 
if (!$lock && !$new)
echo "</form>\n";
$nav = "pl_num=$pl_num&menu=$menu&headline=20";
?>
<table class="sel">
<tr>
<th class="sel" rowspan=2>Akt</th>
<th class="sel" rowspan=2>Num.</th>
<th class="sel" colspan=3 rowspan=2>
<table border=0 width="100%"><tr><td align="center" colspan=2><? Output($db, 333, "Taskname"); ?></td></tr>
<tr><td>&nbsp;</td><td align="right"><? Output($db, 329, "Ressource"); ?></td></tr>
</table>
</th>
<th class="sel" rowspan=2 colspan=3>
<table border=0 width="100%"><tr><td align="center" colspan=3><? Output($db, 334, "Arbeit"); ?></td></tr>
<td align="center"><? Output($db, 330, "Dauer"); ?></td>
<td align="center"><? Output($db, 331, "Start"); ?></td>
<td align="center"><? Output($db, 332, "Ende"); ?></td></tr>
</table>
</th>
<?
# if ($role)
# echo " <th class=\"sel\" rowspan=2>" . GetMessage($db, 335, "Rolle") . "</th>\n";
 
# Ermitteln des Projektstarts um den Tabellenkopf fertig zu schreiben.
$query = "select ta_start, ta_duration, ta_meeting from task where ";
$query .= "ta_plnum = $pl_num order by ta_start";
$resta = QueryDB($db, $query);
 
if (!$resta) {
closeDB($db);
return;
}
 
$numrows = numrowsDB($resta);
$row = 0;
$fdate = 0;
$ldate = 0;
 
while ($row < $numrows) {
$data = fetchDB($resta, $row);
$ta_start = $data[0];
$ta_duration = $data[1];
$ta_meeting = $data[2];
 
if ($row == 0)
$fdate = $ta_start;
 
if ($ta_meeting)
$ed = $ta_start;
else
$ed = GetEDate($einheit, $ta_start, $ta_duration);
 
if ($ed > $ldate)
$ldate = $ed;
 
$row++;
}
 
# Erstellen des restlichen Tabellenkopfs ...
$tm = gmdate("j.n.Y", $fdate);
$dt = explode(".", $tm);
$smon = $dt[1];
$syear = $dt[2];
$dt = $fdate;
$cols = 0;
$tbcols = 1;
$oyear = $syear;
 
while (PerDateComp($dt, $ldate) > 0) {
$syear = gmdate("Y", $dt);
 
if ($oyear != $syear) {
if ($cols <= 1)
echo "<th class=\"sel\">$oyear</th>\n";
else
echo "<th class=\"sel\" colspan=$cols>$oyear</th>\n";
 
$oyear = $syear;
$cols = 0;
}
 
$cols++;
$tbcols++;
$dt = IncDate($periode, $dt);
}
 
$cols++;
 
if ($cols <= 1)
echo "<th class=\"sel\">$syear</th>\n";
else
echo "<th class=\"sel\" colspan=$cols>$syear</th>\n";
 
# Ueberschrift der letzten Spalte, welche die Summierungen der
# geplanten Aufwaende enthaelt.
echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 337, "Summe") . "<br>" . GetMessage($db, 336, "Aufwand") . "</th>\n";
 
if ($verrmodul) {
$query = "select wh_whg from key_whg where wh_num = $stdwhg";
 
if (!($reswhg = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$data = fetchDB($reswhg, 0);
$whg = $data[0];
echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 388, "Risiko<br>in&nbsp;%%") . "</th>\n";
echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 385, "Wert<br>ini&nbsp;%s", $whg) . "</th>\n";
echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 386, "Risiko&minus;<br>aufschlag") . "</th>\n";
echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 387, "Summen<br>ini&nbsp;%s", $whg) . "</th>\n";
}
 
echo "</tr>\n";
$dt = $fdate;
 
while (PerDateComp($dt, $ldate) >= 0) {
printf ("<th class=\"sel\">%s</th>\n", GetStrMonth($smon));
$smon++;
$dt = IncDate($periode, $dt);
 
if ($smon > 12) {
$syear++;
$smon = 1;
}
}
 
echo "</tr>\n";
 
# Neues Projektobjekt. Es enthaelt die Tasknummerierung und Typen-
# zuweisung der einzelnen Tasks.
$project = new TaskNum($pl_num, $db);
 
if (!$project->GetStatus()) {
Error(GetMessage($db, 338, "PlanPeriode: Interner Fehler beim Initialisieren des Objekts \"TaskNum\"!"));
closeDB($db);
return;
}
 
# Nun muessen wir die Tabelle mit Inhalten fuellen
$query = "select ta_num, ta_id, ta_name, ta_meeting, ta_start,";
$query .= "ta_duration, ta_level, ta_phase, ta_color, ta_plnum, ta_risiko ";
$query .= "from task where ta_plnum = $pl_num order by ta_id";
$result = QueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return;
}
 
$numrows = numrowsDB($result);
 
if ($numrows == 0) {
$ta_id = 0;
$ta_plnum = $pl_num;
}
 
$row = 0;
$snum = "1";
$ma = false;
$done = false;
$total = 0;
$brutto_sum = 0;
$netto_sum = 0;
$risiko_sum = 0;
 
while ($row < $numrows) {
if (!$ma) {
$data = fetchDB($result, $row);
$ta_num = $data[0];
$ta_id = $data[1];
$ta_name = $data[2];
$ta_meeting = $data[3];
$ta_start = $data[4];
$ta_duration = $data[5];
$ta_level = $data[6];
$ta_phase = $data[7];
$ta_color = $data[8];
$ta_plnum = $data[9];
$ta_risiko = $data[10];
 
# Der Task muss oben summiert sein, also in der Taskzeile
# selbst.
if ($ta_level == 1) {
$query = "select ta_num, ta_level, ta_risiko from task where ";
$query .= "ta_plnum = $ta_plnum and ta_id > $ta_id and ";
$query .= "ta_meeting = 0 order by ta_id";
 
if (!($resta = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$men = numrowsDB($resta);
$i = 0;
$al_hours = 0;
 
if ($verrmodul) {
$risc_sum = 0;
$netto = 0;
$brutto = 0;
}
 
while ($i < $men) {
$data = fetchDB($resta, $i);
$xnum = $data[0];
$xlevel = $data[1];
$risc = $data[2];
 
if ($xlevel <= $ta_level)
break;
 
# Ist das Verrechnungsmodul aktiv, benoetigen wir
# zusaetzlich den Tagsatz des jeweiligen Mitarbeiters,
# um die korrekten monetaeren Werte errechnen zu koennen.
if ($verrmodul) {
$query = "select al_hours, tg_amount from allocation ";
$query .= "left join tagsatz on tg_minum = al_ressource ";
$query .= "where al_task = $xnum and ";
$query .= "extract(epoch from tg_valid_from) <= al_pstart and ";
$query .= "(extract(epoch from tg_valid_to) >= al_pstart or tg_valid_to is NULL) ";
$query .= "order by tg_valid_from, tg_valid_to";
 
if (!($resver = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$jj = 0;
$xx = numrowsDB($resver);
 
while ($jj < $xx) {
$data = fetchDB($resver, $jj);
$al_hour = $data[0];
$tg_amount = $data[1];
 
$brutto += $tg_amount * $al_hour;
$rs = $al_hour / 100.0 * $risc;
$risc_sum += $rs * $tg_amount;
$netto += ($al_hour + $rs) * $tg_amount;
$al_hours += $al_hour;
$jj++;
}
} else {
$query = "select sum(al_hours) from allocation where ";
$query .= "al_task = $xnum";
 
if (!($resal = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$data = fetchDB($resal, 0);
$al_hours += $data[0];
}
 
$i++;
}
} else {
if ($verrmodul) {
$query = "select al_hours, tg_amount from allocation ";
$query .= "left join tagsatz on tg_minum = al_ressource ";
$query .= "where al_task = $ta_num and ";
$query .= "extract(epoch from tg_valid_from) <= al_pstart and ";
$query .= "(extract(epoch from tg_valid_to) >= al_pstart or tg_valid_to is NULL) ";
$query .= "order by tg_valid_from, tg_valid_to";
 
if (!($resver = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$al_hours = 0;
$risc_sum = 0;
$netto = 0;
$brutto = 0;
$jj = 0;
$xx = numrowsDB($resver);
 
while ($jj < $xx) {
$data = fetchDB($resver, $jj);
$al_hour = $data[0];
$tg_amount = $data[1];
 
$al_hours += $al_hour;
$brutto += $al_hour * $tg_amount;
$rs = $al_hour / 100.0 * $ta_risiko;
$risc_sum += $rs * $tg_amount;
$netto += ($al_hour + $rs) * $tg_amount;
$jj++;
}
 
$brutto_sum += $brutto;
$risiko_sum += $risc_sum;
$netto_sum += $netto;
} else {
$query = "select sum(al_hours) from allocation where ";
$query .= "al_task = $ta_num";
 
if (!($resal = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$data = fetchDB($resal, 0);
$al_hours = $data[0];
}
}
}
 
# Starrer Zeilenbegin ...
echo "<tr>\n";
if (!$ma) {
// $snum = GetTaskNum($pl_num, $ta_id, $ta_level, $ta_phase, $ta_meeting, $snum, &$typ, $db);
$snum = $project->Get_snum($row);
$art = $project->Get_type($row);
 
if ($art == "t")
$typ = true;
else
$typ = false;
}
 
# Diverse Aktionen / Buttons
echo "<td class=\"selakt\">";
$cal_linkf = "";
$cal_linkb = "";
 
if ($new && $ma) {
echo "<a name=\"edit\"></a>\n"; # Einsprungspunkt
echo "<input type=\"hidden\" name=\"ta_num\" value=\"$ta_num\">\n";
echo "<input type=\"hidden\" name=\"ta_phase\" value=\"$ta_phase\">\n";
echo "<input type=\"hidden\" name=\"func\" value=\"SaveMa\">\n";
ButtonImage("filesave.png", "plan", "Zeile speichern");
} else if (!$ta_meeting && !$lock && $ta_level > 1 && $typ) {
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','edittask=$ta_num&$nav')\">";
echo "<img src=\"image/edit.png\" border=0 alt=\"Task editieren\"></a>";
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','taskadd=$ta_id&ta_num=$ta_num&ta_plnum=$ta_plnum&$nav')\">";
echo "<img src=\"image/new.png\" border=0 alt=\"Einfuegen\"></a>\n";
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','deletetask=$ta_num&ta_plnum=$ta_plnum&$nav')\">";
echo "<img src=\"image/editdelete.png\" border=0 alt=\"Task loeschen\"></a>";
$lev = GetPreviousLevel($db, $ta_num);
 
if ($lev != -1 && $lev >= $ta_level) {
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','moveup=$ta_num&$nav')\">";
echo "<img src=\"image/up.png\" border=0 width=\"16\" height=\"16\" alt=\"Hinauf\">";
}
 
$lev = GetNextLevel($db, $ta_num);
 
if ($lev != -1 && $lev >= $ta_level) {
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','movedown=$ta_num&$nav')\">";
echo "<img src=\"image/down.png\" border=0 width=\"16\" height=\"16\" alt=\"Hinunter\">";
}
 
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','func=AllocMa&ta_num=$ta_num&$nav#edit')\">";
echo "<img src=\"image/kverbosuser.png\" border=0 width=15 height=15 alt=\"Neuer Mitarbeiter\"></a>";
// $cal_linkf = "<a href=\"#\" onClick=\"javascript:open_window('calentry.php?header=1&ca_prnum=$pl_prnum&ca_task=$ta_num&func=plan', 'Kalender', 800, 600)\">";
// $cal_linkb = "</a>";
} else if (!$lock) {
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','edittask=$ta_num&$nav')\">";
echo "<img src=\"image/edit.png\" border=0 alt=\"Task editieren\"></a>";
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','taskadd=$ta_id&ta_num=$ta_num&ta_plnum=$ta_plnum&$nav')\">";
echo "<img src=\"image/new.png\" border=0 alt=\"Einfuegen\"></a>\n";
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','deletetask=$ta_num&ta_plnum=$ta_plnum&$nav')\">";
echo "<img src=\"image/editdelete.png\" border=0 alt=\"Task loeschen\"></a>";
 
// if ($ta_meeting) {
$lev = GetPreviousLevel($db, $ta_num);
 
if ($lev != -1 && $lev >= $ta_level) {
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','moveup=$ta_num&$nav')\">";
echo "<img src=\"image/up.png\" border=0 width=\"16\" height=\"16\" alt=\"Hinauf\">";
}
 
$lev = GetNextLevel($db, $ta_num);
 
if ($lev != -1 && $lev >= $ta_level) {
echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','movedown=$ta_num&$nav')\">";
echo "<img src=\"image/down.png\" border=0 width=\"16\" height=\"16\" alt=\"Hinunter\">";
}
// }
} else
echo "&nbsp;";
 
echo "</td>\n";
# Nummerierung
if (!$ma) {
if ($ta_meeting)
echo "<td class=\"sel\"><b>$snum</b></td>\n";
else
echo "<td class=\"sel\">$snum</td>\n";
} else {
echo "<td class=\"sel\">&nbsp;</td>\n";
}
 
# Tasknamendarstellung abhaenging vom Level
if (!$ma) {
if ($ta_level == 1 || !$typ) {
if ($ta_meeting)
echo "<td class=\"seldkgray\" colspan=3>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
else if ($ta_level == 1)
echo "<td class=\"selltgray\" colspan=3>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
else
echo "<td class=\"selgray\" colspan=3>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
} else {
if ($ta_meeting)
echo "<td class=\"sel\" width=\"10%\"> </td><td class=\"seldkgray\" colspan=2>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
else
echo "<td class=\"sel\" width=\"10%\"> </td><td class=\"selgray\" colspan=2>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
}
} else if ($ma && $new) {
echo "<td colspan=2 class=\"sel\" width=\"20%\"> </td>\n";
echo "<td class=\"sel\"><select name=\"name\">\n";
# $query = "select mi_num, mi_vname, mi_nname from mitarbeiter ";
# $query .= "where mi_plan = true order by mi_nname, mi_vname";
$query = "select ma_minum, mi_vname, mi_nname, kr_role from matopr ";
$query .= "left join mitarbeiter on mi_num = ma_minum ";
$query .= "left join key_role on kr_num = ma_role ";
$query .= "where ma_prnum = $pl_prnum ";
$query .= "order by mi_nname, mi_vname";
$resmi = QueryDB($db, $query);
 
if (!$resmi) {
return;
}
 
$nr = numrowsDB($resmi);
$r = 0;
 
while ($r < $nr) {
$data = fetchDB($resmi, $r);
$mi_num = $data[0];
$mi_vname = $data[1];
$mi_nname = $data[2];
$kr_role = $data[3];
echo "<option value=\"$mi_num\">$mi_nname $mi_vname, $kr_role</option>\n";
$r++;
}
 
echo "</select></td>\n";
}
 
if (!$ta_meeting) {
if ($typ) {
$sein = GetStrEinheit($einheit);
echo "<td class=\"selgray\" align=\"right\">$ta_duration $sein</td>\n";
$dt = gmdate($dtformatshort, $ta_start);
$ed = GetEDate($einheit, $ta_start, $ta_duration);
$dte = gmdate($dtformatshort, $ed);
echo "<td class=\"selgray\" align=\"center\">$dt</td>\n";
echo "<td class=\"selgray\" align=\"center\">$dte</td>\n";
} else {
if ($ta_level == 1)
echo "<td colspan=3 class=\"selltgray\">&nbsp;</td>\n";
else
echo "<td colspan=3 class=\"selgray\">&nbsp;</td>\n";
}
} else {
echo "<td class=\"seldkgray\" align=\"center\">M</td>\n";
$dt = gmdate($dtformatshort, $ta_start);
echo "<td class=\"seldkgray\" align=\"center\" colspan=2>$dt</td>\n";
}
 
# Anzeigen der Mitarbeiterrolle
 
# if ($role) {
# if ($ma && $new) {
# echo "<td class=\"sel\">";
# $query = "select kr_num, kr_role from key_role order by kr_num";
# $result2 = QueryDB($db, $query);
 
# if (!$result2)
# return;
 
# $nr = numrowsDB($result2);
# $r = 0;
# echo "<select name=\"role\">\n";
 
# while ($r < $nr) {
# $data = fetchDB($result2, $r);
# $kr_num = $data[0];
# $kr_role = $data[1];
# echo "<option value=\"$kr_num\">$kr_role</option>\n";
# $r++;
# }
 
# echo "</select></td>\n";
# } else {
# if ($ta_level == 1)
# echo "<td class=\"selltgray\">&nbsp;</td>\n";
# else
# echo "<td class=\"selgray\">&nbsp;</td>\n";
# }
# }
 
# Dynamischer Aufbau der restlichen Tabelle.
# Ab dem Startdatum werden Eingabezeilen ausgegeben, in die der
# Anwender Arbeitseinheiten eintragen kann.
$color = dechex($ta_color);
$len = strlen($color);
 
while ($len < 6) {
$color = "0" . $color;
$len++;
}
 
$dt = $fdate;
 
while (PerDateComp($dt, $ta_start) > 0) {
$dt = IncDate($periode, $dt);
 
if (!$typ && ! $ta_meeting && $ta_level == 1)
echo "<td class=\"sel\">&nbsp;</td>";
else
echo "<td class=\"sel\">&nbsp;</td>";
}
 
if ($ta_meeting)
$edate = $ta_start;
else
$edate = GetEDate($einheit, $ta_start, $ta_duration);
 
do {
if ($new && $ma) {
$tm = gmdate("j.n.Y", $dt);
$ad = explode(".", $tm);
$nm = "dt_" . (string)$ta_id . "_" . (string)$ad[1];
$nm .= "_" . (string)$ad[2];
 
if ($dt > $ab_datum || $rstufe == 1)
echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6></td>\n";
else
echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
} else {
if ($typ)
echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
else if ($ta_meeting)
echo "<td style=\"color: #$color;background-color: #969696;border: 1px solid black;\"><center>###</center></td>\n";
else if ($ta_level == 1)
echo "<td style=\"color: #$color;background-color: #dddddd; border: 1px solid black;\"><center>===</center></td>\n";
else
echo "<td style=\"color: #$color;background-color: #dddddd; border: 1px solid black;\"><center>===</center></td>\n";
}
 
$dt = IncDate($periode, $dt);
}
while (PerDateComp($dt, $edate) >= 0);
 
while (PerDateComp($dt, $ldate) >= 0) {
$dt = IncDate($periode, $dt);
 
// if ($ta_level == 1)
// echo "<td class=\"sel\">&nbsp;</td>";
// else
echo "<td class=\"sel\">&nbsp;</td>";
}
 
# Ausfuellen der Summenspalte
if (($typ && !$ma) || $ta_level == 1) {
printf ("<td class=\"selltgray\" align=\"right\"><b><u>%s</u></b></td>\n", FormatNum($al_hours, 3));
$sum = 0;
 
if ($verrmodul) {
if ($ta_risiko > 0)
printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($ta_risiko, 3));
else
echo "<td class=\"sel\">&nbsp;</td>\n";
 
printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($brutto, 2));
printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($risc_sum, 2));
printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($netto, 2));
}
} else {
echo "<td class=\"sel\">&nbsp;</td>\n";
 
if ($verrmodul) {
echo "<td class=\"sel\">&nbsp;</td>";
echo "<td class=\"sel\">&nbsp;</td>";
echo "<td class=\"sel\">&nbsp;</td>";
echo "<td class=\"sel\">&nbsp;</td>";
}
}
 
if ($typ && !$ma) {
if ($ta_num == $tanum)
$sum = PrintMa($db, $fdate, $ldate, $ta_num, $color, $pl_num, $ressource, $lock);
else
$sum = PrintMa($db, $fdate, $ldate, $ta_num, $color, $pl_num, 0, $lock);
 
$total += $sum;
}
 
echo "</tr>\n";
 
if ($ma) {
$ma = false;
$done = true;
}
 
if ($new && !$done && $ta_num == $id)
$ma = true;
 
if (!$ma)
$row++;
}
 
# Anfuegen der Summierungen
 
if ($total > 0) {
# if ($role)
# $span = 9 + $tbcols;
# else
$span = 8 + $tbcols;
 
// if ($sum > 0) {
/* if (($typ && !$ma) || $ta_level == 1) {
echo "<tr><td class=\"sel\"colspan=$span>&nbsp;</td>";
printf("<td class=\"selltgray\" align=\"right\"><b><u>%s</u></b></td>\n", FormatNum($al_hours, 3));
 
if ($verrmodul) {
if ($ta_risiko > 0)
printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($ta_risiko, 3));
else
echo "<td class=\"sel\">&nbsp;</td>\n";
 
printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($brutto, 2));
printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($risc_sum, 2));
printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($netto, 2));
}
 
echo "</tr>\n";
}
*/
echo "<tr><td class=\"selnum\" colspan=$span>Gesamtsumme:</td>";
printf("<td class=\"selgray\" align=\"right\"><b><u>%s</u></b></td>\n", FormatNum($total, 3));
 
if ($verrmodul) {
echo "<td class=\"sel\">&nbsp;</td>\n";
printf ("<td class=\"selgray\" align=\"right\"><b>%s</b></td>\n", FormatNum($brutto_sum, 2));
printf ("<td class=\"selgray\" align=\"right\"><b>%s</b></td>\n", FormatNum($risiko_sum, 2));
printf ("<td class=\"selgray\" align=\"right\"><b>%s</b></td>\n", FormatNum($netto_sum, 2));
}
 
echo "</tr>\n";
}
 
echo "</table>\n";
 
if ($new)
echo "</form>\n";
 
$ta_id++;
 
if (!$lock) {
echo "<table class=\"indent\"><tr><td>";
ButtonLink("Task Anh&auml;ngen", "plan.php", "taskadd=$ta_id&ta_num=$ta_num&ta_plnum=$ta_plnum&$nav");
echo "</td></tr></table>";
}
 
closeDB($db);
}
 
function AskPlanOverload($db, $res_hours, $plan, $pts, $mon, $year) {
global $periode;
global $phase;
global $role;
global $dtformatshort;
global $menu;
global $headline;
 
$pl_num = $_REQUEST['pl_num'];
$ta_num = $_REQUEST['ta_num'];
$name = $_REQUEST['name'];
# $rolem = $_REQUEST['role'];
 
if ($phase)
$ta_phase = $_REQUEST['ta_phase'];
 
$query = "select mi_nname, mi_vname from mitarbeiter where ";
$query .= "mi_num = $name";
 
if (!($result = QueryDB($db, $query)))
return;
$data = fetchDB($result, 0);
$mi_nname = $data[0];
$mi_vname = $data[1];
 
echo "<form name=\"Overload\" action=\"plan.php\" method=\"post\">\n";
echo "<input type=\"hidden\" name=\"func\" value=\"SaveMa\">\n";
echo "<input type=\"hidden\" name=\"pl_num\" value=\"$pl_num\">\n";
echo "<input type=\"hidden\" name=\"ta_num\" value=\"$ta_num\">\n";
echo "<input type=\"hidden\" name=\"name\" value=\"$name\">\n";
# echo "<input type=\"hidden\" name=\"role\" value=\"$rolem\">\n";
echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
echo "<input type=\"hidden\" name=\"headline\" value=\"$headline\">\n";
echo "<input type=\"hidden\" name=\"yes\" value=\"yes\">\n";
 
if ($phase)
echo "<input type=\"hidden\" name=\"ta_phase\" value=\"$ta_phase\">\n";
 
foreach ($_REQUEST as $key => $pstart) {
$fr = substr($key, 0, 3);
 
if ($fr == "dt_")
echo "<input type=\"hidden\" name=\"$key\" value=\"$pstart\">\n";
}
 
$sum = $plan + $res_hours;
?>
<table border=2 class="alarm">
<tr><td colspan=2><big>Warnung!</big><br><br>
Die Ressource <font color="white"><? echo "$mi_nname $mi_vname"; ?></font> soll mit weiteren
<font color="white"><? echo FormatNum($plan, 3); ?></font> PT's in der Periode
<font color="white"><? echo "$mon/$year"; ?></font> gebucht werden. Dadurch
w&uuml;rde die Ressource auf insgesamt <font color="white"><? echo FormatNum($sum, 3); ?></font>
PT's verplant werden. In dieser Periode stehen jedoch nur
<font color="white"><? echo "$pts"; ?></font> PT's zur Verf&uuml;gung!<br>
<br>
Wollen Sie dennoch die eingegebenen Planwerte f&uuml;r diese
Ressource speichern?
</td>
</tr>
<tr>
<td><center>
<?
Button("Planwerte speichern", "Overload");
?>
</center>
</td>
<td><center>
<?
ButtonLink("Abbrechen", "plan.php", "editplan=$pl_num&menu=$menu&headline=$headline");
?>
</center></td>
</tr>
</table>
</form>
<?
}
 
function SaveMa($save=true) {
global $periode;
global $phase;
global $role;
 
$pl_num = $_REQUEST['pl_num'];
$ta_num = $_REQUEST['ta_num'];
$name = $_REQUEST['name'];
 
# if ($role)
# $rolem = $_REQUEST['role'];
 
if ($phase)
$ta_phase = $_REQUEST['ta_phase'];
else
$ta_phase = 0;
 
$err = 0;
 
if (!isset($pl_num) || $pl_num <= 0) {
Error("Interner Fehler: Plannumer fehlt oder ist ung&uuml;ltig!");
$err = 1;
}
 
if (!isset($ta_num) || $ta_num <= 0) {
Error("Interner Fehler: Tasknummer fehlt oder ist ung&uuml;ltig!");
$err = 1;
}
 
if (!isset($name) || $name <= 0) {
Error("Interner Fehler: Mitarbeiternummer fehlt oder ist ung&uuml;ltig!");
$err = 1;
}
 
# if ($role && (!isset($rolem) || $rolem <= 0)) {
# Error("Interner Fehler: Rollenbezeichnung fehlt!");
# $err = 1;
# }
 
if ($err)
return false;
 
// if (!$role)
// $rolem = 1;
 
$db = OpenDB();
 
# Da sich die Mitarbeiterrollenzuweisung geaendert hat (03.04.2007)
# muessen wir die Rolle aus dem zugewiesenen Mitarbeiter extrahieren.
# Dazu benoetigen wir zunaechst die Projektnummer.
if ($role) {
$query = "select pl_prnum from plan where pl_num = $pl_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
if (numrowsDB($result) > 0) {
$data = fetchDB($result, 0);
$pr_num = $data[0];
} else {
closeDB($db);
Error("Interner Fehler: Projektnummer wurde nicht gefunden!");
return false;
}
 
$query = "select ma_role from matopr where ";
$query .= "ma_minum = $name and ma_prnum = $pr_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return false;
}
 
if (numrowsDB($result) > 0) {
$data = fetchDB($result, 0);
$rolem = $data[0];
} else {
closeDB($db);
Error("Interner Fehler: Mitarbeiterrolle wurde nicht gefunden!");
return false;
}
}
 
# Zunaechst muessen wir sicher stellen, das dem Task nicht bereits
# diese Ressource hinzugefuegt wurde.
$query = "select al_num from allocation where al_ressource = $name ";
$query .= "and al_task = $ta_num";
$result = QueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return false;
}
 
$anz = numrowsDB($result);
$query = "select co_allocation from counter";
$result = QueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return false;
}
 
$data = fetchDB($result, 0);
$co_allocation = $data[0];
QueryDB($db, "begin");
 
# Falls die Ressource bereits zugeordnet war, wird sie hier geloescht.
$query = "delete from allocation where al_ressource = $name ";
$query .= "and al_task = $ta_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
foreach ($_REQUEST as $key => $pstart) {
$fr = substr($key, 0, 3);
 
if ($fr == "dt_") {
$p = strpos($key, "_", 3);
$ta_id = substr($key, 3, $p-3);
$q = strpos($key, "_", $p+1);
$mon = substr($key, $p+1, $q-($p+1));
$year = substr($key, $q+1);
$pstart = str_replace(",", ".", $pstart);
 
if (!isset($pstart) || $pstart <= 0.0)
continue;
 
$al_pstart = gmmktime(0, 0, 0, $mon, 1, $year);
 
# Pruefen, ob die Ressource in der aktuellen Periode ueberbucht
# ist. Falls ja, erscheint ein rotes Warnfenster, welches den
# Anwender darauf hinweist.
$res_hours = GetRessource($db, $name, $al_pstart);
$pts = GetPT($al_pstart);
 
if (!$save && ($res_hours + $pstart) > $pts) {
AskPlanOverload($db, $res_hours, $pstart, $pts, $mon, $year);
QueryDB($db, "rollback");
closeDB($db);
include('footer.inc');
exit;
}
 
switch ($periode) {
case 1: $al_pduration = 364; break;
case 2: $al_pduration = 91; break;
case 3: $al_pduration = daysinmonth($mon, $year); break;
case 4: $al_pduration = 1; break;
default: $al_pduration = daysinmonth($mon, $year); break;
}
 
$co_allocation++;
$query = "insert into allocation (al_num, al_task, al_ressource,";
$query .= "al_hours, al_phase, al_pstart, al_pduration";
 
if ($role)
$query .= ",al_role";
 
$query .= ") values ($co_allocation, $ta_num, $name, $pstart, ";
$query .= "$ta_phase, $al_pstart, $al_pduration";
 
if ($role)
$query .= ", $rolem";
 
$query .= ")";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
}
}
 
$query = "update counter set co_allocation = $co_allocation";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
QueryDB($db, "commit");
Journal(300, "plan.php: SaveMa: task=$ta_num; ressource=$name", $db);
closeDB($db);
return true;
}
 
function SaveUpMa() {
global $periode;
global $phase;
global $role;
 
$pl_num = $_REQUEST['pl_num'];
$ta_num = $_REQUEST['ta_num'];
$ressource = $_REQUEST['ressource'];
 
if ($phase)
$al_phase = $_REQUEST['al_phase'];
else
$al_phase = 0;
 
if ($role)
$al_role = $_REQUEST['al_role'];
// else
// $al_role = 1;
 
$err = 0;
 
if (!isset($pl_num) || $pl_num <= 0) {
Error("Interner Fehler: Plannumer fehlt oder ist ung&uuml;ltig!");
$err = 1;
}
 
if (!isset($ta_num) || $ta_num <= 0) {
Error("Interner Fehler: Tasknummer fehlt oder ist ung&uuml;ltig!");
$err = 1;
}
 
if ($err)
return false;
 
$db = OpenDB();
$query = "select co_allocation from counter";
$result = QueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return false;
}
 
$data = fetchDB($result, 0);
$co_allocation = $data[0];
$count = $co_allocation;
 
QueryDB($db, "begin");
 
foreach ($_REQUEST as $key => $pstart) {
$fr = substr($key, 0, 3);
 
if ($fr == "dt_") {
$p = strpos($key, "_", 3);
$al_num = substr($key, 3, $p-3);
$q = strpos($key, "_", $p+1);
$mon = substr($key, $p+1, $q-($p+1));
$year = substr($key, $q+1);
$pstart = str_replace(",", ".", $pstart);
 
if ((!isset($pstart) || $pstart <= 0) && $al_num > 0) {
$query = "delete from allocation where al_num = $al_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
 
continue;
}
 
if ($al_num == 0 && $pstart > 0) {
$al_pstart = gmmktime(0, 0, 0, $mon, 1, $year);
 
switch ($periode) {
case 1: $al_pduration = 364; break;
case 2: $al_pduration = 91; break;
case 3: $al_pduration = 30; break;
case 4: $al_pduration = 1; break;
default: $al_pduration = 30; break;
}
 
$co_allocation++;
$query = "insert into allocation (al_num, al_task,";
$query .= "al_ressource, al_hours, al_phase, al_pstart,";
 
if ($role)
$query .= "al_pduration, al_role) values ($co_allocation,";
else
$query .= "al_pduration) values ($co_allocation,";
$query .= "$ta_num, $ressource, $pstart, $al_phase,";
 
if ($role)
$query .= "$al_pstart, $al_pduration, $al_role)";
else
$query .= "$al_pstart, $al_pduration)";
} else if ($al_num > 0 && $pstart > 0) {
$query = "update allocation set al_hours = $pstart where ";
$query .= "al_num = $al_num";
} else
continue;
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
}
}
 
if ($count < $co_allocation) {
$query = "update counter set co_allocation = $co_allocation";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return false;
}
}
 
QueryDB($db, "commit");
Journal(300, "plan.php: SaveUpMa: task=$ta_num; ressource=$ressource", $db);
closeDB($db);
return true;
}
 
# Folgende Funktion fragt den Anwender, ob er die IST-Werte auch tatsaechlich
# uebernehmen will.
function AskIstPlan($pl_num) {
global $phase;
global $dtformatshort;
global $pjcopy;
 
$headline = $_REQUEST['headline'];
$menu = $_REQUEST['menu'];
$pl_prnum = $_REQUEST['pl_prnum'];
$pl_status = $_REQUEST['pl_status'];
$nav = "editcopy=$pl_num&menu=$menu&pl_prnum=$pl_prnum&";
$nav .= "pl_status=$pl_status&func=CopyPlan&headline=21&";
$nav .= "istdate='+document.AskIstPlan.istdate.value+'";
$datum = time();
$mon = gmdate("n", $datum);
$year = gmdate("Y", $datum);
$day = gmdate("j", $datum);
 
if ($pjcopy != 3) {
$mon--;
 
if ($mon < 1) {
$mon = 12;
$year--;
}
 
if ($day < (daysinmonth($mon, $year) / 2)) {
$mon--;
 
if ($mon < 1) {
$mon = 12;
$year--;
}
}
 
$datum = gmmktime(0, 0, 0, $mon, 1, $year);
} else {
$datum = 0;
$db = OpenDB();
$query = "select ab_datum from abschluss where ";
$query .= "ab_prnum = $pl_prnum order by ab_datum desc";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
if (numrowsDB($result) > 0) {
$data = fetchDB($result, 0);
$ab_datum = $data[0];
$lab = gmdate($dtformatshort, $ab_datum);
} else
$lab = GetMessage($db, 404, "(Projekt wurde bisher noch nicht abgeschlossen)");
}
?>
<br>
<form name="AskIstPlan" action="plan.php" method="post">
<table class="input">
<tr><th class="sel" colspan=3><? Output(-1, 393, "Plan kopieren"); ?></th></tr>
<?
if ($pjcopy == 1) {
?>
<tr><td colspan=3><br><? Output(-1, 394, "Bis zu welcher Periode sollen die IST-Werte als
Planwerte &uuml;bernommen werden?"); ?>
<br><br>
</td>
</tr>
<tr>
<td><? Output(-1, 395, "IST-Werte &uuml;bernehmen bis (%s):", GetVisualDate($dtformatshort, true)); ?></td>
<td colspan=2><input type="text" name="istdate" value="<? echo GetShortDate($datum) ?>" maxlength=7 size=7></td>
</tr>
<?
} else if ($pjcopy == 2) {
?>
<tr>
<td colspan=3><? Output(-1, 397, "Beim Kopieren des Plans werden die IST-Werte bis zum %s &uuml;bernommen!", GetShortDate($datum)); ?>
<input type="hidden" name="istdate" value="<? echo GetShortDate($datum); ?>">
</td>
</tr>
<?
} else {
?>
<tr>
<td colspan=3><? Output(-1, 402, "Die IST-Werte des Projekts %s werden bis zum %s (letzter Teilprojektabschluss) &uuml;bernommen!", $pl_prnum, $lab); ?>
<input type="hidden" name="istdate" value="0">
</td>
</tr>
<?
}
?>
<tr>
<td><center><input type="button" name="yes" value="<? Output(-1, 393, "Plan kopieren"); ?>" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
<td><? if ($pjcopy == 1) { ?><center><input type="button" name="no" value="<? Output(-1, 396, "Planwerte unver&auml;ndert &uuml;bernehmen"); ?>" onClick="javascript:MoveTo('plan.php','no=no&<? echo "$nav"; ?>')"></center> <? } ?></td>
<td><center><input type="button" name="cancel" value="<? Output(-1, 49, "Abbrechen"); ?>" onClick="javascript:MoveTo('plan.php','cancel=cancel&<? echo "$nav"; ?>')"></center></td>
</tr>
</table>
</form>
<?php
}
 
# Folgende Funktion kopiert einen bestehenden Plan und erzeugt eine Instanz
# davon. Anschliessend kann diese Instanz bearbeitet werden.
#
function editcopy($pl_num, $plis=false, $doit=false) {
global $leneinheit;
global $periode;
global $role;
global $pmlight;
global $pjcopy;
 
$pl_prnum = $_REQUEST['pl_prnum'];
$pl_status = $_REQUEST['pl_status'];
 
if (!isset($pl_prnum) || $pl_prnum <= 0) {
Error(GetMessage(-1, 389, "Interner Fehler: Projektnummer fehlt!"));
return false;
}
 
if (!isset($pl_status) || $pl_status <= 0) {
Error(GetMessage(-1, 390, "Interner Fehler: Projektstatus wurde nicht &uuml;bergeben!"));
return false;
}
 
if (!$doit) {
AskIstPlan($pl_num);
require('footer.inc');
exit(0);
}
 
if ($plis || $pjcopy == 2)
$istdate = $_REQUEST['istdate'];
else
$istdate = 0;
 
if (!isset($istdate)) {
Error(GetMessage(-1, 391, "Es wurde kein Datum angegeben, bis zu welchem die IST-Werte &uuml;bernommen werden sollen!"));
return false;
} else if ($plis || $pjcopy == 2) {
$edt = explode(GetDateSep(), $istdate);
$istdate = gmmktime(0, 0, 0, $edt[0], daysinmonth($edt[0], $edt[1]), $edt[1]);
}
 
$db = OpenDB();
$query = "select pl_lfd, pl_prnum, pl_status, pl_comment from plan where ";
$query .= "pl_num = $pl_num";
$result = QueryDB($db, $query);
 
if (!$result) {
closeDB($db);
return false;
}
 
$data = fetchDB($result, 0);
$pl_lfd = $data[0];
$pl_prnum = $data[1];
$pl_status = $data[2];
$pl_comment = $data[3];
closeDB($db);
unset($db);
 
$new_pl_num = SaveNewPlan();
 
if (!$new_pl_num)
return false;
 
$db = OpenDB();
# Den Kommentar zum neuen Plan hinzufuegen (nur wenn keine strikte
# Periodensicht ($pmlight == false) gewaehlt wurde)
if (!$pmlight) {
$query = "update plan set pl_comment = '$pl_comment' where ";
$query .= "pl_num = $new_pl_num";
 
if (!QueryDB($db, $query)) {
closeDB($db);
return false;
}
}
 
$query = "select co_task, co_allocation from counter";
$result = QueryDB($db, $query);
 
if (!$result) {
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
$data = fetchDB($result, 0);
$co_task = $data[0] + 1;
$co_allocation = $data[1] + 1;
 
# Wenn die IST-Werte des PJ bis zum Datum des letzten
# Teilprojektabschluss uebernommen werden sollen,
# benoetigen wir das Datum des letzten TPA.
if ($pjcopy == 3) {
$query = "select ab_datum from abschluss where ";
$query .= "ab_prnum = $pl_prnum order by ab_datum desc";
 
if (!($resab = QueryDB($db, $query))) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
if (numrowsDB($resab) > 0) {
$data = fetchDB($resab, 0);
$ab_datum = $data[0];
} else
$ab_datum = 0;
 
if ($ab_datum == 0)
$plis = 0;
else
$istdate = $ab_datum;
}
 
# Auslesen der Tasks. In der folgenden Schleife werden die Tasks
# kopiert und neu eingefuegt.
$query = "select ta_num, ta_id, ta_depend, ta_deptype, ta_name, ta_color,";
$query .= "ta_shape, ta_meeting, ta_start, ta_duration, ta_complete,";
$query .= "ta_fixed_start, ta_priority, ta_level, ta_phase, ta_notiz, ta_risiko, ta_hash ";
$query .= "from task where ta_plnum = $pl_num order by ta_id";
$result = QueryDB($db, $query);
 
if (!$result) {
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
$numrows = numrowsDB($result);
$rows = 0;
QueryDB($db, "begin");
 
while ($rows < $numrows) {
$data = fetchDB($result, $rows);
$ori_ta_num = $data[0];
$ta_id = $data[1];
$ta_depend = $data[2];
$ta_deptype = $data[3];
$ta_name = addslashes($data[4]);
$ta_color = $data[5];
$ta_shape = $data[6];
$ta_meeting = $data[7];
$ta_start = $data[8];
$ta_duration = $data[9];
$ta_complete = $data[10];
$ta_fixed_start = $data[11];
$ta_priority = $data[12];
$ta_level = $data[13];
$ta_phase = $data[14];
$ta_notiz = $data[15];
$ta_risiko = $data[16];
$ta_hash = $data[17];
$ta_num = $co_task;
$ta_plnum = $new_pl_num;
 
if (!isset($ta_fixed_start))
$ta_fixed_start = 0;
 
if (!isset($ta_risiko))
$ta_risiko = 0;
 
if (!isset($ta_depend) || strlen($ta_depend) == 0)
$ta_depend = "NULL";
 
# Ende des Task als Datum
$ta_end = $ta_start + ($ta_duration * 86400);
# Kopie des Task speichern
$query = "insert into task (ta_num, ta_plnum, ta_id, ta_depend,";
$query .= "ta_deptype, ta_name, ta_color, ta_shape, ta_meeting,";
$query .= "ta_start, ta_duration, ta_complete, ta_fixed_start,";
$query .= "ta_priority, ta_level, ta_phase, ta_notiz, ta_risiko, ta_hash) values ";
$query .= "($ta_num, $ta_plnum, $ta_id, $ta_depend, $ta_deptype,";
$query .= "'$ta_name', $ta_color, '$ta_shape', $ta_meeting,";
$query .= "$ta_start, $ta_duration, $ta_complete, $ta_fixed_start,";
$query .= "$ta_priority, $ta_level, $ta_phase, '$ta_notiz', $ta_risiko, '$ta_hash')";
$result2 = QueryDB($db, $query);
 
if (!$result2) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
if (!$plis && $pjcopy != 2) {
# Auslesen der Planwerte zum Task.
$query = "select al_ressource, al_hours, al_phase, al_pstart,";
 
if ($role)
$query .= "al_pduration, al_role from allocation where ";
else
$query .= "al_pduration from allocation where ";
 
$query .= "al_task = $ori_ta_num order by al_num";
$result3 = QueryDB($db, $query);
 
if (!$result3) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
$nr = numrowsDB($result3);
$r = 0;
 
while ($r < $nr) {
$data = fetchDB($result3, $r);
$al_ressource = $data[0];
$al_hours = $data[1];
$al_phase = $data[2];
$al_pstart = $data[3];
$al_pduration = $data[4];
 
if ($role)
$al_role = $data[5];
 
$al_num = $co_allocation;
$al_task = $ta_num;
 
if (!isset($al_phase))
$al_phase = $ta_phase;
 
if (!isset($al_pduration))
$al_pduration = 1;
 
if (!$role)
$al_role = 1;
 
$query = "insert into allocation (al_num, al_task,";
$query .= "al_ressource, al_hours, al_phase, al_pstart,";
 
if ($role)
$query .= "al_pduration, al_role) values ($al_num, $al_task,";
else
$query .= "al_pduration) values ($al_num, $al_task,";
 
$query .= "$al_ressource, $al_hours, $al_phase, $al_pstart,";
 
if ($role)
$query .= "$al_pduration, $al_role)";
else
$query .= "$al_pduration)";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
$co_allocation++;
$r++;
}
} else {
# Aus der Tabelle "wdone" heraus werden die IST-Werte ermittelt
# und mit Hilfe des Hashwerts den richtigen Tasks zugewiesen.
#
# Ist ein IST-Wert frueher als das Startdatum eingetragen, aendert
# sich das Startdatum und wenn der IST-Wert nach dem Endedatum
# eingetragen wurde, dann aendert sich das Endedatum des Tasks!
#
$query = "select wd_hours/$leneinheit, wd_datum, wd_minum from wdone, task where ";
$query .= "ta_num = wd_task and ta_hash = '$ta_hash' and wd_prnum = $pl_prnum and ";
$query .= "wd_datum <= $istdate ";
$query .= "order by wd_minum, wd_datum";
 
if (!($resma = QueryDB($db, $query))) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
$anzma = numrowsDB($resma);
$maza = 0;
$end = $ta_start + ($ta_duration * 86400);
$akt_von = 0;
$akt_bis = 0;
$al_hours = 0;
$old_wdminum = 0;
$task_flag = false;
 
while ($maza < $anzma) {
$data = fetchDB($resma, $maza);
$wd_hours = $data[0];
$wd_datum = $data[1];
$wd_minum = $data[2];
$lo_tahash = $data[3];
 
if ($maza == 0) {
$mon = gmdate("n", $wd_datum);
$year = gmdate("Y", $wd_datum);
$akt_von = gmmktime(0, 0, 0, $mon, 1, $year);
$akt_bis = gmmktime(0, 0, 0, $mon, daysinmonth($mon, $year), $year);
$old_wdminum = $wd_minum;
}
 
if ($old_wdminum != $wd_minum || ($akt_von < $wd_datum && $akt_bis < $wd_datum)) {
# Speichern der Periode
$al_num = $co_allocation;
$al_task = $ta_num;
$al_pstart = $akt_von;
$al_phase = $ta_phase;
$al_ressource = $old_wdminum;
$al_pduration = (GetUltimo($al_pstart) - $al_pstart) / 86400;
# Wir brauchen noch die Rolle, sofern die Einstellungen das
# verlangen!
if ($role) {
$query = "select al_role from allocation where ";
$query .= "al_task = $ori_ta_num and al_ressource = $al_ressource";
 
if (!($resal = QueryDB($db, $query))) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
if (numrowsDB($resal) > 0) {
$data = fetchDB($resal, 0);
$al_role = $data[0];
}
}
 
$query = "insert into allocation (al_num, al_task,";
$query .= "al_ressource, al_hours, al_phase, al_pstart,";
 
if ($role && isset($al_role))
$query .= "al_pduration, al_role) values ($al_num, $al_task,";
else
$query .= "al_pduration) values ($al_num, $al_task,";
$query .= "$al_ressource, $al_hours, $al_phase, $al_pstart,";
 
if ($role && isset($al_role))
$query .= "$al_pduration, $al_role)";
else
$query .= "$al_pduration)";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
$co_allocation++;
$mon = gmdate("n", $wd_datum);
$year = gmdate("Y", $wd_datum);
$akt_von = gmmktime(0, 0, 0, $mon, 1, $year);
$akt_bis = gmmktime(0, 0, 0, $mon, daysinmonth($mon, $year), $year);
$old_wdminum = $wd_minum;
$al_hours = 0;
}
 
if ($wd_datum > $ta_end) {
$ta_duration = ($wd_datum - $ta_start) / 86400;
$ta_end = $ta_start + ($ta_duration * 86400);
$task_flag = true;
}
 
$al_hours += $wd_hours;
$maza++;
}
 
# Speichern der Periode
# Hier wird der letzte Datensatz weggespeichert!
if ($anzma > 0) {
$al_num = $co_allocation;
$al_task = $ta_num;
$al_pstart = $akt_von;
$al_phase = $ta_phase;
$al_ressource = $wd_minum;
$al_pduration = (GetUltimo($al_pstart) - $al_pstart) / 86400;
# Wir brauchen noch die Rolle, sofern die Einstellungen das
# verlangen!
if ($role) {
$query = "select al_role from allocation where ";
$query .= "al_task = $ori_ta_num and al_ressource = $al_ressource";
 
if (!($resal = QueryDB($db, $query))) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
if (numrowsDB($resal) > 0) {
$data = fetchDB($resal, 0);
$al_role = $data[0];
}
}
 
$query = "insert into allocation (al_num, al_task,";
$query .= "al_ressource, al_hours, al_phase, al_pstart,";
 
if ($role && isset($al_role))
$query .= "al_pduration, al_role) values ($al_num, $al_task,";
else
$query .= "al_pduration) values ($al_num, $al_task,";
 
$query .= "$al_ressource, $al_hours, $al_phase, $al_pstart,";
 
if ($role && isset($al_role))
$query .= "$al_pduration, $al_role)";
else
$query .= "$al_pduration)";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
$co_allocation++;
 
if ($wd_datum > $ta_end) {
$ta_duration = ($wd_datum - $ta_start) / 86400;
$ta_end = $ta_start + ($ta_duration * 86400);
$task_flag = true;
}
}
 
# Wenn ($task_flag == true) ist, dann gab es IST-Efassungen
# die Ausserhalb des Tasks liegen. In diesem Fall muss das
# Beginndatum und/oder die Laufzeit des Tasks entsprechend
# geaendert werden.
#
if ($task_flag) {
$query = "update task set ta_duration = $ta_duration ";
$query .= "where ta_num = $ta_num";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
}
 
# Auslesen der Planwerte zum Task.
# Alle Planwerte die juenger als $istdate sind, muessen gefunden
# und ebenfalls eingefuegt werden!
$query = "select al_ressource, al_hours, al_phase, al_pstart,";
 
if ($role)
$query .= "al_pduration, al_role from allocation where ";
else
$query .= "al_pduration from allocation where ";
 
$query .= "al_task = $ori_ta_num and al_pstart > $istdate order by al_ressource, al_num";
$result3 = QueryDB($db, $query);
 
if (!$result3) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
$nr = numrowsDB($result3);
$r = 0;
 
while ($r < $nr) {
$data = fetchDB($result3, $r);
$al_ressource = $data[0];
$al_hours = $data[1];
$al_phase = $data[2];
$al_pstart = $data[3];
$al_pduration = $data[4];
 
if ($role)
$al_role = $data[5];
 
$al_num = $co_allocation;
$al_task = $ta_num;
 
if (!isset($al_phase))
$al_phase = $ta_phase;
 
if (!isset($al_pduration))
$al_pduration = (GetUltimo($al_pstart) - $al_pstart) / 86400;
 
$query = "insert into allocation (al_num, al_task,";
$query .= "al_ressource, al_hours, al_phase, al_pstart,";
 
if ($role)
$query .= "al_pduration, al_role) values ($al_num, $al_task,";
else
$query .= "al_pduration) values ($al_num, $al_task,";
 
$query .= "$al_ressource, $al_hours, $al_phase, $al_pstart,";
 
if ($role)
$query .= "$al_pduration, $al_role)";
else
$query .= "$al_pduration)";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
$co_allocation++;
$r++;
}
}
 
$co_task++;
$rows++;
}
 
$co_task--;
$co_allocation--;
$query = "update counter set co_task = $co_task, co_allocation = $co_allocation";
$result2 = QueryDB($db, $query);
 
if (!$result2) {
QueryDB($db, "rollback");
QueryDB($db, "delete from plan where pl_num = $new_pl_num");
closeDB($db);
return false;
}
 
QueryDB($db, "commit");
Journal(200, "plan.php: editcopy: alte pl_num=$pl_num; neue pl_num=$new_pl_num; projekt=$pl_prnum", $db);
closeDB($db);
return true;
}
 
# Folgende Funktion speichert den Kommentar zu einem Plan. Dabei wird der
# TIMESTAMP nicht neu gesetzt!
#
function SavePlanComment() {
global $pmlight;
 
$pl_num = $_REQUEST['pl_num'];
$pl_comment = $_REQUEST['pl_comment'];
 
if (!isset($pl_num) || $pl_num <= 0) {
Error("Interner Fehler: Plannummer fehlt in SavePlanComment!");
return;
}
 
$db = OpenDB();
$query = "update plan set pl_comment = '$pl_comment' where ";
$query .= "pl_num = $pl_num";
 
if (!QueryDB($db, $query)) {
closeDB($db);
return;
}
 
closeDB($db);
}
 
# Folgende Funktion stellt eine Maske zur Erfassung eines Statusberichts
# dar. Es sind auch Navigationselemente enthalten, um bereits erfasste
# Berichte abrufen zu koennen.
#
function ManageStatus($pr_num, $pl_num, $edit=false, $lock=false) {
global $pmlight;
global $statusbericht;
global $menu;
global $rstufe;
global $unum;
global $dtformatshort;
 
if (!$statusbericht) {
Error(GetMessage(-1, 354, "Der Statusbericht wurde nicht freigeschalten!"));
return;
}
 
if (!isset($pr_num) || $pr_num <= 0) {
Error(GetMessage(-1, 355, "Interner Fehler: Projektnummer wurde nicht an ManageStatus &uuml;bergeben!"));
return;
}
 
if (!isset($pl_num) || $pl_num <= 0) {
Error(GetMessage(-1, 356, "Interner Fehler: Plannummer wurde nicht an ManageStatus &uuml;bergeben!"));
return;
}
 
$env_lock = $_REQUEST['lock'];
 
if (isset($env_lock) && ($env_lock == true || $env_lock == 1))
$lock = true;
 
if ($edit) {
$ps_num = $_REQUEST['ps_num'];
$ps_prstat = $_REQUEST['ps_prstat'];
$ps_comment = stripslashes(urldecode($_REQUEST['ps_comment']));
$ps_status = $_REQUEST['ps_status'];
$ps_datum = $_REQUEST['ps_datum'];
}
 
$db = OpenDB();
 
if ($lock && !$edit) {
$query = "select ps_num, ps_prstat, ps_comment, ps_status, ";
$query .= "to_char(ps_datum, 'DD.MM.YYYY') from planstatus where ";
$query .= "ps_prnum = $pr_num and ps_plnum = $pl_num and ";
$query .= "ps_status = true order by ps_datum desc";
 
if (!($resps = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
if (numrowsDB($resps) > 0) {
$data = fetchDB($resps, 0);
$ps_num = $data[0];
$ps_prstat = $data[1];
$ps_comment = $data[2];
$ps_status = $data[3];
$ps_datum = $data[4];
}
}
 
$query = "select pr_name, pr_pl, mi_nname, mi_vname ";
$query .= "from project, mitarbeiter where ";
$query .= "mi_num = pr_pl and pr_num = $pr_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$data = fetchDB($result, 0);
$pr_name = $data[0];
$pr_pl = $data[1];
$mi_nname = $data[2];
$mi_vname = $data[3];
 
if ($pr_pl != $unum && $rstufe != 1) {
Error(GetMessage($db, 353, "Nur der Administrator oder der Projektleiter darf den Statusbericht bearbeiten!"));
closeDB($db);
return;
}
 
$query = "select pl_status, pl_lfd from plan where pl_num = $pl_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$data = fetchDB($result, 0);
$pl_status = $data[0];
$pl_lfd = $data[1];
 
switch($pl_status) {
case 1: $str_status = GetMessage($db, 85, "In Erstellung"); break;
case 2: $str_status = GetMessage($db, 86, "Freigegeben"); break;
case 3: $str_status = ""; break;
case 4: $str_status = GetMessage($db, 87, "Aktiv"); break;
case 5: $str_status = GetMessage($db, 88, "Inaktiv"); break;
case 6: $str_status = GetMessage($db, 89, "Abgeschlossen"); break;
}
 
$nav = "menu=$menu&headline=9";
# Kopf der Maske malen
?>
<form action="plan.php" name="statb" method="post">
<input type="hidden" name="menu" value="<? echo "$menu"; ?>">
<input type="hidden" name="headline" value="9">
<input type="hidden" name="pr_num" value="<? echo "$pr_num"; ?>">
<input type="hidden" name="pl_num" value="<? echo "$pl_num"; ?>">
<input type="hidden" name="ps_pl" value="<? echo "$pr_pl"; ?>">
<input type="hidden" name="lock" value="<? echo "$lock"; ?>">
<?
if (isset($ps_num) && $ps_num > 0)
echo "<input type=\"hidden\" name=\"ps_num\" value=\"$ps_num\">\n";
 
if (isset($ps_datum))
echo "<input type=\"hidden\" name=\"ps_datum\" value=\"$ps_datum\">\n";
 
if ($edit && !isset($ps_datum))
$ps_datum = date($dtformatshort);
?>
<input type="hidden" name="func" value="SavePlanstatus">
 
<table class="input">
<tr>
<?
if ($edit || $lock) {
?>
<th class="sel" colspan=2><? Output($db, 357, "Statusbericht vom %s", $ps_datum); ?></th>
<?
} else {
?>
<th class="sel" colspan=2><? Output($db, 358, "Neuen Statusbericht erfassen"); ?></th>
<?
}
?>
<th class="sel"><? Output($db, 359, "Alte Berichte"); ?></th>
</tr>
<tr>
<td><? Output($db, 328, "Projektleiter:"); ?></td>
<td><? echo "$mi_nname $mi_vname"; ?></td>
<td rowspan=6 valign="top">
<?
$query = "select ps_num, ps_plnum, ps_status, ps_comment, ps_prstat,";
$query .= "to_char(ps_datum, 'DD.MM.YYYY') from planstatus ";
$query .= "where ps_prnum = $pr_num ";
 
if ($lock)
$query .= "and ps_plnum = $pl_num and ps_status = true ";
 
$query .= "order by ps_lfd desc";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$anz = numrowsDB($result);
$i = 0;
 
if ($anz > 0)
echo "<table class=\"input\">\n";
 
while ($i < $anz) {
$data = fetchDB($result, $i);
$xps_num = $data[0];
$xps_plnum = $data[1];
$xps_status = $data[2];
$xps_comment = $data[3];
$xps_prstat = $data[4];
$xps_datum = $data[5];
 
echo "<tr><td><a href=\"#\" onClick=\"javascript:MoveTo('plan.php',";
echo "'pr_num=$pr_num&pl_num=$xps_plnum&ps_prstat=$xps_prstat&";
echo "ps_num=$xps_num&ps_comment=" . urlencode($xps_comment) . "&ps_status=$xps_status&";
echo "ps_datum=$xps_datum&lock=$lock&func=PSEDIT&$nav')\">";
echo "$xps_datum</td><td><img src=\"image/";
 
switch ($xps_prstat) {
case 0: echo "cool.gif\" alt=\"" . GetMessage($db, 360, "Gruen"); break;
case 1: echo "shocked.gif\" alt=\"" . GetMessage($db, 361, "Gelb"); break;
case 2: echo "sad.gif\" alt=\"" . GetMessage($db, 362, "Rot"); break;
default: echo "huh.gif\" alt=\"" . GetMessage($db, 363, "Undefiniert");
}
 
echo "\" width=17 height=17></td></tr>\n";
$i++;
}
 
if ($anz > 0)
echo "</table>\n";
?>
</td>
</tr>
<tr>
<td><? Output($db, 1, "Projekt:"); ?></td>
<td><? echo "$pr_num $pr_name"; ?></td>
</tr>
<tr>
<td><? Output($db, 287, "Datum:"); ?></td>
<td><? if ($edit || $lock) echo "$ps_datum"; else echo date($dtformatshort); ?></td>
</tr>
<tr>
<td><? Output($db, 364, "Plannr./Planstatus:"); ?></td>
<td><? echo "$pl_lfd / $str_status"; ?></td>
</tr>
<tr>
<th class="sel" colspan=2><? Output($db, 38, "Statusbericht"); ?></th>
</tr>
<tr>
<td><? Output($db, 365, "Planstatus:"); ?></td>
<td><select name="ps_prstat" <? if ($lock || $pl_status > 4) echo "disabled"; ?>>
<option class="status" value="0" <? if ($ps_prstat == 0) echo "selected"; ?>><? Output($db, 366, "Gr&uuml;n"); ?></option>
<option class="status" value="1" <? if ($ps_prstat == 1) echo "selected"; ?>><? Output($db, 361, "Gelb"); ?></option>
<option class="status" value="2" <? if ($ps_prstat == 2) echo "selected"; ?>><? Output($db, 362, "Rot"); ?></option>
</select>
</td>
</tr>
<tr>
<td valign="top"><? output($db, 367, "Statusbeschreibung:"); ?></td>
<td><textarea name="ps_comment" rows=10 cols=60 <? if ($lock || $pl_status > 4) echo "disabled"; ?>><? echo "$ps_comment"; ?></textarea></td>
</tr>
<tr>
<td><? Output($db, 368, "Bericht:"); ?></td>
<td><select name="ps_status" <? if ($lock || $pl_status > 4) echo "disabled"; ?>>
<option value="true" <? if ($ps_status == "t" || $ps_status == "true") echo "selected"; ?>><? Output($db, 369, "G&uuml;ltig"); ?></option>
<option value="false" <? if ($ps_status == "f" || $ps_status == "false") echo "selected"; ?>><? Output($db, 370, "Ung&uuml;ltig"); ?></option>
</select>
</td>
</tr>
</table>
<?
if ($lock) {
echo "</form>\n";
closeDB($db);
return;
}
?>
<table class="indent"><tr><td>
<?
if ($edit) {
ButtonLink(GetMessage($db, 371, "Neuer Bericht"), "plan.php", "pr_num=$pr_num&pl_num=$pl_num&func=PLANSTATUS&$nav");
echo "</td><td>";
}
 
if ($pl_status <= 4)
ButtonSubmit(GetMessage($db, 45, "Speichern"), "statb");
 
echo "</td></tr></table></form>\n";
closeDB($db);
}
 
# Folgende Funktion speichert einen zuvor erfassten Planstatus. Dabei wird
# ermittelt ob es den Plan bereits gibt oder nicht.
#
function SavePlanstatus() {
$ps_num = $_REQUEST['ps_num'];
$ps_prnum = $_REQUEST['pr_num'];
$ps_plnum = $_REQUEST['pl_num'];
$ps_pl = $_REQUEST['ps_pl'];
$ps_status = $_REQUEST['ps_status'];
$ps_comment = $_REQUEST['ps_comment'];
$ps_prstat = $_REQUEST['ps_prstat'];
 
if (!isset($ps_prnum) || $ps_prnum <= 0) {
Error("Interner Fehler: Projektnummer wurde nicht an SavePlanstatus &uuml;bergeben!");
return;
}
 
if (!isset($ps_plnum) || $ps_plnum <= 0) {
Error("Interner Fehler: Plannummer wurde nicht an SavePlanstatus &uuml;bergeben!");
return;
}
 
if (!isset($ps_pl) || $ps_pl <= 0) {
Error("Interner Fehler: Projektleiter wurde nicht an SavePlanstatus &uuml;bergeben!");
return;
}
 
$db = OpenDB();
# Gibt es den Satz schon, dann machen wir nur ein Update
if (isset($ps_num) && $ps_num > 0) {
$query = "select count(*) from planstatus where ps_num = $ps_num";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$data = fetchDB($result, 0);
 
if ($data[0] > 0) {
$query = "update planstatus set ps_status = $ps_status, ";
$query .= "ps_comment = '$ps_comment', ps_prstat = $ps_prstat ";
$query .= "where ps_num = $ps_num";
 
if (!QueryDB($db, $query)) {
closeDB($db);
return;
}
 
closeDB($db);
return;
}
}
 
# Interne laufende Nummer ermitteln
$query = "select ps_lfd from planstatus where ps_prnum = $ps_prnum order by ps_lfd desc";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
if (numrowsDB($result) > 0) {
$data = fetchDB($result, 0);
$ps_lfd = $data[0] + 1;
} else
$ps_lfd = 0;
 
# Internen Zaehler ermitteln
$query = "select co_planstatus from counter";
 
if (!($result = QueryDB($db, $query))) {
closeDB($db);
return;
}
 
$data = fetchDB($result, 0);
$co_planstatus = $data[0] + 1;
# Einfuegen der Daten in die Datenbank
if (!QueryDB($db, "begin")) {
closeDB($db);
return;
}
 
$query = "insert into planstatus (ps_num, ps_pl, ps_prnum, ps_plnum,";
$query .= "ps_status, ps_comment, ps_lfd, ps_prstat, ps_datum) ";
$query .= "values ($co_planstatus, $ps_pl, $ps_prnum, $ps_plnum, ";
$query .= "$ps_status, '$ps_comment', $ps_lfd, $ps_prstat, ";
$query .= "current_timestamp)";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return;
}
 
$query = "update counter set co_planstatus = $co_planstatus";
 
if (!QueryDB($db, $query)) {
QueryDB($db, "rollback");
closeDB($db);
return;
}
 
QueryDB($db, "commit");
closeDB($db);
}
 
require_once('planlockm.inc');
 
# Folgende Abfrage stellt eine Maske zur Verfuegung, mit deren Hilfe
# die Stammdaten eines neuen Plans erfasst werden koennen. Es ist der Erste
# von insgesamt 3 Schritten.
# Im zweiten Schritt wird zwischen Grob und Feinplanung entschieden. Bei der
# Grobplanung werden noch keine direkten Ressourcen vergeben, wohl aber die
# Anzahl der PT und die Zeitdauer der Tasks angegeben.
# Nei der Feinplanung werden dann den Tasks Ressourcen zugeordnet. Diese
# Planung kann schlisslich in Form eines Ganttcharts ausgegeben werden.
# Bei der sp�eren IST-Erfassung werden die eingegebenen Zeiten mit den
# geplanten gegengerechnet und Abweichungen dargestellt.
#
if ($knopf == 10) {
echo "<form name=\"temp\" action=\"plan.php\" method=\"post\">\n";
echo "<input type=\"hidden\" name=\"pl_status\" value=\"1\">\n";
echo "<input type=\"hidden\" name=\"headline\" value=\"19\">\n";
echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
echo "<input type=\"hidden\" name=\"func\" value=\"SaveNewPlan\">\n";
 
echo "<table class=\"input\">\n";
echo "<tr><td>Projekt:</td><td><select name=\"pl_prnum\">\n";
 
$db = OpenDB();
 
if ($rstufe == 1) {
$query = "select pr_num, pr_name from project where pr_status = 0 ";
$query .= "order by pr_num";
} else {
$query = "select pr_num, pr_name from project where ";
$query .= "pr_pl = $unum and pr_status = 0 ";
$query .= "order by pr_num";
}
 
$result = QueryDB($db, $query);
$numrows = numrowsDB($result);
$row = 0;
 
while ($row < $numrows) {
$data = fetchDB($result, $row);
$pr_num = $data[0];
$pr_name = $data[1];
 
$query = "select count(*) from plan where pl_prnum = $pr_num and ";
$query .= "pl_status = 6";
 
if (!($respl = QueryDB($db, $query)))
break;
 
$data = fetchDB($respl, 0);
 
if ($data[0] > 0) {
$row++;
continue;
}
 
echo "<option value=\"$pr_num\">$pr_num $pr_name</option>\n";
$row++;
}
 
echo "</select></td></tr>\n";
echo "<tr><td>Template:</td>\n";
echo "<td><select name=\"te_num\">\n<option value=\"0\"> -- kein Template -- </option>\n";
 
$query = "select te_num, te_name from tempidx order by te_name";
$result = QueryDB($db, $query);
$numrows = numrowsDB($result);
$row = 0;
 
while ($row < $numrows) {
$data = fetchDB($result, $row);
$te_num = $data[0];
$te_name = $data[1];
echo "<option value=\"$te_num\">$te_name</option>\n";
$row++;
}
 
echo "</td></tr>\n";
echo "</table>\n";
echo "<table class=\"indent\"><tr><td>";
ButtonSubmit("Plan erstellen", "temp");
echo "</td></tr></table>";
echo "</form>\n";
}
 
if ($knopf == 2) {
ShowPlan($rstufe, $menu, $unum);
// include('start.inc');
}
 
if ($knopf == 11) {
ShowPlan($rstufe, $menu, $unum);
}
 
if (isset($func)) {
if ($func == "SaveNewPlan") {
$te_num = $_REQUEST['te_num'];
$pl_num = SaveNewPlan();
 
if ($pl_num > 0 && $te_num > 0) {
PlanPeriode($pl_num, 0, 0);
} else if ($pl_num > 0) {
AddTask($pl_num, 1);
}
}
 
if ($func == "DeletePlan") {
if (isset($_REQUEST['yes'])) {
DeletePlan();
$pl_num = $_REQUEST['pl_num'];
echo "<p class=\"cry\">Plan Nr.: $pl_num wurde erfolgreich gel&ouml;scht!</p>\n";
}
 
ShowPlan($rstufe, $menu, $unum);
}
 
if ($func == "DeleteTask") {
if (isset($_REQUEST['yes'])) {
DeleteTask();
}
 
$ta_plnum = $_REQUEST['ta_plnum'];
PlanPeriode($ta_plnum, 0, 0);
}
 
if ($func == "GetColor") {
GetColor();
}
 
if ($func == "SaveTask" || $func == "SaveObsoleteTask") {
if ($func == "SaveObsoleteTask")
$doit = true;
else
$doit = false;
 
if (SaveTask($doit)) {
$ta_plnum = $_REQUEST['ta_plnum'];
PlanPeriode($ta_plnum, 0, 0);
} else {
// $pl_num = $_REQUEST['pl_num'];
$ta_plnum = $_REQUEST['ta_plnum'];
$ta_id = $_REQUEST['ta_id'];
$ta_num = $_REQUEST['ta_num'];
 
if (isset($ta_num) && $ta_num > 0)
EditTask($ta_num);
else
AddTask($ta_plnum, $ta_id);
}
}
 
if ($func == "AddMiAdd") {
AddMiAdd();
$al_task = $_REQUEST['al_task'];
AddMi($al_task);
}
 
if ($func == "AllocMa") {
$pl_num = $_REQUEST['pl_num'];
PlanPeriode($pl_num, 0, 0, true);
}
 
if ($func == "SaveMa") {
$pl_num = $_REQUEST['pl_num'];
$yes = $_REQUEST['yes'];
 
if (isset($yes) && $yes == "yes")
$yes = true;
else
$yes = false;
 
if (!SaveMa($yes)) {
PlanPeriode($pl_num, 0, 0, true);
} else
PlanPeriode($pl_num, 0, 0);
}
 
if ($func == "SaveUpMa") {
$pl_num = $_REQUEST['pl_num'];
 
if (!SaveUpMa()) {
$ta_num = $_REQUEST['al_task'];
$ressource = $_REQUEST['ressource'];
PlanPeriode($pl_num, $ta_num, $ressource);
} else
PlanPeriode($pl_num, 0, 0);
}
 
if ($func == "UpdateMa") {
$pl_num = $_REQUEST['pl_num'];
$ta_num = $_REQUEST['al_task'];
$ressource = $_REQUEST['ressource'];
PlanPeriode($pl_num, $ta_num, $ressource);
}
 
if ($func == "AskDeleteMa") {
AskDeleteMa();
}
 
if ($func == "DeleteMa") {
if (isset($_REQUEST['yes']))
DeleteMa();
 
$pl_num = $_REQUEST['pl_num'];
PlanPeriode($pl_num, 0, 0);
}
 
if ($func == "EditPlStatus") {
$pl_num = $_REQUEST['pl_num'];
ShowPlan($rstufe, $menu, $unum, $pl_num);
$knopf = -1;
}
 
if ($func == "UpdatePlan") {
UpdatePlan();
ShowPlan($rstufe, $menu, $unum);
$knopf = -1;
}
 
if ($func == "WriteStatus") {
if ($_REQUEST['yes'] == "yes")
UpdatePlan(true);
 
ShowPlan($rstufe, $menu, $unum);
$knopf = -1;
}
 
if ($func == "COMMENT") {
SavePlanComment();
 
if (!isset($editplan) || $editplan <= 0) {
$pl_num = $_REQUEST['pl_num'];
PlanPeriode($pl_num, 0, 0);
}
}
 
if ($func == "PLANSTATUS") {
$pr_num = $_REQUEST['pr_num'];
$pl_num = $_REQUEST['pl_num'];
$lock = $_REQUEST['lock'];
 
if ($lock)
ManageStatus($pr_num, $pl_num, false, true);
else
ManageStatus($pr_num, $pl_num);
}
 
if ($func == "SavePlanstatus") {
SavePlanstatus();
$pr_num = $_REQUEST['pr_num'];
$pl_num = $_REQUEST['pl_num'];
ManageStatus($pr_num, $pl_num, true);
}
 
if ($func == "PSEDIT") {
$pr_num = $_REQUEST['pr_num'];
$pl_num = $_REQUEST['pl_num'];
ManageStatus($pr_num, $pl_num, true);
}
 
if ($func == "LockM")
AskLockM();
 
if ($func == "LockProject") {
LockProject();
ShowPlan($rstufe, $menu, $unum);
}
}
 
# Folgende Abfragen werden dann Aktiv, wenn der Anwender einen der
# Buttons in der ersten Spalte der durch ShowPlan() angezeigten Tabelle
# klickt.
#
if (isset($editplan) && $editplan > 0) {
$lock = $_REQUEST['lock'];
PlanPeriode($editplan, 0, 0);
}
 
if (isset($viewplan) && $viewplan > 0) {
PlanPeriode($viewplan, 0, 0, false, true);
}
 
if (isset($deleteplan) && $deleteplan > 0) {
AskDelete($deleteplan);
}
 
if (isset($editcopy) && $editcopy > 0) {
if ($func == "CopyPlan") {
$yes = $_REQUEST['yes'];
$cancel = $_REQUEST['cancel'];
 
if (isset($cancel) && $cancel == "cancel")
$cancel = true;
else
$cancel = false;
 
if (!isset($yes))
$yes = false;
else
$yes = true;
 
$doit = true;
} else {
$yes = false;
$doit = false;
}
 
if (!$cancel && EditCopy($editcopy, $yes, $doit))
Error("Plan wurde erfolgreich kopiert!");
else if (!$cancel)
Error("Plan konnte nicht kopiert werden!");
else
Error("Aktion wurde abgebrochen.");
 
ShowPlan($rstufe, $menu, $unum);
}
 
if (isset($taskadd) && $taskadd > 0) {
$ta_plnum = $_REQUEST['ta_plnum'];
AddTask($ta_plnum, $taskadd);
}
 
if (isset($deletetask) && $deletetask > 0) {
AskDeleteTask($deletetask);
}
 
if (isset($edittask) && $edittask > 0) {
EditTask($edittask);
}
 
if (isset($addmi) && $addmi > 0) {
AddMi($addmi);
}
 
if (isset($addmiadd)) {
$al_task = $_REQUEST['al_task'];
AddMi($al_task, 1);
}
 
if (isset($addmidel) && $addmidel > 0) {
AddMiDel($addmidel);
$al_task = $_REQUEST['al_task'];
AddMi($al_task);
}
 
if (isset($movedown) && $movedown > 0) {
if (MoveTask($movedown, 1)) {
$pl_num = $_REQUEST['pl_num'];
 
if (isset($pl_num) && $pl_num > 0)
PlanPeriode($pl_num, 0, 0);
else
Error("Interner Fehler: Plannummer ist verloren gegangen!");
} else
Error ("Task konnte nicht verschoben werden!");
}
 
if (isset($moveup) && $moveup > 0) {
if (MoveTask($moveup, -1)) {
$pl_num = $_REQUEST['pl_num'];
 
if (isset($pl_num) && $pl_num > 0)
PlanPeriode($pl_num, 0, 0);
else
Error("Interner Fehler: Plannummer ist verloren gegangen!");
} else
Error ("Task konnte nicht verschoben werden!");
}
 
require('footer.inc');
?>