Subversion Repositories public

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 andreas 1
<?php
2
require_once('version.inc');
3
require_once('dbaccess.inc');
4
require_once('language.inc');
5
require_once('header.inc');
6
require_once('crypt.inc');
7
require_once('settings.inc');
8
require_once('helper.inc');
9
 
10
$drm = array(true, false, false, false, true, true, true, true);
11
$headline = 10;
12
 
13
require_once('menu.inc');
14
require_once('knumber.inc');
15
 
16
$func = $_REQUEST['func'];
17
 
18
# In diesem Modul global verwendete Variablen
19
$sumparr = array(0,0,0,0,0,0,0,0,0);	// Spaltensummen der Eingabezeilen
20
$sumiarr = array(0,0,0,0,0,0,0,0,0);
21
$sumallp = 0.0;		// Spaltensumme der Tasks
22
$sumalli = 0.0;
23
 
24
# Folgende Funktion gibt die IST-Daten bzw. Eingabezeilen fuer einen
25
# Mitarbeiter innerhalb der Tabelle aus.
26
#
27
function ShowMitarbeiter($db, $minum, $anz, $von, $bis, $pr_num, $pl_num, $mi=true) {
28
	global $pmlight;
29
	global $rstufe;
30
	global $leneinheit;
31
	global $periode;
32
	global $ist_erledigung;
33
	global $ist_future;
34
	global $sumparr;
35
	global $sumiarr;
36
	global $sumallp;
37
	global $sumalli;
38
 
39
	# Ermitteln ab wann noch erfasst werden darf.
40
	$query = "select ab_datum from abschluss where ab_prnum = $pr_num ";
41
	$query .= "and ab_plnum = $pl_num order by ab_datum desc";
42
 
43
	if (!($result = QueryDB($db, $query)))
44
	   return false;
45
 
46
	if (numrowsDB($result) > 0) {
47
	   $data = fetchDB($result, 0);
48
	   $ab_datum = $data[0];
49
	} else
50
	   $ab_datum = 0;
51
 
52
	# Projekt oder Konto?
53
	$query = "select pr_status from project where pr_num = $pr_num";
54
 
55
	if (!($result = QueryDB($db, $query)))
56
	   return false;
57
 
58
	$data = fetchDB($result, 0);
59
	$pr_status = $data[0];
60
 
61
	# Auslesen der Tasks welche bebucht werden koennen.
62
	$akt = $von;
63
 
64
	if ($pr_status == 0) {
65
	   $query = "select distinct on (ta_hash) ta_name, sum(al_hours), ta_num, ta_start, ";
66
	   $query .= "ta_duration, ta_hash from task, plan, allocation where ";
67
	   $query .= "pl_num = ta_plnum and al_task = ta_num and al_ressource = $minum and ";
68
	   $query .= "ta_meeting = 0 and pl_status in (0,2,3,4,5) and ta_level > 1 and ";
69
	   $query .= "pl_prnum = $pr_num and (ta_plnum = $pl_num or ";
70
	   $query .= "ta_plnum in (select ta_plnum from wdone, task where ";
71
	   $query .= "ta_num = wd_task and wd_minum = $minum and wd_prnum = $pr_num and ";
72
	   $query .= "wd_datum between $von and $bis order by ta_plnum desc)) and ";
73
//	   $query .= "pl_prnum = $pr_num and ";
74
 
75
	   if (!$ist_future) {
76
	      $query .= "ta_start <= $bis ";
77
	   } else {
78
	      $query .= "(ta_start between $von and $bis or ";
79
	      $query .= "ta_start+ta_duration*86400 between $von and $bis or ";
80
	      $query .= "$von between ta_start and ta_start+ta_duration*86400 or ";
81
	      $query .= "$bis between ta_start and ta_start+ta_duration*86400 or ";
82
	      $query .= "ta_num in (select wd_task from wdone where ";
83
	      $query .= "wd_minum = $minum and wd_prnum = $pr_num and ";
84
	      $query .= "wd_datum between $von and $bis)) ";
85
	   }
86
 
87
	   $query .= "group by ta_hash, ta_num, ta_start, ta_duration, ta_name order by ta_hash, ta_name";
88
	} else {
89
	   $query = "select ta_name, ta_id, ta_num, ta_start, ta_duration, ta_hash from task ";
90
	   $query .= "where ta_plnum = $pl_num";
91
	}
92
 
93
	if (!($res = QueryDB($db, $query)))
94
	   return false;
95
 
96
	$rows = numrowsDB($res);
97
	$r = 0;
98
 
99
	while ($r < $rows) {
100
	   $data = fetchDB($res, $r);
101
	   $ta_name = $data[0];
102
	   $plan = $data[1];
103
	   $ta_num = $data[2];
104
	   $ta_start = $data[3];
105
	   $ta_duration = $data[4];
106
	   $ta_hash = $data[5];
107
 
108
	   # Ermitteln des Planstatus zum aktuellen Task. Ist dieser
109
	   # "Inaktiv" dann darf nur dann eine Planausgabe erfolgen, wenn
110
	   # es einen IST-Wert in der entsprechenden Periode gibt. Das
111
	   # betrifft nur die Periodenerfassung ($pmlight == true).
112
	   if ($pmlight) {
113
	      $query = "select pl_status from plan, task where ";
114
	      $query .= "pl_num = ta_plnum and ta_num = $ta_num";
115
 
116
	      if (!($resta = QueryDB($db, $query)))
117
	         return false;
118
 
119
	      $data = fetchDB($resta, 0);
120
	      $pl_status = $data[0];
121
	   }
122
 
123
	   if ($rstufe == 3)
124
	      $csp = "colspan=2";
125
	   else
126
	      $csp = "";
127
 
128
	   echo "<tr><td class=\"sel\" $csp>$ta_name</td>";
129
 
130
	   if ($rstufe != 3 && $mi) {
131
	      $query = "select mi_nname, mi_vname from mitarbeiter where ";
132
	      $query .= "mi_num = $minum";
133
 
134
	      if (!($resmi = QueryDB($db, $query)))
135
	         return false;
136
 
137
	      $data = fetchDB($resmi, 0);
138
 
139
	      if (!$data) {
140
	         Error("Mitarbeiter konnte nicht ermittelt werden!");
141
	         return false;
142
	      }
143
 
144
	      $mi_nname = $data[0];
145
	      $mi_vname = $data[1];
146
	      echo "<td class=\"sel\">$mi_nname $mi_vname</td>\n";
147
	   } else if ($rstufe != 3) {
148
	      echo "<td class=\"sel\"></td>\n";
149
	   }
150
 
151
	   # Erledigungsgrad ermitteln
152
	   $query = "select sum(wd_hours)/$leneinheit from wdone, task ";
153
	   $query .= "where wd_minum = $minum and wd_prnum = $pr_num and ";
154
	   $query .= "ta_num = wd_task and ta_hash ='$ta_hash'";
155
 
156
	   if (!($reser = QueryDB($db, $query)))
157
	      return false;
158
 
159
	   $data = fetchDB($reser, 0);
160
 
161
	   if (!$data) {
162
	      Error("Erledigungsgrad konnte nicht ermittelt werden!");
163
	      return false;
164
	   }
165
 
166
	   $ist = $data[0];
167
 
168
	   if ($ist_erledigung) {
169
	      if ($plan != 0)
170
	         $proz = $ist / $plan * 100.0;
171
	      else
172
	         $proz = 0.0;
173
	   }
174
 
175
	   if ($pmlight)
176
	      echo "<td class=\"sel\">Plan:<br>IST:</td>\n";
177
 
178
	   $sumi = 0.0;
179
	   $sump = 0.0;
180
	   $z = 0;
181
	   $akt = $von;
182
 
183
	   while ($z < $anz) {
184
	      # Eingabezeilen schreiben (nur wenn Edit erlaubt ist!)
185
	      if ($pmlight) {
186
	         $mon = gmdate("n", $akt);
187
	         $year = gmdate("Y", $akt);
188
	         $dstart = gmmktime(0, 0, 0, $mon, 1, $year);
189
	         $dend = gmmktime(0, 0, 0, $mon, daysinmonth($mon, $year), $year);
190
	         $query = "select sum(wd_hours)/$leneinheit, wd_edit, wd_task from wdone, task ";
191
	         $query .= "where wd_minum = $minum and ta_num = wd_task and ";
192
//	         $query .= "where wd_minum = $minum and ";
193
	         $query .= "ta_hash = '$ta_hash' and wd_prnum = $pr_num and ";
194
	         $query .= "wd_datum >= $dstart and wd_datum <= $dend ";
195
	         $query .= "group by wd_task, wd_edit";
196
	      } else {
197
	         $query = "select wd_hours, wd_edit, wd_task from wdone, task where ";
198
	         $query .= "wd_minum = $minum and wd_prnum = $pr_num and ";
199
	         $query .= "ta_num = wd_task and ta_hash = '$ta_hash' and ";
200
	         $query .= "wd_datum between $akt and $akt";
201
	      }
202
 
203
	      if (!($reswd = QueryDB($db, $query)))
204
	         return false;
205
 
206
	      if (numrowsDB($reswd) > 0) {
207
	         $data = fetchDB($reswd, 0);
208
	         $wd_hours = $data[0];
209
	         $wd_edit = $data[1];
210
	         $wd_task = $data[2];
211
	      } else {
212
	         $wd_hours = 0;
213
	         $wd_edit = 1;
214
	         $wd_task = $ta_num;
215
	      }
216
 
217
	      if ($pmlight) {
218
	         if ($pr_status == 0) {
219
		    $tmon = gmdate("n", $ta_start);
220
		    $tyear = gmdate("Y", $ta_start);
221
		    $td = gmmktime(0, 0, 0, $tmon, 1, $tyear);
222
		 } else
223
		    $td = 0;
224
 
225
	         if ($ist_future) {
226
	            if ($pr_status == 0) {
227
		       $ta_end = $ta_start + $ta_duration * 86400;
228
		       $temon = gmdate("n", $ta_end);
229
		       $teyear = gmdate("Y", $ta_end);
230
		       $te = gmmktime(0, 0, 0, $temon, daysinmonth($temon, $teyear), $teyear);
231
		       $dcomp = ($akt >= $td && $akt <= $te) ? true : false;
232
		    } else {
233
		       $te = 0;
234
		       $dcomp = true;
235
		    }
236
	         } else
237
	            $dcomp = ($akt >= $td) ? true : false;
238
 
239
	         $query = "select al_hours from allocation where ";
240
	         $query .= "al_task = $ta_num and al_pstart between $dstart and $dend and ";
241
	         $query .= "al_ressource = $minum";
242
 
243
	         if (!($resal = QueryDB($db, $query)))
244
	            return false;
245
 
246
		 if (numrowsDB($resal) > 0) {
247
		    if ($pl_status != 5 || $wd_hours > 0.0) {
248
	               $data = fetchDB($resal, 0);
249
	               $al_hours = $data[0];
250
		    } else
251
		       $al_hours = 0.0;
252
 
253
	            $sump += $al_hours;
254
	            $sumparr[$z] += $al_hours;
255
	         } else
256
	            $al_hours = 0;
257
	      } else if ($ist_future)
258
	         $dcomp = ($akt >= $ta_start && $akt <= ($ta_start+$ta_duration*86400)) ? true : false;
259
	      else
260
	         $dcomp = ($akt >= $ta_start) ? true : false;
261
 
262
	      # Heraus finden, ob der aktuelle Task dem neuesten Plan gehoert,
263
	      # oder nicht. Wenn es sich um einen aelteren Plan handelt
264
	      # (Status = Inaktiv) dann darf keine IST-Eingabe moeglich sein.
265
	      if ($dcomp) {
266
	         $query = "select pl_status from plan, task where ";
267
	         $query .= "pl_num = ta_plnum and ta_num = $ta_num";
268
 
269
	         if (!($resdc = QueryDB($db, $query)))
270
	            return false;
271
 
272
		 $data = fetchDB($resdc, 0);
273
		 $akt_status = $data[0];
274
 
275
		 if ($akt_status > 1) {
276
		    $query = "select pl_status from project, plan where ";
277
		    $query .= "pl_prnum = pr_num and pr_num = $pr_num and ";
278
		    $query .= "pl_status in (2,3,4,5) ";
279
		    $query .= "order by pl_lfd desc";
280
 
281
		    if (!($resdc = QueryDB($db, $query)))
282
		       return false;
283
 
284
		    $data = fetchDB($resdc, 0);
285
		    $new_status = $data[0];
286
 
287
		    if ($new_status < $akt_status) {
288
		       $dcomp = false;
289
		       $pplan = true;
290
		    }
291
		 }
292
	      } else
293
	         $pplan = false;
294
 
295
	      if ($akt > $ab_datum && $dcomp && ($wd_edit == 't' || $wd_edit == true || $wd_edit == 1)) {
296
		 if (!$pmlight && (gmdate("w", $akt) == 6 || gmdate("w", $akt) == 0))
297
		    $class = "seldkgray";
298
		 else
299
		    $class = "sel";
300
 
301
	         $name = "dt_" . $minum . "_" . $pr_num . "_" . $wd_task . "_" . $akt;
302
 
303
	         if ($pmlight)
304
	            printf("<td class=\"selnum\">%s<br><input type=\"text\" name=\"$name\" value=\"%s\" size=6 maxlength=6></td>\n",
305
			FormatNum($al_hours, 3),
306
			($wd_hours <= 0) ? "" : FormatNum($wd_hours, 3));
307
		 else
308
	            printf("<td class=\"$class\"><input type=\"text\" name=\"$name\" value=\"%s\" size=6 maxlength=6></td>\n",
309
			($wd_hours <= 0) ? "" : FormatNum($wd_hours, 3));
310
	      }
311
	      else if ($pplan)
312
	         printf("<td class=\"selnum\">%s<br>%s</td>\n",
313
	            FormatNum($al_hours, 3), FormatNum($wd_hours, 3));
314
	      else
315
	         printf("<td class=\"selnum\"><br>%s</td>\n", ($wd_hours <= 0) ? "" : FormatNum($wd_hours, 3));
316
 
317
	      if ($pmlight)
318
	         $akt = IncDate($periode, $akt);
319
	      else
320
		 $akt += 86400;
321
 
322
	      $sumi += $wd_hours;
323
	      $sumiarr[$z] += $wd_hours;
324
	      $z++;
325
	   }
326
 
327
	   if ($pmlight) {
328
	      printf("<td class=\"selakt\" align=\"right\"><b>%s</b></td>\n", FormatNum($sump, 3));
329
 
330
	      if ($sumi > $sump && $pr_status == 0)
331
	         printf("<td class=\"five\" align=\"right\"><br><b>%s</b></td>\n", FormatNum($sumi, 3));
332
	      else
333
	         printf("<td class=\"selakt\" align=\"right\"><br><b>%s</b></td>\n", FormatNum($sumi, 3));
334
	   } else
335
	      printf("<td class=\"selakt\" align=\"right\"><b>%s</b></td>\n", FormatNum($sumi, 3));
336
 
337
	   printf("<td class=\"selnum\"><b>%s</b></td>\n", FormatNum($plan, 3));
338
 
339
	   if (!$ist_erledigung && $ist > $plan && $pr_status == 0) {
340
	      if ($pmlight)
341
	         printf("<td class=\"five\" align=\"right\" valign=\"top\"><br><b>%s</b></td>\n", FormatNum($ist, 3));
342
	      else
343
	         printf("<td class=\"five\" align=\"right\" valign=\"top\"><b>%s</b></td>\n", FormatNum($ist, 3));
344
	   } else {
345
	      if ($pmlight)
346
	         printf("<td class=\"selnum\"><b><br>%s</b></td>\n", FormatNum($ist, 3));
347
	      else
348
	         printf("<td class=\"selnum\"><b>%s</b></td>\n", FormatNum($ist, 3));
349
	   }
350
 
351
	   $sumallp += $plan;
352
	   $sumalli += $ist;
353
 
354
	   if ($ist_erledigung) {
355
	      if ($proz > 100.0 && $pr_status == 0)
356
	         printf ("<td class=\"five\" align=\"right\">%s%%</td></tr>\n", FormatNum($proz, 1));
357
	      else
358
	         printf ("<td class=\"selnum\">%s%%</td></tr>\n", FormatNum($proz, 1));
359
	   }
360
 
361
	   $r++;
362
	}
363
 
364
	return true;
365
}
366
 
367
# Folgende Funktion verwaltet und visualisiert die Auswahlmoeglichkeiten
368
# fuer die IST-Erfassung. Fuer die Darstellung und Eingabefelder der
369
# eigentlichen Isterfassung fuer einen Mitarbeiter, siehe ShowMitarbeiter()
370
#
371
function ManageTime() {
372
	global $phase;
373
	global $pmlight;
374
	global $rstufe;
375
	global $unum;
376
	global $einheit;
377
	global $leneinheit;
378
	global $periode;
379
	global $ist_erledigung;
380
	global $ist_future;
381
	global $menu;
382
	global $headline;
383
	global $sumparr;
384
	global $sumiarr;
385
	global $sumallp;
386
	global $sumalli;
387
	global $dtformatshort;
388
 
389
	$db = OpenDB();
390
	$nav = "menu=$menu&headline=$headline&project='+";
391
	$nav .= "document.ist.project.value+'&mitarbeiter='+";
392
	$nav .= "document.ist.mitarbeiter.value+'&von='+";
393
	$nav .= "document.ist.von.value+'&bis='+document.ist.bis.value+'";
394
 
395
	# Per default waehlen wir alle Projekte (eines Mitarbeiters) aus,
396
	# alle Mitarbeiter die diesem Projekt zugeordnet sind, sofern es sich
397
	# um den Projektleiter handelt und die im Zeitraum der aktuellen
398
	# Periode sind, aus.
399
	#
400
	if ($rstufe == 2 || $rstufe == 3) {
401
	   $query = "select distinct on (pr_num) pr_num, pr_name, pr_pl, ";
402
	   $query .= "mi_nname, mi_vname, pl_num, pl_lfd, pl_status ";
403
	   $query .= "from project, plan, mitarbeiter, task, allocation ";
404
	   $query .= "where pl_prnum = pr_num and mi_num = pr_pl ";
405
	   $query .= "and pl_status in (0, 2, 3, 4, 5) and pl_num = ta_plnum and ";
406
	   $query .= "ta_num = al_task and ";
407
 
408
	   if ($rstufe == 2)
409
	      $query .= "(al_ressource = $unum or pr_pl = $unum or pr_status = 1) ";
410
	   else
411
	      $query .= "(al_ressource = $unum or pr_status = 1)";
412
	} else {
413
	   $query = "select distinct on (pr_num) pr_num, pr_name, pr_pl, mi_nname, mi_vname, ";
414
	   $query .= "pl_num, pl_lfd, pl_status ";
415
	   $query .= "from project, plan, mitarbeiter where ";
416
	   $query .= "pl_prnum = pr_num and mi_num = pr_pl and ";
417
	   $query .= "pl_status in (0, 2, 3, 4, 5) ";
418
	}
419
 
420
	$query .= "order by pr_num, pl_lfd desc";
421
//	$query .= "order by pr_num, pl_lfd desc, pl_status desc";
422
 
423
	if (!($result = QueryDB($db, $query))) {
424
	   closeDB($db);
425
	   return;
426
	}
427
 
428
	$rows = numrowsDB($result);
429
 
430
	if ($rows <= 0) {
431
	   Error("Es wurden keine bebuchbaren Projekte gefunden!");
432
	   closeDB($db);
433
	   return;
434
	}
435
 
436
	# Auswahlfelder fuer die IST-Buchungen anzeigen
437
	$project = $_REQUEST['project'];
438
	$mitarbeiter = $_REQUEST['mitarbeiter'];
439
	$von = $_REQUEST['von'];
440
	$bis = $_REQUEST['bis'];
441
 
442
	if (!isset($mitarbeiter))
443
	   $mitarbeiter = $unum;
444
 
445
	if (isset($von) && isset($bis)) {
446
	   $dxa = explode(".", $von);
447
	   $dxb = explode(".", $bis);
448
 
449
	   if ($pmlight) {
450
	      $dta = gmmktime(0, 0, 0, $dxa[0], 1, $dxa[1]);
451
	      $dtb = gmmktime(0, 0, 0, $dxb[0], 1, $dxb[1]);
452
	   } else {
453
	      $dta = gmmktime(0, 0, 0, $dxa[1], $dxa[0], $dxa[2]);
454
	      $dtb = gmmktime(0, 0, 0, $dxb[1], $dxb[0], $dxb[2]);
455
	   }
456
 
457
	   if ($dta > $dtb) {
458
	      Error("Das \"Datum von\" darf nicht gr&ouml;&szlig;er als das \"Datum bis\" sein!");
459
	      unset($von);
460
	      unset($bis);
461
	   }
462
 
463
	   unset($dxa);
464
	   unset($dxb);
465
	   unset($dta);
466
	   unset($dtb);
467
	}
468
 
469
 
470
	echo "<form name=\"ist\" action=\"ist_alt.php\" method=\"post\" onChange=\"javascript:KeyEvent(this)\">\n";
471
	echo "<input type=\"hidden\" name=\"menu\" value=\"$menu\">\n";
472
	echo "<input type=\"hidden\" name=\"headline\" value=\"$headline\">\n";
473
	echo "<input type=\"hidden\" name=\"func\" value=\"save\">\n";
474
	echo "<table class=\"input\">\n<tr>\n";
475
	# Projekte anzeigen
476
	echo "<td>Projekte</td>\n";
477
	echo "<td><select name=\"project\" ";
478
	echo "onChange=\"javascript:MoveTo('ist_alt.php','$nav')\">\n";
479
	echo "<option value=\"0\">Alle</option>\n";
480
	$r = 0;
481
	$flag = false;
482
 
483
	while ($r < $rows) {
484
	   $data = fetchDB($result, $r);
485
	   $pr_num = $data[0];
486
	   $pr_name = $data[1];
487
	   $plnum = $data[5];
488
	   $pl_lfd = $data[6];
489
	   $pl_status = $data[7];
490
 
491
	   if ($pl_status == 6) {
492
	      $r++;
493
	      continue;
494
	   }
495
 
496
	   if ($pr_num == $project) {
497
	      echo "<option value=\"$pr_num\" selected>$pr_num $pr_name</option>\n";
498
	      $pl_selnum = $plnum;
499
	      $flag = true;
500
	   } else
501
	      echo "<option value=\"$pr_num\">$pr_num $pr_name</option>\n";
502
 
503
	   $r++;
504
	}
505
 
506
	echo "</select></td></tr>\n";
507
 
508
	if (!$flag)
509
	   $project = 0;
510
 
511
	# optional Mitarbeiter anzeigen
512
	if ($rstufe == 1 || $rstufe == 2) {
513
	   echo "<tr><td>Mitarbeiter</td><td><select name=\"mitarbeiter\" ";
514
	   echo "onChange=\"javascript:MoveTo('ist_alt.php','$nav')\">\n";
515
	   echo "<option value=\"0\">Alle</option>\n";
516
 
517
	   $r = 0;
518
 
519
	   while ($r < $rows) {
520
	      $data = fetchDB($result, $r);
521
	      $pl_num[$r] = $data[5];
522
	      $pl_status[$r] = $data[7];
523
	      $r++;
524
	   }
525
 
526
	   if (isset($pl_selnum) && $pl_selnum > 0) {
527
	      $query = "select pl_status from plan where pl_num = $pl_selnum";
528
 
529
	      if (!($res = QueryDB($db, $query))) {
530
	         closeDB($db);
531
	         return;
532
	      }
533
 
534
	      $data = fetchDB($res, 0);
535
	      $pstat = $data[0];
536
	   } else
537
	      $pstat = -1;
538
 
539
	   if ($pstat != 0) {
540
	      $query = "select distinct al_ressource, mi_nname,";
541
	      $query .= "mi_vname from ";
542
	      $query .= "allocation, task, mitarbeiter where ";
543
	      $query .= "ta_num = al_task and mi_num = al_ressource and ";
544
	      $query .= "ta_plnum in (";
545
 
546
	      if (isset($pl_selnum) && $pl_selnum > 0) {
547
	         $query .= "$pl_selnum";
548
	      } else {
549
	         $r = 0;
550
	         $flag = false;
551
 
552
	         while ($r < $rows) {
553
	            if ($pl_status[$r] == 6) {
554
	               $r++;
555
	               continue;
556
	            }
557
 
558
	            if ($flag)
559
	               $query .= "," . $pl_num[$r];
560
	            else
561
	               $query .= $pl_num[$r];
562
 
563
		    $flag = true;
564
	            $r++;
565
	         }
566
	      }
567
 
568
	      $query .= ") order by mi_nname, mi_vname";
569
	   } else {
570
	      $query = "select mi_num, mi_nname, mi_vname from mitarbeiter ";
571
	      $query .= "where mi_plan = true order by mi_nname, mi_vname";
572
	   }
573
 
574
	   if (!($resmi = QueryDB($db, $query))) {
575
	      closeDB($db);
576
	      return;
577
	   }
578
 
579
	   $nr = numrowsDB($resmi);
580
	   $r = 0;
581
	   $flag = false;
582
 
583
	   while ($r < $nr) {
584
	      $data = fetchDB($resmi, $r);
585
	      $al_ressource = $data[0];
586
	      $mi_nname = $data[1];
587
	      $mi_vname = $data[2];
588
 
589
	      if ($al_ressource == $mitarbeiter) {
590
	         echo "<option value=\"$al_ressource\" selected>$mi_nname $mi_vname</option>\n";
591
	         $flag = true;
592
	      } else
593
	         echo "<option value=\"$al_ressource\">$mi_nname $mi_vname</option>\n";
594
 
595
	      $r++;
596
	   }
597
 
598
	   echo "</select></td></tr>\n";
599
 
600
	   if (!$flag)
601
	      $mitarbeiter = 0;
602
	}
603
 
604
	# Zeitraum von anzeigen
605
	$vd = GetVisualDate($dtformatshort, $pmlight);
606
	echo "<tr><td>Zeitraum von ($vd):</td>\n";
607
 
608
	if (isset($von) && strlen($von) >= 4) {
609
	   $sd = explode(GetDateSep(), $von);
610
 
611
	   if ($pmlight)
612
	      $dat = gmmktime(0, 0, 0, $sd[0], 1, $sd[1]);
613
	   else
614
	      $dat = gmmktime(0, 0, 0, $sd[1], $sd[0], $sd[2]);
615
 
616
	   unset($sd);
617
	} else {
618
	   if ($pmlight) {
619
	      $dat = time();
620
	      $mon = gmdate("n", $dat);
621
	      $year = gmdate("Y", $dat);
622
 
623
	      if ($mon <= 3) {
624
		 $mon = 12 - (3 - $mon) + 1;
625
 
626
		 if ($mon == 13)
627
		    $mon = 1;
628
		 else
629
		    $year--;
630
	      } else
631
		 $mon -= 2;
632
 
633
	      $dat = gmmktime(0, 0, 0, $mon, 1, $year);
634
	   } else
635
	      $dat = time() - 86400 * 6;
636
	}
637
 
638
	$mon = gmdate("n", $dat);
639
	$year = gmdate("Y", $dat);
640
	$day = gmdate("j", $dat);
641
 
642
	$dvon = gmmktime(0, 0, 0, $mon, $day, $year);
643
//	$anz = ($pmlight)? 3 : 7;
644
	echo "<td><table border=0 cellpadding=0><tr><td><input type=\"text\" name=\"von\" value=\"";
645
 
646
	if ($pmlight) {
647
	   $vd = GetShortDate($dvon);
648
	   echo "$vd\" size=7 maxlength=7 onBlur=\"javascript:CheckDate(this,1)\">";
649
	} else {
650
	   $vd = gmdate($dtformatshort, $dvon);
651
	   echo "$vd\" size=10 maxlength=10 onBlur=\"javascript:CheckDate(this,0)\">";
652
	}
653
 
654
	# Zeitraum bis anzeigen
655
	if (isset($bis) && strlen($bis) >= 4) {
656
	   $sd = explode(GetDateSep(), $bis);
657
 
658
	   if ($pmlight)
659
	      $dat = gmmktime(0, 0, 0, $sd[0], daysinmonth($sd[0], $sd[1]), $sd[1]);
660
	   else
661
	      $dat = gmmktime(0, 0, 0, $sd[1], $sd[0], $sd[2]);
662
 
663
	   unset($sd);
664
	} else {
665
	   $dat = time();
666
 
667
	   if ($pmlight) {
668
	      $mon = gmdate("n", $dat);
669
	      $year = gmdate("Y", $dat);
670
	      $aday = gmdate("j", $dat);
671
	      $day = daysinmonth($mon, $year);
672
 
673
	      if (($day / 2) < $aday) {
674
	         $mon++;
675
 
676
	         if ($mon > 12) {
677
	            $year++;
678
	            $mon = 1;
679
		 }
680
 
681
		 $day = daysinmonth($mon, $year);
682
	      }
683
 
684
	      $dat = gmmktime(0, 0, 0, $mon, $day, $year);
685
	   }
686
	}
687
 
688
	$mon = gmdate("n", $dat);
689
	$year = gmdate("Y", $dat);
690
	$day = gmdate("j", $dat);
691
	$dbis = gmmktime(0, 0, 0, $mon, $day, $year);
692
	echo " Bis: <input type=\"text\" name=\"bis\" value=\"";
693
 
694
	if ($pmlight) {
695
	   $vd = GetShortDate($dbis);
696
	   echo "$vd\" size=7 maxlength=7 onBlur=\"javascript:CheckDate(this,1)\"></td>\n";
697
	} else {
698
	   $vd = gmdate($dtformatshort, $dbis);
699
	   echo "$vd\" size=10 maxlength=10 onBlur=\"javascript:CheckDate(this,0)\"></td>\n";
700
	}
701
 
702
	echo "<td>";
703
	ButtonLink("Zeitraum setzen", "ist_alt.php","$nav");
704
	echo "</td></tr></table></td></tr></table>\n";
705
	# Button zum Senden / Rueckgaengig machen
706
	echo "<br><table class=\"indent\"><tr><td>\n";
707
	ButtonSubmit("Speichern", "ist");
708
	echo "</td></tr></table>\n";
709
	# Aufbau der Tabelle zur IST-Erfassung
710
	#
711
	# Tabellenkopf
712
	echo "<table class=\"sel\"><tr>\n";
713
 
714
	if ($pmlight)
715
	   echo "<td class=\"sel\" colspan=3></td>\n";
716
	else
717
	   echo "<td class=\"sel\" colspan=2></td>\n";
718
 
719
	# Ermitteln des gewuenschten Zeitraums
720
	$anz = GetAnzEntries($dvon, $dbis);
721
 
722
	if ($anz > 1)
723
	   echo "<th class=\"sel\" colspan=$anz>";
724
	else
725
	   echo "<th class=\"sel\">";
726
 
727
	if (!$pmlight)
728
	   echo "Stunden pro PT</th>\n";
729
	else
730
	   echo "Perioden</th>\n";
731
 
732
	if ($pmlight)
733
	   echo "<th class=\"sel\" colspan=2>Summe&nbsp;Zeile</th>\n";
734
	else
735
	   echo "<th class=\"sel\">Summe&nbsp;Zeile</th>\n";
736
 
737
	if ($ist_erledigung)
738
	   echo "<th class=\"sel\" colspan=3>Summe&nbsp;(PT)/Task</th></tr>\n";
739
	else
740
	   echo "<th class=\"sel\" colspan=2>Summe&nbsp;(PT)/Task</th></tr>\n";
741
 
742
	echo "<tr><th class=\"sel\">Projekt&nbsp;/&nbsp;Task</th>\n";
743
 
744
	if ($rstufe != 3 && isset($mitarbeiter) && $mitarbeiter == 0)
745
	   echo "<th class=\"sel\">PL&nbsp;/&nbsp;Mitarbeiter</th>\n";
746
	else
747
	   echo "<th class=\"sel\">Projektleiter</th>\n";
748
 
749
	if ($pmlight)
750
	   echo "<th class=\"sel\"></th>\n";
751
 
752
	$r = 0;
753
	$dt = $dvon;
754
 
755
	while ($r < $anz) {
756
	   if ($pmlight) {
757
	      $datum = GetShortDate($dt);
758
	      $dt = IncDate($periode, $dt);
759
	   } else {
760
	      $datum = gmdate($dtformatshort, $dt);
761
	      $dt += 86400;
762
	   }
763
 
764
	   echo "<th class=\"sel\">$datum</th>\n";
765
	   $r++;
766
	}
767
 
768
	if ($pmlight)
769
	   echo "<th class=\"sel\">Plan</th>\n";
770
 
771
	echo "<th class=\"sel\">IST</th>\n";
772
	echo "<th class=\"sel\">Plan</th>\n";
773
	echo "<th class=\"sel\">IST</th>\n";
774
 
775
	if ($ist_erledigung)
776
	   echo "<th class=\"sel\">Erl.</th>\n";
777
 
778
	echo "</tr>\n";
779
	# Tabelle mit Inhalten fuellen...
780
	$r = 0;
781
 
782
	while ($r < $rows) {
783
	   $data = fetchDB($result, $r);
784
	   $pr_num = $data[0];
785
	   $pr_name = $data[1];
786
	   $pr_pl = $data[2];
787
	   $mi_nname = $data[3];
788
	   $mi_vname = $data[4];
789
	   $pl_num = $data[5];
790
	   $pl_lfd = $data[6];
791
	   $pl_status = $data[7];
792
 
793
	   # Projekte die einen Plan mit Status = 6 (Abgeschlossen) haben,
794
	   # ignorieren! Sollten nicht vorkommen!
795
	   $query = "select count(*) from plan where pl_prnum = $pr_num and pl_status = 6";
796
 
797
	   if (!($resco = QueryDB($db, $query))) {
798
	      closeDB($db);
799
	      return;
800
	   }
801
 
802
	   $data = fetchDB($resco, 0);
803
	   $menge = $data[0];
804
 
805
	   if ($pl_status == 6 || $menge > 0) {
806
	      $r++;
807
	      continue;
808
	   }
809
 
810
	   # Wenn ein bestimmtes Projekt gewaehlt wurde, nur dieses anzeigen.
811
	   if (isset($project) && $project > 0 && $pr_num != $project) {
812
	      $r++;
813
	      continue;
814
	   }
815
 
816
	   # Pruefen, ob es fuer das aktuelle Projekt auch Tasks zum Anzeigen
817
	   # gibt. Falls nicht, untersuchen wir das naechste Projekt.
818
	   if ($pl_status > 0) {
819
	      $query = "select count(*) from task, plan, allocation where ";
820
	      $query .= "pl_num = ta_plnum and al_task = ta_num and ";
821
 
822
	      if (!$ist_future) {
823
	         $query .= "ta_start <= $dbis and ";
824
	      } else {
825
	         $query .= "(ta_start between $dvon and $dbis or ";
826
	         $query .= "ta_start+ta_duration*86400 between $dvon and $dbis or ";
827
	         $query .= "$dvon between ta_start and ta_start+ta_duration*86400 or ";
828
	         $query .= "$dbis between ta_start and ta_start+ta_duration*86400) and ";
829
	      }
830
 
831
//	      $query .= "ta_plnum = $pl_num and ";
832
	      $query .= "pl_prnum = $pr_num ";
833
 
834
	      if ($rstufe == 3)
835
	         $query .= " and al_ressource = $unum";
836
	      else if (isset($mitarbeiter) && $mitarbeiter > 0)
837
	         $query .= " and al_ressource = $mitarbeiter";
838
 
839
	      if (!($resta = QueryDB($db, $query))) {
840
	         closeDB($db);
841
	         return;
842
	      }
843
 
844
	      $data = fetchDB($resta, 0);
845
 
846
	      if ($data[0] == 0) {
847
	         $r++;
848
	         continue;
849
	      }
850
	   }
851
 
852
	   echo "<tr><td class=\"selakt\">$pr_num&nbsp;$pr_name</td>\n";
853
 
854
	   if ($pl_status > 0)
855
	      echo "<td class=\"selakt\">$mi_nname&nbsp;$mi_vname</td>\n";
856
	   else
857
	      echo "<td class=\"selakt\">&nbsp;</td>\n";
858
 
859
	   echo "<td class=\"selakt\"></td>\n";
860
	   echo "<td class=\"selakt\" colspan=$anz></td>\n";
861
	   echo "<td class=\"selakt\" colspan=5></td></tr>\n";
862
	   # Abhaengig von der Rolle des angemeldeten Users, werden alle
863
	   # Tasks pro Mitarbeiter angezeigt.
864
	   #
865
	   if ($rstufe == 3) { 		// Mitarbeiter
866
	      if (!ShowMitarbeiter($db, $unum, $anz, $dvon, $dbis, $pr_num, $pl_num, false)) {
867
	         closeDB($db);
868
	         return;
869
	      }
870
	   } else if (isset($mitarbeiter) && $mitarbeiter > 0) {
871
	      if (!ShowMitarbeiter($db, $mitarbeiter, $anz, $dvon, $dbis, $pr_num, $pl_num, false)) {
872
		 closeDB($db);
873
		 return;
874
	      }
875
	   } else {
876
	      if ($pl_status > 0) {
877
	         $query = "select distinct al_ressource, mi_nname, mi_vname, pl_lfd ";
878
		 $query .= "from allocation, task, plan, mitarbeiter where ";
879
//		 $query .= "ta_num = al_task and ta_plnum = $pl_num and ";
880
		 $query .= "ta_num = al_task and pl_prnum = $pr_num and ";
881
		 $query .= "mi_num = al_ressource and pl_num = ta_plnum and ";
882
 
883
		 if (!$ist_future) {
884
		    $query .= "ta_start <= $dbis ";
885
		 } else {
886
		    $query .= "(ta_start between $dvon and $dbis or ";
887
		    $query .= "ta_start+ta_duration*86400 between $dvon and $dbis or ";
888
		    $query .= "$dvon between ta_start and ta_start+ta_duration*86400 or ";
889
		    $query .= "$dbis between ta_start and ta_start+ta_duration*86400) ";
890
		 }
891
 
892
		 $query .= "order by pl_lfd desc, mi_nname, mi_vname";
893
	      } else {
894
		 $query = "select mi_num, mi_nname, mi_vname from mitarbeiter ";
895
		 $query .= "where mi_plan = true order by mi_nname, mi_vname";
896
	      }
897
 
898
	      if (!($resal = QueryDB($db, $query))) {
899
		 closeDB($db);
900
		 return;
901
	      }
902
 
903
	      $cnt = numrowsDB($resal);
904
	      $z = 0;
905
 
906
	      while ($z < $cnt) {
907
	         $data = fetchDB($resal, $z);
908
	         $al_ressource = $data[0];
909
 
910
	         if (!ShowMitarbeiter($db, $al_ressource, $anz, $dvon, $dbis, $pr_num, $pl_num)) {
911
	            closeDB($db);
912
	            return;
913
	         }
914
 
915
	         $z++;
916
	      }
917
	   }
918
 
919
	   $r++;
920
	}
921
 
922
	# Endsummen schreiben
923
	if ($pmlight) {
924
	   echo "<tr><td class=\"selnum\" colspan=3>Summen Plan:<br>Summen IST:</td>\n";
925
	   $z = 0;
926
	   $sumptot = 0.0;
927
	   $sumitot = 0.0;
928
 
929
	   while ($z < $anz) {
930
	      printf("<td class=\"selltgray\" align=\"right\"><b>%s<br>%s</b></td>", FormatNum($sumparr[$z], 3),
931
	      		FormatNum($sumiarr[$z], 3));
932
	      $sumptot += $sumparr[$z];
933
	      $sumitot += $sumiarr[$z];
934
	      $z++;
935
	   }
936
 
937
	   printf("<td class=\"selgray\" align=\"right\"><b>%s</b></td>", FormatNum($sumptot, 3));
938
	   printf("<td class=\"selgray\" align=\"right\"><b>%s</b></td>", FormatNum($sumitot, 3));
939
	   echo "<td class=\"sel\" colspan=2>&nbsp;</td>";
940
	} else {
941
	   echo "<tr><td class=\"selnum\" colspan=2>Summen:</td>\n";
942
	   $z = 0;
943
	   $sumitot = 0.0;
944
 
945
	   while ($z < $anz) {
946
	      printf("<td class=\"selltgray\" align=\"right\"><b>%s</b></td>", FormatNum($sumiarr[$z], 3));
947
	      $sumitot += $sumiarr[$z];
948
	      $z++;
949
	   }
950
 
951
	   printf("<td class=\"selgray\" align=\"right\"><b>%s</b></td>", FormatNum($sumitot, 3));
952
	   printf("<td class=\"selnum\"><b>%s</b></td>", FormatNum($sumallp, 3));
953
	   printf("<td class=\"selnum\"><b>%s</b></td>", FormatNum($sumalli, 3));
954
	}
955
 
956
	if (!$pmlight && $ist_erledigung) {
957
	   if ($sumallp == 0)
958
	      printf("<td class=\"selnum\"><b>%s%%</b></td>", FormatNum(0.0, 1));
959
	   else
960
	      printf("<td class=\"selnum\"><b>%s%%</b></td>", FormatNum($sumalli / $sumallp * 100.0, 1));
961
	} else if ($ist_erledigung)
962
	   echo "<td class=\"sel\">&nbsp;</td>\n";
963
 
964
	echo "</tr>\n";
965
	echo "</table></form>\n";
966
	closeDB($db);
967
}
968
 
969
# Folgende Funktion prueft die uebergebenen Parameter und speichert die
970
# neuen oder veraenderten IST-Zeiten in die Datenbank.
971
#
972
function SaveIST() {
973
	global $unum;
974
	global $pmlight;
975
	global $leneinheit;
976
 
977
	$kill = false;
978
	$db = OpenDB();
979
 
980
	if (!($result = QueryDB($db, "select co_wdone from counter"))) {
981
	   closeDB($db);
982
	   return false;
983
	}
984
 
985
	$data = fetchDB($result, 0);
986
	$co_wdone = $data[0];
987
 
988
	foreach ($_REQUEST as $key => $hours) {
989
	   $fr = substr($key, 0, 3);
990
 
991
	   if ($fr != "dt_")
992
	      continue;
993
 
994
	   $pars = explode("_", $key);
995
	   $minum = $pars[1];
996
	   $pr_num = $pars[2];
997
	   $wd_task = $pars[3];
998
	   $dt = $pars[4];
999
 
1000
	   if (!isset($hours) || $hours == "")
1001
	      $hours = 0.0;
1002
	   else
1003
	      $hours = str_replace(",", ".", $hours);
1004
 
1005
	   if ($minum <= 0 || $pr_num <= 0 || $wd_task <= 0 || $dt <= 0) {
1006
	      Error("Interner Fehler: Fehlender Parameter!");
1007
	      closeDB($db);
1008
	      return false;
1009
	   }
1010
 
1011
	   $query = "select ta_phase from task where ta_num = $wd_task";
1012
 
1013
	   if (!($resta = QueryDB($db, $query))) {
1014
	      closeDB($db);
1015
	      return false;
1016
	   }
1017
 
1018
	   $data = fetchDB($resta, 0);
1019
	   $ta_phase = $data[0];
1020
 
1021
	   if (!isset($ta_phase))	// Task eines Kontos?
1022
	      $ta_phase = 0;
1023
 
1024
	   $query = "select wd_num from wdone where ";
1025
	   $query .= "wd_minum = $minum and wd_task = $wd_task and ";
1026
 
1027
	   if ($pmlight) {
1028
	      $day = 1;
1029
	      $mon = gmdate("n", $dt);
1030
	      $year = gmdate("Y", $dt);
1031
	      $fdate = gmmktime(0, 0, 0, $mon, 1, $year);
1032
	      $ldate = gmmktime(0, 0, 0, $mon, daysinmonth($mon, $year), $year);
1033
	      $query .= "wd_datum between $fdate and $ldate ";
1034
	   } else {
1035
	      $query .= "wd_datum = $dt ";
1036
	   }
1037
 
1038
	   if (!($reswd = QueryDB($db, $query))) {
1039
	      closeDB($db);
1040
	      return false;
1041
	   }
1042
 
1043
	   $anz = numrowsDB($reswd);
1044
 
1045
	   if ($pmlight) {
1046
	      if (!QueryDB($db, "begin")) {
1047
		 closeDB($db);
1048
		 return false;
1049
	      }
1050
 
1051
	      if ($anz > 0) {
1052
		 $query = "delete from wdone where wd_minum = $minum and ";
1053
		 $query .= "wd_task = $wd_task and ";
1054
		 $query .= "wd_datum between $fdate and $ldate";
1055
 
1056
		 if (!QueryDB($db, $query)) {
1057
		    QueryDB($db, "rollback");
1058
		    closeDB($db);
1059
		    return false;
1060
		 }
1061
	      }
1062
 
1063
	      $j = 0;
1064
	      $h = $hours * $leneinheit;
1065
	      $days = daysinmonth($mon, $year);
1066
 
1067
	      while ($j < $h) {
1068
		 $datum = gmmktime(0, 0, 0, $mon, $day, $year);
1069
		 $co_wdone++;
1070
 
1071
		 if (($h - $j) < $leneinheit)
1072
		    $ho = $h - $j;
1073
		 else
1074
		    $ho = $leneinheit;
1075
 
1076
		 $query = "insert into wdone (wd_num, wd_prnum, wd_minum, ";
1077
		 $query .= "wd_datum, wd_hours, wd_task, wd_rk, wd_phase, ";
1078
		 $query .= "wd_edit, wd_verr) values ($co_wdone, $pr_num, ";
1079
		 $query .= "$minum, $datum, $ho, $wd_task, 0, $ta_phase,";
1080
		 $query .= "true, true)";
1081
 
1082
		 if (!QueryDB($db, $query)) {
1083
		    QueryDB($db, "rollback");
1084
		    closeDB($db);
1085
		    return false;
1086
		 }
1087
 
1088
		 $j += $leneinheit;
1089
		 $day++;
1090
 
1091
		 if ($day > $days)
1092
		    $day = 1;
1093
	      }
1094
 
1095
	      if (!QueryDB($db, "update counter set co_wdone = $co_wdone")) {
1096
		 QueryDB($db, "rollback");
1097
		 closeDB($db);
1098
		 return false;
1099
	      }
1100
 
1101
	      QueryDB($db, "commit");
1102
	   } else {
1103
	      if ($anz > 0) {
1104
	         $data = fetchDB($reswd, 0);
1105
	         $wd_num = $data[0];
1106
 
1107
		 if ($hours <= 0)
1108
		    $query = "delete from wdone where wd_num = $wd_num";
1109
		 else
1110
		    $query = "update wdone set wd_hours = $hours where wd_num = $wd_num";
1111
 
1112
	         if (!QueryDB($db, $query)) {
1113
	            QueryDB($db, "rollback");
1114
	            closeDB($db);
1115
	            return false;
1116
	         }
1117
 
1118
	         QueryDB($db, "commit");
1119
	      } else if ($hours > 0) {
1120
	         $co_wdone++;
1121
	         $query = "insert into wdone (wd_num, wd_prnum, wd_minum, ";
1122
	         $query .= "wd_datum, wd_hours, wd_task, wd_rk, wd_phase, ";
1123
	         $query .= "wd_edit, wd_verr) values ($co_wdone, $pr_num, ";
1124
	         $query .= "$minum, $dt, $hours, $wd_task, 0, $ta_phase,";
1125
	         $query .= "true, true)";
1126
 
1127
	         if (!QueryDB($db, $query)) {
1128
		    QueryDB($db, "rollback");
1129
		    closeDB($db);
1130
		    return false;
1131
	         }
1132
 
1133
	         if (!QueryDB($db, "update counter set co_wdone = $co_wdone")) {
1134
		    QueryDB($db, "rollback");
1135
		    closeDB($db);
1136
		    return false;
1137
	         }
1138
 
1139
	         QueryDB($db, "commit");
1140
	      }
1141
	   }
1142
	}
1143
 
1144
	Journal(302, "ist_alt.php: SaveIST: Projekt: $pr_num, Mitarbeiter: $minum", $db);
1145
	closeDB($db);
1146
	return true;
1147
}
1148
 
1149
if ($func == "save")
1150
   SaveIST();
1151
 
1152
ManageTime();
1153
 
1154
require_once('footer.inc');
1155
?>