Subversion Repositories public

Rev

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