Subversion Repositories public

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 andreas 1
<?
2
require_once('version.inc');
3
require_once('dbaccess.inc');
4
require_once('language.inc');
5
require_once('header.inc');
6
require_once('helper.inc');
7
require_once('crypt.inc');
8
require_once('settings.inc');
9
 
10
$drm = array(true, false, false, false, true, true, true);
11
 
12
$knopf = 0;
13
$func = $_REQUEST['func'];
14
$editplan = $_REQUEST['editplan'];
15
$viewplan = $_REQUEST['viewplan'];
16
$deleteplan = $_REQUEST['deleteplan'];
17
$editcopy = $_REQUEST['editcopy'];
18
$taskadd = $_REQUEST['taskadd'];
19
$deletetask = $_REQUEST['deletetask'];
20
$edittask = $_REQUEST['edittask'];
21
$addmi = $_REQUEST['addmi'];
22
$addmidel = $_REQUEST['addmidel'];
23
$addmiadd = $_REQUEST['addmiadd'];
24
$moveup = $_REQUEST['moveup'];
25
$movedown = $_REQUEST['movedown'];
26
 
27
if (isset($editplan)) {
28
   $headline = 20;
29
   $pl_num = $editplan;
30
} else {
31
   $pl_num = 0;
32
}
33
 
34
if (isset($deleteplan)) {
35
   $headline = 21;
36
}
37
 
38
if (isset($_REQUEST['no'])) {
39
   $headline = 9;
40
}
41
 
42
# Planungsmenue
43
//if (isset($_REQUEST['plan'])) { $knopf = 2; $headline = 9; $menu = 2; }
44
if (isset($_REQUEST['plan'])) { $knopf = 2; $headline = 20; $menu = 2; }
45
 
46
if (isset($_REQUEST['plneu'])) { $knopf = 10; $headline = 19; }
47
if (isset($_REQUEST['plchange'])) { $knopf = 11; $headline = 20; }
48
if (isset($_REQUEST['plumplan'])) { $knopf = 12; }
49
 
50
require_once('menu.inc');
51
require_once('knumber.inc');
52
require_once('class_tasknum.inc');
53
 
54
$ab_datum = 0;
55
 
56
# Folgende Funktion zeigt in einer Tabelle die Planstammdaten an, welche
57
# mit Hilfe der Buttons in der ersten Spalte bearbeitet werden koennen.
58
#
59
# Es handelt sich dabei um die Liste der Plaene, die zur Betrachtung oder
60
# auch zur Bearbeitung stehen. Der Projektleiter sieht alle Plaene, bei
61
# denen er Projektleiter ist und der Administrator sieht immer alle
62
# Plaene.
63
#
64
function ShowPlan($rstufe, $menu, $unum, $plnum=0) {
65
	global $rstufe;
66
	global $unum;
67
	global $phase;
68
	global $pmlight;
69
	global $statusbericht;
70
	global $menu;
71
	global $headline;
72
	global $func;
73
	global $pj_lock;
74
	global $dtformatshort;
75
 
76
	# Als erstes wird eine Auswahlbox angezeigt, in der der User die
77
	# Anzeige ein wenig individualisieren kann.
78
	$ps_1 = $_REQUEST['ps_1'];
79
	$ps_2 = $_REQUEST['ps_2'];
80
	$ps_3 = $_REQUEST['ps_3'];
81
	$ps_4 = $_REQUEST['ps_4'];
82
	$ps_5 = $_REQUEST['ps_5'];
83
	$ps_6 = $_REQUEST['ps_6'];
84
	$sx_prnum = $_REQUEST['sx_prnum'];
85
	$sx_prname = $_REQUEST['sx_prname'];
86
 
87
	if ($func != "SHOWPLAN") {
88
	   $ps_1 = 1;
89
	   $ps_2 = 1;
90
	   $ps_4 = 1;
91
	}
92
 
93
	$db = OpenDB();
94
?>
95
<form name="stati" method="post" action="plan.php" onChange="javascript:this.submit()">
96
<input type="hidden" name="menu" value="<? echo "$menu"; ?>">
97
<input type="hidden" name="headline" value="<? echo "$headline"; ?>">
98
<input type="hidden" name="plchange" value="1">
99
<input type="hidden" name="func" value="SHOWPLAN">
100
<table class="input">
101
   <tr>
102
      <th class="sel" colspan=2><? Output($db, 23, "Pl&auml;ne mit folgendem Status anzeigen"); ?></th>
103
      <th class="sel" colspan=2><? Output($db, 24, "Projektsuche"); ?></th>
104
   </tr>
105
   <tr>
106
      <td><? Output($db, 25, "In Erstellung:"); ?></td>
107
      <td><input type="checkbox" name="ps_1" value="1" <? if ($ps_1) echo "checked"; ?>></td>
108
      <td class="input_l">Projektnummer:</td>
109
      <td><input type="text" name="sx_prnum" value="<? echo "$sx_prnum"; ?>" size=8 maxlength=16></td>
110
   </tr>
111
<?
112
	if (!$pmlight) {
113
?>
114
   <tr>
115
      <td><? Output($db, 26, "Freigegeben:"); ?></td>
116
      <td><input type="checkbox" name="ps_2" value="1" <? if ($ps_2) echo "checked"; ?>></td>
117
      <td rowspan=4 class="input_l">Projektname:</td>
118
      <td rowspan=4 valign="top"><input type="text" name="sx_prname" value="<? echo "$sx_prname"; ?>" size=20 mxlength=100></td>
119
   </tr>
120
<?
121
	}
122
?>
123
   <tr>
124
      <td><? Output($db, 27, "Aktiv:"); ?></td>
125
      <td><input type="checkbox" name="ps_4" value="1" <? if ($ps_4) echo "checked"; ?>></td>
126
<?
127
	if ($pmlight) {
128
?>
129
      <td rowspan=3 class="input_l"><? Output($db, 28, "Projektname:"); ?></td>
130
      <td rowspan=3 valign="top"><input type="text" name="sx_prname" value="<? echo "$sx_prname"; ?>" size=20 mxlength=100></td>
131
<?
132
	}
133
?>
134
   </tr>
135
   <tr>
136
      <td><? Output($db, 29, "Inaktiv:"); ?></td>
137
      <td><input type="checkbox" name="ps_5" value="1" <? if ($ps_5) echo "checked"; ?>></td>
138
   </tr>
139
   <tr>
140
      <td><? Output($db, 30, "Abgeschlossen:"); ?></td>
141
      <td><input type="checkbox" name="ps_6" value="1" <? if ($ps_6) echo "checked"; ?>></td>
142
   </tr>
143
   <tr>
144
      <td class="sel" colspan = 4><center>
145
<?
146
	Button(GetMessage($db, 31, "Selektion durchf&uuml;hren"), "stati");
147
?>
148
      </center></td>
149
   </tr>
150
</table>
151
</form>
152
<?
153
	if (!isset($ps_1) && !isset($ps_2) && !isset($ps_3) && !isset($ps_4) && !isset($ps_5) && !isset($ps_6)) {
154
	   echo "<p class=\"cry\">" . Output($db, 32, "Es wurden keine Pl&auml;ne gefunden!") . "</p>\n";
155
	   return;
156
	}
157
 
158
	$old_prnum = 0;
159
	$db = OpenDB();
160
	$dtdb = GetDBDateFormat(true);
161
	$query = "select pl_num, pl_lfd, pl_prnum, pl_status, pr_name, ";
162
	$query .= "pr_status, to_char(pl_date, '$dtdb'), pl_comment ";
163
	$query .= "from plan, project where pr_num = pl_prnum ";
164
 
165
	if ($rstufe == 2)
166
	   $query .= "and pr_pl = $unum ";
167
 
168
	if (isset($sx_prnum) && strlen($sx_prnum) > 0)
169
	   $query .= "and pr_num = $sx_prnum ";
170
	else if (isset($sx_prname) && strlen($sx_prname) > 0)
171
	   $query .= "and pr_name ilike '$sx_prname%' ";
172
 
173
	$query .= "and pr_status = 0 and pl_status in (";
174
	$komma = false;
175
 
176
	if ($ps_1) {
177
	   $query .= "1";
178
	   $komma = true;
179
	}
180
 
181
	if ($ps_2) {
182
	   if ($komma)
183
	      $query .= ",";
184
 
185
	   $query .= "2";
186
	   $komma = true;
187
	}
188
 
189
	if ($ps_3) {
190
	   if ($komma)
191
	      $query .= ",";
192
 
193
	   $query .= "3";
194
	   $komma = true;
195
	}
196
 
197
	if ($ps_4) {
198
	   if ($komma)
199
	      $query .= ",";
200
 
201
	   $query .= "4";
202
	   $komma = true;
203
	}
204
 
205
	if ($ps_5) {
206
	   if ($komma)
207
	      $query .= ",";
208
 
209
	   $query .= "5";
210
	   $komma = true;
211
	}
212
 
213
	if ($ps_6) {
214
	   if ($komma)
215
	      $query .= ",";
216
 
217
	   $query .= "6";
218
	   $komma = true;
219
	}
220
 
221
	$query .= ") ";
222
	$query .= "order by pl_prnum asc, pl_lfd desc";
223
	$result = QueryDB($db, $query);
224
 
225
	if (!$result) {
226
	   include('footer.inc');
227
	   return;
228
	}
229
 
230
	$numrows = numrowsDB($result);
231
	$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";
232
 
233
	if ($numrows > 0) {
234
	   echo "<form name=\"plan\" action=\"plan.php\" method=\"post\">\n";
235
	   echo "<input type=\"hidden\" name=\"pl_num\" value=\"$plnum\">\n";
236
	   echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
237
	   echo "<input type=\"hidden\" name=\"headline\" value=\"9\">\n";
238
	   echo "<input type=\"hidden\" name=\"ps_1\" value=\"$ps_1\">\n";
239
	   echo "<input type=\"hidden\" name=\"ps_2\" value=\"$ps_2\">\n";
240
	   echo "<input type=\"hidden\" name=\"ps_3\" value=\"$ps_3\">\n";
241
	   echo "<input type=\"hidden\" name=\"ps_4\" value=\"$ps_4\">\n";
242
	   echo "<input type=\"hidden\" name=\"ps_5\" value=\"$ps_5\">\n";
243
	   echo "<input type=\"hidden\" name=\"ps_6\" value=\"$ps_6\">\n";
244
 
245
	   if ($plnum > 0) {
246
	      echo "<input type=\"hidden\" name=\"func\" value=\"UpdatePlan\">\n";
247
	   }
248
?>
249
<table class="sel">
250
   <tr>
251
      <th class="sel"><? Output($db, 33, "Aktion"); ?></th>
252
      <th class="sel"><? Output($db, 34, "Lfd.Nr."); ?></th>
253
      <th class="sel"><? Output($db, 35, "Proj.Nr."); ?></th>
254
      <th class="sel"><? Output($db, 36, "Projektbezeichnung"); ?></th>
255
      <th class="sel"><? Output($db, 37, "Planstatus"); ?></th>
256
      <th class="sel"><? Output($db, 403, "Abg. bis"); ?></th>
257
<?
258
	if ($statusbericht) {
259
	   echo "      <th class=\"sel\">" . GetMessage($db, 38, "Statusbericht") . "</th>";
260
	} else {
261
	   echo "      <th class=\"sel\">" . GetMessage($db, 39, "Beschreibung") . "</th>";
262
	}
263
?>
264
   </tr>
265
<?php
266
	   $old_plnum = 0;
267
	   $oo_prnum = 0;
268
	   $row = 0;
269
	   $inp_com = false;
270
 
271
	   while ($row < $numrows) {
272
	      $data = fetchDB($result, $row);
273
	      $pl_num = $data[0];
274
	      $pl_lfd = $data[1];
275
	      $pl_prnum = $data[2];
276
	      $pl_status = $data[3];
277
	      $pr_name = $data[4];
278
	      $ks_status = $data[5];
279
	      $pl_date = $data[6];
280
	      $pl_comment = $data[7];
281
 
282
	      if ($oo_prnum != $pl_prnum)
283
	         $old_pllfd = $pl_lfd;
284
 
285
	      # Pruefen, ob bereits IST-Buchungen vorgenommen wurden. Wenn ja,
286
	      # dann darf der Plan nicht mehr geloescht werden koennen!
287
	      #
288
	      $query = "select wd_num from wdone, task where ";
289
	      $query .= "wd_prnum = $pl_prnum and ta_num = wd_task and ";
290
	      $query .= "ta_plnum = $pl_num";
291
 
292
	      if (!($resta = QueryDB($db, $query)))
293
	         return;
294
 
295
	      if (numrowsDB($resta) <= 0)
296
	         $del = true;
297
	      else
298
	         $del = false;
299
 
300
	      echo "<tr><td class=\"selakt\"><table border=0 cellspacing=0 cellpadding=0><tr>";
301
 
302
	      if ($pl_status < 3 && $old_prnum != $pl_prnum) {
303
	         echo "<td><a href=\"#\" onClick=\"javascript:MoveTo('plan.php','editplan=$pl_num&$nav')\"><img src=\"image/edit.png\" border=0 alt=\"Edit\"></a></td>";
304
		 $old_prnum = $pl_prnum;
305
		 $inp_com = true;
306
	      } else {
307
	         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>";
308
	      }
309
 
310
	      if ($del && $pl_status < 4 && ($rstufe == 1 || $rstufe == 2))
311
	         echo "<td><a href=\"#\" onClick=\"javascript:MoveTo('plan.php','deleteplan=$pl_num&$nav')\"><img src=\"image/editdelete.png\" border=0 alt=\"Delete\"></a></td>";
312
 
313
	      if ($pl_status > 1 && $pl_status < 5) {
314
		 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>";
315
 
316
		 if (!$pj_lock)
317
		    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>";
318
	      }
319
 
320
	      echo "</tr></table>";
321
	      echo "</td>\n<td class=\"selnum\">$pl_lfd</td>\n<td class=\"selnum\">$pl_prnum</td>\n";
322
 
323
	      if ($inp_com) {
324
	         echo "<td class=\"sel\">";
325
		 echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','editplan=$pl_num&$nav')\">";
326
		 echo "$pr_name</a></td>\n";
327
		 $inp_com = false;
328
	      } else
329
	         echo "<td class=\"sel\">$pr_name</td>\n";
330
 
331
	      if ($plnum == $pl_num) {
332
	         echo "<td sel=\"sel\"><select name=\"pl_status\">\n";
333
		 $status = $_REQUEST['pl_status'];
334
 
335
		 if ($status == 3)
336
		    $j = 4;
337
		 else
338
		    $j = 1;
339
 
340
		 for ($i = $j; $i <= 6; $i++) {
341
		    if (($i == 2 && $pmlight) || $i == 3 || $i == 5)
342
		       continue;
343
 
344
		    if ($rstufe == 2 && $status == 6 && $i == 1)
345
		       continue;
346
 
347
		    if ($status == $i)
348
		       echo "<option value=\"$i\" selected>";
349
		    else
350
		       echo "<option value=\"$i\">";
351
 
352
	            switch ($i) {
353
	               case 1: Output($db, 40, "In Erstellung (&auml;nderbar, nicht bebuchbar)"); break;
354
		       case 2: Output($db, 41, "Freigegeben (&auml;nderbar, bebuchbar)"); break;
355
//		       case 3: echo "Wartet auf Genehmigung"; break;
356
		       case 4: Output($db, 42, "Aktiv (nicht &auml;nderbar, bebuchbar)"); break;
357
		       case 5: Output($db, 43, "Inaktiv (nicht &auml;nderbar, nicht bebuchbar)"); break;
358
		       case 6: Output($db, 44, "Abgeschlossen (Projekt ist abgeschlossen)"); break;
359
//		       default: echo "In Erstellung";
360
	            }
361
 
362
		    echo "</option>\n";
363
		 }
364
 
365
		 echo "</select>";
366
		 Button(GetMessage($db, 45, "Speichern"), "plan");
367
		 echo "</td>\n";
368
	      } else if ($oo_prnum != $pl_prnum && $old_pllfd >= $pl_lfd) {
369
	         echo "<td class=\"sel\">";
370
 
371
//		 if ($pl_status < 4 || $rstufe == 1 || $rstufe == 4) {
372
		    echo "<a href=\"#\" onClick=";
373
	            echo "\"javascript:MoveTo('plan.php','pl_num=$pl_num&pl_status=$pl_status&func=EditPlStatus&$nav')\">\n";
374
//		 }
375
 
376
	         switch ($pl_status) {
377
	            case 1: Output($db, 85, "In Erstellung"); break;
378
		    case 2: Output($db, 86, "Freigegeben"); break;
379
		    case 3: echo "Wartet auf Genehmigung"; break;
380
		    case 4: Output($db, 87, "Aktiv"); break;
381
		    case 5: Output($db, 88, "Inaktiv"); break;
382
		    case 6: Output($db, 89, "Abgeschlossen"); break;
383
		    default: Output($db, 85, "In Erstellung");
384
	         }
385
 
386
//	         if ($pl_status < 4)
387
		    echo "</a>";
388
 
389
		 echo "</td>";
390
		 $oo_prnum = $pl_prnum;
391
		 $inp_com = true;
392
	      } else {
393
	         echo "<td class=\"sel\">\n";
394
 
395
	         switch ($pl_status) {
396
	            case 1: Output($db, 85, "In Erstellung"); break;
397
		    case 2: Output($db, 86, "Freigegeben"); break;
398
		    case 3: echo "Wartet auf Genehmigung"; break;
399
		    case 4: Output($db, 87, "Aktiv"); break;
400
		    case 5: Output($db, 88, "Inaktiv"); break;
401
		    case 6: Output($db, 89, "Abgeschlossen"); break;
402
		    default: Output($db, 85, "In Erstellung");
403
	         }
404
 
405
	         echo "</td>\n";
406
	      }
407
 
408
	      # Letzter Teilprojektabschluss
409
	      $query = "select ab_datum from abschluss where ";
410
	      $query .= "ab_prnum = $pl_prnum order by ab_datum desc";
411
 
412
	      if (!($resab = QueryDB($db, $query))) {
413
	         closeDB($db);
414
		 return;
415
	      }
416
 
417
	      if (numrowsDB($resab) > 0) {
418
	         $data = fetchDB($resab, 0);
419
		 $ab_datum = $data[0];
420
		 $dt = gmdate($dtformatshort, $ab_datum);
421
	      } else
422
	         $dt = "";
423
 
424
	      echo "<td class=\"selnum\">$dt</td>\n";
425
 
426
	      # Kommentar / Beschreibung / Statusbericht
427
	      if ($statusbericht) {
428
	         $query = "select ps_prstat from planstatus where ";
429
	         $query .= "ps_prnum = $pl_prnum  and ps_status = true and ";
430
	         $query .= "ps_plnum = $pl_num ";
431
		 $query .= "order by ps_lfd desc";
432
 
433
	         if (!($resps = QueryDB($db, $query))) {
434
	            closeDB($db);
435
		    return;
436
	         }
437
 
438
		 $anzps = numrowsDB($resps);
439
 
440
		 if ($anzps > 0) {
441
		    $data = fetchDB($resps, 0);
442
	            $ps_prstat = $data[0];
443
		 } else
444
		    $ps_prstat = 3;
445
 
446
	         echo "<td class=\"sel\">$pl_date&nbsp;&nbsp;<img src=\"";
447
 
448
		 switch ($ps_prstat) {
449
		    case 0: echo "image/cool.gif\" alt=\"Gruen"; break;
450
		    case 1: echo "image/shocked.gif\" alt=\"Gelb"; break;
451
		    case 2: echo "image/sad.gif\" alt=\"Rot"; break;
452
		    default: echo "image/huh.gif\" alt=\"Undefiniert";
453
		 }
454
 
455
		 echo "\" width=17 height=17>";
456
 
457
	         if ($inp_com && $pl_status > 1 && $pl_status < 5) {
458
		    echo "&nbsp;&nbsp;<a href=\"#\" ";
459
		    echo "onClick=\"javascript:MoveTo('plan.php','func=PLANSTATUS&pr_num=$pl_prnum&pl_num=$pl_num&$nav')\">";
460
		    echo "<img src=\"image/edit.png\" border=0 alt=\"Statusbericht\"></a>";
461
		 } else if ($pl_status > 4) {
462
		    echo "&nbsp;&nbsp;<a href=\"#\" ";
463
		    echo "onClick=\"javascript:MoveTo('plan.php','func=PLANSTATUS&lock=1&pr_num=$pl_prnum&pl_num=$pl_num&$nav')\">";
464
		    echo "<img src=\"image/view.png\" border=0 alt=\"Statusbericht ansehen\" width=15 height=15></a>";
465
		 }
466
 
467
		 echo "</td>\n";
468
		 $inp_com = false;
469
	      } else {
470
	         echo "<td class=\"sel\"><table border=0 cellspacing=0 cellpadding=0><tr><td>$pl_date&nbsp;&nbsp;</td><td>";
471
		 $inp_com = false;
472
		 echo substr($pl_comment, 0, 30);
473
		 echo "</td></tr></table></td>\n";
474
	      }
475
 
476
	      echo "</tr>\n";
477
	      $row++;
478
	   }
479
 
480
	   echo "</table>\n";
481
 
482
	   if ($plnum > 0)
483
	      echo "</form>\n";
484
	} else {
485
	   echo "<p class=\"cry\">" . GetMessage($db, 32, "Es wurden keine Pl&auml;ne gefunden!") . "</p>\n";
486
	}
487
 
488
	closeDB($db);
489
}
490
 
491
function AskClosePlan($anz) {
492
	$headline = $_REQUEST['headline'];
493
	$menu = $_REQUEST['menu'];
494
	$pl_num = $_REQUEST['pl_num'];
495
	$pl_status = $_REQUEST['pl_status'];
496
	$nav = "pl_num=$pl_num&pl_status=$pl_status&menu=$menu&func=WriteStatus&headline=21";
497
?>
498
<br>
499
<form action="plan.php" method="post">
500
<table border=2 class="alarm">
501
   <tr><td colspan=2><big><? Output(-1, 46, "Warnung!"); ?></big><br><br>
502
<?	Output(-1, 47, "
503
           Es existieren noch %d Tasks, die noch nicht zu Ende sind.<br>
504
           Wenn Sie diesen Plan nun abschliessen, k&ouml;nnen Sie keine
505
           IST-Buchungen mehr auf dieses Projekt vornehmen. Sobald ein Plan
506
           abgeschlossen ist, ist das gesamte Projekt abgeschlossen!
507
	   <br><br>
508
	   Wollen Sie wirklich dieses Projekt abschliessen?", $anz);
509
?>
510
      </td>
511
   </tr>
512
   <tr>
513
      <td><center><input type="button" name="yes" value="<? Output(-1, 48, "Projekt Abschliessen"); ?>" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
514
      <td><center><input type="button" name="no" value="<? Output(-1, 49, "Abbruch"); ?>" onClick="javascript:MoveTo('plan.php','no=no&<? echo "$nav"; ?>')"></center></td>
515
   </tr>
516
</table>
517
</form>
518
<?php
519
}
520
 
521
# Folgende Funktion schreibt den (eventuell) geaenderten Status eines Plans
522
# in die Datenbank.
523
#
524
function UpdatePlan($write=false) {
525
	global $rstufe;
526
	global $phase;
527
	global $pmlight;
528
	global $language;
529
	global $unum;
530
 
531
	if ($rstufe != 1 && $rstufe != 2) {
532
	   Error(GetMessage(-1, 50, "Berechtigungsfehler!"));
533
	   return false;
534
	}
535
 
536
	$pl_num = $_REQUEST['pl_num'];
537
	$pl_status = $_REQUEST['pl_status'];
538
 
539
	if (!isset($pl_num) || $pl_num <= 0) {
540
	   Error(GetMessage(-1, 341, "Interner Fehler: Plannummer fehlt!"));
541
	   return false;
542
	}
543
 
544
	if (!isset($pl_status) || $pl_status < 1 || $pl_status > 6) {
545
	   Error(GetMessage(-1, 379, "Interner Fehler: Fehlender oder ung&uuml;ltiger Status!"));
546
	   return false;
547
	}
548
 
549
	$db = OpenDB();
550
 
551
	# Bevor wir den Planstatus von 6 tatsaechlich schreiben pruefen wir, ob
552
	# nicht noch ein Task des Plans offen ist. Ist dem so, warnen wir den
553
	# User und weisen ihn auf die Konsequenzen hin.
554
	if (!$write && $pl_status == 6) {
555
	   $today = time();
556
	   $query = "select count(*) from task where ";
557
	   $query .= "ta_plnum = $pl_num and ta_start+(ta_duration*86400) > $today and ";
558
	   $query .= "ta_level > 1";
559
 
560
	   if (!($result = QueryDB($db, $query)))
561
	      return false;
562
 
563
	   $data = fetchDB($result, 0);
564
	   $anz = $data[0];
565
 
566
	   if ($anz > 0) {
567
	      AskClosePlan($anz);
568
	      return true;
569
	   }
570
	}
571
 
572
	# Handelt es sich um den Planstatus 1 pruefen wir, ob der Plan
573
	# zuvor nicht bereits einen anderen Status hatte und wenn ja, ob
574
	# IST-Buchungen vorgenommen wurden. Trifft das zu, darf der Status
575
	# nicht auf 1 gesetzt werden.
576
	if ($pl_status == 1) {
577
	   $query = "select count(*) from wdone, task where ";
578
	   $query .= "ta_plnum = $pl_num and wd_task = ta_num";
579
 
580
	   if (!($result = QueryDB($db, $query)))
581
	      return false;
582
 
583
	   $data = fetchDB($result, 0);
584
	   $anz = $data[0];
585
 
586
	   if ($anz > 0) {
587
	      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!"));
588
	      return false;
589
	   }
590
	}
591
 
592
	# In der strikten Periodensicht ($pmlight == true), darf der Status nur
593
	# dann auf > 1 gesetzt werden, wenn es einen Kommentar zum Plan gibt.
594
	# Falls es also keinen Kommentar gibt, wird dieser automatisch erzeugt.
595
	#
596
	if ($pmlight && $pl_status > 1) {
597
	   $query = "select pl_comment from plan where pl_num = $pl_num";
598
 
599
	   if (!($result = QueryDB($db, $query)))
600
	      return false;
601
 
602
	   $data = fetchDB($result, 0);
603
	   $pl_comment = $data[0];
604
 
605
	   if (!isset($pl_comment) || strlen($pl_comment) <= 0) {
606
	      $query = "select mi_nname, mi_vname from mitarbeiter where mi_num = $unum";
607
 
608
	      if (!($resmi = QueryDB($db, $query)))
609
	         return false;
610
 
611
	      $data = fetchDB($resmi, 0);
612
	      $mi_nname = $data[0];
613
	      $mi_vname = $data[0];
614
 
615
	      $query = "update plan set pl_comment = '";
616
	      $query .= GetMessageLang($db, $language, 381, "Statusänderung durch %s", "$mi_nname $mi_vname");
617
	      $query .= "' where pl_num = $pl_num";
618
 
619
	      if (!QueryDB($db, $query))
620
	         return false;
621
 
622
	      Error(GetMessage($db, 382, "Der fehlende Kommentar zum Plan wurde automatisch eingef&uuml;gt!"));
623
	   }
624
	}
625
 
626
	$query = "update plan set pl_status = $pl_status ";
627
 
628
	if ($pl_status == 4)
629
	   $query .= ", pl_date = current_timestamp ";
630
 
631
	$query .= "where pl_num = $pl_num";
632
 
633
	if (!TQueryDB($db, $query)) {
634
	   closeDB($db);
635
	   return false;
636
	}
637
 
638
	# Handelt es sich nicht um den ersten Plan eines Projekts,
639
	# muessen alle aelteren Instanzen auf Inaktiv gesetzt werden.
640
	# Ausgenommen sind Plaene die Abgeschlossen sind (Status = 6).
641
	# Status 1 darf nur dann gesetzt werden koennen, wenn der
642
	# Plan noch keine IST-Buchungen hat. Ein neuerliches setzen
643
	# von Status 1 bewirkt, dass der folgende Plan auf 4 gesetzt
644
	# wird.
645
	$query = "select pl_prnum from plan where pl_num = $pl_num";
646
 
647
	if (!($result = QueryDB($db, $query)))
648
	   return false;
649
 
650
	$data = fetchDB($result, 0);
651
	$pl_prnum = $data[0];
652
 
653
	$query = "select pl_num, pl_status from plan where ";
654
	$query .= "pl_prnum = $pl_prnum and pl_num != $pl_num ";
655
	$query .= "order by pl_lfd desc";
656
//	$query .= "and pl_status != 6 order by pl_lfd desc";
657
 
658
	if (!($result = QueryDB($db, $query)))
659
	   return false;
660
 
661
	$numrows = numrowsDB($result);
662
	$status = ($pl_status == 6) ? 6 : 5;
663
 
664
	if ($numrows > 0) {
665
	   QueryDB($db, "begin");
666
	   $j = 0;
667
 
668
	   while ($j < $numrows) {
669
	      $data = fetchDB($result, $j);
670
	      $pl_num = $data[0];
671
	      $pst = $data[1];
672
 
673
	      if ($j == 0 && $status != 6 && $pl_status == 1)
674
	         $query = "update plan set pl_status = 4, pl_date = current_timestamp ";
675
	      else
676
	         $query = "update plan set pl_status = $status ";
677
 
678
	      $query .= "where pl_num = $pl_num";
679
 
680
	      if ($pst != $status || ($j == 0 && $status != 6 && $pl_status == 1)) {
681
	         if (!QueryDB($db, $query)) {
682
		    QueryDB($db, "rollback");
683
		    closeDB($db);
684
		    return false;
685
	         }
686
	      }
687
 
688
	      $j++;
689
	   }
690
 
691
	   QueryDB($db, "commit");
692
	}
693
 
694
	closeDB($db);
695
	return true;
696
}
697
 
698
# Folgende Funktion speichert die zuvor erfassten Planstammdaten. Da die
699
# Erfassung ohnehin nur mittels ComboBox (select) moeglich ist, kann eine
700
# Plausibilitaetspruefung entfallen.
701
#
702
function SaveNewPlan() {
703
	global $phase;
704
	global $unum;
705
 
706
	$pl_prnum = $_REQUEST['pl_prnum'];
707
	$pl_status = $_REQUEST['pl_status'];
708
	$te_num = $_REQUEST['te_num'];
709
 
710
	$db = OpenDB();
711
	#
712
	# Zunaechst muessen wir die laufende Nummer (pl_lfd) ermitteln...
713
	#
714
	$query = "select pl_lfd, pl_status, pl_num from plan where ";
715
	$query .= "pl_prnum = $pl_prnum order by pl_lfd desc";
716
 
717
	if (!($respl = QueryDB($db, $query))) {
718
	   closeDB($db);
719
	   return 0;
720
	}
721
 
722
	$numrows = numrowsDB($respl);
723
 
724
	if ($numrows > 0) {
725
	   $data = fetchDB($respl, 0);
726
	   $pl_lfd = $data[0] + 1;
727
	} else {
728
	   $pl_lfd = 1;
729
	}
730
 
731
	$query = "select co_plan from counter";
732
	$result = QueryDB($db, $query);
733
	$data = fetchDB($result, 0);
734
	$pl_num = $data[0] + 1;
735
 
736
	QueryDB($db, "begin");
737
	$query = "insert into plan (pl_num, pl_lfd, pl_prnum, pl_status) ";
738
	$query .= "values ($pl_num, $pl_lfd, $pl_prnum, $pl_status)";
739
 
740
	if (!QueryDB($db, $query)) {
741
	   QueryDB($db, "rollback");
742
	   closeDB($db);
743
	   return 0;
744
	}
745
 
746
	$query = "update counter set co_plan = $pl_num";
747
 
748
	if (!QueryDB($db, $query)) {
749
	   QueryDB($db, "rollback");
750
	   closeDB($db);
751
	   return 0;
752
	}
753
 
754
	# Handelt es sich nicht um den ersten Plan eines Projekts,
755
	# muessen alle aelteren Instanzen auf Inaktiv gesetzt werden.
756
	# Ausgenommen sind Plaene die Abgeschlossen sind (Status = 6)
757
	if ($numrows > 0 && $pl_status > 1) {
758
	   $j = 0;
759
 
760
	   while ($j < $numrows) {
761
	      $data = fetchDB($respl, $j);
762
	      $plstatus = $data[1];
763
	      $plnum = $data[2];
764
 
765
	      if ($plstatus != 6) {
766
		 $query = "update plan set pl_status = 5, pl_date = current_timestamp ";
767
		 $query .= "where pl_num = $plnum";
768
 
769
		 if (!QueryDB($db, $query)) {
770
		    QueryDB($db, "rollback");
771
		    closeDB($db);
772
		    return 0;
773
		 }
774
	      }
775
 
776
	      $j++;
777
	   }
778
	}
779
 
780
	QueryDB($db, "commit");
781
 
782
	# Wenn ein Template ausgewaehlt wurde, muss es ausgelesen werden
783
	# und als Plan angelegt werden.
784
	if (isset($te_num) && $te_num > 0) {
785
	   $query = "select co_task from counter";
786
	   $result = QueryDB($db, $query);
787
 
788
	   if (!$result) {
789
	      closeDB($db);
790
	      return 0;
791
	   }
792
 
793
	   $data = fetchDB($result, 0);
794
	   $co_task = $data[0];
795
 
796
	   $query = "select pt_lfd, pt_level, pt_name, pt_color, pt_meeting, ";
797
	   $query .= "pt_phase from ptemp where pt_tnum = $te_num ";
798
	   $query .= "order by pt_lfd";
799
	   $result = QueryDB($db, $query);
800
 
801
	   if (!$result) {
802
	      closeDB($db);
803
	      return 0;
804
	   }
805
 
806
	   $numrows = numrowsDB($result);
807
	   $row = 0;
808
	   QueryDB($db, "begin");
809
 
810
	   while ($row < $numrows) {
811
	      $data = fetchDB($result, $row);
812
	      $pt_lfd = $data[0];
813
	      $pt_level = $data[1];
814
	      $pt_name = addslashes($data[2]);
815
	      $pt_color = $data[3];
816
	      $pt_meeting = $data[4];
817
	      $pt_phase = $data[5];
818
 
819
	      if ($pt_meeting == "t")
820
	         $pt_meeting = 1;
821
	      else
822
	          $pt_meeting = 0;
823
 
824
	      $ta_start = time();
825
	      $co_task++;
826
	      $query = "insert into task (ta_num, ta_plnum, ta_id, ta_name, ";
827
	      $query .= "ta_color, ta_shape, ta_meeting, ta_start, ";
828
	      $query .= "ta_duration, ta_complete, ta_priority, ta_level, ";
829
	      $query .= "ta_phase) values ($co_task, $pl_num, $pt_lfd, ";
830
	      $query .= "'$pt_name', $pt_color, '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0',";
831
	      $query .= "$pt_meeting, $ta_start, 1, 0, 1, $pt_level, $pt_phase)";
832
 
833
	      if (!QueryDB($db, $query)) {
834
		 QueryDB($db, "rollback");
835
		 closeDB($db);
836
		 return 0;
837
	      }
838
 
839
	      $row++;
840
	   }
841
 
842
	   $query = "update counter set co_task = $co_task";
843
 
844
	   if (!QueryDB($db, $query)) {
845
	      QueryDB($db, "rollback");
846
	      closeDB($db);
847
	      return 0;
848
	   }
849
 
850
	   QueryDB($db, "commit");
851
	}
852
 
853
	Journal(300, "plan.php: SaveNewPlan: plan=$pl_num", $db);
854
	closeDB($db);
855
	return $pl_num;
856
}
857
 
858
# Folgende Funktion zeigt die Erfassungsmaske fuer einen Task an. Es muss
859
# die interne Datensatznummer des Plans uebergeben werden auf die sich der
860
# Task bezieht und die ID, also die laufende Nummer. Diese laufende Nummer
861
# stellt sicher, das die Tasks immer in der richtigen Reihenfolge angezeigt
862
# werden.
863
#
864
function AddTask($ta_plnum, $ta_id) {
865
	$menu = $_REQUEST['menu'];
866
	global $unum;
867
	global $rstufe;
868
	global $phase;
869
	global $VisualDate;
870
	global $pmlight;
871
	global $verrmodul;
872
 
873
	if (!isset($ta_plnum) || $ta_plnum <= 0) {
874
	   Error(GetMessage(-1, 22, "Error: Interner Fehler!<br>Funktion AddTask fehlt Parameter 1!"));
875
	   return;
876
	}
877
 
878
	$db = OpenDB();
879
	# Projektnummer und Projektname ermitteln
880
	$query = "select plan.pl_prnum, project.pr_name from plan, project ";
881
	$query .= "where plan.pl_num = $ta_plnum and ";
882
	$query .= "project.pr_num = plan.pl_prnum";
883
	$result = QueryDB($db, $query);
884
	$data = fetchDB($result, 0);
885
	$pl_prnum = $data[0];
886
	$pr_name = $data[1];
887
 
888
	# Finden des vorhergehenden Tasks um den Level vorzuschlagen.
889
	$query = "select ta_level, ta_meeting, ta_phase from task where ta_plnum = $ta_plnum and ";
890
	$query .= "ta_id < $ta_id order by ta_id desc";
891
 
892
	if (!($result = QueryDB($db, $query))) {
893
	   closeDB($db);
894
	   return;
895
	}
896
 
897
	if (numrowsDB($result) > 0) {
898
	   $data = fetchDB($result, 0);
899
	   $level = $data[0];
900
	   $ta_meeting = $data[1];
901
	   $ta_phase = $data[2];
902
 
903
	   if ($level == 1)
904
	      $level = 2;
905
	} else {
906
	   $level = 1;
907
	   $ta_meeting = 0;
908
	   $ta_phase = 0;
909
	}
910
?>
911
<br>
912
<form name="Task" action="plan.php" method="post">
913
<input type="hidden" name="ta_plnum" value="<? echo "$ta_plnum"; ?>">
914
<input type="hidden" name="headline" value="20">
915
<input type="hidden" name="menu" value="<? echo "$menu"; ?>">
916
<input type="hidden" name="ta_id" value="<? echo "$ta_id"; ?>">
917
<input type="hidden" name="func" value="SaveTask">
918
<?
919
	if (!$verrmodul)
920
	   echo "<input type=\"hidden\" name=\"ta_risiko\" value=\"0\">\n";
921
?>
922
<table class="input">
923
   <tr>
924
      <th class="sel" colspan=2><? Output($db, 1, "Projekt:"); echo "$pl_prnum $pr_name"; ?></th>
925
   </tr>
926
   <tr>
927
      <td>Level:</td>
928
      <td>
929
<?
930
	echo "<input type=\"text\" class=\"inputmust\" name=\"ta_level\" value=\"$level\" ";
931
 
932
	if ($ta_meeting)
933
	   echo "onBlur=\"NumRange(this,1,$level)\" ";
934
	else
935
	   echo "onBlur=\"NumRange(this,1,99)\" ";
936
 
937
	echo "size=2 maxlength=2>";
938
?>
939
      </td>
940
   </tr>
941
   <tr>
942
      <td><? Output($db, 2, "Taskname:"); ?></td>
943
      <td><input type="text" class="inputmust" name="ta_name" size=40 maxlength=50></td>
944
   </tr>
945
<?
946
        if (!$pmlight) { ?>
947
   <tr>
948
      <td><? Output($db, 3, "Farbe:"); ?></td>
949
      <td><input type="text" class="inputmust" name="ta_color" value="ffffcc" size=8 maxlength=6>
950
<?php
951
	   echo "<button type=\"button\" onClick=\"javascript:open_window('plan.php?unum=$unum&rstufe=$rstufe&header=1&func=GetColor', 'Farbwahl', 217, 57)\">";
952
	   echo "<img src=\"image/coloredit.png\" border=0 width=15 height=15 alt=\"Farbwahl\"></button>";
953
	   echo "</td>\n</tr>\n";
954
	} else {
955
	   echo "<input type=\"hidden\" name=\"ta_color\" value=\"ffffcc\">\n";
956
	}
957
?>
958
   <tr>
959
      <td><? Output($db, 4, "Meilenstein:"); ?></td>
960
      <td><input type="checkbox" name="ta_meeting" value="1" onChange="javascript:if (this.checked == true) {document.Task.ende.value = document.Task.start.value;}"></td>
961
   </tr>
962
<?php
963
	if ($phase == 1) {
964
	   echo "<tr><td>" . GetMessage($db, 5, "Phase:") . "</td>\n<td>";
965
	   $query = "select kp_num, kp_phase from key_phase order by kp_num";
966
	   $result = QueryDB($db, $query);
967
 
968
	   if (!result)
969
	      return;
970
 
971
	   $numrows = numrowsDB($result);
972
	   $row = 0;
973
	   echo "<select name=\"ta_phase\">\n";
974
 
975
	   while ($row < $numrows) {
976
	      $data = fetchDB($result, $row);
977
	      $kp_num = $data[0];
978
	      $kp_phase = $data[1];
979
 
980
	      if ($kp_num == $ta_phase)
981
	         echo "<option value=\"$kp_num\" selected>$kp_num. $kp_phase</option>\n";
982
	      else
983
	         echo "<option value=\"$kp_num\">$kp_num. $kp_phase</option>\n";
984
 
985
	      $row++;
986
	   }
987
 
988
	   echo "</td></tr>\n";
989
	} else {
990
	   $ta_phase = 0;
991
	}
992
?>
993
   <tr>
994
      <td><? Output($db, 6, "Startdatum (%s):", $VisualDate); ?></td>
995
      <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>
996
          <input type="button" value="..." onClick="javascript:open_window('calendar.php?header=1&target=window.opener.document.Task.start', 'Calendar', 200, 250)">
997
      </td>
998
   </tr>
999
   <tr>
1000
      <td><? Output($db, 7, "Endedatum (%s):", $VisualDate); ?></td>
1001
      <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>
1002
	  <input type="button" value="..." onClick="javascript:open_window('calendar.php?header=1&target=window.opener.document.Task.ende', 'Calendar', 200, 250)">
1003
      </td>
1004
   </tr>
1005
<?
1006
	if ($verrmodul) {
1007
?>
1008
   <tr>
1009
      <td><? Output($db, 8, "Risikoaufschlag:"); ?></td>
1010
      <td><input type="text" name="ta_risiko" value="0" onBlur="javascript:NumRange(this,0,100)" size="3" maxlength=3>%</td>
1011
   </tr>
1012
<?
1013
	}
1014
?>
1015
   <tr>
1016
      <td><? Output($db, 9, "Bereits erledigt:"); ?></td>
1017
      <td><input type="text" name="ta_complete" value="0" size=3 maxlength=3>%</td>
1018
   </tr>
1019
   <tr>
1020
      <td><? Output($db, 10, "Priorit&auml;t:"); ?></td>
1021
      <td><select name="ta_priority">
1022
             <option value="0"><? Output($db, 11, "Niedrig"); ?></option>
1023
	     <option value="1" selected><? Output($db, 12, "Normal"); ?></option>
1024
	     <option value="2"><? Output($db, 13, "Hoch"); ?></option>
1025
	  </select>
1026
      </td>
1027
   </tr>
1028
   <tr>
1029
      <td><? Output($db, 14, "Abh&auml;ngigkeit:"); ?></td>
1030
      <td><select name="ta_depend">
1031
             <option selected></option>
1032
<?php
1033
	SelectTask($ta_plnum, true);
1034
	closeDB($db);
1035
?>
1036
          </select>
1037
	  <select name="ta_deptype">
1038
	     <option value="2"><? Output(-1, 15, "Ende-Beginn"); ?></option>
1039
	     <option value="3"><? Output(-1, 16, "Ende-Ende"); ?></option>
1040
	     <option value="4"><? Output(-1, 17, "Beginn-Ende"); ?></option>
1041
	     <option value="1"><? Output(-1, 18, "Beginn-Beginn"); ?></option>
1042
	  </select>
1043
      </td>
1044
   </tr>
1045
   <tr>
1046
      <td valign="top"><? Output(-1, 19, "Kommentar:"); ?></td>
1047
      <td><textarea name="ta_notiz" rows=5 cols=60></textarea></td>
1048
   </tr>
1049
   <tr>
1050
      <td class="selnf" colspan=2>
1051
         <table border=0 cellspacing=0 cellpadding=0><tr><td>
1052
<?
1053
	Button(GetMessage(-1, 20, "Task Speichern"), "Task");
1054
	echo "</td><td>&nbsp;&nbsp;</td><td>";
1055
	ButtonLink(GetMessage(-1, 21, "Zur&uuml;ck"), "plan.php", "editplan=$ta_plnum&menu=$menu&headline=20");
1056
?>
1057
        </td></tr></table>
1058
      </td>
1059
   </tr>
1060
</table>
1061
<br>
1062
<?php
1063
	echo "</form>\n";
1064
}
1065
 
1066
# Folgende Funktion zeigt die Erfassungsmaske fuer einen Task an. Es muss
1067
# die interne Datensatznummer des Plans uebergeben werden auf die sich der
1068
# Task bezieht.
1069
#
1070
function EditTask($ta_num) {
1071
	global $dtformatshort;
1072
	global $VisualDate;
1073
	global $verrmodul;
1074
	global $ab_datum;
1075
 
1076
	$menu = $_REQUEST['menu'];
1077
	global $unum;
1078
	global $rstufe;
1079
	global $phase;
1080
	global $numphase;
1081
	global $pmlight;
1082
 
1083
	$db = OpenDB();
1084
	$query = "select ta_plnum, ta_id, ta_depend, ta_deptype, ta_name, ";
1085
	$query .= "ta_color, ta_meeting, ta_start, ta_duration, ta_complete, ";
1086
	$query .= "ta_priority, ta_level, ta_phase, ta_notiz, ta_risiko from task ";
1087
	$query .= "where ta_num = $ta_num";
1088
 
1089
	$result = QueryDB($db, $query);
1090
	$numrows = numrowsDB($result);
1091
 
1092
	if ($numrows != 1) {
1093
	   Error(GetMessage($db, 340, "Interner Fehler: Task \"%d\" existiert nicht!", $ta_num));
1094
	   return;
1095
	}
1096
 
1097
	$data = fetchDB($result, 0);
1098
	$ta_plnum = $data[0];
1099
	$ta_id = $data[1];
1100
	$ta_depend = $data[2];
1101
	$ta_deptype = $data[3];
1102
	$ta_name = $data[4];
1103
	$ta_color = $data[5];
1104
	$ta_meeting = $data[6];
1105
	$ta_start = $data[7];
1106
	$ta_duration = $data[8];
1107
	$ta_complete = $data[9];
1108
	$ta_priority = $data[10];
1109
	$ta_level = $data[11];
1110
	$ta_phase = $data[12];
1111
	$ta_notiz = $data[13];
1112
	$ta_risiko = $data[14];
1113
	$color = dechex($ta_color);
1114
	$len = strlen($color);
1115
 
1116
	while ($len < 6) {
1117
	   $color = "0" . $color;
1118
	   $len++;
1119
	}
1120
 
1121
	# Ermitteln, ob der Task bereits Mitarbeiter zugewiesen hat. In
1122
	# diesem Fall darf der Level nicht geaendert werden und es darf
1123
	# kein Meilenstein werden.
1124
	$query = "select count(*) from allocation where al_task = $ta_num";
1125
 
1126
	if (!($result = QueryDB($db, $query))) {
1127
	   closeDB($db);
1128
	   return;
1129
	}
1130
 
1131
	$data = fetchDB($result, 0);
1132
	$anz = $data[0];
1133
 
1134
	$query = "select plan.pl_prnum, project.pr_name from plan, project ";
1135
	$query .= "where plan.pl_num = $ta_plnum and ";
1136
	$query .= "project.pr_num = plan.pl_prnum";
1137
	$result = QueryDB($db, $query);
1138
	$data = fetchDB($result, 0);
1139
	$pl_prnum = $data[0];
1140
	$pr_name = $data[1];
1141
	echo "<p class=\"cry\">" . GetMessage($db, 1, "Projekt:") . " $pl_prnum $pr_name</p>";
1142
	# Datum des letzten Teilprojektabschluss ermitteln
1143
	$query = "select ab_datum from abschluss where ";
1144
	$query .= "ab_prnum = $pl_prnum order by ab_datum desc";
1145
 
1146
	if (!($result = QueryDB($db, $query))) {
1147
	   closeDB($db);
1148
	   return;
1149
	}
1150
 
1151
	if (numrowsDB($result) > 0) {
1152
	   $data = fetchDB($result, 0);
1153
	   $ab_datum = $data[0];
1154
	} else
1155
	   $ab_datum = 0;
1156
 
1157
	# Start des Tasks ermitteln. Gibt es breits IST-Buchungen auf
1158
	# diesen Plan, dann darf der Start des Tasks nicht nach die erste
1159
	# IST-Buchung geschoben werden.
1160
	$query = "select wd_datum from wdone where ";
1161
	$query .= "wd_task = $ta_num and wd_datum <= $ta_start ";
1162
	$query .= "order by wd_datum";
1163
 
1164
	if (!($reswd = QueryDB($db, $query)))
1165
	   return;
1166
 
1167
	$rows = numrowsDB($reswd);
1168
 
1169
	if ($rows > 0) {
1170
	   $data = fetchDB($reswd, 0);
1171
	   $wd_datum = $data[0];
1172
	}
1173
	# Finden der folgenden Tasks um im Falle eines Ordners automatisch
1174
	# das richtige Beginn- und Endedatum zu setzen.
1175
	$query = "select ta_level, ta_meeting, ta_start,";
1176
	$query .= "ta_start+ta_duration*86400 from task where ";
1177
	$query .= "ta_plnum = $ta_plnum and ta_id > $ta_id order by ta_id";
1178
 
1179
	if (!($result = QueryDB($db, $query))) {
1180
	   closeDB($db);
1181
	   return;
1182
	}
1183
 
1184
	$tstart = 0;
1185
	$tend = 0;
1186
 
1187
	if (($rows = numrowsDB($result)) > 0) {
1188
	   $j = 0;
1189
 
1190
	   while ($j < $rows) {
1191
	      $data = fetchDB($result, $j);
1192
	      $xlevel = $data[0];
1193
	      $xmeeting = $data[1];
1194
	      $xstart = $data[2];
1195
	      $xend = $data[3];
1196
 
1197
	      if ($xlevel <= $ta_level)
1198
	         break;
1199
 
1200
	      if ($tstart == 0 || $tstart > $xstart)
1201
	         $tstart = $xstart;
1202
 
1203
	      if ($tend < $xend) {
1204
	         if ($xmeeting) {
1205
	            if ($tend < $xstart)
1206
		       $tend = $xstart;
1207
		 } else
1208
	            $tend = $xend;
1209
	      }
1210
 
1211
	      $j++;
1212
	   }
1213
	}
1214
?>
1215
<br>
1216
<form name="Task" action="plan.php" method="post">
1217
<input type="hidden" name="ta_num" value="<? echo "$ta_num"; ?>">
1218
<input type="hidden" name="ta_plnum" value="<? echo "$ta_plnum"; ?>">
1219
<input type="hidden" name="headline" value="20">
1220
<input type="hidden" name="menu" value="<? echo "$menu"; ?>">
1221
<input type="hidden" name="ta_id" value="<? echo "$ta_id"; ?>">
1222
<input type="hidden" name="folder" value="0">
1223
<?
1224
	if ($tstart > 0) {
1225
	   echo "<input type=\"hidden\" name=\"start\" value=\"". gmdate($dtformatshort, $tstart) . "\">\n";
1226
	   echo "<input type=\"hidden\" name=\"folder\" value=\"1\">\n";
1227
	} else
1228
	   echo "<input type=\"hidden\" name=\"folder\" value=\"0\">\n";
1229
 
1230
	if ($tend > 0)
1231
	   echo "<input type=\"hidden\" name=\"ende\" value=\"". gmdate($dtformatshort, $tend) . "\">\n";
1232
 
1233
	if ($anz > 0 || $tstart > 0 || $tend > 0)
1234
	   echo "<input type=\"hidden\" name=\"ta_level\" value=\"$ta_level\">\n";
1235
 
1236
	if (!$verrmodul)
1237
	   echo "<input type=\"hidden\" name=\"ta_risiko\" value=\"0\">\n";
1238
?>
1239
<input type="hidden" name="func" value="SaveTask">
1240
 
1241
<table class="input">
1242
   <tr>
1243
      <td>Level:</td>
1244
<?
1245
	if ($anz > 0 || $tstart > 0 || $tend > 0) {
1246
?>
1247
      <td><b><? echo "$ta_level"; ?></b></td>
1248
<?	} else { ?>
1249
      <td><input type="text" class="inputmust" name="ta_level" value="<? echo "$ta_level"; ?>" onBlur="NumRange(this,1,99)" size=2 maxlength=2></td>
1250
<?	} ?>
1251
   </tr>
1252
   <tr>
1253
      <td>Taskname:</td>
1254
      <td><input type="text" class="inputmust" name="ta_name" value="<? echo htmlentities($ta_name); ?>" size=40 maxlength=50></td>
1255
   </tr>
1256
<?
1257
	if (!$pmlight) { ?>
1258
   <tr>
1259
      <td>Farbe:</td>
1260
      <td><input type="text" name="ta_color" value="<? echo "$color"; ?>" size=8 maxlength=6>
1261
<?php
1262
	   echo "<button type=\"button\" onClick=\"javascript:open_window('plan.php?header=1&func=GetColor', 'Farbwahl', 217, 57)\">";
1263
	   echo "<img src=\"image/coloredit.png\" border=0 width=15 height=15 alt=\"Farbwahl\"></button>";
1264
	   echo "</td></tr>\n";
1265
	} else {
1266
	   echo "<input type=\"hidden\" name=\"ta_color\" value=\"ffffcc\">\n";
1267
	}
1268
?>
1269
   <tr>
1270
      <td>Meilenstein:</td>
1271
<?php
1272
	if ($ta_meeting) {
1273
           echo "<td><input type=\"checkbox\" name=\"ta_meeting\" value=\"1\" checked ";
1274
	} else {
1275
           echo "<td><input type=\"checkbox\" name=\"ta_meeting\" value=\"1\" ";
1276
	}
1277
 
1278
	echo "onChange=\"javascript:if (this.checked == true) {document.Task.ende.value = document.Task.start.value;}\" ";
1279
 
1280
	if ($anz > 0  || $tstart > 0 || $tend > 0)
1281
	   echo "disabled";
1282
 
1283
	echo "></td>\n";
1284
?>
1285
   </tr>
1286
<?php
1287
	if ($phase == 1) {
1288
	   echo "<tr><td>Phase:</td>\n<td>";
1289
	   $query = "select kp_num, kp_phase from key_phase order by kp_num";
1290
	   $result = QueryDB($db, $query);
1291
 
1292
	   if (!$result)
1293
	      return;
1294
 
1295
	   $numrows = numrowsDB($result);
1296
	   $row = 0;
1297
	   echo "<select name=\"ta_phase\">\n";
1298
 
1299
	   while ($row < $numrows) {
1300
	      $data = fetchDB($result, $row);
1301
	      $kp_num = $data[0];
1302
	      $kp_phase = $data[1];
1303
 
1304
	      if ($ta_phase == $kp_num)
1305
	         echo "<option value=\"$kp_num\" selected>$kp_num. $kp_phase</option>\n";
1306
	      else
1307
	         echo "<option value=\"$kp_num\">$kp_num. $kp_phase</option>\n";
1308
 
1309
	      $row++;
1310
	   }
1311
 
1312
	   echo "</td></tr>\n";
1313
	}
1314
?>
1315
   <tr>
1316
      <td><? Output($db, 6, "Startdatum (%s):", $VisualDate); ?></td>
1317
<?php
1318
	# Wenn $tstart > 0 ist, dann handelt es sich um einen Ordner!
1319
	if ($tstart > 0)
1320
	   $tm = gmdate($dtformatshort, $tstart);
1321
	else
1322
	   $tm = gmdate($dtformatshort, $ta_start);
1323
 
1324
	echo "      <td><input type=\"text\" class=\"inputmust\" ";
1325
 
1326
	if ($tstart > 0 || ($tstart > 0 && $tstart <= $ab_datum) || ($tstart <= 0 && $ta_start <= $ab_datum)) {
1327
	   echo "disabled ";
1328
	   $disabled = true;
1329
	} else {
1330
	   echo "onChange=\"javascript:var stat = CheckDate(this, false);if (stat == true && document.Task.ta_meeting.checked == true) {document.Task.ende.value = this.value;}\" ";
1331
	   $disabled = false;
1332
	}
1333
 
1334
	echo "name=\"start\" value=\"$tm\" size=10 maxlength=10>\n";
1335
 
1336
	if ($tend > 0)
1337
	   $te = $tend;
1338
	else
1339
	   $te = $ta_start + ($ta_duration * 86400);
1340
 
1341
	$tem = gmdate($dtformatshort, $te);
1342
 
1343
	if ($tstart == 0 && !$disabled) {
1344
?>
1345
          <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()">
1346
<?
1347
	} else if ($tstart == 0) {
1348
?>
1349
          <input type="hidden" name="start" value="<? echo "$tm"; ?>">
1350
<?
1351
	}
1352
?>
1353
      </td>
1354
   </tr>
1355
   <tr>
1356
      <td><? Output($db, 7, "Endedatum (%s):", $VisualDate); ?></td>
1357
      <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>
1358
<?
1359
	if ($tend == 0) {
1360
?>
1361
          <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()">
1362
<?
1363
	} else {
1364
?>
1365
          <input type="hidden" name="ende" value="<? echo "$tem"; ?>">
1366
<?
1367
	}
1368
?>
1369
      </td>
1370
   </tr>
1371
<?
1372
	if ($verrmodul) {
1373
?>
1374
   <tr>
1375
      <td>Risikoaufschlag:</td>
1376
      <td><input type="text" name="ta_risiko" value="<? echo "$ta_risiko"; ?>" onBlur="javascript:NumRange(this,0,100)" size="3" maxlength=3>%</td>
1377
   </tr>
1378
<?
1379
	}
1380
?>
1381
   <tr>
1382
      <td>Bereits erledigt:</td>
1383
      <td><input type="text" name="ta_complete" value="<? echo "$ta_complete"; ?>" size=3 maxlength=3>%</td>
1384
   </tr>
1385
   <tr>
1386
      <td>Priorit&auml;t:</td>
1387
      <td><select name="ta_priority">
1388
             <option value="0" <? if ($ta_priority == 0) echo "selected"; ?>>Niedrig</option>
1389
	     <option value="1" <? if ($ta_priority == 1) echo "selected"; ?>>Normal</option>
1390
	     <option value="2" <? if ($ta_priority == 2) echo "selected"; ?>>Hoch</option>
1391
	  </select>
1392
      </td>
1393
   </tr>
1394
   <tr>
1395
      <td>Abh&auml;ngigkeit:</td>
1396
      <td colspan=2><select name="ta_depend">
1397
<?php
1398
	if (strlen($ta_depend) == 0 || $ta_depend == 0) {
1399
	   echo "<option selected></option>\n";
1400
	} else {
1401
	   echo "<option></option>\n";
1402
	}
1403
 
1404
	$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";
1405
	$result = QueryDB($db, $query);
1406
	$numrows = numrowsDB($result);
1407
	$row = 0;
1408
	$snum = "1";
1409
	$olevel = 0;
1410
	$db2 = OpenDB();
1411
 
1412
	while ($row < $numrows) {
1413
	   $data = fetchDB($result, $row);
1414
	   $num = $data[0];
1415
	   $name = $data[1];
1416
	   $id = $data[2];
1417
	   $level = $data[3];
1418
	   $depend = $data[4];
1419
	   $meeting = $data[5];
1420
	   $tphase = $data[6];
1421
 
1422
	   $query = "select ta_level from task where ta_plnum = $ta_plnum and ta_id > $id order by ta_id";
1423
	   $result2 = QueryDB($db2, $query);
1424
	   $nr = numrowsDB($result2);
1425
 
1426
	   if ($nr > 0) {
1427
	      $data = fetchDB($result2, 0);
1428
	      $xlevel = $data[0];
1429
	   } else {
1430
	      $xlevel = $ta_level;
1431
	   }
1432
 
1433
	   if ($olevel == 0) {
1434
	      $lev = 0;
1435
	      $olevel = $level;
1436
	      $dir = -3;
1437
	   } else if ($olevel < $level) {
1438
	      $lev = $level - 1;
1439
	      $olevel = $level;
1440
	      $dir = -3;
1441
	   } else if ($olevel == $level) {
1442
	      $lev = $level - 1;
1443
	      $dir = 0;
1444
	   } else if ($olevel > $level) {
1445
	      $lev = $level - 1;
1446
	      $olevel = $level;
1447
	      $dir = -1;
1448
	   }
1449
 
1450
	   $snum = kNumber($snum, $lev, $dir);
1451
 
1452
	   if ($phase == 1 && $numphase == 1) {
1453
	      $sarr = explode(".", $snum);
1454
	      $sarr[0] = $tphase;
1455
	      $snum = implode(".", $sarr);
1456
	   }
1457
 
1458
	   if ($ta_depend > 0 && $ta_depend == $id) {
1459
	      echo "<option value=\"$id\" selected>$snum $name</option>\n";
1460
	   } else {
1461
	      if (!$meeting && $level > 1 && $xlevel <= $level)
1462
	         echo "<option value=\"$id\">$snum $name</option>\n";
1463
	   }
1464
 
1465
	   $row++;
1466
	}
1467
?>
1468
          </select>
1469
	  <select name="ta_deptype">
1470
	     <option value="2" <? if ($ta_deptype == 2) echo "selected"; ?>>Ende-Beginn</option>
1471
	     <option value="3" <? if ($ta_deptype == 3) echo "selected"; ?>>Ende-Ende</option>
1472
	     <option value="4" <? if ($ta_deptype == 4) echo "selected"; ?>>Beginn-Ende</option>
1473
	     <option value="1" <? if ($ta_deptype == 1) echo "selected"; ?>>Beginn-Beginn</option>
1474
	  </select>
1475
      </td>
1476
   </tr>
1477
   <tr>
1478
      <td valign="top">Kommentar:</td>
1479
      <td colspan=2><textarea name="ta_notiz" rows=5 cols=60><? echo htmlentities($ta_notiz); ?></textarea></td>
1480
   </tr>
1481
   <tr>
1482
      <td class="selnf" colspan=2>
1483
         <table border=0 cellspacing=0 cellpadding=0><tr><td>
1484
<?
1485
	Button("Task Speichern", "Task");
1486
	echo "</td><td>&nbsp;&nbsp;</td><td>";
1487
	ButtonLink("Zur&uuml;ck", "plan.php", "editplan=$ta_plnum&menu=$menu&headline=20");
1488
?>
1489
        </td></tr></table>
1490
      </td>
1491
   </tr>
1492
</table>
1493
<br>
1494
<?php
1495
	echo "</form>\n";
1496
	closeDB($db);
1497
}
1498
 
1499
# Folgende Funktion laesst die Auswahl einer Farbe zu, die dann in ein
1500
# bestimmtes Feld der Maske "Task" geschrieben wird (function AddTask).
1501
# Die Funktion wird ueber ein Java Script innerhalb eines eigenen Fensters
1502
# aufgerufen. Neben einer Farbtafel enthaelt das Fenster noch einen Button
1503
# ueber den es sich schliessen laesst.
1504
#
1505
function GetColor() {
1506
?>
1507
<map name="farbe">
1508
<area shape="rect" coords="1,1,26,10" href="javascript:Farb('255','128','128')">
1509
<area shape="rect" coords="28,1,53,10" href="javascript:Farb('255','255','128')">
1510
<area shape="rect" coords="55,1,80,10" href="javascript:Farb('128','255','128')">
1511
<area shape="rect" coords="82,1,107,10" href="javascript:Farb('0','255','128')">
1512
<area shape="rect" coords="109,1,134,10" href="javascript:Farb('128','255','255')">
1513
<area shape="rect" coords="136,1,161,10" href="javascript:Farb('0','128','255')">
1514
<area shape="rect" coords="163,1,188,10" href="javascript:Farb('255','128','192')">
1515
<area shape="rect" coords="190,1,215,10" href="javascript:Farb('255','128','255')">
1516
<area shape="rect" coords="1,12,26,21" href="javascript:Farb('255','0','0')">
1517
<area shape="rect" coords="28,12,53,21" href="javascript:Farb('255','255','0')">
1518
<area shape="rect" coords="55,12,80,21" href="javascript:Farb('128','255','0')">
1519
<area shape="rect" coords="82,12,107,21" href="javascript:Farb('0','255','64')">
1520
<area shape="rect" coords="109,12,134,21" href="javascript:Farb('0','255','255')">
1521
<area shape="rect" coords="136,12,161,21" href="javascript:Farb('0','128','192')">
1522
<area shape="rect" coords="163,12,188,21" href="javascript:Farb('128','128','192')">
1523
<area shape="rect" coords="190,12,215,21" href="javascript:Farb('255','0','255')">
1524
<area shape="rect" coords="1,23,26,32" href="javascript:Farb('128','64','64')">
1525
<area shape="rect" coords="28,23,53,32" href="javascript:Farb('255','128','64')">
1526
<area shape="rect" coords="55,23,80,32" href="javascript:Farb('0','255','0')">
1527
<area shape="rect" coords="82,23,107,32" href="javascript:Farb('0','128','128')">
1528
<area shape="rect" coords="109,23,134,32" href="javascript:Farb('0','64','128')">
1529
<area shape="rect" coords="136,23,161,32" href="javascript:Farb('128','128','255')">
1530
<area shape="rect" coords="163,23,188,32" href="javascript:Farb('128','0','64')">
1531
<area shape="rect" coords="190,23,215,32" href="javascript:Farb('255','0','128')">
1532
<area shape="rect" coords="1,34,26,43" href="javascript:Farb('128','0','0')">
1533
<area shape="rect" coords="28,34,53,43" href="javascript:Farb('255','128','0')">
1534
<area shape="rect" coords="55,34,80,43" href="javascript:Farb('0','128','0')">
1535
<area shape="rect" coords="82,34,107,43" href="javascript:Farb('0','128','64')">
1536
<area shape="rect" coords="109,34,134,43" href="javascript:Farb('0','0','255')">
1537
<area shape="rect" coords="136,34,161,43" href="javascript:Farb('0','0','160')">
1538
<area shape="rect" coords="163,34,188,43" href="javascript:Farb('128','0','128')">
1539
<area shape="rect" coords="190,34,215,43" href="javascript:Farb('128','0','255')">
1540
<area shape="rect" coords="1,45,26,54" href="javascript:Farb('64','0','0')">
1541
<area shape="rect" coords="28,45,53,54" href="javascript:Farb('128','64','0')">
1542
<area shape="rect" coords="55,45,80,54" href="javascript:Farb('0','64','0')">
1543
<area shape="rect" coords="82,45,107,54" href="javascript:Farb('0','64','64')">
1544
<area shape="rect" coords="109,45,134,54" href="javascript:Farb('0','0','128')">
1545
<area shape="rect" coords="136,45,161,54" href="javascript:Farb('0','0','64')">
1546
<area shape="rect" coords="163,45,188,54" href="javascript:Farb('64','0','64')">
1547
<area shape="rect" coords="190,45,215,54" href="javascript:Farb('64','0','128')">
1548
<area shape="rect" coords="1,56,26,65" href="javascript:Farb('0','0','0')">
1549
<area shape="rect" coords="28,56,53,65" href="javascript:Farb('128','128','0')">
1550
<area shape="rect" coords="55,56,80,65" href="javascript:Farb('128','128','64')">
1551
<area shape="rect" coords="82,56,107,65" href="javascript:Farb('128','128','128')">
1552
<area shape="rect" coords="109,56,134,65" href="javascript:Farb('64','128','128')">
1553
<area shape="rect" coords="136,56,161,65" href="javascript:Farb('192','192','192')">
1554
<area shape="rect" coords="163,56,188,65" href="javascript:Farb('64','64','64')">
1555
<area shape="rect" coords="190,56,215,65" href="javascript:Farb('255','255','255')">
1556
</map>
1557
<img src="image/farben.png" width="217" height="67" border="0" vspace="3" alt="" usemap="#farbe">
1558
<form name="schliessen">
1559
<?
1560
	ButtonProg("Schliessen", "self.close()");
1561
//   <input type="button" name="close" value="Schliessen" onClick="javascript:self.close()">
1562
	echo "</form>\n";
1563
}
1564
 
1565
# Die folgenden zwei Funktionen loeschen einen bestehenden Plan
1566
# und alle damit verknpften Tasks. Neben dem Superuser darf das auch
1567
# vom Projektleiter durchgefuehrt werden.
1568
#
1569
function AskDelete($pl_num) {
1570
	global $phase;
1571
 
1572
	$headline = $_REQUEST['headline'];
1573
	$menu = $_REQUEST['menu'];
1574
	$nav = "pl_num=$pl_num&menu=$menu&func=DeletePlan&headline=21";
1575
?>
1576
<br>
1577
<form action="plan.php" method="post">
1578
<table border=2 class="alarm">
1579
   <tr><td colspan=2><big>Warnung!</big><br><br>
1580
           Sie sind im Begriff alle erfassten Tasks dieses Plans zu
1581
	   l&ouml;schen!<br><br>
1582
	   Wollen Sie wirklich diesen Plan mit allen Daten
1583
	   unwiederbringlich l&ouml;schen?<br>
1584
      </td>
1585
   </tr>
1586
   <tr>
1587
      <td><center><input type="button" name="yes" value="L&ouml;schen" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
1588
      <td><center><input type="button" name="no" value="Abbruch" onClick="javascript:MoveTo('plan.php','no=no&<? echo "$nav"; ?>')"></center></td>
1589
   </tr>
1590
</table>
1591
</form>
1592
<?php
1593
}
1594
 
1595
function DeletePlan() {
1596
	global $phase;
1597
 
1598
	$pl_num = $_REQUEST['pl_num'];
1599
	$db = OpenDB();
1600
	QueryDB($db, "begin");
1601
	$query = "select ta_num from task where ta_plnum = $pl_num";
1602
	$result = QueryDB($db, $query);
1603
 
1604
	if (!result) {
1605
	   QueryDB($db, "rollback");
1606
	   closeDB($db);
1607
	   return false;
1608
	}
1609
 
1610
	$numrows = numrowsDB($result);
1611
	$row = 0;
1612
 
1613
	while ($row < $numrows) {
1614
	   $data = fetchDB($result, $row);
1615
	   $ta_num = $data[0];
1616
	   $query = "delete from allocation where al_task = $ta_num";
1617
 
1618
	   if (!QueryDB($db, $query)) {
1619
	      QueryDB($db, "rollback");
1620
	      closeDB($db);
1621
	      return false;
1622
	   }
1623
 
1624
	   $row++;
1625
	}
1626
 
1627
	$query = "delete from task where ta_plnum = $pl_num";
1628
 
1629
	if (!QueryDB($db, $query)) {
1630
	   QueryDB($db, "rollback");
1631
	   closeDB($db);
1632
	   return false;
1633
	}
1634
 
1635
	$query = "delete from plan where pl_num = $pl_num";
1636
 
1637
	if (!QueryDB($db, $query)) {
1638
	   QueryDB($db, "rollback");
1639
	   closeDB($db);
1640
	   return false;
1641
	}
1642
 
1643
	QueryDB($db, "commit");
1644
	Journal(101, "plan.php: DeletePlan: pl_num=$pl_num", $db);
1645
	closeDB($db);
1646
	return true;
1647
}
1648
 
1649
# Die folgenden zwei Funktionen loeschen einen bestehenden Task
1650
# und alle damit verknpften Mitarbeiter. Neben dem Superuser darf das auch
1651
# vom Projektleiter durchgefuehrt werden.
1652
#
1653
function AskDeleteTask($ta_num) {
1654
	global $phase;
1655
 
1656
	$headline = $_REQUEST['headline'];
1657
	$menu = $_REQUEST['menu'];
1658
	$ta_plnum = $_REQUEST['ta_plnum'];
1659
	$nav = "ta_num=$ta_num&ta_plnum=$ta_plnum&func=DeleteTask&menu=$menu&headline=21";
1660
 
1661
	$db = OpenDB();
1662
	$query = "select plan.pl_prnum, project.pr_name from plan, project ";
1663
	$query .= "where plan.pl_num = $ta_plnum and project.pr_num = plan.pl_prnum";
1664
	$result = QueryDB($db, $query);
1665
	$data = fetchDB($result, 0);
1666
	$pl_prnum = $data[0];
1667
	$pr_name = $data[1];
1668
	echo "<p class=\"cry\">Projekt: $pl_prnum $pr_name</p>";
1669
	closeDB($db);
1670
?>
1671
<br>
1672
<form action="plan.php" method="post">
1673
<table border=2 class="alarm">
1674
   <tr><td colspan=2><big>Warnung!</big><br><br>
1675
           Sie sind im Begriff einen Task mit allen seinen Abh&auml;ngigkeiten
1676
	   zu l&ouml;schen!<br><br>
1677
	   Wollen Sie wirklich diesen Task unwiederbringlich l&ouml;schen?<br>
1678
      </td>
1679
   </tr>
1680
   <tr>
1681
      <td><center><input type="button" name="yes" value="L&ouml;schen" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
1682
      <td><center><input type="button" name="no" value="Abbruch" onClick="javascript:MoveTo('plan.php','no=no&<? echo "$nav"; ?>')"></center></td>
1683
   </tr>
1684
</table>
1685
</form>
1686
<?php
1687
}
1688
 
1689
function DeleteTask() {
1690
	global $phase;
1691
 
1692
	$ta_num = $_REQUEST['ta_num'];
1693
 
1694
	if (!isset($ta_num) || $ta_num < 1) {
1695
	   Error("Interner Fehler: DeleteTask: Tasknummer fehlt oder ist ung&uuml;ltig!");
1696
	   return false;
1697
	}
1698
 
1699
	$db = OpenDB();
1700
	# Fuer das E-Journal brauchen wir die Plan- und Projektnummer!
1701
	$query = "select pl_num, pl_prnum, ta_name from task, plan where ";
1702
	$query .= "pl_num = ta_plnum and ta_num = $ta_num";
1703
 
1704
	if (!($result = QueryDB($db, $query))) {
1705
	   closeDB($db);
1706
	   return false;
1707
	}
1708
 
1709
	$data = fetchDB($result, 0);
1710
	$pl_num = $data[0];
1711
	$pl_prnum = $data[1];
1712
	$ta_name = $data[2];
1713
 
1714
	QueryDB($db, "begin");
1715
	$query = "delete from allocation where al_task = $ta_num";
1716
	$result = QueryDB($db, $query);
1717
 
1718
	if (!$result) {
1719
	   QueryDB($db, "rollback");
1720
	   Error("SQL-Error: $query");
1721
	   closeDB($db);
1722
	   return false;
1723
	}
1724
 
1725
	$query = "delete from task where ta_num = $ta_num";
1726
 
1727
	if (!QueryDB($db, $query)) {
1728
	   QueryDB($db, "rollback");
1729
	   Error("SQL-Error: $query");
1730
	   closeDB($db);
1731
	   return false;
1732
	}
1733
 
1734
	QueryDB($db, "commit");
1735
	Journal(100, "plan.php: DeleteTask: ta_num=$ta_num $ta_name, pl_num=$pl_num, Projekt: $pl_prnum", $db);
1736
	closeDB($db);
1737
	return true;
1738
}
1739
 
1740
# Die folgenden zwei Funktionen loeschen einen bestehenden Task
1741
# und alle damit verknpften Mitarbeiter. Neben dem Superuser darf das auch
1742
# vom Projektleiter durchgefuehrt werden.
1743
#
1744
function AskDeleteMa() {
1745
	global $phase;
1746
	global $dtformatshort;
1747
 
1748
	$headline = $_REQUEST['headline'];
1749
	$menu = $_REQUEST['menu'];
1750
	$pl_num = $_REQUEST['pl_num'];
1751
	$al_task = $_REQUEST['al_task'];
1752
	$ressource = $_REQUEST['ressource'];
1753
	$nav = "al_task=$al_task&pl_num=$pl_num&ressource=$ressource&func=DeleteMa&menu=$menu&headline=$headline";
1754
 
1755
	$db = OpenDB();
1756
	$query = "select plan.pl_prnum, project.pr_name from plan, project ";
1757
	$query .= "where plan.pl_num = $pl_num and project.pr_num = plan.pl_prnum";
1758
	$result = QueryDB($db, $query);
1759
	$data = fetchDB($result, 0);
1760
	$pl_prnum = $data[0];
1761
	$pr_name = $data[1];
1762
	echo "<p class=\"cry\">Projekt: $pl_prnum $pr_name</p>";
1763
 
1764
	$query = "select ta_name, ta_start, ta_duration from task ";
1765
	$query .= "where ta_num = $al_task";
1766
	$result = QueryDB($db, $query);
1767
	$data = fetchDB($result, 0);
1768
	$ta_name = $data[0];
1769
	$ta_start = $data[1];
1770
	$ta_duration = $data[2];
1771
 
1772
	$query = "select am_hours, am_role, am_nname, am_vname ";
1773
	$query .= "from allocmi where am_task = $al_task and am_ressource = $ressource";
1774
	$result = QueryDB($db, $query);
1775
	$rows = 0;
1776
	$numrows = numrowsDB($result);
1777
 
1778
?>
1779
<br>
1780
<form action="plan.php" method="post">
1781
<table border=2 class="alarm">
1782
   <tr><td colspan=2><big>Warnung!</big><br><br>
1783
           Sie sind im Begriff einen Mitarbeiter von einem Task
1784
	   zu l&ouml;schen!<br>
1785
	   <center><table border=1><tr>
1786
	      <td class="tbhead">Taskname</td>
1787
	      <td class="tbhead">Dauer</td>
1788
	      <td class="tbhead">Start</td></tr>
1789
<?php
1790
        echo "<tr><td>$ta_name</td>\n";
1791
        echo "<td>$ta_duration</td>\n";
1792
        $dt = gmdate($dtformatshort, $ta_start);
1793
        echo "<td>$dt</td></tr>\n";
1794
        echo "</table></center>\n";
1795
 
1796
        echo "<center><p>";
1797
 
1798
        while ($rows < $numrows) {
1799
           $data = fetchDB($result, $rows);
1800
           $am_hours = $data[0];
1801
           $am_role = $data[1];
1802
           $am_nname = $data[2];
1803
           $am_vname = $data[3];
1804
 
1805
           if ($rows == 0) {
1806
              echo "$am_nname $am_vname, $am_role: ";
1807
              printf("%s", FormatNum($am_hours, 3));
1808
           }
1809
           else
1810
              printf(", %s", FormatNum($am_hours, 3));
1811
 
1812
           $rows++;
1813
        }
1814
 
1815
        echo "</p></center>\n";
1816
        closeDB($db);
1817
?>
1818
	   Wollen Sie wirklich diesen Mitarbeiter unwiederbringlich l&ouml;schen?<br>
1819
      </td>
1820
   </tr>
1821
   <tr>
1822
      <td><center><input type="button" name="yes" value="L&ouml;schen" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
1823
      <td><center><input type="button" name="no" value="Abbruch" onClick="javascript:MoveTo('plan.php','no=no&<? echo "$nav"; ?>')"></center></td>
1824
   </tr>
1825
</table>
1826
</form>
1827
<?php
1828
}
1829
 
1830
function DeleteMa() {
1831
	$al_task = $_REQUEST['al_task'];
1832
	$ressource = $_REQUEST['ressource'];
1833
 
1834
	$db = OpenDB();
1835
	QueryDB($db, "begin");
1836
	$query = "delete from allocation where al_task = $al_task and ";
1837
	$query .= "al_ressource = $ressource";
1838
	$result = QueryDB($db, $query);
1839
 
1840
	if (!result) {
1841
	   QueryDB($db, "rollback");
1842
	   closeDB($db);
1843
	   return false;
1844
	}
1845
 
1846
	QueryDB($db, "commit");
1847
	Journal(105, "plan.php: DeleteMa: ressource=$ressource; task=$al_task", $db);
1848
	closeDB($db);
1849
	return true;
1850
}
1851
 
1852
# Folgende Funktion wird von SaveTask() aufgerufen.
1853
# Der Aufruf erfolgt, wenn bei einem Task das Startdatum so geaendert
1854
# wurde, dass es gegenueber dem Alten in der Vergangenheit liegt. Ist das
1855
# der Fall, koennen die betroffenen Perioden der zugeordneten Mitarbeiter
1856
# geloescht werden.
1857
#
1858
function AskObsoleteMA() {
1859
	global $menu;
1860
	global $headline;
1861
	global $phase;
1862
 
1863
	$ta_num = $_REQUEST['ta_num'];
1864
	$ta_plnum = $_REQUEST['ta_plnum'];
1865
	$ta_id = $_REQUEST['ta_id'];
1866
	$ta_level = $_REQUEST['ta_level'];
1867
	$ta_name = $_REQUEST['ta_name'];
1868
	$ta_color = $_REQUEST['ta_color'];
1869
	$ta_meeting = $_REQUEST['ta_meeting'];
1870
	$start = $_REQUEST['start'];
1871
	$ende = $_REQUEST['ende'];
1872
	$ta_duration = $_REQUEST['ta_duration'];
1873
	$ta_complete = $_REQUEST['ta_complete'];
1874
	$ta_priority = $_REQUEST['ta_priority'];
1875
	$ta_depend = $_REQUEST['ta_depend'];
1876
	$ta_deptype = $_REQUEST['ta_deptype'];
1877
	$ta_notiz = $_REQUEST['ta_notiz'];
1878
 
1879
	if ($phase)
1880
	   $ta_phase = $_REQUEST['ta_phase'];
1881
	else
1882
	   $ta_phase = 0;
1883
 
1884
	if (!isset($ta_meeting))
1885
	   $ta_meeting = 0;
1886
 
1887
	echo "<form name=\"obsolete\" action=\"plan.php\" method=\"post\">\n";
1888
	echo "<input type=\"hidden\" name=\"ta_num\" value=\"$ta_num\">\n";
1889
	echo "<input type=\"hidden\" name=\"ta_plnum\" value=\"$ta_plnum\">\n";
1890
	echo "<input type=\"hidden\" name=\"ta_id\" value=\"$ta_id\">\n";
1891
	echo "<input type=\"hidden\" name=\"ta_level\" value=\"$ta_level\">\n";
1892
	echo "<input type=\"hidden\" name=\"ta_name\" value=\"$ta_name\">\n";
1893
	echo "<input type=\"hidden\" name=\"ta_color\" value=\"$ta_color\">\n";
1894
	echo "<input type=\"hidden\" name=\"ta_meeting\" value=\"$ta_meeting\">\n";
1895
	echo "<input type=\"hidden\" name=\"ta_duration\" value=\"$ta_duration\">\n";
1896
	echo "<input type=\"hidden\" name=\"ta_complete\" value=\"$ta_complete\">\n";
1897
	echo "<input type=\"hidden\" name=\"ta_priority\" value=\"$ta_priority\">\n";
1898
	echo "<input type=\"hidden\" name=\"ta_depend\" value=\"$ta_depend\">\n";
1899
	echo "<input type=\"hidden\" name=\"ta_deptype\" value=\"$ta_deptype\">\n";
1900
	echo "<input type=\"hidden\" name=\"ta_phase\" value=\"$ta_phase\">\n";
1901
	echo "<input type=\"hidden\" name=\"ta_notiz\" value=\"$ta_notiz\">\n";
1902
	echo "<input type=\"hidden\" name=\"start\" value=\"$start\">\n";
1903
	echo "<input type=\"hidden\" name=\"ende\" value=\"$ende\">\n";
1904
	echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
1905
	echo "<input type=\"hidden\" name=\"headline\" value=\"$headline\">\n";
1906
	echo "<input type=\"hidden\" name=\"func\" value=\"SaveObsoleteTask\">\n";
1907
?>
1908
<center>
1909
<table border=2 class="alarm" width="50%">
1910
   <tr>
1911
      <td colspan=2><big>Hinweis!</big><br><br>
1912
<?
1913
	Output(-1, 351,
1914
"         Sie haben das Start&minus; bzw. Endedatum des Tasks
1915
         ge&auml;ndert. Diesem Task sind jedoch bereits Mitarbeiter
1916
         zugeordnet, deren Perioden nun (teilweise) au&szlig;erhalb des
1917
         Zeitraums des Tasks fallen w&uuml;rden.<br><br>
1918
         Wenn Sie folgende Frage mit <b>JA</b> beantworten, werden jene
1919
         Perioden geloescht, die au&szlig;erhalb des Taskzeitraums liegen!<br><br>
1920
         Wollen Sie die Perioden der zugeordneten Mitarbeiter die au&szlig;erhalb des
1921
         Taskzeitraums liegen wirklich loeschen?");
1922
?>
1923
      </td>
1924
   </tr>
1925
   <tr>
1926
<?
1927
	echo "<td align=\"center\">";
1928
	Button("Ja", "obsolete");
1929
	echo "</td><td align=\"center\">";
1930
	ButtonLink("Abbrechen", "plan.php", "editplan=$ta_plnum&menu=$menu&headline=$headline");
1931
	echo "</td>";
1932
?>
1933
   </tr>
1934
</table>
1935
</center>
1936
</form>
1937
<?php
1938
}
1939
 
1940
function SaveTask($doit=false) {
1941
	global $phase;
1942
	$ta_num = $_REQUEST['ta_num'];
1943
	$ta_plnum = $_REQUEST['ta_plnum'];
1944
	$ta_id = $_REQUEST['ta_id'];
1945
	$ta_level = $_REQUEST['ta_level'];
1946
	$ta_name = $_REQUEST['ta_name'];
1947
	$ta_color = $_REQUEST['ta_color'];
1948
	$ta_meeting = $_REQUEST['ta_meeting'];
1949
	$start = $_REQUEST['start'];
1950
	$end = $_REQUEST['ende'];
1951
	$ta_duration = $_REQUEST['ta_duration'];
1952
	$ta_complete = $_REQUEST['ta_complete'];
1953
	$ta_priority = $_REQUEST['ta_priority'];
1954
	$ta_depend = $_REQUEST['ta_depend'];
1955
	$ta_deptype = $_REQUEST['ta_deptype'];
1956
	$ta_notiz = $_REQUEST['ta_notiz'];
1957
	$ta_risiko = $_REQUEST['ta_risiko'];
1958
	$folder = $_REQUEST['folder'];
1959
 
1960
	if ($phase)
1961
	   $ta_phase = $_REQUEST['ta_phase'];
1962
	else
1963
	   $ta_phase = 0;
1964
 
1965
	# Plausibilitaetspruefungen
1966
	$err = 0;
1967
 
1968
	if (!isset($ta_plnum) || $ta_plnum < 1) {
1969
	   Error(GetMessage(-1, 341, "Interner Fehler: Plannummer fehlt!"));
1970
	   $err = 1;
1971
	}
1972
 
1973
	if (!isset($ta_id) || $ta_id < 1) {
1974
	   Error(GetMessage(-1, 342, "Interner Fehler: Keine oder ung&uuml;ltige ID-Nummer!"));
1975
	   $err = 1;
1976
	}
1977
 
1978
	if (strlen($ta_name) < 1) {
1979
	   Error(GetMessage(-1, 343, "Ein Task muss einen Namen haben!"));
1980
	   $err = 1;
1981
	}
1982
 
1983
	if (strlen($ta_color) != 6) {
1984
	   Error(GetMessage(-1, 344, "Ung&uuml;ltiger Farbcode! Standard (hellgelb) wurde gesetzt!"));
1985
	   $ta_color = "ffffcc";
1986
	}
1987
 
1988
	if (!isset($ta_meeting)) {
1989
	   $ta_meeting = 0;
1990
	}
1991
 
1992
	if (!isset($ta_risiko) || $ta_meeting)
1993
	   $ta_risiko = 0;
1994
 
1995
	if (strlen($start) < 8 || str_wordcount($start) != 3) {
1996
	   Error(GetMessage(-1, 345, "Ung&uuml;ltiges Startdatum! (%s)", $start));
1997
	   $err = 1;
1998
	}
1999
 
2000
	if (!$ta_meeting && (strlen($end) < 8 || str_wordcount($end) != 3)) {
2001
	   Error(GetMessage(-1, 346, "Ung&uuml;ltiges Endedatum! (%s)", $end));
2002
	   $err = 1;
2003
	}
2004
 
2005
	$db = OpenDB();
2006
	# Datum des letzten Teilprojektabschlusses ermitteln.
2007
	$query = "select pl_prnum from plan where pl_num = $ta_plnum";
2008
 
2009
	if (!($result = QueryDB($db, $query))) {
2010
	   closeDB($db);
2011
	   return false;
2012
	}
2013
 
2014
	$data = fetchDB($result, 0);
2015
	$pl_prnum = $data[0];
2016
 
2017
	$query = "select ab_datum from abschluss where ab_prnum = $pl_prnum ";
2018
	$query .= "order by ab_Datum desc";
2019
 
2020
	if (!($result = QueryDB($db, $query))) {
2021
	   closeDB($db);
2022
	   return false;
2023
	}
2024
 
2025
	if (numrowsDB($result) > 0) {
2026
	   $data = fetchDB($result, 0);
2027
	   $ab_datum = $data[0];
2028
	} else
2029
	   $ab_datum = 0;
2030
 
2031
	# Pruefen ob die eingegebenen Datum korrekt sind.
2032
	$dt = explode(".", $start);
2033
	$ta_start = gmmktime(0, 0, 0, $dt[1], $dt[0], $dt[2]);
2034
 
2035
//	if (isset($ta_num) && $ta_num > 0 && $ta_start <= $ab_datum) {
2036
//	   Error(GetMessage($db, 349, "Das Startdatum darf nicht vor dem Datum des letzten Teilprojektabschlu&szlig; sein!"));
2037
//	   $err = 1;
2038
//	}
2039
 
2040
	if (!$ta_meeting) {
2041
	   $dt = explode(".", $end);
2042
	   $ta_end = gmmktime(0, 0, 0, $dt[1], $dt[0], $dt[2]);
2043
	} else
2044
	   $ta_end = $ta_start;
2045
 
2046
	if ($ta_meeting == 0 && $ta_start > $ta_end) {
2047
	   Error(GetMessage(-1, 347, "Das Startdatum darf nicht gr&ouml;&szlig;er als das Endedatum sein!"));
2048
	   $err = 1;
2049
	}
2050
 
2051
//	if (!$err && isset($ta_num) && $ta_num > 0 && $ta_end <= $ab_datum) {
2052
//	   Error(GetMessage($db, 350, "Das Endedatum darf nicht vor dem Datum des letzten Teilprojektabschlu&szlig; sein!"));
2053
//	   $err = 1;
2054
//	}
2055
 
2056
	if (!isset($ta_depend) || strlen($ta_depend) == 0) {
2057
	   $ta_depend = 0;
2058
	}
2059
 
2060
	if ($ta_complete > 100) {
2061
	   $ta_complete = 100;
2062
	}
2063
 
2064
	# Wenn der vorhergehende Task, sofern einer existiert, ein Meilenstein
2065
	# ist, dann darf der Level des folgenden Tasks nicht hoeher sein.
2066
	$query = "select ta_level, ta_meeting from task where ";
2067
	$query .= "ta_plnum = $ta_plnum and ta_id < $ta_id order by ta_id desc";
2068
 
2069
	if (!($result = QueryDB($db, $query))) {
2070
	   closeDB($db);
2071
	   return false;
2072
	}
2073
 
2074
	if (numrowsDB($result) > 0) {
2075
	   $data = fetchDB($result, 0);
2076
	   $level = $data[0];
2077
	   $meeting = $data[1];
2078
 
2079
	   if ($meeting && !$ta_meeting && $ta_level > $level) {
2080
	      Error(GetMessage($db, 348, "Der \"Level\" ist au&szlig;erhalb des g&uuml;ltigen Bereichs!"));
2081
	      $err = 1;
2082
	   }
2083
	}
2084
 
2085
	if ($ta_level < 1 || $ta_level > 99) {
2086
	   Error(GetMessage($db, 348, "Der \"Level\" ist au&szlig;erhalb des g&uuml;ltigen Bereichs!"));
2087
	   $err = 1;
2088
	}
2089
 
2090
	if ($err == 1) {
2091
	   closeDB($db);
2092
	   return false;
2093
	}
2094
 
2095
	# Umwandlungen
2096
	$ta_color = hexdec($ta_color);
2097
 
2098
	if (!$ta_meeting)
2099
	   $ta_duration = ($ta_end - $ta_start) / 86400;
2100
	else
2101
	   $ta_duration = 0;
2102
 
2103
	# Aendern wir einen bestehenden Datensatz, oder speichern wir einen
2104
	# neuen?
2105
	if (isset($ta_num) && $ta_num > 0) {		// neuer Datensatz?
2106
	   $query = "select ta_start, ta_duration from task where ta_num = $ta_num";
2107
 
2108
	   if (!($result = QueryDB($db, $query))) {
2109
	      closeDB($db);
2110
	      return false;
2111
	   }
2112
 
2113
	   $numrows = numrowsDB($result);
2114
 
2115
	   # Pruefen ob das eventuell geaenderte Startdatum nicht in einer
2116
	   # zukuenftigen Periode liegt und bereits zugewiesene Mitarbeiter
2117
	   # in der Luft haengen wuerden. Ist das der Fall, muss der User
2118
	   # darauf hingewiesen werden und, wenn er es will, die nicht mehr
2119
	   # zugeordneten Mitarbeiter geloescht werden.
2120
	   #
2121
	   if ($numrows == 1 && !$doit) {
2122
	      $data = fetchDB($result, 0);
2123
	      $old_tastart = $data[0];
2124
	      $old_taduration = $data[1];
2125
	      $oend = $old_tastart + ($old_taduration * 86400);
2126
	      $dend = $ta_start + ($ta_duration * 86400);
2127
 
2128
	      # Prufen, ob das Start- oder Endedatum geaendert wurde und wenn
2129
	      # ja, dann duerfen die neuen Datum nicht juenger als das letzte
2130
	      # Datum des Teilprojektabschluss sein.
2131
 
2132
	      if (!$folder && (($old_tastart != $ta_start && $ta_start <= $ab_datum) ||
2133
		  ($old_taduration != $ta_duration && $dend <= $ab_datum))) {
2134
		 Error(GetMessage($db, 352, "Das Startdatum und/oder das Endedatum darf nicht vor dem Datum des letzten Teilabschluss sein!"));
2135
		 closeDB($db);
2136
		 return false;
2137
	      }
2138
 
2139
	      # Pruefen, ob die neuen Start- oder Endedatum keine in der Luft
2140
	      # haengenden Planwerte hinterlassen.
2141
	      if (PerDateComp($ta_start, $old_tastart) < 0 ||
2142
	          PerDateComp($oend, $dend) < 0) {
2143
		 $query = "select al_num, al_pstart from allocation where ";
2144
		 $query .= "al_task = $ta_num and (al_pstart < $ta_start or ";
2145
		 $query .= "al_pstart > $dend)";
2146
 
2147
		 if (!($result = QueryDB($db, $query))) {
2148
		    closeDB($db);
2149
		    return false;
2150
		 }
2151
 
2152
		 $rows = numrowsDB($result);
2153
 
2154
		 if ($rows > 0) {	// Gibt es MA unterhalb von ta_start?
2155
		    AskObsoleteMA();
2156
		    closeDB($db);
2157
		    require('footer.inc');
2158
		    exit();
2159
		 }
2160
	      }
2161
	   } /* else
2162
	      $numrows = 0;
2163
*/
2164
	   # Gibt es den Datensatz bereits, dann aendern wir ihn.
2165
	   if ($numrows == 1) {
2166
	      if ($doit) {
2167
	         $dend = $ta_start + ($ta_duration * 86400);
2168
	         QueryDB($db, "begin");
2169
	         $query = "delete from allocation where al_task = $ta_num and ";
2170
	         $query .= "(al_pstart < $ta_start or al_pstart > $dend)";
2171
 
2172
	         if (!QueryDB($db, $query)) {
2173
		    closeDB($db);
2174
		    return false;
2175
	         }
2176
	      }
2177
 
2178
	      $query = "update task set ta_name = '$ta_name', ta_color = '$ta_color',";
2179
	      $query .= "ta_meeting = $ta_meeting, ta_start = $ta_start,";
2180
	      $query .= "ta_duration = $ta_duration, ta_complete = $ta_complete,";
2181
	      $query .= "ta_priority = $ta_priority, ta_level = $ta_level,";
2182
	      $query .= "ta_depend = $ta_depend, ta_deptype = $ta_deptype,";
2183
 
2184
	      if ($phase == 1)
2185
	         $query .= "ta_plnum = $ta_plnum, ta_id = $ta_id, ta_phase = $ta_phase,";
2186
	      else
2187
	         $query .= "ta_plnum = $ta_plnum, ta_id = $ta_id,";
2188
 
2189
	      $query .= "ta_notiz = '$ta_notiz', ta_risiko = $ta_risiko where ta_num = $ta_num";
2190
 
2191
	      if (!QueryDB($db, $query)) {
2192
		 if ($doit)
2193
		    QueryDB($db, "rollback");
2194
 
2195
		 closeDB($db);
2196
		 return false;
2197
	      }
2198
 
2199
	      if ($doit)
2200
	         QueryDB($db, "commit");
2201
 
2202
	      closeDB($db);
2203
	      return true;
2204
	   }
2205
	}
2206
 
2207
	# Der Datensatz existiert nicht und deshalb fuegen wir ihn ein. Es
2208
	# muss jedoch geprueft werden, ob die ID bereits existiert. Existiert
2209
	# sie, muessen alle IDs >= #ta_id um 1 erhoeht werden und der
2210
	# Datensatz anschliessend eingefuegt werden.
2211
	$query = "select ta_id from task where ta_plnum = $ta_plnum and ta_id = $ta_id";
2212
	$result = QueryDB($db, $query);
2213
	$numrows = numrowsDB($result);
2214
 
2215
	if ($numrows == 1) {
2216
	   # Alle IDs um 1 nach hinten schieben!
2217
	   $query = "select ta_num, ta_id from task where ta_plnum = $ta_plnum and ta_id >= $ta_id order by ta_id desc";
2218
	   $result = QueryDB($db, $query);
2219
	   $numrows = numrowsDB($result);
2220
	   $row = 0;
2221
	   $db2 = OpenDB();
2222
 
2223
	   while ($row < $numrows) {
2224
	      $data = fetchDB($result, $row);
2225
	      $num = $data[0];
2226
	      $id = $data[1] + 1;
2227
	      $query = "update task set ta_id = $id where ta_num = $num";
2228
 
2229
	      if (!TQueryDB($db2, $query)) {
2230
	         Error("SQL-Error: $query");
2231
		 closeDB($db);
2232
		 closeDB($db2);
2233
		 return false;
2234
	      }
2235
 
2236
	      $row++;
2237
	   }
2238
 
2239
	   closeDB($db2);
2240
	}
2241
 
2242
	# Nun wird der neue Datensatz tatsaechlich geschrieben.
2243
	$query = "select co_task from counter";
2244
	$result = QueryDB($db, $query);
2245
	$data = fetchDB($result, 0);
2246
	$ta_num = $data[0] + 1;
2247
	$ta_hash = md5($ta_num);
2248
 
2249
	QueryDB($db, "begin");
2250
	$query = "insert into task (ta_num, ta_plnum, ta_id, ta_depend,";
2251
	$query .= "ta_deptype, ta_name, ta_color, ta_shape, ta_meeting,";
2252
	$query .= "ta_start, ta_duration, ta_complete, ta_fixed_start,";
2253
	$query .= "ta_priority, ta_level, ta_phase, ta_notiz, ta_hash, ta_risiko) values (";
2254
	$query .= "$ta_num, $ta_plnum, $ta_id, $ta_depend, $ta_deptype,";
2255
	$query .= "'$ta_name', $ta_color, '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0',";
2256
	$query .= "$ta_meeting, $ta_start, $ta_duration, $ta_complete,";
2257
 
2258
	if ($phase == 1)
2259
	   $query .= "0, $ta_priority, $ta_level, $ta_phase, '$ta_notiz', '$ta_hash', $ta_risiko)";
2260
	else
2261
	   $query .= "0, $ta_priority, $ta_level, 0, '$ta_notiz', '$ta_hash', $ta_risiko)";
2262
 
2263
	if (!QueryDB($db, $query)) {
2264
	   QueryDB($db, "rollback");
2265
	   Error("SQL-Error: $query");
2266
	   closeDB($db);
2267
	   return false;
2268
	}
2269
 
2270
	$query = "update counter set co_task = $ta_num";
2271
 
2272
	if (!QueryDB($db, $query)) {
2273
	   QueryDB($db, "rollback");
2274
	   Error("SQL-Error: $query");
2275
	   closeDB($db);
2276
	   return false;
2277
	}
2278
 
2279
	QueryDB($db, "commit");
2280
	Journal(300, "plan.php: SaveTask: task=$ta_num", $db);
2281
	closeDB($db);
2282
	return true;
2283
}
2284
 
2285
function AddMiAdd() {
2286
	global $periode;
2287
	global $phase;
2288
	global $role;
2289
 
2290
	$al_task = $_REQUEST['al_task'];
2291
	$al_ressource = $_REQUEST['al_ressource'];
2292
	$al_hours = $_REQUEST['al_hours'];
2293
 
2294
	if ($role)
2295
	   $al_role = $_REQUEST['al_role'];
2296
 
2297
	$al_pstart = $_REQUEST['al_pstart'];
2298
 
2299
	if ($phase)
2300
	   $al_phase = $_REQUEST['al_phase'];
2301
	else
2302
	   $al_phase = 0;
2303
 
2304
	$al_hours = str_replace(",", ".", $al_hours);
2305
 
2306
	if ($al_hours <= 0 || $al_hours > 99.999) {
2307
	   Error("Error: Die Projekttage (PT) m&uuml;ssen im Bereich 1 bis 99,999 sein!<br>\n");
2308
	   return false;
2309
	}
2310
 
2311
	$db = OpenDB();
2312
	$query = "select co_allocation from counter";
2313
	$result = QueryDB($db, $query);
2314
 
2315
	if (!$result) {
2316
	   closeDB($db);
2317
	   return false;
2318
	}
2319
 
2320
	$data = fetchDB($result, 0);
2321
	$co_allocation = $data[0] + 1;
2322
	$mon = gmdate("n", $al_pstart);
2323
	$year = gmdate("Y", $al_pstart);
2324
 
2325
	switch ($periode) {
2326
	   case 1: $al_pduration = 364; break;
2327
	   case 2: $al_pduration = 91; break;
2328
	   case 3: $al_pduration = daysinmonth($mon, $year); break;
2329
	   case 4: $al_pduration = 1; break;
2330
	   default: $al_pduration = daysinmonth($mon, $year); break;
2331
	}
2332
 
2333
	QueryDB($db, "begin");
2334
 
2335
	if (!$phase)
2336
	   $al_phase = 0;
2337
 
2338
	$query = "insert into allocation (al_num, al_task, al_ressource,";
2339
 
2340
	if ($role)
2341
	   $query .= "al_hours, al_phase, al_role, al_pstart, al_pduration) ";
2342
	else
2343
	   $query .= "al_hours, al_phase, al_pstart, al_pduration) ";
2344
 
2345
	$query .= "values ($co_allocation, $al_task,";
2346
 
2347
	if ($role)
2348
	   $query .= "$al_ressource, $al_hours, $al_phase, $al_role,";
2349
	else
2350
	   $query .= "$al_ressource, $al_hours, $al_phase, ";
2351
 
2352
	$query .= "$al_pstart, $al_pduration)";
2353
	$result = QueryDB($db, $query);
2354
 
2355
	if (!$result) {
2356
	   QueryDB($db, "rollback");
2357
	   closeDB($db);
2358
	   return false;
2359
	}
2360
 
2361
	$query = "update counter set co_allocation = $co_allocation";
2362
	$result = QueryDB($db, $query);
2363
 
2364
	if (!$result) {
2365
	   QueryDB($db, "rollback");
2366
	   closeDB($db);
2367
	   return false;
2368
	}
2369
 
2370
	QueryDB($db, "commit");
2371
	Journal(202, "plan.php: AddMiAdd: task=$al_task; ressource=$al_ressource", $db);
2372
	closeDB($db);
2373
	return true;
2374
}
2375
 
2376
function AddMiDel($al_num) {
2377
	global $unum;
2378
	global $rstufe;
2379
 
2380
	$db = OpenDB();
2381
	$query = "delete from allocation where al_num = $al_num";
2382
	$result = TQueryDB($db, $query);
2383
 
2384
	if (!$result) {
2385
	   closeDB($db);
2386
	   return false;
2387
	}
2388
 
2389
	Journal(105, "plan.php: AddMiDel: al_num=$al_num", $db);
2390
	closeDB($db);
2391
	return true;
2392
}
2393
 
2394
# Folgende Funktion ermittelt die Summe aller Planwerte eines bestimmten
2395
# Mitarbeiters in einer bestimmten Periode.
2396
#
2397
function GetRessource($db, $mi_num, $periode) {
2398
	$mon = gmdate("n", $periode);
2399
	$year = gmdate("Y", $periode);
2400
	$per_start = gmmktime(0, 0, 0, $mon, 1, $year);
2401
	$per_end = gmmktime(0, 0, 0, $mon, daysinmonth($mon, $year), $year);
2402
	$query = "select sum(al_hours) from allocation, task, plan where ";
2403
	$query .= "ta_num = al_task and pl_num = ta_plnum and pl_status in (2,4) and ";
2404
	$query .= "al_ressource = $mi_num and al_pstart between $per_start and $per_end";
2405
 
2406
	if (!($result = QueryDB($db, $query)))
2407
	   return -1;
2408
 
2409
	$data = fetchDB($result, 0);
2410
	return $data[0];
2411
}
2412
 
2413
function PrintMa($db, $dstart, $dend, $al_task, $color, $pl_num, $ressource, $lock=false) {
2414
	global $periode;
2415
	global $einheit;
2416
	global $menu;
2417
	global $phase;
2418
	global $role;
2419
	global $verrmodul;
2420
	global $stdwhg;
2421
	global $ab_datum;
2422
	global $rstufe;
2423
 
2424
	$nav = "pl_num=$pl_num&al_task=$al_task&menu=$menu&headline=20";
2425
	$query = "select am_num, am_task, am_ressource, am_hours, am_pstart,";
2426
	$query .= "am_pduration, am_role, am_krnum, am_nname, am_vname, am_phase ";
2427
	$query .= "from allocmi where am_task = $al_task order by ";
2428
	$query .= "am_nname, am_vname, am_pstart";
2429
	$erg = QueryDB($db, $query);
2430
 
2431
	if (!$erg)
2432
	   return 0;
2433
 
2434
	$erganz = numrowsDB($erg);
2435
	$ergrow = 0;
2436
	$oressource = 0;
2437
	$dt = 0;
2438
	$sum = 0;
2439
	$total = 0;
2440
	$brutto = 0;
2441
 
2442
	while ($ergrow < $erganz) {
2443
	   $data = fetchDB($erg, $ergrow);
2444
	   $am_num = $data[0];
2445
	   $am_task = $data[1];
2446
	   $am_ressource = $data[2];
2447
	   $am_hours = $data[3];
2448
	   $am_pstart = $data[4];
2449
	   $am_pduration = $data[5];
2450
	   $am_role = $data[6];
2451
	   $am_krnum = $data[7];
2452
	   $am_nname = $data[8];
2453
	   $am_vname = $data[9];
2454
	   $am_phase = $data[10];
2455
 
2456
	   # Wenn das Verrechnungsmodul aktiv ist, benoetigen wir den
2457
	   # Tagsatz des Mitarbeiters.
2458
	   if ($oressource != $am_ressource) {
2459
	      if ($oressource != 0) {
2460
	         $ed = GetEDate($einheit, $ta_start, $ta_duration);
2461
 
2462
		 if ($dt < $ed) {
2463
		    while (PerDateComp($dt, $ed) >= 0) {
2464
		       if ($oressource == $ressource) {
2465
			  $res_hours = GetRessource($db, $ressource, $dt);
2466
			  $pts = GetPT($dt);
2467
			  $mon = gmdate("n", $dt);
2468
			  $year = gmdate("Y", $dt);
2469
			  $nm = "dt_0_" . (string)$mon;
2470
			  $nm .= "_" . (string)$year;
2471
 
2472
			  if ($dt > $ab_datum || $rstufe == 1) {
2473
			     echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6 ";
2474
			     echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
2475
			  } else {
2476
			     echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
2477
			  }
2478
		       }
2479
		       else
2480
			  echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
2481
 
2482
		       $dt = IncDate($periode, $dt);
2483
		    }
2484
		 }
2485
 
2486
		 while (PerDateComp($dt, $dend) >= 0) {
2487
		    $dt = IncDate($periode, $dt);
2488
		    echo "<td class=\"sel\">&nbsp;</td>";
2489
		 }
2490
 
2491
		 printf ("<td class=\"selnum\"><b>%s</b></td>\n", FormatNum($sum, 3));
2492
		 $total += $sum;
2493
 
2494
		 if ($verrmodul) {
2495
		    echo "<td class=\"sel\">&nbsp;</td>";
2496
		    printf ("<td class=\"selnum\">%s</td>", FormatNum($brutto, 2));
2497
		    echo "<td class=\"sel\">&nbsp;</td>";
2498
		    echo "<td class=\"sel\">&nbsp;</td>";
2499
	         }
2500
 
2501
		 $sum = 0;
2502
		 $brutto = 0;
2503
		 echo "</tr>\n";
2504
	      }
2505
 
2506
	      # Starrer Zeilenbegin ...
2507
	      echo "<tr>\n";
2508
	      # Button
2509
	      echo "<td class=\"selakt\">";
2510
 
2511
	      if (!$lock && $am_ressource == $ressource) {
2512
		 echo "<a name=\"edit\"></a>\n";		# Einsprungpunkt
2513
		 echo "<form name=\"PrintMa\" action=\"plan.php\" method=\"post\">\n";
2514
		 echo "<input type=\"hidden\" name=\"pl_num\" value=\"$pl_num\">\n";
2515
		 echo "<input type=\"hidden\" name=\"ressource\" value=\"$am_ressource\">\n";
2516
		 echo "<input type=\"hidden\" name=\"ta_num\" value=\"$al_task\">\n";
2517
		 echo "<input type=\"hidden\" name=\"al_phase\" value=\"$am_phase\">\n";
2518
		 echo "<input type=\"hidden\" name=\"al_role\" value=\"$am_krnum\">\n";
2519
		 echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
2520
		 echo "<input type=\"hidden\" name=\"headline\" value=\"20\">\n";
2521
		 echo "<input type=\"hidden\" name=\"func\" value=\"SaveUpMa\">\n";
2522
/*		 echo "<button type=\"submit\" name=\"submit\">";
2523
		 echo "<img src=\"image/new.png\" border=0 alt=\"Speichern\">";
2524
		 echo "</button>\n";
2525
*/
2526
		 ButtonImage("filesave.png", "PrintMa", "Speichern");
2527
	      } else if (!$lock) {
2528
	         echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php',";
2529
		 echo "'ressource=$am_ressource&func=UpdateMa&$nav#edit')\">";
2530
		 echo "<img src=\"image/edit.png\" border=0 alt=\"Update\"></a>";
2531
	         echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php',";
2532
		 echo "'ta_num=$am_task&ressource=$am_ressource&func=AskDeleteMa&$nav')\">";
2533
		 echo "<img src=\"image/editdelete.png\" border=0 alt=\"Loeschen\"></a>";
2534
	      } else
2535
	         echo "&nbsp;";
2536
 
2537
	      echo "</td>\n";
2538
	      # Nummerierung
2539
              echo "<td class=\"sel\">&nbsp;</td>\n";
2540
	      # Ressource
2541
	      echo "<td colspan=2 class=\"sel\" width=\"20%\"> </td>\n";
2542
	      echo "<td class=\"sel\"><i>$am_nname $am_vname";
2543
 
2544
	      if ($role)
2545
	         echo ", $am_role";
2546
 
2547
	      echo "</i></td>\n";
2548
	      # Tasklaenge mit Einheit
2549
	      echo "<td colspan=3 class=\"sel\">&nbsp;</td>\n";
2550
	      # Mitarbeiterrolle
2551
 
2552
#	      if ($role)
2553
#	         echo "<td class=\"sel\">$am_role</td>\n";
2554
 
2555
	      # Zellen bis zum Taskanfang schreiben
2556
	      $query = "select ta_start, ta_duration from task where ta_num = $am_task";
2557
 
2558
	      if (!($res = QueryDB($db, $query))) {
2559
		 Error(GetMessage($db, 339, "Keinen dazupassenden Task gefunden!"));
2560
		 return 0;
2561
	      }
2562
 
2563
	      $data = fetchDB($res, 0);
2564
	      $ta_start = $data[0];
2565
	      $ta_duration = $data[1];
2566
	      $dt = $dstart;
2567
 
2568
	      while (PerDateComp($dt, $ta_start) > 0) {
2569
		 $dt = IncDate($periode, $dt);
2570
		 echo "<td class=\"sel\">&nbsp;</td>";
2571
	      }
2572
 
2573
	      # Falls wir Eingabezeilen benoetigen die vor dem ersten
2574
	      # gespeicherten Task beginnen, schreiben wir diese hier.
2575
	      if ($ressource == $am_ressource && $ta_start < $am_pstart) {
2576
		 while (PerDateComp($dt, $am_pstart) > 0) {
2577
		    $res_hours = GetRessource($db, $ressource, $dt);
2578
		    $pts = GetPT($dt);
2579
		    $mon = gmdate("n", $dt);
2580
		    $year = gmdate("Y", $dt);
2581
		    $nm = "dt_0_" . (string)$mon;
2582
		    $nm .= "_" . (string)$year;
2583
 
2584
		    if ($dt > $ab_datum || $rstufe == 1) {
2585
		       echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6 ";
2586
		       echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
2587
		    } else
2588
		       echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
2589
 
2590
		    $dt = IncDate($periode, $dt);
2591
		 }
2592
	      }
2593
 
2594
	      $oressource = $am_ressource;
2595
	   }
2596
 
2597
	   # Rest der Zeile schreiben
2598
	   $PerStart = GetPeriode($am_pstart);
2599
	   $pyear = gmdate("Y", $am_pstart);
2600
	   $PerAkt = GetPeriode($dt);
2601
	   $tyear = gmdate("Y", $dt);
2602
 
2603
	   # Wenn das Verrechnungsmodul aktiv ist, benoetigen wir den
2604
	   # Tagsatz des Mitarbeiters zum aktuellen Datum.
2605
	   if ($verrmodul) {
2606
	      $query = "select tg_amount, tg_whg from tagsatz where ";
2607
	      $query .= "tg_minum = $am_ressource and tg_valid_from <= to_date('" . gmdate("d.m.Y", $dt) . "','DD.MM.YYYY') and ";
2608
	      $query .= "(tg_valid_to >= to_date('" . gmdate("d.m.Y", GetUltimo($dt)) . "','DD.MM.YYYY') or tg_valid_to is NULL) ";
2609
	      $query .= "order by tg_valid_from, tg_valid_to";
2610
 
2611
	      if (!($resver = QueryDB($db, $query)))
2612
	         return 0;
2613
 
2614
	      if (numrowsDB($resver) > 0) {
2615
	         $data = fetchDB($resver, 0);
2616
		 $tg_amount = $data[0];
2617
		 $tg_whg = $data[1];
2618
	      } else {
2619
	         $tg_amount = 0.0;
2620
		 $tg_whg = $stdwhg;
2621
	      }
2622
	   }
2623
 
2624
	   if ($ressource == $am_ressource) {
2625
	      $tm = gmdate("j.n.Y", $dt);
2626
	      $ad = explode(".", $tm);
2627
	      $res_hours = GetRessource($db, $ressource, $dt);
2628
	      $pts = GetPT($dt);
2629
 
2630
	      if ($PerStart == $PerAkt) {
2631
		 $nm = "dt_" . (string)$am_num . "_" . (string)$ad[1];
2632
		 $nm .= "_" . (string)$ad[2];
2633
 
2634
		 if ($dt > $ab_datum || $rstufe == 1) {
2635
		    printf("<td class=\"sel\"><input type=\"text\" name=\"$nm\" value=\"%s\" size=6 maxlength=6 ", FormatNum($am_hours, 3));
2636
		    echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
2637
		 } else {
2638
		    echo "<td style=\"background-color: #$color; border: 1px solid black; text-align: right;\">";
2639
		    echo FormatNum($am_hours, 3) . "</td>\n";
2640
		 }
2641
 
2642
		 $sum += $am_hours;
2643
		 $brutto += $am_hours * $tg_amount;
2644
		 $ergrow++;
2645
	      } else {
2646
		 $nm = "dt_0_" . (string)$ad[1];
2647
		 $nm .= "_" . (string)$ad[2];
2648
 
2649
		 if ($dt > $ab_datum || $rstufe == 1) {
2650
		    echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6 ";
2651
		    echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
2652
		 } else
2653
		    echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
2654
	      }
2655
	   } else {
2656
	      if ($PerStart == $PerAkt && $pyear == $tyear) {
2657
		 printf ("<td style=\"background-color: #$color; border: 1px solid black; text-align:right;\">%s</td>\n", FormatNum($am_hours, 3));
2658
		 $sum += $am_hours;
2659
		 $brutto += $am_hours * $tg_amount;
2660
		 $ergrow++;
2661
	      } else
2662
		 echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
2663
	   }
2664
 
2665
	   $dt = IncDate($periode, $dt);
2666
	}
2667
 
2668
	if ($erganz > 0) {
2669
	   $ed = GetEDate($einheit, $ta_start, $ta_duration);
2670
 
2671
	   if ($dt < $ed) {
2672
	      while (PerDateComp($dt, $ed) >= 0) {
2673
		 if ($oressource == $ressource) {
2674
		    $res_hours = GetRessource($db, $am_ressource, $dt);
2675
		    $pts = GetPT($dt);
2676
		    $mon = gmdate("n", $dt);
2677
		    $year = gmdate("Y", $dt);
2678
		    $nm = "dt_0_" . (string)$mon;
2679
		    $nm .= "_" . (string)$year;
2680
 
2681
		    if ($dt > $ab_datum || $rstufe == 1) {
2682
		       echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6 \n";
2683
		       echo "onChange=\"javascript:CheckOverload(this, $res_hours, $pts)\"></td>\n";
2684
		    } else
2685
		       echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
2686
		 }
2687
		 else
2688
		    echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
2689
 
2690
	         $dt = IncDate($periode, $dt);
2691
	      }
2692
	   }
2693
 
2694
	   while (PerDateComp($dt, $dend) >= 0) {
2695
	      $dt = IncDate($periode, $dt);
2696
	      echo "<td class=\"sel\">&nbsp;</td>";
2697
	   }
2698
 
2699
	   printf ("<td class=\"selnum\"><b>%s</b></td>\n", FormatNum($sum, 3));
2700
	   $total += $sum;
2701
 
2702
	   if ($verrmodul) {
2703
	      echo "<td class=\"sel\">&nbsp;</td>";
2704
	      printf ("<td class=\"selnum\">%s</td>", FormatNum($brutto, 2));
2705
	      echo "<td class=\"sel\">&nbsp;</td>";
2706
	      echo "<td class=\"sel\">&nbsp;</td>";
2707
	   }
2708
 
2709
	   echo "</tr>\n";
2710
 
2711
	   if ($am_ressource == $ressource)
2712
	      echo "</form>\n";
2713
	}
2714
 
2715
	return $total;
2716
}
2717
 
2718
# Liefert den Level des Tasks vor dem angegebenen. Existiert kein Task
2719
# davor, wird -1 zurueckgegeben.
2720
#
2721
function GetPreviousLevel($db, $ta_num) {
2722
	$query = "select ta_id, ta_plnum from task where ta_num = $ta_num";
2723
 
2724
	if (!($result = QueryDB($db, $query)))
2725
	   return -1;
2726
 
2727
	$data = fetchDB($result, 0);
2728
	$ta_id = $data[0];
2729
	$ta_plnum = $data[1];
2730
	$query = "select ta_level from task where ta_plnum = $ta_plnum ";
2731
	$query .= "and ta_num != $ta_num and ta_id < $ta_id ";
2732
	$query .= "order by ta_id desc";
2733
 
2734
	if (!($result = QueryDB($db, $query)))
2735
	   return -1;
2736
 
2737
	if (numrowsDB($result) <= 0)
2738
	   return -1;
2739
 
2740
	$data = fetchDB($result, 0);
2741
	return $data[0];
2742
}
2743
 
2744
# Liefert den Level des Tasks nach dem angegebenen. Existiert kein Task
2745
# danach, wird -1 zurueckgegeben.
2746
#
2747
function GetNextLevel($db, $ta_num) {
2748
	$query = "select ta_id, ta_plnum from task where ta_num = $ta_num";
2749
 
2750
	if (!($result = QueryDB($db, $query)))
2751
	   return -1;
2752
 
2753
	$data = fetchDB($result, 0);
2754
	$ta_id = $data[0];
2755
	$ta_plnum = $data[1];
2756
	$query = "select ta_level from task where ta_plnum = $ta_plnum ";
2757
	$query .= "and ta_num != $ta_num and ta_id > $ta_id ";
2758
	$query .= "order by ta_id";
2759
 
2760
	if (!($result = QueryDB($db, $query)))
2761
	   return -1;
2762
 
2763
	if (numrowsDB($result) <= 0)
2764
	   return -1;
2765
 
2766
	$data = fetchDB($result, 0);
2767
	return $data[0];
2768
}
2769
 
2770
# Folgende Funktion liefert den vorhergehenden, oder den nachfolgenden Task,
2771
# mit welchem getauscht werden kann. Es handelt sich also um einen Task
2772
# des selben Levels.
2773
#
2774
function GetReplaceTask($db, $ta_num, $dir) {
2775
	$query = "select ta_id, ta_plnum, ta_level from task where ta_num = $ta_num";
2776
 
2777
	if (!($result = QueryDB($db, $query)))
2778
	   return -1;
2779
 
2780
	$data = fetchDB($result, 0);
2781
	$ta_id = $data[0];
2782
	$ta_plnum = $data[1];
2783
	$ta_level = $data[2];
2784
	$query = "select ta_num from task where ta_plnum = $ta_plnum ";
2785
	$query .= "and ta_num != $ta_num and ta_level = $ta_level and ta_id ";
2786
 
2787
	if ($dir > 0)		// 0 = Rueckwaerts, 1 = Vorwaerts
2788
	   $query .= "> ";
2789
	else
2790
	   $query .= "< ";
2791
 
2792
	$query .= "$ta_id order by ta_id";
2793
 
2794
	if ($dir == 0)
2795
	   $query .= " desc";
2796
 
2797
	if (!($result = QueryDB($db, $query)))
2798
	   return -1;
2799
 
2800
	if (numrowsDB($result) <= 0)
2801
	   return -1;
2802
 
2803
	$data = fetchDB($result, 0);
2804
	return $data[0];
2805
}
2806
 
2807
# Die Funktion tauscht die Reihen folge eines Tasks, so das ein Task nach
2808
# oben oder unten verschoben werden kann.
2809
#
2810
function MoveTask($ta_num, $dir) {
2811
	$db = OpenDB();
2812
	$query = "select ta_id, ta_plnum, ta_level from task where ta_num = $ta_num";
2813
 
2814
	if (!($result = QueryDB($db, $query))) {
2815
	   closeDB($db);
2816
	   return false;
2817
	}
2818
 
2819
	$data = fetchDB($result, 0);
2820
	$ta_id = $data[0];
2821
	$ta_plnum = $data[1];
2822
	$ta_level = $data[2];
2823
	$query = "select ta_num, ta_id from task where ta_plnum = $ta_plnum and ";
2824
	$query .= "ta_level = $ta_level and ";
2825
 
2826
	if ($dir < 0) {
2827
	   $query .= "ta_num != $ta_num and ta_id < $ta_id ";
2828
	   $query .= "order by ta_id desc";
2829
	} else {
2830
	   $query .= "ta_num != $ta_num and ta_id > $ta_id ";
2831
	   $query .= "order by ta_id";
2832
	}
2833
 
2834
	if (!($result = QueryDB($db, $query))) {
2835
	   closeDB($db);
2836
	   return false;
2837
	}
2838
 
2839
	if (numrowsDB($result) <= 0) {
2840
	   Error("Interner Fehler: In der gew&auml;hlten Richtung existiert kein geeigneter Task!");
2841
	   closeDB($db);
2842
	   return false;
2843
	}
2844
 
2845
	$data = fetchDB($result, 0);
2846
	$ta_num1 = $data[0];
2847
	$ta_id1 = $data[1];
2848
 
2849
	# Tauschen der Tasks
2850
	QueryDB($db, "begin");
2851
	$query = "update task set ta_id = -1 where ta_num = $ta_num";
2852
 
2853
	if (!QueryDB($db, $query)) {
2854
	   QueryDB($db, "rollback");
2855
	   closeDB($db);
2856
	   return false;
2857
	}
2858
 
2859
	$query = "update task set ta_id = $ta_id where ta_num = $ta_num1";
2860
 
2861
	if (!QueryDB($db, $query)) {
2862
	   QueryDB($db, "rollback");
2863
	   closeDB($db);
2864
	   return false;
2865
	}
2866
 
2867
	$query = "update task set ta_id = $ta_id1 where ta_num = $ta_num";
2868
 
2869
	if (!QueryDB($db, $query)) {
2870
	   QueryDB($db, "rollback");
2871
	   closeDB($db);
2872
	   return false;
2873
	}
2874
 
2875
	QueryDB($db, "commit");
2876
	closeDB($db);
2877
	return true;
2878
}
2879
 
2880
# Folgenden Funktionen erlauben die Erfassung von Plaenen, wobei die
2881
# einzelnen Perioden dargestellt werden, welche mit individuellen Zeiten
2882
# gefuellt werden koennen.
2883
# Es wird immer der Zeitraum vom Start des Projekts bis zu seinem Ende
2884
# dargestellt. Bei sehr langen Projekten oder sehr kleinen Perioden, kann
2885
# die Tabelle durchaus sehr breit werden.
2886
#
2887
function PlanPeriode($pl_num, $ta_num, $ressource, $new=false, $lock=false) {
2888
	global $rstufe;
2889
	global $unum;
2890
	global $periode;
2891
	global $verteil;
2892
	global $einheit;
2893
	global $menu;
2894
	global $phase;
2895
	global $dtformatshort;
2896
	global $role;
2897
	global $pmlight;
2898
	global $stdwhg;
2899
	global $verrmodul;
2900
	global $ab_datum;
2901
 
2902
	if ($pl_num <= 0) {
2903
	   Error(GetMessage(-1, 327, "Interner Fehler: Es wurde keine Plannummer an \"PlanPeriode\" &uuml;bergeben!"));
2904
	   return;
2905
	}
2906
 
2907
	if ($rstufe != 1 && $rstufe != 2) {
2908
	   Error(GetMessage(-1, 50, "Berechtigungsfehler!"));
2909
	   return;
2910
	}
2911
 
2912
	if (!isset($ta_num))
2913
	   $ta_num = 0;
2914
 
2915
	if (!isset($ressource))
2916
	   $ressource = 0;
2917
	else if ($ressource > 0)
2918
	   $tanum = $ta_num;
2919
 
2920
	if ($lock && $new)
2921
	   $new = false;
2922
 
2923
	$db = OpenDB();
2924
	$query = "select pr_name, pl_prnum, mi_nname, mi_vname from ";
2925
	$query .= "plan, project, mitarbeiter where pl_num = $pl_num and ";
2926
	$query .= "pr_num = pl_prnum and mi_num = pr_pl";
2927
	$result = QueryDB($db, $query);
2928
 
2929
	if (!$result) {
2930
	   closeDB($db);
2931
	   return;
2932
	}
2933
 
2934
	$data = fetchDB($result, 0);
2935
	$pr_name = $data[0];
2936
	$pl_prnum = $data[1];
2937
	$mi_nname = $data[2];
2938
	$mi_vname = $data[3];
2939
 
2940
	# Ermitteln des letzten Abschlussdatums fuer das aktuelle Projekt
2941
	$query = "select ab_datum from abschluss where ";
2942
	$query .= "ab_prnum = $pl_prnum ";
2943
	$query .= "order by ab_datum desc";
2944
 
2945
	if (!($resab = QueryDB($db, $query))) {
2946
	   closeDB($db);
2947
	   return;
2948
	}
2949
 
2950
	if (numrowsDB($resab) > 0) {
2951
	   $data = fetchDB($resab, 0);
2952
	   $ab_datum = $data[0];
2953
	} else
2954
	   $ab_datum = 0;
2955
 
2956
	# Zeichnen der fixen Kopfspalten.
2957
        if ($new) {
2958
           $id = $_REQUEST['ta_num'];
2959
 
2960
           if (!isset($id))
2961
              $id = 0;
2962
?>
2963
<form name="plan" action="plan.php" method="post">
2964
<input type="hidden" name="menu" value="<? echo "$menu"; ?>">
2965
<input type="hidden" name="headline" value="20">
2966
<input type="hidden" name="pl_num" value="<? echo "$pl_num"; ?>">
2967
<?php
2968
        }
2969
 
2970
	# Eingabezeile fuer den Plankommentar anzeigen.
2971
	$query = "select pl_comment from plan where pl_num = $pl_num";
2972
 
2973
	if (!($result = QueryDB($db, $query))) {
2974
	   closeDB($db);
2975
	   return;
2976
	}
2977
 
2978
	$data = fetchDB($result, 0);
2979
	$pl_comment = $data[0];
2980
 
2981
	if (!$lock && !$new) {
2982
	   echo "<form name=\"plcomment\" aktion=\"plan.php\" method=\"post\">\n";
2983
	   echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
2984
	   echo "<input type=\"hidden\" name=\"headline\" value=\"20\">\n";
2985
	   echo "<input type=\"hidden\" name=\"pl_num\" value=\"$pl_num\">\n";
2986
	   echo "<input type=\"hidden\" name=\"func\" value=\"COMMENT\">\n";
2987
	}
2988
 
2989
	echo "<table class=\"input\">\n";
2990
	echo "<tr><td>" . GetMessage($db, 1, "Projekt:") . "</td><td>$pl_prnum $pr_name</td></tr>\n";
2991
	echo "<tr><td>" . GetMessage($db, 328, "Projektleiter:") . "</td><td>$mi_nname $mi_vname</td></tr>\n";
2992
	echo "<tr><td>" . GetMessage($db, 19, "Kommentar:") . "</td>\n";
2993
 
2994
	if (!$lock && !$new) {
2995
	   if ($pmlight)
2996
	      $class = " class=\"inputmust\"";
2997
 
2998
	   echo "<td><input type=\"text\"$class name=\"pl_comment\" ";
2999
	   echo "value=\"" . htmlentities($pl_comment) . "\" onChange=\"javascript:document.plcomment.submit()\" ";
3000
 
3001
	   if ($pmlight)
3002
	      echo "size=\"30\" maxlength=\"30\"></td>\n";
3003
	   else
3004
	      echo "size=\"80\" maxlength=\"255\"></td>\n";
3005
	} else {
3006
	   echo "<td>$pl_comment</td>\n";
3007
	}
3008
 
3009
	echo "</tr></table>\n";
3010
 
3011
	if (!$lock && !$new)
3012
	   echo "</form>\n";
3013
 
3014
	$nav = "pl_num=$pl_num&menu=$menu&headline=20";
3015
?>
3016
<table class="sel">
3017
   <tr>
3018
      <th class="sel" rowspan=2>Akt</th>
3019
      <th class="sel" rowspan=2>Num.</th>
3020
      <th class="sel" colspan=3 rowspan=2>
3021
         <table border=0 width="100%"><tr><td align="center" colspan=2><? Output($db, 333, "Taskname"); ?></td></tr>
3022
	    <tr><td>&nbsp;</td><td align="right"><? Output($db, 329, "Ressource"); ?></td></tr>
3023
	 </table>
3024
      </th>
3025
      <th class="sel" rowspan=2 colspan=3>
3026
         <table border=0 width="100%"><tr><td align="center" colspan=3><? Output($db, 334, "Arbeit"); ?></td></tr>
3027
	    <td align="center"><? Output($db, 330, "Dauer"); ?></td>
3028
	    <td align="center"><? Output($db, 331, "Start"); ?></td>
3029
	    <td align="center"><? Output($db, 332, "Ende"); ?></td></tr>
3030
	 </table>
3031
      </th>
3032
<?
3033
#	if ($role)
3034
#	   echo "      <th class=\"sel\" rowspan=2>" . GetMessage($db, 335, "Rolle") . "</th>\n";
3035
 
3036
	# Ermitteln des Projektstarts um den Tabellenkopf fertig zu schreiben.
3037
	$query = "select ta_start, ta_duration, ta_meeting from task where ";
3038
	$query .= "ta_plnum = $pl_num order by ta_start";
3039
	$resta = QueryDB($db, $query);
3040
 
3041
	if (!$resta) {
3042
	   closeDB($db);
3043
	   return;
3044
	}
3045
 
3046
	$numrows = numrowsDB($resta);
3047
	$row = 0;
3048
	$fdate = 0;
3049
	$ldate = 0;
3050
 
3051
	while ($row < $numrows) {
3052
	   $data = fetchDB($resta, $row);
3053
	   $ta_start = $data[0];
3054
	   $ta_duration = $data[1];
3055
	   $ta_meeting = $data[2];
3056
 
3057
	   if ($row == 0)
3058
	      $fdate = $ta_start;
3059
 
3060
	   if ($ta_meeting)
3061
	      $ed = $ta_start;
3062
           else
3063
	      $ed = GetEDate($einheit, $ta_start, $ta_duration);
3064
 
3065
	   if ($ed > $ldate)
3066
	      $ldate = $ed;
3067
 
3068
	   $row++;
3069
	}
3070
 
3071
	# Erstellen des restlichen Tabellenkopfs ...
3072
	$tm = gmdate("j.n.Y", $fdate);
3073
	$dt = explode(".", $tm);
3074
	$smon = $dt[1];
3075
	$syear = $dt[2];
3076
	$dt = $fdate;
3077
	$cols = 0;
3078
	$tbcols = 1;
3079
	$oyear = $syear;
3080
 
3081
	while (PerDateComp($dt, $ldate) > 0) {
3082
	   $syear = gmdate("Y", $dt);
3083
 
3084
	   if ($oyear != $syear) {
3085
	      if ($cols <= 1)
3086
	         echo "<th class=\"sel\">$oyear</th>\n";
3087
	      else
3088
	         echo "<th class=\"sel\" colspan=$cols>$oyear</th>\n";
3089
 
3090
	      $oyear = $syear;
3091
	      $cols = 0;
3092
	   }
3093
 
3094
	   $cols++;
3095
	   $tbcols++;
3096
	   $dt = IncDate($periode, $dt);
3097
	}
3098
 
3099
	$cols++;
3100
 
3101
	if ($cols <= 1)
3102
	   echo "<th class=\"sel\">$syear</th>\n";
3103
	else
3104
	   echo "<th class=\"sel\" colspan=$cols>$syear</th>\n";
3105
 
3106
	# Ueberschrift der letzten Spalte, welche die Summierungen der
3107
	# geplanten Aufwaende enthaelt.
3108
	echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 337, "Summe") . "<br>" . GetMessage($db, 336, "Aufwand") . "</th>\n";
3109
 
3110
	if ($verrmodul) {
3111
	   $query = "select wh_whg from key_whg where wh_num = $stdwhg";
3112
 
3113
	   if (!($reswhg = QueryDB($db, $query))) {
3114
	      closeDB($db);
3115
	      return;
3116
	   }
3117
 
3118
	   $data = fetchDB($reswhg, 0);
3119
	   $whg = $data[0];
3120
	   echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 388, "Risiko<br>in&nbsp;%%") . "</th>\n";
3121
	   echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 385, "Wert<br>ini&nbsp;%s", $whg) . "</th>\n";
3122
	   echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 386, "Risiko&minus;<br>aufschlag") . "</th>\n";
3123
	   echo "<th class=\"sel\" rowspan=2>" . GetMessage($db, 387, "Summen<br>ini&nbsp;%s", $whg) . "</th>\n";
3124
	}
3125
 
3126
	echo "</tr>\n";
3127
	$dt = $fdate;
3128
 
3129
	while (PerDateComp($dt, $ldate) >= 0) {
3130
	   printf ("<th class=\"sel\">%s</th>\n", GetStrMonth($smon));
3131
	   $smon++;
3132
	   $dt = IncDate($periode, $dt);
3133
 
3134
	   if ($smon > 12) {
3135
	      $syear++;
3136
	      $smon = 1;
3137
	   }
3138
	}
3139
 
3140
	echo "</tr>\n";
3141
 
3142
	# Neues Projektobjekt. Es enthaelt die Tasknummerierung und Typen-
3143
	# zuweisung der einzelnen Tasks.
3144
	$project = new TaskNum($pl_num, $db);
3145
 
3146
	if (!$project->GetStatus()) {
3147
	   Error(GetMessage($db, 338, "PlanPeriode: Interner Fehler beim Initialisieren des Objekts \"TaskNum\"!"));
3148
	   closeDB($db);
3149
	   return;
3150
	}
3151
 
3152
	# Nun muessen wir die Tabelle mit Inhalten fuellen
3153
	$query = "select ta_num, ta_id, ta_name, ta_meeting, ta_start,";
3154
	$query .= "ta_duration, ta_level, ta_phase, ta_color, ta_plnum, ta_risiko ";
3155
	$query .= "from task where ta_plnum = $pl_num order by ta_id";
3156
	$result = QueryDB($db, $query);
3157
 
3158
	if (!$result) {
3159
	   closeDB($db);
3160
	   return;
3161
	}
3162
 
3163
	$numrows = numrowsDB($result);
3164
 
3165
	if ($numrows == 0) {
3166
	   $ta_id = 0;
3167
	   $ta_plnum = $pl_num;
3168
	}
3169
 
3170
	$row = 0;
3171
	$snum = "1";
3172
	$ma = false;
3173
        $done = false;
3174
	$total = 0;
3175
	$brutto_sum = 0;
3176
	$netto_sum = 0;
3177
	$risiko_sum = 0;
3178
 
3179
	while ($row < $numrows) {
3180
	   if (!$ma) {
3181
	      $data = fetchDB($result, $row);
3182
	      $ta_num = $data[0];
3183
	      $ta_id = $data[1];
3184
	      $ta_name = $data[2];
3185
	      $ta_meeting = $data[3];
3186
	      $ta_start = $data[4];
3187
	      $ta_duration = $data[5];
3188
	      $ta_level = $data[6];
3189
	      $ta_phase = $data[7];
3190
	      $ta_color = $data[8];
3191
	      $ta_plnum = $data[9];
3192
	      $ta_risiko = $data[10];
3193
 
3194
	      # Der Task muss oben summiert sein, also in der Taskzeile
3195
	      # selbst.
3196
	      if ($ta_level == 1) {
3197
	         $query = "select ta_num, ta_level, ta_risiko from task where ";
3198
	         $query .= "ta_plnum = $ta_plnum and ta_id > $ta_id and ";
3199
	         $query .= "ta_meeting = 0 order by ta_id";
3200
 
3201
	         if (!($resta = QueryDB($db, $query))) {
3202
	            closeDB($db);
3203
	            return;
3204
		 }
3205
 
3206
		 $men = numrowsDB($resta);
3207
		 $i = 0;
3208
		 $al_hours = 0;
3209
 
3210
		 if ($verrmodul) {
3211
	            $risc_sum = 0;
3212
		    $netto = 0;
3213
		    $brutto = 0;
3214
		 }
3215
 
3216
		 while ($i < $men) {
3217
		    $data = fetchDB($resta, $i);
3218
		    $xnum = $data[0];
3219
		    $xlevel = $data[1];
3220
		    $risc = $data[2];
3221
 
3222
		    if ($xlevel <= $ta_level)
3223
		       break;
3224
 
3225
		    # Ist das Verrechnungsmodul aktiv, benoetigen wir
3226
		    # zusaetzlich den Tagsatz des jeweiligen Mitarbeiters,
3227
		    # um die korrekten monetaeren Werte errechnen zu koennen.
3228
		    if ($verrmodul) {
3229
		       $query = "select al_hours, tg_amount from allocation ";
3230
		       $query .= "left join tagsatz on tg_minum = al_ressource ";
3231
		       $query .= "where al_task = $xnum and ";
3232
		       $query .= "extract(epoch from tg_valid_from) <= al_pstart and ";
3233
		       $query .= "(extract(epoch from tg_valid_to) >= al_pstart or tg_valid_to is NULL) ";
3234
		       $query .= "order by tg_valid_from, tg_valid_to";
3235
 
3236
		       if (!($resver = QueryDB($db, $query))) {
3237
		          closeDB($db);
3238
			  return;
3239
		       }
3240
 
3241
		       $jj = 0;
3242
		       $xx = numrowsDB($resver);
3243
 
3244
		       while ($jj < $xx) {
3245
		          $data = fetchDB($resver, $jj);
3246
			  $al_hour = $data[0];
3247
			  $tg_amount = $data[1];
3248
 
3249
			  $brutto += $tg_amount * $al_hour;
3250
			  $rs = $al_hour / 100.0 * $risc;
3251
			  $risc_sum += $rs * $tg_amount;
3252
			  $netto += ($al_hour + $rs) * $tg_amount;
3253
			  $al_hours += $al_hour;
3254
			  $jj++;
3255
		       }
3256
		    } else {
3257
		       $query = "select sum(al_hours) from allocation where ";
3258
		       $query .= "al_task = $xnum";
3259
 
3260
		       if (!($resal = QueryDB($db, $query))) {
3261
		          closeDB($db);
3262
		          return;
3263
		       }
3264
 
3265
		       $data = fetchDB($resal, 0);
3266
		       $al_hours += $data[0];
3267
		    }
3268
 
3269
		    $i++;
3270
		 }
3271
	      } else {
3272
	         if ($verrmodul) {
3273
		    $query = "select al_hours, tg_amount from allocation ";
3274
		    $query .= "left join tagsatz on tg_minum = al_ressource ";
3275
		    $query .= "where al_task = $ta_num and ";
3276
		    $query .= "extract(epoch from tg_valid_from) <= al_pstart and ";
3277
		    $query .= "(extract(epoch from tg_valid_to) >= al_pstart or tg_valid_to is NULL) ";
3278
		    $query .= "order by tg_valid_from, tg_valid_to";
3279
 
3280
		    if (!($resver = QueryDB($db, $query))) {
3281
		       closeDB($db);
3282
		       return;
3283
		    }
3284
 
3285
		    $al_hours = 0;
3286
		    $risc_sum = 0;
3287
		    $netto = 0;
3288
		    $brutto = 0;
3289
		    $jj = 0;
3290
		    $xx = numrowsDB($resver);
3291
 
3292
		    while ($jj < $xx) {
3293
		       $data = fetchDB($resver, $jj);
3294
		       $al_hour = $data[0];
3295
		       $tg_amount = $data[1];
3296
 
3297
		       $al_hours += $al_hour;
3298
		       $brutto += $al_hour * $tg_amount;
3299
		       $rs = $al_hour / 100.0 * $ta_risiko;
3300
		       $risc_sum += $rs * $tg_amount;
3301
		       $netto += ($al_hour + $rs) * $tg_amount;
3302
		       $jj++;
3303
		    }
3304
 
3305
		    $brutto_sum += $brutto;
3306
		    $risiko_sum += $risc_sum;
3307
		    $netto_sum += $netto;
3308
		 } else {
3309
	            $query = "select sum(al_hours) from allocation where ";
3310
	            $query .= "al_task = $ta_num";
3311
 
3312
		    if (!($resal = QueryDB($db, $query))) {
3313
		       closeDB($db);
3314
		       return;
3315
		    }
3316
 
3317
		    $data = fetchDB($resal, 0);
3318
		    $al_hours = $data[0];
3319
		 }
3320
	      }
3321
	   }
3322
 
3323
	   # Starrer Zeilenbegin ...
3324
	   echo "<tr>\n";
3325
	   if (!$ma) {
3326
//	      $snum = GetTaskNum($pl_num, $ta_id, $ta_level, $ta_phase, $ta_meeting, $snum, &$typ, $db);
3327
	      $snum = $project->Get_snum($row);
3328
	      $art = $project->Get_type($row);
3329
 
3330
	      if ($art == "t")
3331
		 $typ = true;
3332
	      else
3333
		 $typ = false;
3334
	   }
3335
 
3336
	   # Diverse Aktionen / Buttons
3337
	   echo "<td class=\"selakt\">";
3338
	   $cal_linkf = "";
3339
	   $cal_linkb = "";
3340
 
3341
	   if ($new && $ma) {
3342
	      echo "<a name=\"edit\"></a>\n";		# Einsprungspunkt
3343
	      echo "<input type=\"hidden\" name=\"ta_num\" value=\"$ta_num\">\n";
3344
	      echo "<input type=\"hidden\" name=\"ta_phase\" value=\"$ta_phase\">\n";
3345
	      echo "<input type=\"hidden\" name=\"func\" value=\"SaveMa\">\n";
3346
	      ButtonImage("filesave.png", "plan", "Zeile speichern");
3347
           } else if (!$ta_meeting && !$lock && $ta_level > 1 && $typ) {
3348
	      echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','edittask=$ta_num&$nav')\">";
3349
	      echo "<img src=\"image/edit.png\" border=0 alt=\"Task editieren\"></a>";
3350
	      echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','taskadd=$ta_id&ta_num=$ta_num&ta_plnum=$ta_plnum&$nav')\">";
3351
	      echo "<img src=\"image/new.png\" border=0 alt=\"Einfuegen\"></a>\n";
3352
	      echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','deletetask=$ta_num&ta_plnum=$ta_plnum&$nav')\">";
3353
	      echo "<img src=\"image/editdelete.png\" border=0 alt=\"Task loeschen\"></a>";
3354
	      $lev = GetPreviousLevel($db, $ta_num);
3355
 
3356
	      if ($lev != -1 && $lev >= $ta_level) {
3357
	         echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','moveup=$ta_num&$nav')\">";
3358
	         echo "<img src=\"image/up.png\" border=0 width=\"16\" height=\"16\" alt=\"Hinauf\">";
3359
	      }
3360
 
3361
	      $lev = GetNextLevel($db, $ta_num);
3362
 
3363
	      if ($lev != -1 && $lev >= $ta_level) {
3364
	         echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','movedown=$ta_num&$nav')\">";
3365
	         echo "<img src=\"image/down.png\" border=0 width=\"16\" height=\"16\" alt=\"Hinunter\">";
3366
	      }
3367
 
3368
	      echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','func=AllocMa&ta_num=$ta_num&$nav#edit')\">";
3369
              echo "<img src=\"image/kverbosuser.png\" border=0 width=15 height=15 alt=\"Neuer Mitarbeiter\"></a>";
3370
//	      $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)\">";
3371
//              $cal_linkb = "</a>";
3372
	   } else if (!$lock) {
3373
	      echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','edittask=$ta_num&$nav')\">";
3374
	      echo "<img src=\"image/edit.png\" border=0 alt=\"Task editieren\"></a>";
3375
	      echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','taskadd=$ta_id&ta_num=$ta_num&ta_plnum=$ta_plnum&$nav')\">";
3376
	      echo "<img src=\"image/new.png\" border=0 alt=\"Einfuegen\"></a>\n";
3377
	      echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','deletetask=$ta_num&ta_plnum=$ta_plnum&$nav')\">";
3378
	      echo "<img src=\"image/editdelete.png\" border=0 alt=\"Task loeschen\"></a>";
3379
 
3380
//	      if ($ta_meeting) {
3381
		 $lev = GetPreviousLevel($db, $ta_num);
3382
 
3383
		 if ($lev != -1 && $lev >= $ta_level) {
3384
	            echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','moveup=$ta_num&$nav')\">";
3385
	            echo "<img src=\"image/up.png\" border=0 width=\"16\" height=\"16\" alt=\"Hinauf\">";
3386
		 }
3387
 
3388
		 $lev = GetNextLevel($db, $ta_num);
3389
 
3390
		 if ($lev != -1 && $lev >= $ta_level) {
3391
	            echo "<a href=\"#\" onClick=\"javascript:MoveTo('plan.php','movedown=$ta_num&$nav')\">";
3392
	            echo "<img src=\"image/down.png\" border=0 width=\"16\" height=\"16\" alt=\"Hinunter\">";
3393
		 }
3394
//	      }
3395
	   } else
3396
	      echo "&nbsp;";
3397
 
3398
           echo "</td>\n";
3399
	   # Nummerierung
3400
	   if (!$ma) {
3401
	      if ($ta_meeting)
3402
	         echo "<td class=\"sel\"><b>$snum</b></td>\n";
3403
	      else
3404
	         echo "<td class=\"sel\">$snum</td>\n";
3405
           } else {
3406
              echo "<td class=\"sel\">&nbsp;</td>\n";
3407
           }
3408
 
3409
	   # Tasknamendarstellung abhaenging vom Level
3410
	   if (!$ma) {
3411
	      if ($ta_level == 1 || !$typ) {
3412
	         if ($ta_meeting)
3413
	            echo "<td class=\"seldkgray\" colspan=3>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
3414
	         else if ($ta_level == 1)
3415
	            echo "<td class=\"selltgray\" colspan=3>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
3416
		 else
3417
	            echo "<td class=\"selgray\" colspan=3>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
3418
	      } else {
3419
	         if ($ta_meeting)
3420
	            echo "<td class=\"sel\" width=\"10%\"> </td><td class=\"seldkgray\" colspan=2>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
3421
	         else
3422
	            echo "<td class=\"sel\" width=\"10%\"> </td><td class=\"selgray\" colspan=2>" . $cal_linkf . $ta_name . $cal_linkb . "</td>\n";
3423
	      }
3424
           } else if ($ma && $new) {
3425
              echo "<td colspan=2 class=\"sel\" width=\"20%\"> </td>\n";
3426
              echo "<td class=\"sel\"><select name=\"name\">\n";
3427
#              $query = "select mi_num, mi_vname, mi_nname from mitarbeiter ";
3428
#              $query .= "where mi_plan = true order by mi_nname, mi_vname";
3429
	      $query = "select ma_minum, mi_vname, mi_nname, kr_role from matopr ";
3430
	      $query .= "left join mitarbeiter on mi_num = ma_minum ";
3431
	      $query .= "left join key_role on kr_num = ma_role ";
3432
	      $query .= "where ma_prnum = $pl_prnum ";
3433
	      $query .= "order by mi_nname, mi_vname";
3434
              $resmi = QueryDB($db, $query);
3435
 
3436
              if (!$resmi) {
3437
                 return;
3438
              }
3439
 
3440
              $nr = numrowsDB($resmi);
3441
              $r = 0;
3442
 
3443
              while ($r < $nr) {
3444
                 $data = fetchDB($resmi, $r);
3445
                 $mi_num = $data[0];
3446
                 $mi_vname = $data[1];
3447
                 $mi_nname = $data[2];
3448
		 $kr_role = $data[3];
3449
                 echo "<option value=\"$mi_num\">$mi_nname $mi_vname, $kr_role</option>\n";
3450
                 $r++;
3451
              }
3452
 
3453
              echo "</select></td>\n";
3454
           }
3455
 
3456
	   if (!$ta_meeting) {
3457
	      if ($typ) {
3458
	         $sein = GetStrEinheit($einheit);
3459
	         echo "<td class=\"selgray\" align=\"right\">$ta_duration $sein</td>\n";
3460
		 $dt = gmdate($dtformatshort, $ta_start);
3461
		 $ed = GetEDate($einheit, $ta_start, $ta_duration);
3462
		 $dte = gmdate($dtformatshort, $ed);
3463
		 echo "<td class=\"selgray\" align=\"center\">$dt</td>\n";
3464
		 echo "<td class=\"selgray\" align=\"center\">$dte</td>\n";
3465
	      } else {
3466
	         if ($ta_level == 1)
3467
	            echo "<td colspan=3 class=\"selltgray\">&nbsp;</td>\n";
3468
		 else
3469
	            echo "<td colspan=3 class=\"selgray\">&nbsp;</td>\n";
3470
	      }
3471
	   } else {
3472
	      echo "<td class=\"seldkgray\" align=\"center\">M</td>\n";
3473
	      $dt = gmdate($dtformatshort, $ta_start);
3474
	      echo "<td class=\"seldkgray\" align=\"center\" colspan=2>$dt</td>\n";
3475
	   }
3476
 
3477
           # Anzeigen der Mitarbeiterrolle
3478
 
3479
#           if ($role) {
3480
#              if ($ma && $new) {
3481
#                 echo "<td class=\"sel\">";
3482
#                 $query = "select kr_num, kr_role from key_role order by kr_num";
3483
#                 $result2 = QueryDB($db, $query);
3484
 
3485
#                 if (!$result2)
3486
#                    return;
3487
 
3488
#                 $nr = numrowsDB($result2);
3489
#                 $r = 0;
3490
#                 echo "<select name=\"role\">\n";
3491
 
3492
#                 while ($r < $nr) {
3493
#                    $data = fetchDB($result2, $r);
3494
#                    $kr_num = $data[0];
3495
#                    $kr_role = $data[1];
3496
#                    echo "<option value=\"$kr_num\">$kr_role</option>\n";
3497
#                    $r++;
3498
#                 }
3499
 
3500
#                 echo "</select></td>\n";
3501
#              } else {
3502
#	         if ($ta_level == 1)
3503
#	            echo "<td class=\"selltgray\">&nbsp;</td>\n";
3504
#	         else
3505
#                    echo "<td class=\"selgray\">&nbsp;</td>\n";
3506
#              }
3507
#	   }
3508
 
3509
	   # Dynamischer Aufbau der restlichen Tabelle.
3510
	   # Ab dem Startdatum werden Eingabezeilen ausgegeben, in die der
3511
	   # Anwender Arbeitseinheiten eintragen kann.
3512
	   $color = dechex($ta_color);
3513
	   $len = strlen($color);
3514
 
3515
	   while ($len < 6) {
3516
	      $color = "0" . $color;
3517
	      $len++;
3518
	   }
3519
 
3520
	   $dt = $fdate;
3521
 
3522
	   while (PerDateComp($dt, $ta_start) > 0) {
3523
	      $dt = IncDate($periode, $dt);
3524
 
3525
	      if (!$typ && ! $ta_meeting && $ta_level == 1)
3526
	         echo "<td class=\"sel\">&nbsp;</td>";
3527
	      else
3528
	         echo "<td class=\"sel\">&nbsp;</td>";
3529
	   }
3530
 
3531
	   if ($ta_meeting)
3532
	      $edate = $ta_start;
3533
	   else
3534
	      $edate = GetEDate($einheit, $ta_start, $ta_duration);
3535
 
3536
	   do {
3537
	      if ($new && $ma) {
3538
	         $tm = gmdate("j.n.Y", $dt);
3539
	         $ad = explode(".", $tm);
3540
	         $nm = "dt_" . (string)$ta_id . "_" . (string)$ad[1];
3541
		 $nm .= "_" . (string)$ad[2];
3542
 
3543
		 if ($dt > $ab_datum || $rstufe == 1)
3544
		    echo "<td class=\"sel\"><input type=\"text\" name=\"$nm\" size=6 maxlength=6></td>\n";
3545
		 else
3546
		    echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
3547
	      } else {
3548
	         if ($typ)
3549
	            echo "<td style=\"background-color: #$color; border: 1px solid black;\">&nbsp;</td>\n";
3550
	         else if ($ta_meeting)
3551
	            echo "<td style=\"color: #$color;background-color: #969696;border: 1px solid black;\"><center>###</center></td>\n";
3552
	         else if ($ta_level == 1)
3553
	            echo "<td style=\"color: #$color;background-color: #dddddd; border: 1px solid black;\"><center>===</center></td>\n";
3554
	         else
3555
	            echo "<td style=\"color: #$color;background-color: #dddddd; border: 1px solid black;\"><center>===</center></td>\n";
3556
	      }
3557
 
3558
	      $dt = IncDate($periode, $dt);
3559
           }
3560
	   while (PerDateComp($dt, $edate) >= 0);
3561
 
3562
	   while (PerDateComp($dt, $ldate) >= 0) {
3563
	      $dt = IncDate($periode, $dt);
3564
 
3565
//	      if ($ta_level == 1)
3566
//	         echo "<td class=\"sel\">&nbsp;</td>";
3567
//	      else
3568
	         echo "<td class=\"sel\">&nbsp;</td>";
3569
	   }
3570
 
3571
	   # Ausfuellen der Summenspalte
3572
	   if (($typ && !$ma) || $ta_level == 1) {
3573
	      printf ("<td class=\"selltgray\" align=\"right\"><b><u>%s</u></b></td>\n", FormatNum($al_hours, 3));
3574
	      $sum = 0;
3575
 
3576
	      if ($verrmodul) {
3577
	         if ($ta_risiko > 0)
3578
	            printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($ta_risiko, 3));
3579
		 else
3580
		    echo "<td class=\"sel\">&nbsp;</td>\n";
3581
 
3582
	         printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($brutto, 2));
3583
		 printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($risc_sum, 2));
3584
		 printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($netto, 2));
3585
	      }
3586
	   } else {
3587
	      echo "<td class=\"sel\">&nbsp;</td>\n";
3588
 
3589
	      if ($verrmodul) {
3590
	         echo "<td class=\"sel\">&nbsp;</td>";
3591
	         echo "<td class=\"sel\">&nbsp;</td>";
3592
	         echo "<td class=\"sel\">&nbsp;</td>";
3593
	         echo "<td class=\"sel\">&nbsp;</td>";
3594
	      }
3595
	   }
3596
 
3597
	   if ($typ && !$ma) {
3598
	      if ($ta_num == $tanum)
3599
	         $sum = PrintMa($db, $fdate, $ldate, $ta_num, $color, $pl_num, $ressource, $lock);
3600
	      else
3601
	         $sum = PrintMa($db, $fdate, $ldate, $ta_num, $color, $pl_num, 0, $lock);
3602
 
3603
	      $total += $sum;
3604
	   }
3605
 
3606
	   echo "</tr>\n";
3607
 
3608
	   if ($ma) {
3609
              $ma = false;
3610
              $done = true;
3611
           }
3612
 
3613
	   if ($new && !$done && $ta_num == $id)
3614
	      $ma = true;
3615
 
3616
	   if (!$ma)
3617
	      $row++;
3618
	}
3619
 
3620
	# Anfuegen der Summierungen
3621
 
3622
	if ($total > 0) {
3623
#	   if ($role)
3624
#	      $span = 9 + $tbcols;
3625
#	   else
3626
	      $span = 8 + $tbcols;
3627
 
3628
//	   if ($sum > 0) {
3629
/*	   if (($typ && !$ma) || $ta_level == 1) {
3630
	      echo "<tr><td class=\"sel\"colspan=$span>&nbsp;</td>";
3631
	      printf("<td class=\"selltgray\" align=\"right\"><b><u>%s</u></b></td>\n", FormatNum($al_hours, 3));
3632
 
3633
	      if ($verrmodul) {
3634
	         if ($ta_risiko > 0)
3635
	            printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($ta_risiko, 3));
3636
		 else
3637
		    echo "<td class=\"sel\">&nbsp;</td>\n";
3638
 
3639
	         printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($brutto, 2));
3640
		 printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($risc_sum, 2));
3641
		 printf ("<td class=\"selnum\"><b>%s</b></td>", FormatNum($netto, 2));
3642
	      }
3643
 
3644
	      echo "</tr>\n";
3645
           }
3646
*/
3647
	   echo "<tr><td class=\"selnum\" colspan=$span>Gesamtsumme:</td>";
3648
	   printf("<td class=\"selgray\" align=\"right\"><b><u>%s</u></b></td>\n", FormatNum($total, 3));
3649
 
3650
	   if ($verrmodul) {
3651
	      echo "<td class=\"sel\">&nbsp;</td>\n";
3652
	      printf ("<td class=\"selgray\" align=\"right\"><b>%s</b></td>\n", FormatNum($brutto_sum, 2));
3653
	      printf ("<td class=\"selgray\" align=\"right\"><b>%s</b></td>\n", FormatNum($risiko_sum, 2));
3654
	      printf ("<td class=\"selgray\" align=\"right\"><b>%s</b></td>\n", FormatNum($netto_sum, 2));
3655
	   }
3656
 
3657
	   echo "</tr>\n";
3658
	}
3659
 
3660
	echo "</table>\n";
3661
 
3662
        if ($new)
3663
           echo "</form>\n";
3664
 
3665
	$ta_id++;
3666
 
3667
	if (!$lock) {
3668
	   echo "<table class=\"indent\"><tr><td>";
3669
	   ButtonLink("Task Anh&auml;ngen", "plan.php", "taskadd=$ta_id&ta_num=$ta_num&ta_plnum=$ta_plnum&$nav");
3670
	   echo "</td></tr></table>";
3671
	}
3672
 
3673
	closeDB($db);
3674
}
3675
 
3676
function AskPlanOverload($db, $res_hours, $plan, $pts, $mon, $year) {
3677
	global $periode;
3678
	global $phase;
3679
	global $role;
3680
	global $dtformatshort;
3681
	global $menu;
3682
	global $headline;
3683
 
3684
	$pl_num = $_REQUEST['pl_num'];
3685
	$ta_num = $_REQUEST['ta_num'];
3686
	$name = $_REQUEST['name'];
3687
#	$rolem = $_REQUEST['role'];
3688
 
3689
	if ($phase)
3690
	   $ta_phase = $_REQUEST['ta_phase'];
3691
 
3692
	$query = "select mi_nname, mi_vname from mitarbeiter where ";
3693
	$query .= "mi_num = $name";
3694
 
3695
	if (!($result = QueryDB($db, $query)))
3696
	   return;
3697
 
3698
	$data = fetchDB($result, 0);
3699
	$mi_nname = $data[0];
3700
	$mi_vname = $data[1];
3701
 
3702
	echo "<form name=\"Overload\" action=\"plan.php\" method=\"post\">\n";
3703
	echo "<input type=\"hidden\" name=\"func\" value=\"SaveMa\">\n";
3704
	echo "<input type=\"hidden\" name=\"pl_num\" value=\"$pl_num\">\n";
3705
	echo "<input type=\"hidden\" name=\"ta_num\" value=\"$ta_num\">\n";
3706
	echo "<input type=\"hidden\" name=\"name\" value=\"$name\">\n";
3707
#	echo "<input type=\"hidden\" name=\"role\" value=\"$rolem\">\n";
3708
	echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
3709
	echo "<input type=\"hidden\" name=\"headline\" value=\"$headline\">\n";
3710
	echo "<input type=\"hidden\" name=\"yes\" value=\"yes\">\n";
3711
 
3712
	if ($phase)
3713
	   echo "<input type=\"hidden\" name=\"ta_phase\" value=\"$ta_phase\">\n";
3714
 
3715
	foreach ($_REQUEST as $key => $pstart) {
3716
	   $fr = substr($key, 0, 3);
3717
 
3718
	   if ($fr == "dt_")
3719
	      echo "<input type=\"hidden\" name=\"$key\" value=\"$pstart\">\n";
3720
	}
3721
 
3722
	$sum = $plan + $res_hours;
3723
?>
3724
<table border=2 class="alarm">
3725
   <tr><td colspan=2><big>Warnung!</big><br><br>
3726
           Die Ressource <font color="white"><? echo "$mi_nname $mi_vname"; ?></font> soll mit weiteren
3727
	   <font color="white"><? echo FormatNum($plan, 3); ?></font> PT's in der Periode
3728
	   <font color="white"><? echo "$mon/$year"; ?></font> gebucht werden. Dadurch
3729
	   w&uuml;rde die Ressource auf insgesamt <font color="white"><? echo FormatNum($sum, 3); ?></font>
3730
	   PT's verplant werden. In dieser Periode stehen jedoch nur
3731
	   <font color="white"><? echo "$pts"; ?></font> PT's zur Verf&uuml;gung!<br>
3732
	   <br>
3733
	   Wollen Sie dennoch die eingegebenen Planwerte f&uuml;r diese
3734
	   Ressource speichern?
3735
      </td>
3736
   </tr>
3737
   <tr>
3738
      <td><center>
3739
<?
3740
	Button("Planwerte speichern", "Overload");
3741
?>
3742
          </center>
3743
      </td>
3744
      <td><center>
3745
<?
3746
	ButtonLink("Abbrechen", "plan.php", "editplan=$pl_num&menu=$menu&headline=$headline");
3747
?>
3748
      </center></td>
3749
   </tr>
3750
</table>
3751
</form>
3752
<?
3753
}
3754
 
3755
function SaveMa($save=true) {
3756
	global $periode;
3757
	global $phase;
3758
	global $role;
3759
 
3760
	$pl_num = $_REQUEST['pl_num'];
3761
	$ta_num = $_REQUEST['ta_num'];
3762
	$name = $_REQUEST['name'];
3763
 
3764
#	if ($role)
3765
#	   $rolem = $_REQUEST['role'];
3766
 
3767
	if ($phase)
3768
	   $ta_phase = $_REQUEST['ta_phase'];
3769
	else
3770
	   $ta_phase = 0;
3771
 
3772
	$err = 0;
3773
 
3774
	if (!isset($pl_num) || $pl_num <= 0) {
3775
	   Error("Interner Fehler: Plannumer fehlt oder ist ung&uuml;ltig!");
3776
	   $err = 1;
3777
	}
3778
 
3779
	if (!isset($ta_num) || $ta_num <= 0) {
3780
	   Error("Interner Fehler: Tasknummer fehlt oder ist ung&uuml;ltig!");
3781
	   $err = 1;
3782
	}
3783
 
3784
	if (!isset($name) || $name <= 0) {
3785
	   Error("Interner Fehler: Mitarbeiternummer fehlt oder ist ung&uuml;ltig!");
3786
	   $err = 1;
3787
	}
3788
 
3789
#	if ($role && (!isset($rolem) || $rolem <= 0)) {
3790
#	   Error("Interner Fehler: Rollenbezeichnung fehlt!");
3791
#	   $err = 1;
3792
#	}
3793
 
3794
	if ($err)
3795
	   return false;
3796
 
3797
//	if (!$role)
3798
//	   $rolem = 1;
3799
 
3800
	$db = OpenDB();
3801
 
3802
	# Da sich die Mitarbeiterrollenzuweisung geaendert hat (03.04.2007)
3803
	# muessen wir die Rolle aus dem zugewiesenen Mitarbeiter extrahieren.
3804
	# Dazu benoetigen wir zunaechst die Projektnummer.
3805
	if ($role) {
3806
	   $query = "select pl_prnum from plan where pl_num = $pl_num";
3807
 
3808
	   if (!($result = QueryDB($db, $query))) {
3809
	      closeDB($db);
3810
	      return;
3811
	   }
3812
 
3813
	   if (numrowsDB($result) > 0) {
3814
	      $data = fetchDB($result, 0);
3815
	      $pr_num = $data[0];
3816
	   } else {
3817
	      closeDB($db);
3818
	      Error("Interner Fehler: Projektnummer wurde nicht gefunden!");
3819
	      return false;
3820
	   }
3821
 
3822
	   $query = "select ma_role from matopr where ";
3823
	   $query .= "ma_minum = $name and ma_prnum = $pr_num";
3824
 
3825
	   if (!($result = QueryDB($db, $query))) {
3826
	      closeDB($db);
3827
	      return false;
3828
	   }
3829
 
3830
	   if (numrowsDB($result) > 0) {
3831
	      $data = fetchDB($result, 0);
3832
	      $rolem = $data[0];
3833
	   } else {
3834
	      closeDB($db);
3835
	      Error("Interner Fehler: Mitarbeiterrolle wurde nicht gefunden!");
3836
	      return false;
3837
	   }
3838
	}
3839
 
3840
	# Zunaechst muessen wir sicher stellen, das dem Task nicht bereits
3841
	# diese Ressource hinzugefuegt wurde.
3842
	$query = "select al_num from allocation where al_ressource = $name ";
3843
	$query .= "and al_task = $ta_num";
3844
	$result = QueryDB($db, $query);
3845
 
3846
	if (!$result) {
3847
	   closeDB($db);
3848
	   return false;
3849
	}
3850
 
3851
	$anz = numrowsDB($result);
3852
	$query = "select co_allocation from counter";
3853
	$result = QueryDB($db, $query);
3854
 
3855
	if (!$result) {
3856
	   closeDB($db);
3857
	   return false;
3858
	}
3859
 
3860
	$data = fetchDB($result, 0);
3861
	$co_allocation = $data[0];
3862
	QueryDB($db, "begin");
3863
 
3864
	# Falls die Ressource bereits zugeordnet war, wird sie hier geloescht.
3865
	$query = "delete from allocation where al_ressource = $name ";
3866
	$query .= "and al_task = $ta_num";
3867
 
3868
	if (!QueryDB($db, $query)) {
3869
	   QueryDB($db, "rollback");
3870
	   closeDB($db);
3871
	   return false;
3872
	}
3873
 
3874
	foreach ($_REQUEST as $key => $pstart) {
3875
	   $fr = substr($key, 0, 3);
3876
 
3877
	   if ($fr == "dt_") {
3878
	      $p = strpos($key, "_", 3);
3879
	      $ta_id = substr($key, 3, $p-3);
3880
	      $q = strpos($key, "_", $p+1);
3881
	      $mon = substr($key, $p+1, $q-($p+1));
3882
	      $year = substr($key, $q+1);
3883
	      $pstart = str_replace(",", ".", $pstart);
3884
 
3885
	      if (!isset($pstart) || $pstart <= 0.0)
3886
	         continue;
3887
 
3888
	      $al_pstart = gmmktime(0, 0, 0, $mon, 1, $year);
3889
 
3890
	      # Pruefen, ob die Ressource in der aktuellen Periode ueberbucht
3891
	      # ist. Falls ja, erscheint ein rotes Warnfenster, welches den
3892
	      # Anwender darauf hinweist.
3893
	      $res_hours = GetRessource($db, $name, $al_pstart);
3894
	      $pts = GetPT($al_pstart);
3895
 
3896
	      if (!$save && ($res_hours + $pstart) > $pts) {
3897
	         AskPlanOverload($db, $res_hours, $pstart, $pts, $mon, $year);
3898
		 QueryDB($db, "rollback");
3899
		 closeDB($db);
3900
		 include('footer.inc');
3901
		 exit;
3902
	      }
3903
 
3904
	      switch ($periode) {
3905
	         case 1: $al_pduration = 364; break;
3906
	         case 2: $al_pduration = 91; break;
3907
	         case 3: $al_pduration = daysinmonth($mon, $year); break;
3908
	         case 4: $al_pduration = 1; break;
3909
	         default: $al_pduration = daysinmonth($mon, $year); break;
3910
	      }
3911
 
3912
              $co_allocation++;
3913
              $query = "insert into allocation (al_num, al_task, al_ressource,";
3914
              $query .= "al_hours, al_phase, al_pstart, al_pduration";
3915
 
3916
	      if ($role)
3917
	         $query .= ",al_role";
3918
 
3919
              $query .= ") values ($co_allocation, $ta_num, $name, $pstart, ";
3920
              $query .= "$ta_phase, $al_pstart, $al_pduration";
3921
 
3922
	      if ($role)
3923
	         $query .= ", $rolem";
3924
 
3925
	      $query .= ")";
3926
 
3927
              if (!QueryDB($db, $query)) {
3928
                 QueryDB($db, "rollback");
3929
                 closeDB($db);
3930
                 return false;
3931
              }
3932
           }
3933
        }
3934
 
3935
        $query = "update counter set co_allocation = $co_allocation";
3936
 
3937
        if (!QueryDB($db, $query)) {
3938
           QueryDB($db, "rollback");
3939
           closeDB($db);
3940
           return false;
3941
        }
3942
 
3943
        QueryDB($db, "commit");
3944
        Journal(300, "plan.php: SaveMa: task=$ta_num; ressource=$name", $db);
3945
        closeDB($db);
3946
        return true;
3947
}
3948
 
3949
function SaveUpMa() {
3950
        global $periode;
3951
	global $phase;
3952
	global $role;
3953
 
3954
        $pl_num = $_REQUEST['pl_num'];
3955
        $ta_num = $_REQUEST['ta_num'];
3956
	$ressource = $_REQUEST['ressource'];
3957
 
3958
	if ($phase)
3959
	   $al_phase = $_REQUEST['al_phase'];
3960
	else
3961
	   $al_phase = 0;
3962
 
3963
	if ($role)
3964
	   $al_role = $_REQUEST['al_role'];
3965
//	else
3966
//	   $al_role = 1;
3967
 
3968
        $err = 0;
3969
 
3970
        if (!isset($pl_num) || $pl_num <= 0) {
3971
           Error("Interner Fehler: Plannumer fehlt oder ist ung&uuml;ltig!");
3972
           $err = 1;
3973
        }
3974
 
3975
        if (!isset($ta_num) || $ta_num <= 0) {
3976
           Error("Interner Fehler: Tasknummer fehlt oder ist ung&uuml;ltig!");
3977
           $err = 1;
3978
        }
3979
 
3980
        if ($err)
3981
           return false;
3982
 
3983
        $db = OpenDB();
3984
	$query = "select co_allocation from counter";
3985
	$result = QueryDB($db, $query);
3986
 
3987
	if (!$result) {
3988
	   closeDB($db);
3989
	   return false;
3990
	}
3991
 
3992
	$data = fetchDB($result, 0);
3993
	$co_allocation = $data[0];
3994
	$count = $co_allocation;
3995
 
3996
	QueryDB($db, "begin");
3997
 
3998
        foreach ($_REQUEST as $key => $pstart) {
3999
           $fr = substr($key, 0, 3);
4000
 
4001
           if ($fr == "dt_") {
4002
              $p = strpos($key, "_", 3);
4003
              $al_num = substr($key, 3, $p-3);
4004
              $q = strpos($key, "_", $p+1);
4005
              $mon = substr($key, $p+1, $q-($p+1));
4006
              $year = substr($key, $q+1);
4007
	      $pstart = str_replace(",", ".", $pstart);
4008
 
4009
	      if ((!isset($pstart) || $pstart <= 0) && $al_num > 0) {
4010
	         $query = "delete from allocation where al_num = $al_num";
4011
 
4012
		 if (!QueryDB($db, $query)) {
4013
		    QueryDB($db, "rollback");
4014
		    closeDB($db);
4015
		    return false;
4016
		 }
4017
 
4018
	         continue;
4019
	      }
4020
 
4021
	      if ($al_num == 0 && $pstart > 0) {
4022
	         $al_pstart = gmmktime(0, 0, 0, $mon, 1, $year);
4023
 
4024
	         switch ($periode) {
4025
	            case 1: $al_pduration = 364; break;
4026
	            case 2: $al_pduration = 91; break;
4027
	            case 3: $al_pduration = 30; break;
4028
	            case 4: $al_pduration = 1; break;
4029
	            default: $al_pduration = 30; break;
4030
	         }
4031
 
4032
		 $co_allocation++;
4033
	         $query = "insert into allocation (al_num, al_task,";
4034
		 $query .= "al_ressource, al_hours, al_phase, al_pstart,";
4035
 
4036
		 if ($role)
4037
		    $query .= "al_pduration, al_role) values ($co_allocation,";
4038
		 else
4039
		    $query .= "al_pduration) values ($co_allocation,";
4040
 
4041
		 $query .= "$ta_num, $ressource, $pstart, $al_phase,";
4042
 
4043
		 if ($role)
4044
		    $query .= "$al_pstart, $al_pduration, $al_role)";
4045
		 else
4046
		    $query .= "$al_pstart, $al_pduration)";
4047
	      } else if ($al_num > 0 && $pstart > 0) {
4048
		 $query = "update allocation set al_hours = $pstart where ";
4049
		 $query .= "al_num = $al_num";
4050
	      } else
4051
	         continue;
4052
 
4053
	      if (!QueryDB($db, $query)) {
4054
		 QueryDB($db, "rollback");
4055
		 closeDB($db);
4056
		 return false;
4057
	      }
4058
	   }
4059
	}
4060
 
4061
	if ($count < $co_allocation) {
4062
	   $query = "update counter set co_allocation = $co_allocation";
4063
 
4064
	   if (!QueryDB($db, $query)) {
4065
	      QueryDB($db, "rollback");
4066
	      closeDB($db);
4067
	      return false;
4068
	   }
4069
	}
4070
 
4071
	QueryDB($db, "commit");
4072
	Journal(300, "plan.php: SaveUpMa: task=$ta_num; ressource=$ressource", $db);
4073
	closeDB($db);
4074
	return true;
4075
}
4076
 
4077
# Folgende Funktion fragt den Anwender, ob er die IST-Werte auch tatsaechlich
4078
# uebernehmen will.
4079
function AskIstPlan($pl_num) {
4080
	global $phase;
4081
	global $dtformatshort;
4082
	global $pjcopy;
4083
 
4084
	$headline = $_REQUEST['headline'];
4085
	$menu = $_REQUEST['menu'];
4086
	$pl_prnum = $_REQUEST['pl_prnum'];
4087
	$pl_status = $_REQUEST['pl_status'];
4088
	$nav = "editcopy=$pl_num&menu=$menu&pl_prnum=$pl_prnum&";
4089
	$nav .= "pl_status=$pl_status&func=CopyPlan&headline=21&";
4090
	$nav .= "istdate='+document.AskIstPlan.istdate.value+'";
4091
	$datum = time();
4092
	$mon = gmdate("n", $datum);
4093
	$year = gmdate("Y", $datum);
4094
	$day = gmdate("j", $datum);
4095
 
4096
	if ($pjcopy != 3) {
4097
	   $mon--;
4098
 
4099
	   if ($mon < 1) {
4100
	      $mon = 12;
4101
	      $year--;
4102
	   }
4103
 
4104
	   if ($day < (daysinmonth($mon, $year) / 2)) {
4105
	      $mon--;
4106
 
4107
	      if ($mon < 1) {
4108
	         $mon = 12;
4109
	         $year--;
4110
	      }
4111
	   }
4112
 
4113
	   $datum = gmmktime(0, 0, 0, $mon, 1, $year);
4114
	} else {
4115
	   $datum = 0;
4116
	   $db = OpenDB();
4117
	   $query = "select ab_datum from abschluss where ";
4118
	   $query .= "ab_prnum = $pl_prnum order by ab_datum desc";
4119
 
4120
	   if (!($result = QueryDB($db, $query))) {
4121
	      closeDB($db);
4122
	      return;
4123
	   }
4124
 
4125
	   if (numrowsDB($result) > 0) {
4126
	      $data = fetchDB($result, 0);
4127
	      $ab_datum = $data[0];
4128
	      $lab = gmdate($dtformatshort, $ab_datum);
4129
	   } else
4130
	      $lab = GetMessage($db, 404, "(Projekt wurde bisher noch nicht abgeschlossen)");
4131
	}
4132
?>
4133
<br>
4134
<form name="AskIstPlan" action="plan.php" method="post">
4135
<table class="input">
4136
   <tr><th class="sel" colspan=3><? Output(-1, 393, "Plan kopieren"); ?></th></tr>
4137
<?
4138
	if ($pjcopy == 1) {
4139
?>
4140
   <tr><td colspan=3><br><? Output(-1, 394, "Bis zu welcher Periode sollen die IST-Werte als
4141
        Planwerte &uuml;bernommen werden?"); ?>
4142
        <br><br>
4143
      </td>
4144
   </tr>
4145
   <tr>
4146
      <td><? Output(-1, 395, "IST-Werte &uuml;bernehmen bis (%s):", GetVisualDate($dtformatshort, true)); ?></td>
4147
      <td colspan=2><input type="text" name="istdate" value="<? echo GetShortDate($datum) ?>" maxlength=7 size=7></td>
4148
   </tr>
4149
<?
4150
	} else if ($pjcopy == 2) {
4151
?>
4152
   <tr>
4153
      <td colspan=3><? Output(-1, 397, "Beim Kopieren des Plans werden die IST-Werte bis zum %s &uuml;bernommen!", GetShortDate($datum)); ?>
4154
         <input type="hidden" name="istdate" value="<? echo GetShortDate($datum); ?>">
4155
      </td>
4156
   </tr>
4157
<?
4158
	} else {
4159
?>
4160
   <tr>
4161
      <td colspan=3><? Output(-1, 402, "Die IST-Werte des Projekts %s werden bis zum %s (letzter Teilprojektabschluss) &uuml;bernommen!", $pl_prnum, $lab); ?>
4162
         <input type="hidden" name="istdate" value="0">
4163
      </td>
4164
   </tr>
4165
<?
4166
	}
4167
?>
4168
   <tr>
4169
      <td><center><input type="button" name="yes" value="<? Output(-1, 393, "Plan kopieren"); ?>" onClick="javascript:MoveTo('plan.php','yes=yes&<? echo "$nav"; ?>')"></center></td>
4170
      <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>
4171
      <td><center><input type="button" name="cancel" value="<? Output(-1, 49, "Abbrechen"); ?>" onClick="javascript:MoveTo('plan.php','cancel=cancel&<? echo "$nav"; ?>')"></center></td>
4172
   </tr>
4173
</table>
4174
</form>
4175
<?php
4176
}
4177
 
4178
# Folgende Funktion kopiert einen bestehenden Plan und erzeugt eine Instanz
4179
# davon. Anschliessend kann diese Instanz bearbeitet werden.
4180
#
4181
function editcopy($pl_num, $plis=false, $doit=false) {
4182
	global $leneinheit;
4183
	global $periode;
4184
	global $role;
4185
	global $pmlight;
4186
	global $pjcopy;
4187
 
4188
	$pl_prnum = $_REQUEST['pl_prnum'];
4189
	$pl_status = $_REQUEST['pl_status'];
4190
 
4191
	if (!isset($pl_prnum) || $pl_prnum <= 0) {
4192
	   Error(GetMessage(-1, 389, "Interner Fehler: Projektnummer fehlt!"));
4193
	   return false;
4194
	}
4195
 
4196
	if (!isset($pl_status) || $pl_status <= 0) {
4197
	   Error(GetMessage(-1, 390, "Interner Fehler: Projektstatus wurde nicht &uuml;bergeben!"));
4198
	   return false;
4199
	}
4200
 
4201
	if (!$doit) {
4202
	   AskIstPlan($pl_num);
4203
	   require('footer.inc');
4204
	   exit(0);
4205
	}
4206
 
4207
	if ($plis || $pjcopy == 2)
4208
	   $istdate = $_REQUEST['istdate'];
4209
	else
4210
	   $istdate = 0;
4211
 
4212
	if (!isset($istdate)) {
4213
	   Error(GetMessage(-1, 391, "Es wurde kein Datum angegeben, bis zu welchem die IST-Werte &uuml;bernommen werden sollen!"));
4214
	   return false;
4215
	} else if ($plis || $pjcopy == 2) {
4216
	   $edt = explode(GetDateSep(), $istdate);
4217
	   $istdate = gmmktime(0, 0, 0, $edt[0], daysinmonth($edt[0], $edt[1]), $edt[1]);
4218
	}
4219
 
4220
	$db = OpenDB();
4221
	$query = "select pl_lfd, pl_prnum, pl_status, pl_comment from plan where ";
4222
	$query .= "pl_num = $pl_num";
4223
	$result = QueryDB($db, $query);
4224
 
4225
	if (!$result) {
4226
	   closeDB($db);
4227
	   return false;
4228
	}
4229
 
4230
	$data = fetchDB($result, 0);
4231
	$pl_lfd = $data[0];
4232
	$pl_prnum = $data[1];
4233
	$pl_status = $data[2];
4234
	$pl_comment = $data[3];
4235
	closeDB($db);
4236
	unset($db);
4237
 
4238
	$new_pl_num = SaveNewPlan();
4239
 
4240
	if (!$new_pl_num)
4241
	   return false;
4242
 
4243
	$db = OpenDB();
4244
	# Den Kommentar zum neuen Plan hinzufuegen (nur wenn keine strikte
4245
	# Periodensicht ($pmlight == false) gewaehlt wurde)
4246
	if (!$pmlight) {
4247
	   $query = "update plan set pl_comment = '$pl_comment' where ";
4248
	   $query .= "pl_num = $new_pl_num";
4249
 
4250
	   if (!QueryDB($db, $query)) {
4251
	      closeDB($db);
4252
	      return false;
4253
	   }
4254
	}
4255
 
4256
	$query = "select co_task, co_allocation from counter";
4257
	$result = QueryDB($db, $query);
4258
 
4259
	if (!$result) {
4260
	   QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4261
	   closeDB($db);
4262
	   return false;
4263
	}
4264
 
4265
	$data = fetchDB($result, 0);
4266
	$co_task = $data[0] + 1;
4267
	$co_allocation = $data[1] + 1;
4268
 
4269
	# Wenn die IST-Werte des PJ bis zum Datum des letzten
4270
	# Teilprojektabschluss uebernommen werden sollen,
4271
	# benoetigen wir das Datum des letzten TPA.
4272
	if ($pjcopy == 3) {
4273
	   $query = "select ab_datum from abschluss where ";
4274
	   $query .= "ab_prnum = $pl_prnum order by ab_datum desc";
4275
 
4276
	   if (!($resab = QueryDB($db, $query))) {
4277
	      QueryDB($db, "rollback");
4278
	      QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4279
	      closeDB($db);
4280
	      return false;
4281
	   }
4282
 
4283
	   if (numrowsDB($resab) > 0) {
4284
	      $data = fetchDB($resab, 0);
4285
	      $ab_datum = $data[0];
4286
	   } else
4287
	      $ab_datum = 0;
4288
 
4289
	   if ($ab_datum == 0)
4290
	      $plis = 0;
4291
	   else
4292
	      $istdate = $ab_datum;
4293
	}
4294
 
4295
	# Auslesen der Tasks. In der folgenden Schleife werden die Tasks
4296
	# kopiert und neu eingefuegt.
4297
	$query = "select ta_num, ta_id, ta_depend, ta_deptype, ta_name, ta_color,";
4298
	$query .= "ta_shape, ta_meeting, ta_start, ta_duration, ta_complete,";
4299
	$query .= "ta_fixed_start, ta_priority, ta_level, ta_phase, ta_notiz, ta_risiko, ta_hash ";
4300
	$query .= "from task where ta_plnum = $pl_num order by ta_id";
4301
	$result = QueryDB($db, $query);
4302
 
4303
	if (!$result) {
4304
	   QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4305
	   closeDB($db);
4306
	   return false;
4307
	}
4308
 
4309
	$numrows = numrowsDB($result);
4310
	$rows = 0;
4311
	QueryDB($db, "begin");
4312
 
4313
	while ($rows < $numrows) {
4314
	   $data = fetchDB($result, $rows);
4315
	   $ori_ta_num = $data[0];
4316
	   $ta_id = $data[1];
4317
	   $ta_depend = $data[2];
4318
	   $ta_deptype = $data[3];
4319
	   $ta_name = addslashes($data[4]);
4320
	   $ta_color = $data[5];
4321
	   $ta_shape = $data[6];
4322
	   $ta_meeting = $data[7];
4323
	   $ta_start = $data[8];
4324
	   $ta_duration = $data[9];
4325
	   $ta_complete = $data[10];
4326
	   $ta_fixed_start = $data[11];
4327
	   $ta_priority = $data[12];
4328
	   $ta_level = $data[13];
4329
	   $ta_phase = $data[14];
4330
	   $ta_notiz = $data[15];
4331
	   $ta_risiko = $data[16];
4332
	   $ta_hash = $data[17];
4333
	   $ta_num = $co_task;
4334
	   $ta_plnum = $new_pl_num;
4335
 
4336
	   if (!isset($ta_fixed_start))
4337
	      $ta_fixed_start = 0;
4338
 
4339
	   if (!isset($ta_risiko))
4340
	      $ta_risiko = 0;
4341
 
4342
	   if (!isset($ta_depend) || strlen($ta_depend) == 0)
4343
	      $ta_depend = "NULL";
4344
 
4345
	   # Ende des Task als Datum
4346
	   $ta_end = $ta_start + ($ta_duration * 86400);
4347
	   # Kopie des Task speichern
4348
	   $query = "insert into task (ta_num, ta_plnum, ta_id, ta_depend,";
4349
	   $query .= "ta_deptype, ta_name, ta_color, ta_shape, ta_meeting,";
4350
	   $query .= "ta_start, ta_duration, ta_complete, ta_fixed_start,";
4351
	   $query .= "ta_priority, ta_level, ta_phase, ta_notiz, ta_risiko, ta_hash) values ";
4352
	   $query .= "($ta_num, $ta_plnum, $ta_id, $ta_depend, $ta_deptype,";
4353
	   $query .= "'$ta_name', $ta_color, '$ta_shape', $ta_meeting,";
4354
	   $query .= "$ta_start, $ta_duration, $ta_complete, $ta_fixed_start,";
4355
	   $query .= "$ta_priority, $ta_level, $ta_phase, '$ta_notiz', $ta_risiko, '$ta_hash')";
4356
	   $result2 = QueryDB($db, $query);
4357
 
4358
	   if (!$result2) {
4359
	      QueryDB($db, "rollback");
4360
	      QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4361
	      closeDB($db);
4362
	      return false;
4363
	   }
4364
 
4365
	   if (!$plis && $pjcopy != 2) {
4366
	      # Auslesen der Planwerte zum Task.
4367
	      $query = "select al_ressource, al_hours, al_phase, al_pstart,";
4368
 
4369
	      if ($role)
4370
	         $query .= "al_pduration, al_role from allocation where ";
4371
	      else
4372
	         $query .= "al_pduration from allocation where ";
4373
 
4374
	      $query .= "al_task = $ori_ta_num order by al_num";
4375
	      $result3 = QueryDB($db, $query);
4376
 
4377
	      if (!$result3) {
4378
		 QueryDB($db, "rollback");
4379
		 QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4380
		 closeDB($db);
4381
		 return false;
4382
	      }
4383
 
4384
	      $nr = numrowsDB($result3);
4385
	      $r = 0;
4386
 
4387
	      while ($r < $nr) {
4388
	         $data = fetchDB($result3, $r);
4389
	         $al_ressource = $data[0];
4390
	         $al_hours = $data[1];
4391
	         $al_phase = $data[2];
4392
	         $al_pstart = $data[3];
4393
	         $al_pduration = $data[4];
4394
 
4395
		 if ($role)
4396
	            $al_role = $data[5];
4397
 
4398
	         $al_num = $co_allocation;
4399
	         $al_task = $ta_num;
4400
 
4401
	         if (!isset($al_phase))
4402
	            $al_phase = $ta_phase;
4403
 
4404
	         if (!isset($al_pduration))
4405
	            $al_pduration = 1;
4406
 
4407
		 if (!$role)
4408
		    $al_role = 1;
4409
 
4410
	         $query = "insert into allocation (al_num, al_task,";
4411
		 $query .= "al_ressource, al_hours, al_phase, al_pstart,";
4412
 
4413
		 if ($role)
4414
	            $query .= "al_pduration, al_role) values ($al_num, $al_task,";
4415
		 else
4416
	            $query .= "al_pduration) values ($al_num, $al_task,";
4417
 
4418
	         $query .= "$al_ressource, $al_hours, $al_phase, $al_pstart,";
4419
 
4420
		 if ($role)
4421
	            $query .= "$al_pduration, $al_role)";
4422
		 else
4423
	            $query .= "$al_pduration)";
4424
 
4425
	         if (!QueryDB($db, $query)) {
4426
		    QueryDB($db, "rollback");
4427
	            QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4428
	            closeDB($db);
4429
	            return false;
4430
	         }
4431
 
4432
	         $co_allocation++;
4433
	         $r++;
4434
	      }
4435
	   } else {
4436
	      # Aus der Tabelle "wdone" heraus werden die IST-Werte ermittelt
4437
	      # und mit Hilfe des Hashwerts den richtigen Tasks zugewiesen.
4438
	      #
4439
	      # Ist ein IST-Wert frueher als das Startdatum eingetragen, aendert
4440
	      # sich das Startdatum und wenn der IST-Wert nach dem Endedatum
4441
	      # eingetragen wurde, dann aendert sich das Endedatum des Tasks!
4442
	      #
4443
	      $query = "select wd_hours/$leneinheit, wd_datum, wd_minum from wdone, task where ";
4444
	      $query .= "ta_num = wd_task and ta_hash = '$ta_hash' and wd_prnum = $pl_prnum and ";
4445
	      $query .= "wd_datum <= $istdate ";
4446
	      $query .= "order by wd_minum, wd_datum";
4447
 
4448
	      if (!($resma = QueryDB($db, $query))) {
4449
	         QueryDB($db, "rollback");
4450
		 QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4451
		 closeDB($db);
4452
		 return false;
4453
	      }
4454
 
4455
	      $anzma = numrowsDB($resma);
4456
	      $maza = 0;
4457
	      $end = $ta_start + ($ta_duration * 86400);
4458
	      $akt_von = 0;
4459
	      $akt_bis = 0;
4460
	      $al_hours = 0;
4461
	      $old_wdminum = 0;
4462
	      $task_flag = false;
4463
 
4464
	      while ($maza < $anzma) {
4465
	         $data = fetchDB($resma, $maza);
4466
		 $wd_hours = $data[0];
4467
		 $wd_datum = $data[1];
4468
		 $wd_minum = $data[2];
4469
		 $lo_tahash = $data[3];
4470
 
4471
		 if ($maza == 0) {
4472
		    $mon = gmdate("n", $wd_datum);
4473
		    $year = gmdate("Y", $wd_datum);
4474
		    $akt_von = gmmktime(0, 0, 0, $mon, 1, $year);
4475
		    $akt_bis = gmmktime(0, 0, 0, $mon, daysinmonth($mon, $year), $year);
4476
		    $old_wdminum = $wd_minum;
4477
		 }
4478
 
4479
		 if ($old_wdminum != $wd_minum || ($akt_von < $wd_datum && $akt_bis < $wd_datum)) {
4480
		    # Speichern der Periode
4481
		    $al_num = $co_allocation;
4482
		    $al_task = $ta_num;
4483
		    $al_pstart = $akt_von;
4484
		    $al_phase = $ta_phase;
4485
		    $al_ressource = $old_wdminum;
4486
		    $al_pduration = (GetUltimo($al_pstart) - $al_pstart) / 86400;
4487
		    # Wir brauchen noch die Rolle, sofern die Einstellungen das
4488
		    # verlangen!
4489
		    if ($role) {
4490
		       $query = "select al_role from allocation where ";
4491
		       $query .= "al_task = $ori_ta_num and al_ressource = $al_ressource";
4492
 
4493
		       if (!($resal = QueryDB($db, $query))) {
4494
		          QueryDB($db, "rollback");
4495
	                  QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4496
	                  closeDB($db);
4497
	                  return false;
4498
	               }
4499
 
4500
		       if (numrowsDB($resal) > 0) {
4501
		          $data = fetchDB($resal, 0);
4502
			  $al_role = $data[0];
4503
		       }
4504
		    }
4505
 
4506
	            $query = "insert into allocation (al_num, al_task,";
4507
		    $query .= "al_ressource, al_hours, al_phase, al_pstart,";
4508
 
4509
		    if ($role && isset($al_role))
4510
	               $query .= "al_pduration, al_role) values ($al_num, $al_task,";
4511
		    else
4512
	               $query .= "al_pduration) values ($al_num, $al_task,";
4513
 
4514
	            $query .= "$al_ressource, $al_hours, $al_phase, $al_pstart,";
4515
 
4516
		    if ($role && isset($al_role))
4517
	               $query .= "$al_pduration, $al_role)";
4518
		    else
4519
	               $query .= "$al_pduration)";
4520
 
4521
	            if (!QueryDB($db, $query)) {
4522
		       QueryDB($db, "rollback");
4523
	               QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4524
	               closeDB($db);
4525
	               return false;
4526
	            }
4527
 
4528
	            $co_allocation++;
4529
		    $mon = gmdate("n", $wd_datum);
4530
		    $year = gmdate("Y", $wd_datum);
4531
		    $akt_von = gmmktime(0, 0, 0, $mon, 1, $year);
4532
		    $akt_bis = gmmktime(0, 0, 0, $mon, daysinmonth($mon, $year), $year);
4533
		    $old_wdminum = $wd_minum;
4534
		    $al_hours = 0;
4535
		 }
4536
 
4537
		 if ($wd_datum > $ta_end) {
4538
		    $ta_duration = ($wd_datum - $ta_start) / 86400;
4539
	            $ta_end = $ta_start + ($ta_duration * 86400);
4540
		    $task_flag = true;
4541
		 }
4542
 
4543
		 $al_hours += $wd_hours;
4544
		 $maza++;
4545
	      }
4546
 
4547
	      # Speichern der Periode
4548
	      # Hier wird der letzte Datensatz weggespeichert!
4549
	      if ($anzma > 0) {
4550
		 $al_num = $co_allocation;
4551
		 $al_task = $ta_num;
4552
		 $al_pstart = $akt_von;
4553
		 $al_phase = $ta_phase;
4554
		 $al_ressource = $wd_minum;
4555
		 $al_pduration = (GetUltimo($al_pstart) - $al_pstart) / 86400;
4556
		 # Wir brauchen noch die Rolle, sofern die Einstellungen das
4557
		 # verlangen!
4558
		 if ($role) {
4559
		    $query = "select al_role from allocation where ";
4560
		    $query .= "al_task = $ori_ta_num and al_ressource = $al_ressource";
4561
 
4562
		    if (!($resal = QueryDB($db, $query))) {
4563
		       QueryDB($db, "rollback");
4564
		       QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4565
		       closeDB($db);
4566
		       return false;
4567
		    }
4568
 
4569
		    if (numrowsDB($resal) > 0) {
4570
		       $data = fetchDB($resal, 0);
4571
		       $al_role = $data[0];
4572
		    }
4573
		 }
4574
 
4575
		 $query = "insert into allocation (al_num, al_task,";
4576
		 $query .= "al_ressource, al_hours, al_phase, al_pstart,";
4577
 
4578
		 if ($role && isset($al_role))
4579
		    $query .= "al_pduration, al_role) values ($al_num, $al_task,";
4580
		 else
4581
		    $query .= "al_pduration) values ($al_num, $al_task,";
4582
 
4583
		 $query .= "$al_ressource, $al_hours, $al_phase, $al_pstart,";
4584
 
4585
		 if ($role && isset($al_role))
4586
		    $query .= "$al_pduration, $al_role)";
4587
		 else
4588
		    $query .= "$al_pduration)";
4589
 
4590
		 if (!QueryDB($db, $query)) {
4591
		    QueryDB($db, "rollback");
4592
		    QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4593
		    closeDB($db);
4594
		    return false;
4595
		 }
4596
 
4597
		 $co_allocation++;
4598
 
4599
		 if ($wd_datum > $ta_end) {
4600
		    $ta_duration = ($wd_datum - $ta_start) / 86400;
4601
	            $ta_end = $ta_start + ($ta_duration * 86400);
4602
		    $task_flag = true;
4603
		 }
4604
	      }
4605
 
4606
	      # Wenn ($task_flag == true) ist, dann gab es IST-Efassungen
4607
	      # die Ausserhalb des Tasks liegen. In diesem Fall muss das
4608
	      # Beginndatum und/oder die Laufzeit des Tasks entsprechend
4609
	      # geaendert werden.
4610
	      #
4611
	      if ($task_flag) {
4612
		 $query = "update task set ta_duration = $ta_duration ";
4613
		 $query .= "where ta_num = $ta_num";
4614
 
4615
		 if (!QueryDB($db, $query)) {
4616
		    QueryDB($db, "rollback");
4617
	            QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4618
	            closeDB($db);
4619
	            return false;
4620
		 }
4621
	      }
4622
 
4623
	      # Auslesen der Planwerte zum Task.
4624
	      # Alle Planwerte die juenger als $istdate sind, muessen gefunden
4625
	      # und ebenfalls eingefuegt werden!
4626
	      $query = "select al_ressource, al_hours, al_phase, al_pstart,";
4627
 
4628
	      if ($role)
4629
	         $query .= "al_pduration, al_role from allocation where ";
4630
	      else
4631
	         $query .= "al_pduration from allocation where ";
4632
 
4633
	      $query .= "al_task = $ori_ta_num and al_pstart > $istdate order by al_ressource, al_num";
4634
	      $result3 = QueryDB($db, $query);
4635
 
4636
	      if (!$result3) {
4637
		 QueryDB($db, "rollback");
4638
		 QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4639
		 closeDB($db);
4640
		 return false;
4641
	      }
4642
 
4643
	      $nr = numrowsDB($result3);
4644
	      $r = 0;
4645
 
4646
	      while ($r < $nr) {
4647
	         $data = fetchDB($result3, $r);
4648
	         $al_ressource = $data[0];
4649
	         $al_hours = $data[1];
4650
	         $al_phase = $data[2];
4651
	         $al_pstart = $data[3];
4652
	         $al_pduration = $data[4];
4653
 
4654
		 if ($role)
4655
	            $al_role = $data[5];
4656
 
4657
	         $al_num = $co_allocation;
4658
	         $al_task = $ta_num;
4659
 
4660
	         if (!isset($al_phase))
4661
	            $al_phase = $ta_phase;
4662
 
4663
	         if (!isset($al_pduration))
4664
	            $al_pduration = (GetUltimo($al_pstart) - $al_pstart) / 86400;
4665
 
4666
	         $query = "insert into allocation (al_num, al_task,";
4667
		 $query .= "al_ressource, al_hours, al_phase, al_pstart,";
4668
 
4669
		 if ($role)
4670
	            $query .= "al_pduration, al_role) values ($al_num, $al_task,";
4671
		 else
4672
	            $query .= "al_pduration) values ($al_num, $al_task,";
4673
 
4674
	         $query .= "$al_ressource, $al_hours, $al_phase, $al_pstart,";
4675
 
4676
		 if ($role)
4677
	            $query .= "$al_pduration, $al_role)";
4678
		 else
4679
	            $query .= "$al_pduration)";
4680
 
4681
	         if (!QueryDB($db, $query)) {
4682
		    QueryDB($db, "rollback");
4683
	            QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4684
	            closeDB($db);
4685
	            return false;
4686
	         }
4687
 
4688
	         $co_allocation++;
4689
	         $r++;
4690
	      }
4691
	   }
4692
 
4693
	   $co_task++;
4694
	   $rows++;
4695
	}
4696
 
4697
	$co_task--;
4698
	$co_allocation--;
4699
	$query = "update counter set co_task = $co_task, co_allocation = $co_allocation";
4700
	$result2 = QueryDB($db, $query);
4701
 
4702
	if (!$result2) {
4703
	   QueryDB($db, "rollback");
4704
	   QueryDB($db, "delete from plan where pl_num = $new_pl_num");
4705
	   closeDB($db);
4706
	   return false;
4707
	}
4708
 
4709
	QueryDB($db, "commit");
4710
	Journal(200, "plan.php: editcopy: alte pl_num=$pl_num; neue pl_num=$new_pl_num; projekt=$pl_prnum", $db);
4711
	closeDB($db);
4712
	return true;
4713
}
4714
 
4715
# Folgende Funktion speichert den Kommentar zu einem Plan. Dabei wird der
4716
# TIMESTAMP nicht neu gesetzt!
4717
#
4718
function SavePlanComment() {
4719
	global $pmlight;
4720
 
4721
	$pl_num = $_REQUEST['pl_num'];
4722
	$pl_comment = $_REQUEST['pl_comment'];
4723
 
4724
	if (!isset($pl_num) || $pl_num <= 0) {
4725
	   Error("Interner Fehler: Plannummer fehlt in SavePlanComment!");
4726
	   return;
4727
	}
4728
 
4729
	$db = OpenDB();
4730
	$query = "update plan set pl_comment = '$pl_comment' where ";
4731
	$query .= "pl_num = $pl_num";
4732
 
4733
	if (!QueryDB($db, $query)) {
4734
	   closeDB($db);
4735
	   return;
4736
	}
4737
 
4738
	closeDB($db);
4739
}
4740
 
4741
# Folgende Funktion stellt eine Maske zur Erfassung eines Statusberichts
4742
# dar. Es sind auch Navigationselemente enthalten, um bereits erfasste
4743
# Berichte abrufen zu koennen.
4744
#
4745
function ManageStatus($pr_num, $pl_num, $edit=false, $lock=false) {
4746
	global $pmlight;
4747
	global $statusbericht;
4748
	global $menu;
4749
	global $rstufe;
4750
	global $unum;
4751
	global $dtformatshort;
4752
 
4753
	if (!$statusbericht) {
4754
	   Error(GetMessage(-1, 354, "Der Statusbericht wurde nicht freigeschalten!"));
4755
	   return;
4756
	}
4757
 
4758
	if (!isset($pr_num) || $pr_num <= 0) {
4759
	   Error(GetMessage(-1, 355, "Interner Fehler: Projektnummer wurde nicht an ManageStatus &uuml;bergeben!"));
4760
	   return;
4761
	}
4762
 
4763
	if (!isset($pl_num) || $pl_num <= 0) {
4764
	   Error(GetMessage(-1, 356, "Interner Fehler: Plannummer wurde nicht an ManageStatus &uuml;bergeben!"));
4765
	   return;
4766
	}
4767
 
4768
	$env_lock = $_REQUEST['lock'];
4769
 
4770
	if (isset($env_lock) && ($env_lock == true || $env_lock == 1))
4771
	   $lock = true;
4772
 
4773
	if ($edit) {
4774
	   $ps_num = $_REQUEST['ps_num'];
4775
	   $ps_prstat = $_REQUEST['ps_prstat'];
4776
	   $ps_comment = stripslashes(urldecode($_REQUEST['ps_comment']));
4777
	   $ps_status = $_REQUEST['ps_status'];
4778
	   $ps_datum = $_REQUEST['ps_datum'];
4779
	}
4780
 
4781
	$db = OpenDB();
4782
 
4783
	if ($lock && !$edit) {
4784
	   $query = "select ps_num, ps_prstat, ps_comment, ps_status, ";
4785
	   $query .= "to_char(ps_datum, 'DD.MM.YYYY') from planstatus where ";
4786
	   $query .= "ps_prnum = $pr_num and ps_plnum = $pl_num and ";
4787
	   $query .= "ps_status = true order by ps_datum desc";
4788
 
4789
	   if (!($resps = QueryDB($db, $query))) {
4790
	      closeDB($db);
4791
	      return;
4792
	   }
4793
 
4794
	   if (numrowsDB($resps) > 0) {
4795
	      $data = fetchDB($resps, 0);
4796
	      $ps_num = $data[0];
4797
	      $ps_prstat = $data[1];
4798
	      $ps_comment = $data[2];
4799
	      $ps_status = $data[3];
4800
	      $ps_datum = $data[4];
4801
	   }
4802
	}
4803
 
4804
	$query = "select pr_name, pr_pl, mi_nname, mi_vname ";
4805
	$query .= "from project, mitarbeiter where ";
4806
	$query .= "mi_num = pr_pl and pr_num = $pr_num";
4807
 
4808
	if (!($result = QueryDB($db, $query))) {
4809
	   closeDB($db);
4810
	   return;
4811
	}
4812
 
4813
	$data = fetchDB($result, 0);
4814
	$pr_name = $data[0];
4815
	$pr_pl = $data[1];
4816
	$mi_nname = $data[2];
4817
	$mi_vname = $data[3];
4818
 
4819
	if ($pr_pl != $unum && $rstufe != 1) {
4820
	   Error(GetMessage($db, 353, "Nur der Administrator oder der Projektleiter darf den Statusbericht bearbeiten!"));
4821
	   closeDB($db);
4822
	   return;
4823
	}
4824
 
4825
	$query = "select pl_status, pl_lfd from plan where pl_num = $pl_num";
4826
 
4827
	if (!($result = QueryDB($db, $query))) {
4828
	   closeDB($db);
4829
	   return;
4830
	}
4831
 
4832
	$data = fetchDB($result, 0);
4833
	$pl_status = $data[0];
4834
	$pl_lfd = $data[1];
4835
 
4836
	switch($pl_status) {
4837
	   case 1: $str_status = GetMessage($db, 85, "In Erstellung"); break;
4838
	   case 2: $str_status = GetMessage($db, 86, "Freigegeben"); break;
4839
	   case 3: $str_status = ""; break;
4840
	   case 4: $str_status = GetMessage($db, 87, "Aktiv"); break;
4841
	   case 5: $str_status = GetMessage($db, 88, "Inaktiv"); break;
4842
	   case 6: $str_status = GetMessage($db, 89, "Abgeschlossen"); break;
4843
	}
4844
 
4845
	$nav = "menu=$menu&headline=9";
4846
	# Kopf der Maske malen
4847
?>
4848
<form action="plan.php" name="statb" method="post">
4849
   <input type="hidden" name="menu" value="<? echo "$menu"; ?>">
4850
   <input type="hidden" name="headline" value="9">
4851
   <input type="hidden" name="pr_num" value="<? echo "$pr_num"; ?>">
4852
   <input type="hidden" name="pl_num" value="<? echo "$pl_num"; ?>">
4853
   <input type="hidden" name="ps_pl" value="<? echo "$pr_pl"; ?>">
4854
   <input type="hidden" name="lock" value="<? echo "$lock"; ?>">
4855
<?
4856
	if (isset($ps_num) && $ps_num > 0)
4857
	   echo "<input type=\"hidden\" name=\"ps_num\" value=\"$ps_num\">\n";
4858
 
4859
	if (isset($ps_datum))
4860
	   echo "<input type=\"hidden\" name=\"ps_datum\" value=\"$ps_datum\">\n";
4861
 
4862
	if ($edit && !isset($ps_datum))
4863
	   $ps_datum = date($dtformatshort);
4864
?>
4865
   <input type="hidden" name="func" value="SavePlanstatus">
4866
 
4867
<table class="input">
4868
   <tr>
4869
<?
4870
	if ($edit || $lock) {
4871
?>
4872
      <th class="sel" colspan=2><? Output($db, 357, "Statusbericht vom %s", $ps_datum); ?></th>
4873
<?
4874
	} else {
4875
?>
4876
      <th class="sel" colspan=2><? Output($db, 358, "Neuen Statusbericht erfassen"); ?></th>
4877
<?
4878
	}
4879
?>
4880
      <th class="sel"><? Output($db, 359, "Alte Berichte"); ?></th>
4881
   </tr>
4882
   <tr>
4883
      <td><? Output($db, 328, "Projektleiter:"); ?></td>
4884
      <td><? echo "$mi_nname $mi_vname"; ?></td>
4885
      <td rowspan=6 valign="top">
4886
<?
4887
	$query = "select ps_num, ps_plnum, ps_status, ps_comment, ps_prstat,";
4888
	$query .= "to_char(ps_datum, 'DD.MM.YYYY') from planstatus ";
4889
	$query .= "where ps_prnum = $pr_num ";
4890
 
4891
	if ($lock)
4892
	   $query .= "and ps_plnum = $pl_num and ps_status = true ";
4893
 
4894
	$query .= "order by ps_lfd desc";
4895
 
4896
	if (!($result = QueryDB($db, $query))) {
4897
	   closeDB($db);
4898
	   return;
4899
	}
4900
 
4901
	$anz = numrowsDB($result);
4902
	$i = 0;
4903
 
4904
	if ($anz > 0)
4905
	   echo "<table class=\"input\">\n";
4906
 
4907
	while ($i < $anz) {
4908
	   $data = fetchDB($result, $i);
4909
	   $xps_num = $data[0];
4910
	   $xps_plnum = $data[1];
4911
	   $xps_status = $data[2];
4912
	   $xps_comment = $data[3];
4913
	   $xps_prstat = $data[4];
4914
	   $xps_datum = $data[5];
4915
 
4916
	   echo "<tr><td><a href=\"#\" onClick=\"javascript:MoveTo('plan.php',";
4917
	   echo "'pr_num=$pr_num&pl_num=$xps_plnum&ps_prstat=$xps_prstat&";
4918
	   echo "ps_num=$xps_num&ps_comment=" . urlencode($xps_comment) . "&ps_status=$xps_status&";
4919
	   echo "ps_datum=$xps_datum&lock=$lock&func=PSEDIT&$nav')\">";
4920
	   echo "$xps_datum</td><td><img src=\"image/";
4921
 
4922
	   switch ($xps_prstat) {
4923
	      case 0: echo "cool.gif\" alt=\"" . GetMessage($db, 360, "Gruen"); break;
4924
	      case 1: echo "shocked.gif\" alt=\"" . GetMessage($db, 361, "Gelb"); break;
4925
	      case 2: echo "sad.gif\" alt=\"" . GetMessage($db, 362, "Rot"); break;
4926
	      default: echo "huh.gif\" alt=\"" . GetMessage($db, 363, "Undefiniert");
4927
	   }
4928
 
4929
	   echo "\" width=17 height=17></td></tr>\n";
4930
	   $i++;
4931
	}
4932
 
4933
	if ($anz > 0)
4934
	   echo "</table>\n";
4935
?>
4936
      </td>
4937
   </tr>
4938
   <tr>
4939
      <td><? Output($db, 1, "Projekt:"); ?></td>
4940
      <td><? echo "$pr_num $pr_name"; ?></td>
4941
   </tr>
4942
   <tr>
4943
      <td><? Output($db, 287, "Datum:"); ?></td>
4944
      <td><? if ($edit || $lock) echo "$ps_datum"; else echo date($dtformatshort); ?></td>
4945
   </tr>
4946
   <tr>
4947
      <td><? Output($db, 364, "Plannr./Planstatus:"); ?></td>
4948
      <td><? echo "$pl_lfd / $str_status"; ?></td>
4949
   </tr>
4950
   <tr>
4951
      <th class="sel" colspan=2><? Output($db, 38, "Statusbericht"); ?></th>
4952
   </tr>
4953
   <tr>
4954
      <td><? Output($db, 365, "Planstatus:"); ?></td>
4955
      <td><select name="ps_prstat" <? if ($lock || $pl_status > 4) echo "disabled"; ?>>
4956
             <option class="status" value="0" <? if ($ps_prstat == 0) echo "selected"; ?>><? Output($db, 366, "Gr&uuml;n"); ?></option>
4957
             <option class="status" value="1" <? if ($ps_prstat == 1) echo "selected"; ?>><? Output($db, 361, "Gelb"); ?></option>
4958
             <option class="status" value="2" <? if ($ps_prstat == 2) echo "selected"; ?>><? Output($db, 362, "Rot"); ?></option>
4959
          </select>
4960
      </td>
4961
   </tr>
4962
   <tr>
4963
      <td valign="top"><? output($db, 367, "Statusbeschreibung:"); ?></td>
4964
      <td><textarea name="ps_comment" rows=10 cols=60 <? if ($lock || $pl_status > 4) echo "disabled"; ?>><? echo "$ps_comment"; ?></textarea></td>
4965
   </tr>
4966
   <tr>
4967
      <td><? Output($db, 368, "Bericht:"); ?></td>
4968
      <td><select name="ps_status" <? if ($lock || $pl_status > 4) echo "disabled"; ?>>
4969
             <option value="true" <? if ($ps_status == "t" || $ps_status == "true") echo "selected"; ?>><? Output($db, 369, "G&uuml;ltig"); ?></option>
4970
             <option value="false" <? if ($ps_status == "f" || $ps_status == "false") echo "selected"; ?>><? Output($db, 370, "Ung&uuml;ltig"); ?></option>
4971
          </select>
4972
      </td>
4973
   </tr>
4974
</table>
4975
<?
4976
	if ($lock) {
4977
	   echo "</form>\n";
4978
	   closeDB($db);
4979
	   return;
4980
	}
4981
?>
4982
<table class="indent"><tr><td>
4983
<?
4984
	if ($edit) {
4985
	   ButtonLink(GetMessage($db, 371, "Neuer Bericht"), "plan.php", "pr_num=$pr_num&pl_num=$pl_num&func=PLANSTATUS&$nav");
4986
	   echo "</td><td>";
4987
	}
4988
 
4989
	if ($pl_status <= 4)
4990
	   ButtonSubmit(GetMessage($db, 45, "Speichern"), "statb");
4991
 
4992
	echo "</td></tr></table></form>\n";
4993
	closeDB($db);
4994
}
4995
 
4996
# Folgende Funktion speichert einen zuvor erfassten Planstatus. Dabei wird
4997
# ermittelt ob es den Plan bereits gibt oder nicht.
4998
#
4999
function SavePlanstatus() {
5000
	$ps_num = $_REQUEST['ps_num'];
5001
	$ps_prnum = $_REQUEST['pr_num'];
5002
	$ps_plnum = $_REQUEST['pl_num'];
5003
	$ps_pl = $_REQUEST['ps_pl'];
5004
	$ps_status = $_REQUEST['ps_status'];
5005
	$ps_comment = $_REQUEST['ps_comment'];
5006
	$ps_prstat = $_REQUEST['ps_prstat'];
5007
 
5008
	if (!isset($ps_prnum) || $ps_prnum <= 0) {
5009
	   Error("Interner Fehler: Projektnummer wurde nicht an SavePlanstatus &uuml;bergeben!");
5010
	   return;
5011
	}
5012
 
5013
	if (!isset($ps_plnum) || $ps_plnum <= 0) {
5014
	   Error("Interner Fehler: Plannummer wurde nicht an SavePlanstatus &uuml;bergeben!");
5015
	   return;
5016
	}
5017
 
5018
	if (!isset($ps_pl) || $ps_pl <= 0) {
5019
	   Error("Interner Fehler: Projektleiter wurde nicht an SavePlanstatus &uuml;bergeben!");
5020
	   return;
5021
	}
5022
 
5023
	$db = OpenDB();
5024
	# Gibt es den Satz schon, dann machen wir nur ein Update
5025
	if (isset($ps_num) && $ps_num > 0) {
5026
	   $query = "select count(*) from planstatus where ps_num = $ps_num";
5027
 
5028
	   if (!($result = QueryDB($db, $query))) {
5029
	      closeDB($db);
5030
	      return;
5031
	   }
5032
 
5033
	   $data = fetchDB($result, 0);
5034
 
5035
	   if ($data[0] > 0) {
5036
	      $query = "update planstatus set ps_status = $ps_status, ";
5037
	      $query .= "ps_comment = '$ps_comment', ps_prstat = $ps_prstat ";
5038
	      $query .= "where ps_num = $ps_num";
5039
 
5040
	      if (!QueryDB($db, $query)) {
5041
	         closeDB($db);
5042
	         return;
5043
	      }
5044
 
5045
	      closeDB($db);
5046
	      return;
5047
	   }
5048
	}
5049
 
5050
	# Interne laufende Nummer ermitteln
5051
	$query = "select ps_lfd from planstatus where ps_prnum = $ps_prnum order by ps_lfd desc";
5052
 
5053
	if (!($result = QueryDB($db, $query))) {
5054
	   closeDB($db);
5055
	   return;
5056
	}
5057
 
5058
	if (numrowsDB($result) > 0) {
5059
	   $data = fetchDB($result, 0);
5060
	   $ps_lfd = $data[0] + 1;
5061
	} else
5062
	   $ps_lfd = 0;
5063
 
5064
	# Internen Zaehler ermitteln
5065
	$query = "select co_planstatus from counter";
5066
 
5067
	if (!($result = QueryDB($db, $query))) {
5068
	   closeDB($db);
5069
	   return;
5070
	}
5071
 
5072
	$data = fetchDB($result, 0);
5073
	$co_planstatus = $data[0] + 1;
5074
	# Einfuegen der Daten in die Datenbank
5075
	if (!QueryDB($db, "begin")) {
5076
	   closeDB($db);
5077
	   return;
5078
	}
5079
 
5080
	$query = "insert into planstatus (ps_num, ps_pl, ps_prnum, ps_plnum,";
5081
	$query .= "ps_status, ps_comment, ps_lfd, ps_prstat, ps_datum) ";
5082
	$query .= "values ($co_planstatus, $ps_pl, $ps_prnum, $ps_plnum, ";
5083
	$query .= "$ps_status, '$ps_comment', $ps_lfd, $ps_prstat, ";
5084
	$query .= "current_timestamp)";
5085
 
5086
	if (!QueryDB($db, $query)) {
5087
	   QueryDB($db, "rollback");
5088
	   closeDB($db);
5089
	   return;
5090
	}
5091
 
5092
	$query = "update counter set co_planstatus = $co_planstatus";
5093
 
5094
	if (!QueryDB($db, $query)) {
5095
	   QueryDB($db, "rollback");
5096
	   closeDB($db);
5097
	   return;
5098
	}
5099
 
5100
	QueryDB($db, "commit");
5101
	closeDB($db);
5102
}
5103
 
5104
require_once('planlockm.inc');
5105
 
5106
# Folgende Abfrage stellt eine Maske zur Verfuegung, mit deren Hilfe
5107
# die Stammdaten eines neuen Plans erfasst werden koennen. Es ist der Erste
5108
# von insgesamt 3 Schritten.
5109
# Im zweiten Schritt wird zwischen Grob und Feinplanung entschieden. Bei der
5110
# Grobplanung werden noch keine direkten Ressourcen vergeben, wohl aber die
5111
# Anzahl der PT und die Zeitdauer der Tasks angegeben.
5112
# Nei der Feinplanung werden dann den Tasks Ressourcen zugeordnet. Diese
5113
# Planung kann schlisslich in Form eines Ganttcharts ausgegeben werden.
5114
# Bei der sp�eren IST-Erfassung werden die eingegebenen Zeiten mit den
5115
# geplanten gegengerechnet und Abweichungen dargestellt.
5116
#
5117
if ($knopf == 10) {
5118
   echo "<form name=\"temp\" action=\"plan.php\" method=\"post\">\n";
5119
   echo "<input type=\"hidden\" name=\"pl_status\" value=\"1\">\n";
5120
   echo "<input type=\"hidden\" name=\"headline\" value=\"19\">\n";
5121
   echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
5122
   echo "<input type=\"hidden\" name=\"func\" value=\"SaveNewPlan\">\n";
5123
 
5124
   echo "<table class=\"input\">\n";
5125
   echo "<tr><td>Projekt:</td><td><select name=\"pl_prnum\">\n";
5126
 
5127
   $db = OpenDB();
5128
 
5129
   if ($rstufe == 1) {
5130
      $query = "select pr_num, pr_name from project where pr_status = 0 ";
5131
      $query .= "order by pr_num";
5132
   } else {
5133
      $query = "select pr_num, pr_name from project where ";
5134
      $query .= "pr_pl = $unum and pr_status = 0 ";
5135
      $query .= "order by pr_num";
5136
   }
5137
 
5138
   $result = QueryDB($db, $query);
5139
   $numrows = numrowsDB($result);
5140
   $row = 0;
5141
 
5142
   while ($row < $numrows) {
5143
      $data = fetchDB($result, $row);
5144
      $pr_num = $data[0];
5145
      $pr_name = $data[1];
5146
 
5147
      $query = "select count(*) from plan where pl_prnum = $pr_num and ";
5148
      $query .= "pl_status = 6";
5149
 
5150
      if (!($respl = QueryDB($db, $query)))
5151
	 break;
5152
 
5153
      $data = fetchDB($respl, 0);
5154
 
5155
      if ($data[0] > 0) {
5156
	 $row++;
5157
	 continue;
5158
      }
5159
 
5160
      echo "<option value=\"$pr_num\">$pr_num $pr_name</option>\n";
5161
      $row++;
5162
   }
5163
 
5164
   echo "</select></td></tr>\n";
5165
   echo "<tr><td>Template:</td>\n";
5166
   echo "<td><select name=\"te_num\">\n<option value=\"0\"> -- kein Template -- </option>\n";
5167
 
5168
   $query = "select te_num, te_name from tempidx order by te_name";
5169
   $result = QueryDB($db, $query);
5170
   $numrows = numrowsDB($result);
5171
   $row = 0;
5172
 
5173
   while ($row < $numrows) {
5174
      $data = fetchDB($result, $row);
5175
      $te_num = $data[0];
5176
      $te_name = $data[1];
5177
      echo "<option value=\"$te_num\">$te_name</option>\n";
5178
      $row++;
5179
   }
5180
 
5181
   echo "</td></tr>\n";
5182
   echo "</table>\n";
5183
   echo "<table class=\"indent\"><tr><td>";
5184
   ButtonSubmit("Plan erstellen", "temp");
5185
   echo "</td></tr></table>";
5186
   echo "</form>\n";
5187
}
5188
 
5189
if ($knopf == 2) {
5190
   ShowPlan($rstufe, $menu, $unum);
5191
//   include('start.inc');
5192
}
5193
 
5194
if ($knopf == 11) {
5195
   ShowPlan($rstufe, $menu, $unum);
5196
}
5197
 
5198
if (isset($func)) {
5199
   if ($func == "SaveNewPlan") {
5200
      $te_num = $_REQUEST['te_num'];
5201
      $pl_num = SaveNewPlan();
5202
 
5203
      if ($pl_num > 0 && $te_num > 0) {
5204
	 PlanPeriode($pl_num, 0, 0);
5205
      } else if ($pl_num > 0) {
5206
         AddTask($pl_num, 1);
5207
      }
5208
   }
5209
 
5210
   if ($func == "DeletePlan") {
5211
      if (isset($_REQUEST['yes'])) {
5212
         DeletePlan();
5213
	 $pl_num = $_REQUEST['pl_num'];
5214
	 echo "<p class=\"cry\">Plan Nr.: $pl_num wurde erfolgreich gel&ouml;scht!</p>\n";
5215
      }
5216
 
5217
      ShowPlan($rstufe, $menu, $unum);
5218
   }
5219
 
5220
   if ($func == "DeleteTask") {
5221
      if (isset($_REQUEST['yes'])) {
5222
         DeleteTask();
5223
      }
5224
 
5225
      $ta_plnum = $_REQUEST['ta_plnum'];
5226
      PlanPeriode($ta_plnum, 0, 0);
5227
   }
5228
 
5229
   if ($func == "GetColor") {
5230
      GetColor();
5231
   }
5232
 
5233
   if ($func == "SaveTask" || $func == "SaveObsoleteTask") {
5234
      if ($func == "SaveObsoleteTask")
5235
         $doit = true;
5236
      else
5237
         $doit = false;
5238
 
5239
      if (SaveTask($doit)) {
5240
         $ta_plnum = $_REQUEST['ta_plnum'];
5241
         PlanPeriode($ta_plnum, 0, 0);
5242
      } else {
5243
//         $pl_num = $_REQUEST['pl_num'];
5244
         $ta_plnum = $_REQUEST['ta_plnum'];
5245
	 $ta_id = $_REQUEST['ta_id'];
5246
	 $ta_num = $_REQUEST['ta_num'];
5247
 
5248
	 if (isset($ta_num) && $ta_num > 0)
5249
	    EditTask($ta_num);
5250
	 else
5251
            AddTask($ta_plnum, $ta_id);
5252
      }
5253
   }
5254
 
5255
   if ($func == "AddMiAdd") {
5256
      AddMiAdd();
5257
      $al_task = $_REQUEST['al_task'];
5258
      AddMi($al_task);
5259
   }
5260
 
5261
   if ($func == "AllocMa") {
5262
      $pl_num = $_REQUEST['pl_num'];
5263
      PlanPeriode($pl_num, 0, 0, true);
5264
   }
5265
 
5266
   if ($func == "SaveMa") {
5267
      $pl_num = $_REQUEST['pl_num'];
5268
      $yes = $_REQUEST['yes'];
5269
 
5270
      if (isset($yes) && $yes == "yes")
5271
         $yes = true;
5272
      else
5273
         $yes = false;
5274
 
5275
      if (!SaveMa($yes)) {
5276
         PlanPeriode($pl_num, 0, 0, true);
5277
      } else
5278
         PlanPeriode($pl_num, 0, 0);
5279
   }
5280
 
5281
   if ($func == "SaveUpMa") {
5282
      $pl_num = $_REQUEST['pl_num'];
5283
 
5284
      if (!SaveUpMa()) {
5285
	 $ta_num = $_REQUEST['al_task'];
5286
	 $ressource = $_REQUEST['ressource'];
5287
	 PlanPeriode($pl_num, $ta_num, $ressource);
5288
      } else
5289
         PlanPeriode($pl_num, 0, 0);
5290
   }
5291
 
5292
   if ($func == "UpdateMa") {
5293
      $pl_num = $_REQUEST['pl_num'];
5294
      $ta_num = $_REQUEST['al_task'];
5295
      $ressource = $_REQUEST['ressource'];
5296
      PlanPeriode($pl_num, $ta_num, $ressource);
5297
   }
5298
 
5299
   if ($func == "AskDeleteMa") {
5300
      AskDeleteMa();
5301
   }
5302
 
5303
   if ($func == "DeleteMa") {
5304
      if (isset($_REQUEST['yes']))
5305
         DeleteMa();
5306
 
5307
      $pl_num = $_REQUEST['pl_num'];
5308
      PlanPeriode($pl_num, 0, 0);
5309
   }
5310
 
5311
   if ($func == "EditPlStatus") {
5312
      $pl_num = $_REQUEST['pl_num'];
5313
      ShowPlan($rstufe, $menu, $unum, $pl_num);
5314
      $knopf = -1;
5315
   }
5316
 
5317
   if ($func == "UpdatePlan") {
5318
      UpdatePlan();
5319
      ShowPlan($rstufe, $menu, $unum);
5320
      $knopf = -1;
5321
   }
5322
 
5323
   if ($func == "WriteStatus") {
5324
      if ($_REQUEST['yes'] == "yes")
5325
         UpdatePlan(true);
5326
 
5327
      ShowPlan($rstufe, $menu, $unum);
5328
      $knopf = -1;
5329
   }
5330
 
5331
   if ($func == "COMMENT") {
5332
      SavePlanComment();
5333
 
5334
      if (!isset($editplan) || $editplan <= 0) {
5335
	 $pl_num = $_REQUEST['pl_num'];
5336
	 PlanPeriode($pl_num, 0, 0);
5337
      }
5338
   }
5339
 
5340
   if ($func == "PLANSTATUS") {
5341
      $pr_num = $_REQUEST['pr_num'];
5342
      $pl_num = $_REQUEST['pl_num'];
5343
      $lock = $_REQUEST['lock'];
5344
 
5345
      if ($lock)
5346
	 ManageStatus($pr_num, $pl_num, false, true);
5347
      else
5348
	 ManageStatus($pr_num, $pl_num);
5349
   }
5350
 
5351
   if ($func == "SavePlanstatus") {
5352
      SavePlanstatus();
5353
      $pr_num = $_REQUEST['pr_num'];
5354
      $pl_num = $_REQUEST['pl_num'];
5355
      ManageStatus($pr_num, $pl_num, true);
5356
   }
5357
 
5358
   if ($func == "PSEDIT") {
5359
      $pr_num = $_REQUEST['pr_num'];
5360
      $pl_num = $_REQUEST['pl_num'];
5361
      ManageStatus($pr_num, $pl_num, true);
5362
   }
5363
 
5364
   if ($func == "LockM")
5365
      AskLockM();
5366
 
5367
   if ($func == "LockProject") {
5368
      LockProject();
5369
      ShowPlan($rstufe, $menu, $unum);
5370
   }
5371
}
5372
 
5373
# Folgende Abfragen werden dann Aktiv, wenn der Anwender einen der
5374
# Buttons in der ersten Spalte der durch ShowPlan() angezeigten Tabelle
5375
# klickt.
5376
#
5377
if (isset($editplan) && $editplan > 0) {
5378
   $lock = $_REQUEST['lock'];
5379
   PlanPeriode($editplan, 0, 0);
5380
}
5381
 
5382
if (isset($viewplan) && $viewplan > 0) {
5383
   PlanPeriode($viewplan, 0, 0, false, true);
5384
}
5385
 
5386
if (isset($deleteplan) && $deleteplan > 0) {
5387
   AskDelete($deleteplan);
5388
}
5389
 
5390
if (isset($editcopy) && $editcopy > 0) {
5391
   if ($func == "CopyPlan") {
5392
      $yes = $_REQUEST['yes'];
5393
      $cancel = $_REQUEST['cancel'];
5394
 
5395
      if (isset($cancel) && $cancel == "cancel")
5396
         $cancel = true;
5397
      else
5398
         $cancel = false;
5399
 
5400
      if (!isset($yes))
5401
         $yes = false;
5402
      else
5403
         $yes = true;
5404
 
5405
      $doit = true;
5406
   } else {
5407
      $yes = false;
5408
      $doit = false;
5409
   }
5410
 
5411
   if (!$cancel && EditCopy($editcopy, $yes, $doit))
5412
      Error("Plan wurde erfolgreich kopiert!");
5413
   else if (!$cancel)
5414
      Error("Plan konnte nicht kopiert werden!");
5415
   else
5416
      Error("Aktion wurde abgebrochen.");
5417
 
5418
   ShowPlan($rstufe, $menu, $unum);
5419
}
5420
 
5421
if (isset($taskadd) && $taskadd > 0) {
5422
   $ta_plnum = $_REQUEST['ta_plnum'];
5423
   AddTask($ta_plnum, $taskadd);
5424
}
5425
 
5426
if (isset($deletetask) && $deletetask > 0) {
5427
   AskDeleteTask($deletetask);
5428
}
5429
 
5430
if (isset($edittask) && $edittask > 0) {
5431
   EditTask($edittask);
5432
}
5433
 
5434
if (isset($addmi) && $addmi > 0) {
5435
   AddMi($addmi);
5436
}
5437
 
5438
if (isset($addmiadd)) {
5439
   $al_task = $_REQUEST['al_task'];
5440
   AddMi($al_task, 1);
5441
}
5442
 
5443
if (isset($addmidel) && $addmidel > 0) {
5444
   AddMiDel($addmidel);
5445
   $al_task = $_REQUEST['al_task'];
5446
   AddMi($al_task);
5447
}
5448
 
5449
if (isset($movedown) && $movedown > 0) {
5450
   if (MoveTask($movedown, 1)) {
5451
      $pl_num = $_REQUEST['pl_num'];
5452
 
5453
      if (isset($pl_num) && $pl_num > 0)
5454
         PlanPeriode($pl_num, 0, 0);
5455
      else
5456
         Error("Interner Fehler: Plannummer ist verloren gegangen!");
5457
   } else
5458
      Error ("Task konnte nicht verschoben werden!");
5459
}
5460
 
5461
if (isset($moveup) && $moveup > 0) {
5462
   if (MoveTask($moveup, -1)) {
5463
      $pl_num = $_REQUEST['pl_num'];
5464
 
5465
      if (isset($pl_num) && $pl_num > 0)
5466
         PlanPeriode($pl_num, 0, 0);
5467
      else
5468
         Error("Interner Fehler: Plannummer ist verloren gegangen!");
5469
   } else
5470
      Error ("Task konnte nicht verschoben werden!");
5471
}
5472
 
5473
require('footer.inc');
5474
?>