Geschrieben für frei Mitarbeiter.
Code:
#!/usr/bin/perl
use warnings;
use strict;
use Time::Local;
use Cwd;
#-------------------------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------------------------
# Version: 1.2
# Autor: Catweasel
# ZEITEINGABE:
# mit "rrr" wird die letzte Eingabe gelöscht.
# mit "zzz x" wird die x. Zeile neu eingelesen.
# mit "del x" wird ab der x. Zeile alles gelöscht.
# mit "ende" wird das Programm beendet.
my $arbeitsverzeichnis="stundenberechnung";
# Arbeitsverzeichnis: wenn Sie das $arbeitsverzeichnis leer lassen, werden die Dateien direkt ins $dir geschrieben.
my $dir="";
# $dir ist das Verzeichnis in dem das $arbeitsverzeichnis erstell wird; wurde kein $arbeitsverzeichnis angegeben, werden die Dateien direkt in $dir erstellt.
# Möchten Sie das aktuelle Verzeichnis als $dir, edieren Sie $dir so: $dir="cwd";
# Wir $dir leer gelassen, wird das entsprechende Home-Verzeichnis als $dir gewählt.
my $fs=";";
# Erlaubte Trennzeichen für die csv-Dateien: Beistrich oder Strichpunkt.
my $titel="Stundenberechnung";
my $untertitel="ABC";
# Bleiben $titel oder $untertitel leer, erfolgt später eine Eingabeaufforderung.
#-------------------------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------------------------
my $datei;
my $datei_csv;
my $debugmode=0; # 0 = aus 1 = ein
my @sp=("nummer", "datum", "beginn_vormittag ", "", "ende_vormittag ", "", "beginn_nachmittag", "", "ende_nachmittag ", "zeit_tag");
my @file=();
my @zeit_in_minuten=();
my $time_to_time=2;
my $beginn_vorm=2;
my $ende_vorm=4;
my $beginn_nachm=6;
my $ende_nachm=8;
my @minuten;
my $y=0;
my $tag_beginn='';
my $naechster_tag=0;
my @heute;
my $tage_vor_heute;
my $x;
format STDOUT=
@>> @|||||||||||| @>>>>@||@>>>>@|||||@>>>>@||@>>>>@>>>>>>>>
$file[$x][0], $file[$x][1], $file[$x][2], $file[$x][3], $file[$x][4], $file[$x][5], $file[$x][6], $file[$x][7], $file[$x][8], $file[$x][9]
.
format FILE_OUT=
@>> @|||||||||||| @>>>>@||@>>>>@|||||@>>>>@||@>>>>@>>>>>>>>
$file[$x][0], $file[$x][1], $file[$x][2], $file[$x][3], $file[$x][4], $file[$x][5], $file[$x][6], $file[$x][7], $file[$x][8], $file[$x][9]
.
format FILE_OUT_TOP=
@|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$titel
@|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$untertitel
.
$fs=";" if $fs ne ";" && $fs ne ",";
&titeleingabe;
$dir=&verzeichnis;
$datei=&dateiauswahl($dir);
$datei_csv="$datei.csv";
my $alt=&csv_auswahl($dir);
($tage_vor_heute, @heute)=&tagevorheute($tag_beginn, $naechster_tag);
# -------------------------------------------------
# CCC_1 Zeiteingabeschleife / pro Tag ein Durchlauf
# -------------------------------------------------
CCC_1: while()
{
my $wh=0;
my $i=0;
my $y_backup='';
@{$file[$y]}=('', '', '', '', '', '', '', '', '', '');
$file[$y][$i]=$y+1;
$i++;
my @datum= &format_localtime(localtime(timelocal(0,0,0,$heute[3],$heute[4],$heute[5])-$tage_vor_heute*86400));
$file[$y][$i]="$datum[6] $datum[3].$datum[4].$datum[5]";
$tage_vor_heute=$tage_vor_heute - 1;
# ---------------------------------------------------------
# CCC_2 Zeiteingabeschleife / pro Zeiteingabe ein Durchlauf
# ---------------------------------------------------------
CCC_2: for ($i=$beginn_vorm;$i<=$ende_nachm;$i+=2)
{
&clear;
for(my $count_3=0; $count_3<=$y; $count_3++)
{
$x=$count_3;
write STDOUT;
}
CCC_3: while()
{
print("\n\n$sp[$i] : ");
chomp($file[$y][$i]=<STDIN>);
# ------------------------------------
# Überprüfung / Verarbeitung "Eingabe"
# ------------------------------------
if ($wh==1 && $file[$y][$i] =~ /^[Eerz][Nnrz][Ddrz]/)
{
print "Beenden Sie zuerst diese Zeile.\n";
redo CCC_3;
}
if ($file[$y][$i] =~ /[Ee][Nn][Dd][Ee]/)
{
&ende(@minuten) if $i==$beginn_vorm;
print "\n\nBeenden Sie zuerst die Zeile.\n";
redo CCC_3;
}
my $leer='.....';
if($file[$y][$i] eq 'rrr')
{
$file[$y][$i]='';
if($i>$beginn_vorm)
{
$i-=$time_to_time;
$file[$y][$i]=$leer;
redo CCC_2;
}
elsif($i==$beginn_vorm)
{
$y--;
$i=$ende_nachm;
if($file[$y][$i] !~ /^\d\d:\d\d$/)
{
$i=$beginn_nachm;
$file[$y][$ende_nachm]=$leer;
}
$file[$y][$i]=$leer;
$tage_vor_heute=$tage_vor_heute + 1;
redo CCC_2;
}
}
elsif($file[$y][$i] =~ /^([z,d][z,e][z,l])\ (\d+)$/)
{
$file[$y][$i]='';
if($i!=$beginn_vorm)
{
print "\n\nBeenden Sie zuerst die Zeile\n";
redo;
}
my $o=$y;
$i=0;
$tage_vor_heute=$tage_vor_heute + 1;
if($1 eq 'zzz')
{
$y_backup=$y;
$y=$2-1;
for(my $l=$beginn_vorm;$l<=$ende_nachm;$l+=$time_to_time)
{
$file[$y][$l]=$leer;
}
$wh=1;
next CCC_2;
}
elsif($1 eq 'del')
{
$y=$2-1;
$#file=$2-2;
$#minuten=$2-2;
$#zeit_in_minuten=$2-2;
$tage_vor_heute=$tage_vor_heute + ($o - ($2 - 1));
next CCC_1;
}
}
if ($file[$y][$i] =~ /^\d\D\d\d$/)
{
$file[$y][$i]="0".$file[$y][$i];
}
if ($file[$y][$i] ne '' || ($file[$y][$i] eq '' && $i!=$beginn_vorm && $i!=$beginn_nachm))
{
if($file[$y][$i] eq '')
{
print "\n\tKeine Eingabe!\n\n";
print "\tWiederholen Sie die Eingabe.\n";
}
elsif(($file[$y][$i] !~ /^\d\d\D\d\d$/) || ($file[$y][$i]=~/^(\d\d)\D(\d\d)$/ && (($1 > 24 || $2 > 59) || ($1 == 24 && $2 != 0))))
{
print "\n\tUngültige Eingabe!\n\n";
print "\tEingabe: 0-23:0-59 bis 24:00 z.B 9:30 oder 22.40;\n";
print "\tals Trennzeichen sind neben : alle Zeichen außer Ziffern erlaubt.\n\n";
print "\tWiederholen Sie die Eingabe.\n";
}
else
{
$file[$y][$i]=~s/^(\d\d)\D(\d\d)$/$1:$2/;
$zeit_in_minuten[$y][$i]=$2+$1*60;
unless($i==$beginn_vorm || $file[$y][$beginn_vorm] eq '' && $i==$beginn_nachm)
{
if ($zeit_in_minuten[$y][$i] < $zeit_in_minuten[$y][$i-$time_to_time])
{
print "\n\tUngültige Eingabe!\n\n";
print "\tEingabe muss größer sein, als vorherige Eingabe.\n\n";
print "\tWiederholen Sie die Eingabe.\n";
}
else
{
last CCC_3;
}
}
else
{
last CCC_3;
}
}
}
else
{
$zeit_in_minuten[$y][$i]=0;
$zeit_in_minuten[$y][$i+1]=0;
last CCC_3;
}
}
# -----------------------------------
# Auswahl Zeichen zwischen den Zeiten
# -----------------------------------
if($file[$y][$i] eq '')
{
if($i==$beginn_vorm)
{
$file[$y][$i]=' ';
$file[$y][$i+1]=' ';
$file[$y][$i+2]=' ';
$file[$y][$i+3]=' ';
}
elsif($i==$beginn_nachm)
{
$file[$y][$i-1]=' ';
$file[$y][$i]=' ';
$file[$y][$i+1]=' ';
$file[$y][$i+2]=' ';
}
$i+=$time_to_time;
}
else
{
$file[$y][$i+1]=' - ' if $i == $beginn_vorm;
# $file[$y][$i+1]=' ' if $i == $beginn_vorm+$time_to_time;
$file[$y][$i+1]=' - ' if $i == $beginn_vorm+$time_to_time*2;
}
}
#---------------
# Zeitberechnung
# --------------
$minuten[$y]=&zeittag(@{$zeit_in_minuten[$y]});
$file[$y][$#{sp}]=&minuten_in_stunden($minuten[$y]); # Stunden pro Tag
$y++;
$y_backup ? $y=$y_backup : $y=$y;
}
#------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------
sub titeleingabe
{
if(! $titel || ! $untertitel)
{
my $ok=0;
my $t=0;
my $ut=0;
$t=1 if ! $titel;
$ut=1 if ! $untertitel;
while($ok!=1)
{
print "\nTitel : " if $t==1;
chomp($titel=<STDIN>) if $t==1;
print "\nUntertitel : " if $ut==1;
chomp($untertitel=<STDIN>) if $ut==1;
print "\nEingabe ok 1\n";
print "Eingabe Wiederholen 2\n";
print "Nr.: ";
chomp($ok=<STDIN>);
}
}
}
sub verzeichnis
{
chdir() if ! $dir;
chdir($dir) if $dir;
$dir=cwd();
$dir="$dir/$arbeitsverzeichnis/" if $arbeitsverzeichnis;
mkdir($dir) if ! -d $dir;
chdir($dir);
print "\n\n";
return $dir;
}
sub dateiauswahl
{
AAA_1: while()
{
my $directory=$_[0];
my @liste=grep {!/_sb\.csv$/ && !/_sb~$/} glob("*_sb");
my $num=$#liste + 1;
print "\n";
my $a=" neue Datei erzeugen\n";
$a="neue Datei erzeugen\n ---------------------\n Überschreiben Datei Nr.:" if @liste;
my $count;
map {$count++; print "$count $_\n";} $a, @liste;
print "\nAuswahl Nr.: ";
while(<STDIN>)
{
if($_ !~ /^\d+$/ || $_ > $num+1 || $_ < 1)
{
print "\nungültige Auswahl\n";
print "Auswahl Nrrrrr.: ";
}
elsif($_ == 1)
{
print "\nDateiname : ";
chomp($datei=<STDIN>);
$datei="${datei}_sb";
if( -e $datei)
{
print "Eine Datei mit diesem Namen besteht bereits\n";
redo AAA_1;
}
while($datei!~/^[a-zA-Z]\w*_sb$/)
{
print "\nFür Dateinamen sind nur Wortzeichen (Buchstaben (keine Umlaute), Zahlen und _) erlaubt.\n";
print "Das erste Zeichen muss ein Buchstabe sein.\n";
print "\nNeuer Versuch. Eingabe Dateiname : ";
chomp($datei=<STDIN>);
$datei="${datei}_sb";
}
return $datei="$directory$datei";
system("echo datei_automatisch_von_stunden_berechnung_erstellt > $datei");
last AAA_1;
}
else
{
return $datei="$directory$liste[$_-2]";
last AAA_1;
}
}
}
}
sub csv_auswahl
{
my $directory=$_[0];
print "\nDaten aus einer Datei einlesen?\n";
map {print "$_\n";} "1 ja", "2 nein";
print "\nAuswahl Nr.: ";
BBB_1: while(<STDIN>)
{
if(!/^\d+$/ || $_ > 2 || $_ == 0)
{
print "\nungültige Auswahl\n";
print "Auswahl Nr.: ";
}
elsif($_==1)
{
my @liste_2=glob("*_sb.csv");
if(! @liste_2)
{
print "\nKeine zu lesenden csv-Dateien in $dir gefunden.\n";
$_=2;
redo;
}
my $num_2=$#liste_2 + 1;
print "\n";
my $count;
map {$count++; print "$count $_\n";} @liste_2;
my $in_csv;
print "\nAuswahl Nr.: ";
BBB_2: while(<STDIN>)
{
if(!/^\d+$/ || $_ > $num_2 || $_ == 0)
{
print "\nungültige Auswahl\n";
print "Auswahl Nr.: ";
}
elsif($_ <= $num_2)
{
$in_csv="$directory$liste_2[$_-1]";
last BBB_2;
}
}
&ausgabe_csv($in_csv);
if($y<1)
{
print "Keine verwertbaren Zeilen in $in_csv gefunden.\n";
$_=2;
redo BBB_1;
}
my $spaeter=&auswahl_zeilen_csv($y);
$y=0;
my $alt=&ausgabe_zeilen_csv($in_csv, $spaeter);
$file[$y-1][1]=~/^\w\w\ (\d\d\.\d\d\.\d\d\d\d)$/;
$tag_beginn=$1;
@{$file[$y]}='' if $naechster_tag eq 'leer';
$minuten[$y]='' if $naechster_tag eq 'leer';
$naechster_tag=1;
return $alt;
last BBB_1;
}
elsif($_==2)
{
print "\nDatum erster Tag : ";
chomp($tag_beginn=<STDIN>);
if (&eingabekontrolle_datum($tag_beginn) == 0)
{
$_=2;
redo BBB_1;
}
elsif (&eingabekontrolle_datum($tag_beginn) == 1)
{
last BBB_1;
}
}
}
print "\n";
}
sub tagevorheute
{
my $tag_beginn=$_[0];
my $naechster_tag=$_[1];
my @tag_beginn=split(/\D/, $tag_beginn);
my @heute=&format_localtime(localtime());
$tage_vor_heute=int((timelocal(0,0,0,$heute[3],$heute[4],$heute[5]) - timelocal(0,0,0,$tag_beginn[0],$tag_beginn[1]-1,$tag_beginn[2])) / 86400);
$tage_vor_heute-- if $naechster_tag == 1;
$tage_vor_heute-- if $tage_vor_heute < -39; #
return ($tage_vor_heute, @heute);
}
sub ausgabe_csv
{
&clear;
open(CSV_IN, "<$_[0]") or die "$_[0] konnte nicht geöffnet werden: $!\n";
while(<CSV_IN>)
{
if($_ =~ /\w\w\ \d\d\.\d\d\.\d\d\d\d/)
{
my @array = split/;|,/;
$file[$y][0]=$y+1;
$file[$y][1]=$array[0];
$file[$y][2]=$array[1];
$file[$y][3]=' - ';
$file[$y][4]=$array[2];
$file[$y][5]=' ';
$file[$y][6]=$array[3];
$file[$y][7]=' - ';
$file[$y][8]=$array[4];
$file[$y][9]=$array[5];
$file[$y][3]=' ' if $file[$y][2] =~ /^ *$/;
#$file[$y][5]=' ' if $file[$y][2] =~ /^ *$/ || $file[$y][6] =~ /^ *$/;
$file[$y][7]=' ' if $file[$y][6] =~ /^ *$/;
$x=$y;
write STDOUT;
$y++;
}
}
close CSV_IN;
}
sub auswahl_zeilen_csv
{
@file=();
my $zeilen=$_[0];
my $spaeter;
BBB_3: while()
{
print "\n\nEinlesen ab Zeile Nr.: ";
chomp($spaeter=<STDIN>);
if($spaeter !~ /^[1-9]\d*$/)
{
print "Ungültige Eingabe";
}
elsif($spaeter > $zeilen+1)
{
print "Es sind nur $zeilen Zeilen\n";
}
elsif($spaeter == $zeilen+1)
{
$naechster_tag='leer';
last BBB_3;
}
else
{
last BBB_3;
}
}
$spaeter--;
return $spaeter;
}
sub ausgabe_zeilen_csv
{
open(CSV_IN, "<$_[0]") or die "$_[0] konnte nicht geöffnet werden: $!\n";
my $spaeter=$_[1];
while(<CSV_IN>)
{
if($_ =~ /\w\w\ \d\d\.\d\d\.\d\d\d\d/)
{
chomp(my @array = split/;|,/);
$file[$y][0]=$y+1;
$file[$y][1]=$array[0];
$file[$y][2]=$array[1];
$zeit_in_minuten[$y][2]=($1*60)+$2 if $file[$y][2] =~/(\d\d):(\d\d)/;
$file[$y][3]='-';
$file[$y][4]=$array[2];
$zeit_in_minuten[$y][4]=($1*60)+$2 if $file[$y][4] =~/(\d\d):(\d\d)/;
$file[$y][5]=' ';
$file[$y][6]=$array[3];
$zeit_in_minuten[$y][6]=($1*60)+$2 if $file[$y][6] =~/(\d\d):(\d\d)/;
$file[$y][7]='-';
$file[$y][8]=$array[4];
$zeit_in_minuten[$y][8]=($1*60)+$2 if $file[$y][8] =~/(\d\d):(\d\d)/;
$file[$y][9]=$array[5];
$minuten[$y]=($1*60)+$2 if $file[$y][9] =~/(\d+):(\d\d)/;
$file[$y][3]=' ' if $file[$y][2] =~ /^ *$/;
#$file[$y][5]=' ' if $file[$y][2] =~ /^ *$/ || $file[$y][6] =~ /^ *$/;
$file[$y][7]=' ' if $file[$y][6] =~ /^ *$/;
$y++;
if($_[1])
{
$y--;
$_[1]--;
}
}
}
return my $alt=$y;
close CSV_IN;
}
sub eingabekontrolle_datum
{
my $datum=$_[0];
if($datum !~ /(\d\d)\D(\d\d)\D(\d\d\d\d)/)
{
print "\nFormat= 00.00.0000 (Tag-Monat-Jahr)\n";
print "\nNeuer Versuch. Eingabe erste Tag : ";
return 0;
}
elsif($1==0)
{
print "\nTag 0 ist nicht erlaubt.\n";
print "\nNeuer Versuch. Eingabe erste Tag : ";
return 0;
}
elsif(($2==1||$2==3||$2==5||$2==7||$2==8||$2==10||$2==12)&&$1>31)
{
print "\nDieser Monat hat höchstens 31 Tage.\n";
print "\nNeuer Versuch. Eingabe erste Tag : ";
return 0;
}
elsif(($2==4||$2==6||$2==9||$2==11)&&$1>30)
{
print "\nDieser Monat hat höchstens 30 Tage.\n";
print "\nNeuer Versuch. Eingabe erste Tag : ";
return 0;
}
elsif($2==2&&$1>29)
{
print "\nDieser Monat hat höchstens 29 Tage.\n";
print "\nNeuer Versuch. Eingabe erste Tag : ";
return 0;
}
elsif($2==0||$2>12)
{
print "\nMonat: erlaubt 1 - 12.\n";
print "\nNeuer Versuch. Eingabe erste Tag : ";
return 0;
}
elsif($3>2037||$3<1902)
{
print "\nJahr: erlaubt von 1902 bis 2037.\n";
print "\nNeuer Versuch. Eingabe erste Tag : ";
return 0;
}
else
{
return 1;
}
}
sub zeittag
{
my @zeit_in_minuten=@_;
my $min=0;
for (my $i=$beginn_vorm;$i<=$beginn_nachm;$i+=(2 * $time_to_time))
{
if ($zeit_in_minuten[$i] && $zeit_in_minuten[$i+$time_to_time])
{
$min+=$zeit_in_minuten[$i+$time_to_time] - $zeit_in_minuten[$i];
}
}
return $min;
}
sub minuten_in_stunden
{
my $zeit='';
my $stunden=0;
my $minuten=0;
$stunden=int($_[0] / 60);
$minuten=$_[0] % 60;
if ($minuten =~ /^[0-9]$/)
{
$minuten="0$minuten";
}
$zeit="$stunden:$minuten";
if ($zeit eq "0:00")
{
$zeit="";
}
return $zeit;
}
sub clear
{
my $os=$^O;
my $clear="clear" if $os eq 'linux';
$clear="cls" if $os ne 'linux';
system("$clear") if $debugmode==0;
}
sub format_localtime()
{
my @localtime=@_;
$localtime[0]="0$localtime[0]" if $localtime[0] =~ /^\d$/;
$localtime[1]="0$localtime[1]" if $localtime[1] =~ /^\d$/;
$localtime[2]="0$localtime[2]" if $localtime[2] =~ /^\d$/;
$localtime[3]="0$localtime[3]" if $localtime[3] =~ /^\d$/;
$localtime[4]=$localtime[4]+1;
$localtime[4]="0$localtime[4]" if $localtime[4] =~ /^\d$/;
$localtime[5]=1900+$localtime[5];
my @wochentag=qw(Mo Di Mi Do Fr Sa So);
$localtime[6]=$wochentag[$localtime[6]-1];
return @localtime;
}
sub ende
{
my @minuten=@_;
my $stunden_gesamt=0;
my $minuten_gesamt=0;
for(my $u=0;$u<=$#_;$u++)
{
$minuten_gesamt+=$minuten[$u] if $minuten[$u];
}
$stunden_gesamt=int($minuten_gesamt / 60);
$minuten_gesamt=int($minuten_gesamt % 60);
if ($minuten_gesamt =~ /^[0-9]$/)
{
$minuten_gesamt="0$minuten_gesamt";
}
$y--;
open(FILE_OUT, ">$datei") or die "$datei konnte nicht geöffnet werden: $!\n";
open(CSV_OUT, ">$datei_csv") or die "$datei_csv konnte nicht geöffnet werden: $!\n";
for(my $count_5=0; $count_5<=$y; $count_5++)
{
$x=$count_5;
write FILE_OUT;
print CSV_OUT "${$file[$x]}[1]$fs", "${$file[$x]}[2]$fs", "${$file[$x]}[4]$fs", "${$file[$x]}[6]$fs", "${$file[$x]}[8]$fs", "${$file[$x]}[9]\n";
}
printf(FILE_OUT "\n\n%47sSTUNDEN = %5s:%2s\n", ' ', $stunden_gesamt, $minuten_gesamt);
close FILE_OUT;
close CSV_OUT;
&clear;
open(FILE_IN, "<$datei");
print "\n", <FILE_IN>, "\n\n";
close FILE_IN;
print "Das Programm wurde beendet.\n\n";
exit
}