
| Current Path : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/Process/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/Process/projekt.pm |
package Process::projekt;
use strict;
use Data::Dumper;
#use Time::ParseDate;
#use Date::Format;
sub new {
my $class = shift;
my $self = {};
$self->{'FAKTOR'} = {@_};
$self->{'PROJEKTE'} = {};
bless($self,$class);
return($self);
}
#************************************************************************
sub metrik {
my $self = shift;
$self->{'FAKTOR'} = {@_};
}
#************************************************************************
sub projgroup {
my $self = shift;
$self->{'PROJGROUP'} = [@_];
}
#************************************************************************
sub uebersicht {
my $self = shift;
my $day = shift;
return($self->report(1,$day,$day,@{$self->{'PROJGROUP'}}));
}
#************************************************************************
sub budget {
my $self = shift;
my $day1 = shift;
my $day2 = shift;
my $title = shift;
my $erg = $title . "\n\n" . <<'TEXT_ENDE';
Task Plan lt.Plan Plan real Rueck- Rest- LATE to
. verbraucht angepasst verbraucht stand mittel START start
TEXT_ENDE
my $m1 = $day1 - 1;
my $m2 = $day2 - 1;
my $o;
foreach my $o (@{$self->{'PROJGROUP'}}) {
$erg = $erg . $self->report("1,1,$day2","1,1,$m1","$day1,1,$day2",
"$day1,1,$m1",".1,1,$m2",'-$p[4]+$p[2]',
'$p[3]-$p[4]','_($q[4]-1).$q[2]',
'_($q[2]-1).$q[5]',"*".$o) . "\n";
}
$erg = $erg . <<'TEXT_ENDE';
Erlaeuterung:
Task: <taskgruppe>_<tasknummer>_<zugeordnete person>
Plan: Gesamt-Budget laut Plan
lt. Plan verbraucht: bis zum Stichtag verbrauchtes Budget laut Plan
Plan angepasst: angepasster Plan
real verbraucht: tatsaechlich bis zum Stichtag verbrauchtes Budget
Rueckstand: Differenz zwischen Planverbrauch und tatsaechlichem
Verbrauch (Differenz zwischen Spalte 4 und 2)
Restmittel: noch abzuarbeitendes Budget
LATE START: bei -1.00: Task haette schon gestartet werden sollen,
das ist aber noch nicht geschehen
to start: bei -1,00: dieser Task soll laut Plan in der
dem Stichtag folgenden Woche gestartet werden.
TEXT_ENDE
return($erg);
}
#************************************************************************
sub gesamt {
my $self = shift;
my $day1 = shift;
my $day2 = shift;
my $erg = $self->uebersicht($day1) . "\n\n" .
"----------------------------------------------------------\n\n\n" .
$self->budget($day1+1,$day2) . "\n\n";
return($erg);
}
#************************************************************************
# Aktualisieren gespeicherter Tasks
sub actualize {
my $self = shift;
my $o; my $VAR1;
foreach $o (keys %{$self->{'TASKS'}}) {
eval($self->{'TASKS'}->{$o}); print $@;
$self->np(@$VAR1);
}
}
#************************************************************************
# Speichern von Projektdaten
sub np {
my $self = shift;
my @pars = @_;
my $faktor = 1;
my $o; my $o1; my $o2; my $o3; my @ee;
foreach $o (keys %{$self->{'FAKTOR'}}) {
next if ($pars[1] !~ /$o/);
$faktor = $self->{'FAKTOR'}->{$o};
}
my $zaehler = -1;
my $summe = 0;
if ($pars[0] eq "DAY") {
$self->{'TASKS'}->{$pars[1]} = Dumper([@pars]);
}
foreach $o (@pars) {
if (ref($o)) {
if ($o->[0] =~ /^DAY/) { $o->[0] = $PAR::DAY }
if ($o->[1] =~ /^DAY/) { $o->[1] = $PAR::DAY }
if ($o->[0] > $o->[1]) {
$o = $o->[0];
} else {
$o = $o->[1];
}
}
if ($o =~ /^DAY/) { $o = $PAR::DAY }
}
my $nr = shift(@pars);
my $id = shift(@pars);
push(@pars,0);
push(@pars,99999);
while (@pars) {
$o = shift(@pars); # Starttag
$o1 = shift(@pars); # Menge
if ($o1 < 0) {
$o1 = -$o1; # das ist die Gesamt-Task-Stundenmenge
if ($o1 > 0.009 and $o1 < 0.99999) {
if ($o1 > 0.998) { $o1 = 1; } # als Prozentangabe
$o1 = $summe/$o1; # des schon gelaufenen
}
$o1 = $o1 - $summe;
$summe = 0;
if ($o1 < 0) { $o1 = 0; }
} else {
$summe = $summe + $o1;
}
$o1 = $o1 * $faktor;
last if (!@pars);
if ($o1 > 0 and $o >= $pars[0]) { # wenn noch Arbeitsleistung zu tun ist
$pars[0] = $o + 1;
}
elsif ($o1 == 0 and $o > $pars[0]) {
$pars[0] = $o;
}
$o2 = $pars[0]; # Endtag
next if ($o1 == 0 and $o2 == $o);
if ($o2 == $o) { print "Fehler bei $id, $o, $o1, $o2, zero division.\n"; exit; }
$zaehler = $zaehler + 1;
if ($o2 <= $nr and $o1) {
foreach $o3 (keys %{$self->{'PROJEKTE'}->{$id}}) {
if ($o < $o3 and $o3 < $o2) {
print "Warnung: Aenderung der Ist-Daten in $id, Stichtag $nr\n";
}
}
}
$self->{'PROJEKTE'}->{$id}->{$nr}->[$zaehler] = [$o,$o1,$o2,
$o1/($o2-$o)];
}
}
#***********************************************************************
sub version {
my $self = shift;
my $id = shift;
my $stand = shift;
my @ee; my $projektdaten = []; my $versionen;
my $versionen = $self->{'PROJEKTE'}->{$id};
if ($stand == 0) {
@ee = reverse sort keys %$versionen;
$projektdaten = $versionen->{shift(@ee)};
} else {
@ee = sort { $a <=> $b } keys %$versionen;
while (0 == 0) {
last if ($ee[0] > $stand);
$projektdaten = $versionen->{$ee[0]};
shift(@ee);
last if (!@ee);
}
}
return($projektdaten);
}
#***********************************************************************
sub remark {
my $self = shift;
$self->{'REMARK'} = {@_};
}
#***********************************************************************
sub projlist {
my $self = shift;
my $pars = shift;
my @erg = ();
my $projekt; my $bed; my $o2; my @pars1;
foreach $projekt (keys %{$self->{'PROJEKTE'}}) {
@pars1 = split(/,/,$pars);
$bed = 1;
foreach $o2 (@pars1) {
next if ($projekt =~ /$o2/);
$bed = 0;
last;
}
if ($bed) {
# $projekt =~ s/\_CG$/\_\(CG\|KH\)/;
push(@erg,$projekt);
}
}
return(sort @erg);
}
#***********************************************************************
sub compare {
my $self = shift;
my @pars = @_;
my @days = ();
while ($pars[0] =~ /\$/ or $pars[0] =~ /^(\.?)(\d+),(\d+),(\d+)$/
or $pars[0] =~ /^[A-Z]$/ or $pars[0] =~ /^\_/) {
push(@days,shift(@pars));
}
push(@pars,"sum");
my $o; my $o1; my @p; my @q;
my $text = " ";
my $hiddenday = [];
my $short = [];
my $zaehler = -1;
foreach $o (@days) {
$zaehler = $zaehler + 1;
$o =~ s/\'//g;
$o1 = $o;
$o1 =~ s/\$/ /g;
$o1 = 9 - length($o1);
if ($o1 < 1) { $o1 = 1; }
if ($o =~ /^\.(.*)/) { # Spalte wird nicht angezeigt
$o = $1;
$hiddenday->[$zaehler] = 1;
}
elsif ($o =~ /^\_(.*)/) { # Kurz-Ausgabe bei fuehrendem _
$o = $1;
$short->[$zaehler] = 1;
$text = $text . substr(" ",0,$o1) . $o;
}
else {
$text = $text . substr(" ",0,$o1) . $o;
}
}
my $sum = {};
foreach $o (@pars) {
$text = $text . "\n" . substr($o." ",0,20);
$sum->{$o} = 0;
@p = ($o);
@q = ($o);
$zaehler = -1;
foreach $o1 (@days) {
$zaehler = $zaehler + 1;
if ($o ne "sum") {
$o1 =~ /(.*),(.*),(.*)/;
if ($o1 eq "A") { $self->{'SUMME'} = -$p[4]+$p[2]; }
elsif ($o1 eq "B") { $self->{'SUMME'} = $p[3]-$p[4]; }
elsif ($o1 eq "C") { $self->{'SUMME'} = ($q[4]-1) * $q[2]; }
elsif ($o1 eq "D") { $self->{'SUMME'} = ($q[2]-1) * $q[5]; }
elsif ($o1 =~ /\$/) {
$o1 =~ s/\./\*/g;
eval("\$self->{'SUMME'} = " . $o1); print $@;
}
else {
$self->report($2,$3,"$1,$o");
}
push(@p,$self->{'SUMME'});
push(@q,($self->{'SUMME'} ? 1 : 0));
$sum->{$o1} = $sum->{$o1} + $self->{'SUMME'};
} else {
$self->{'SUMME'} = $sum->{$o1};
}
if (!($hiddenday->[$zaehler])) {
if ($short->[$zaehler]) {
$text = $text . sprintf("%4.0f",$self->{'SUMME'});
} else {
$text = $text . sprintf("%9.2f",$self->{'SUMME'});
}
}
}
}
return($text . "\n");
}
#***********************************************************************
sub bedarf {
my $self = shift;
my $day = shift;
my $pars = shift;
my $o; my $o1; my $o2; my @pars1; my $bed;
my $projekt; my $projektdaten; my $versionen; my $ee; my $stand;
my $erg = 0;
@pars1 = split(/,/,$pars);
if ($pars1[0] =~ /^\d/) {
$stand = shift(@pars1);
} else {
$stand = 0;
}
$pars = join(",",$stand,@pars1);
if(!($self->{'PROJEKTDATEN'}->{$pars})) {
$ee = [];
foreach $projekt (keys %{$self->{'PROJEKTE'}}) {
$bed = 1;
foreach $o2 (@pars1) {
next if ($projekt =~ /$o2/);
$bed = 0;
last;
}
if ($bed) {
push(@$ee,$self->version($projekt,$stand))
}
}
$self->{'PROJEKTDATEN'}->{$pars} = $ee;
}
$ee = $self->{'PROJEKTDATEN'}->{$pars};
foreach $projekt (@$ee) {
foreach $o1 (@$projekt) {
if ($o1->[0] <= $day and $day < $o1->[2]) {
# if ($bed) {
$erg = $erg + $o1->[3];
# }
}
}
}
return($erg);
}
#***********************************************************************
sub report {
my $self = shift;
my @pars1 = @_;
my $zeile; my $zeile1; my $zeile2; my $o; my $par; my $zaehler; my $par1;
my $par7; my @pars = ();
foreach $o (@pars1) {
if (-f $o) {
open(FFILE,"<".$o);
$o = join("",<FFILE>);
close(FFILE);
$o =~ s/\n/ /g;
foreach $zaehler (split(/ /,$o)) {
push(@pars,$zaehler);
}
}
if ($o =~ s/\*//) {
my @ee = $self->projlist($o);
foreach $zaehler (@ee) {
push(@pars,$zaehler);
}
}
else {
push(@pars,$o);
}
}
if ($pars[0] eq "list") {
shift(@pars);
my @ee = $self->projlist(@pars);
return();
}
if ($pars[0] =~ /,/) {
return($self->compare(@pars));
}
#-----------------------------------
my $start = shift(@pars);
my $start1 = $start;
my $ende = shift(@pars);
my $ende1 = $ende;
my $faktor = 1;
if ($start < 0) {
$start = -$start;
$faktor = 8;
}
my $short = 0;
if ($ende < 0) {
$ende = -$ende;
$short = 1;
}
my @summe = ();
$start = $start - 1;
my $text = "";
if ($pars[0] =~ /^\d+$/) {
$par = shift(@pars);
foreach $o (@pars) {
$o = $par . "," . $o;
}
}
my $spaces = {};
my $spaces1 = {};
$zeile2 = " ";
$zeile1 = " ";
foreach $par (@pars) {
$par1 = $par;
if ($short) { $par1 =~ s/[\_A-Z]//g; }
$o = length($par1);
if ($o < 8) {
$zaehler = substr(" ",0,8-$o);
$o = 8;
}
elsif ($o == 8) {
$zaehler = " ";
$o = 9;
}
else {
$zaehler = " ";
$o = $o + 2;
}
$spaces->{$par} = substr(" ",0,$o-5);
$zeile2 = $zeile2 . $zaehler . $par1;
$spaces1->{$par} = substr(" ",0,$o-8);
}
while ($start < $ende) {
$start = $start + 1;
$o = $self->{'REMARK'}->{$start} || "-";
$zeile = substr($o . " ",0,11) .
sprintf("%3u",$start);
$zaehler = 0;
foreach $par (@pars) {
$o = $faktor*$self->bedarf($start,$par);
$zeile = $zeile . $spaces->{$par} . sprintf("%5.2f",$o);
$summe[$zaehler] = $summe[$zaehler] + $o;
$zaehler = $zaehler + 1;
}
$text = $text . $zeile . "\n";
}
$text = $text . "\n";
@pars1 = ();
foreach $par (@pars) {
if ($summe[0]) {
push(@pars1,$par);
} else {
$zeile2 = "";
}
$self->{'SUMME'} = $summe[0];
$zeile1 = $zeile1 . $spaces1->{$par} . sprintf("%8.2f",shift(@summe));
}
if (!$zeile2) {
return($self->report($start1,$ende1,@pars1));
}
$text = $text . $zeile1 . "\n" . $zeile2 . "\n";
return($text);
}
1;