use utf8;
use warnings; no warnings "redefine";
use strict;
use Loader qw(
	add_perso add_stunde
	check_perm check_vorgesetzter
	delete_perso
	edit_person_monat edit_stunde edit_stundenlisten
	flip_perso_back
	line_in
	list_perso list_stunden
	list_stunden_hotline list_stunden_summe list_stunden_ueber
	log_view
	set_perso_abschluss set_perso_anfang set_perso_datum
	set_perso_jahresurlaub set_perso_letzter
	set_perso_personr set_perso_resturlaub set_perso_tagstunden
	set_perso_ueberstunden set_perso_ueberstundenlimit set_perso_urlaub
	set_perso_vorgesetzter
	valid_person
	);
use Fehler qw(report_fehler problem warnung);
use Dbase::Help qw(DoFn DoTime);

sub edit_person_stunden($;$$) {
	my($id,$kn) = @_;
	return unless valid_person($id);

	my $verwaltung = check_perm("perso",1);
	return problem 'Du kannst nur deine eigenen Stunden oder die (D)eines Mitarbeiters ansehen.'
	    	unless $verwaltung || check_vorgesetzter( undef, $id );

	my($pbe,$pen);
	{
		my($kunde_id, $kunde_name);
		($kunde_id, $kunde_name, $pbe,$pen)= DoFn <<_;
			SELECT kunde.id, kunde.name,
			       perso.beginn, perso.ende
			FROM   ( kunde, person )
			  left join perso
			    on person.id=perso.person
			WHERE  kunde.id = person.kunde
			   AND person.id = $id
_
		return problem "Konnte nicht ermitteln, zu welchem Kunden diese Person gehört!?"
			unless defined $kunde_id && defined $kunde_name;

		warnung "Diese Person gehört nicht zu POP, sondern zu Kunde #$kunde_id:$kunde_name."
			unless $kunde_id == 1 && $kunde_name eq 'POP';

		if(defined $pbe) {
			warnung "Diese Person ist nicht mehr Mitarbeiter" if defined $pen and $pen < DoTime();
		} else {
			warnung "Diese Person ist kein Mitarbeiter";
		}
	}

	persk: while(1) {
		my $act = line_in "$kn Stunden >",4; last if $act eq "";
		if($act eq "?") {
			print <<'END' if $verwaltung;
l       auflisten (Summe)
END
			print <<'END' if $verwaltung;
L       Monat abrechnen
END
			print <<'END';
ll      auflisten (ausführlich)     lh  Liste der Hotline-Einsätze
a       hinzufügen
END
			print <<'END' if $verwaltung;
###     bearbeiten

END
			print <<'END' if $verwaltung and not defined $pbe;
p       Personal-Marker setzen
END
			print <<'END' if $verwaltung and defined $pbe;
p       Personaldaten ausgeben      lg  Überstunden auflisten
                                    llg ... inkl. Berechnung
END
			print <<'END' if defined $pbe and $verwaltung;
x   Datum setzen, ab dem Stunden bearbeitet werden dürfen
e   Monat setzen, bis zu dem abschließend berechnet wurde

ü   Überstundensumme setzen         u   Urlaub setzen          ru Rest-
v   Vorgesetzten setzen             j   Jahresurlaub setzen
#   Personalnummer setzen           b   Benachrichtigungen
r   letzte Abrechnung zurücknehmen  gg  Überstunden-Obergrenze gesamt
t   Arbeitsstunden/Tag setzen       X   Beginn/Ende setzen
s   Anfangsmonat und -überstunden

YYYY-MM Daten dieses Monats bearbeiten
del     Personal-Marker löschen
END
			next;
		}
		if($verwaltung and $act eq "l") { list_stunden_summe($id,undef,$kn); next; }
		if($act eq "H") { log_view($kn,"perso","person",$id); next; }
		if($verwaltung and $act eq "L") { list_stunden_summe($id,undef,$kn,1|4); next; }
		if($act eq "ll") { list_stunden($id,undef,$kn); next; }
		if($act eq "lh") { list_stunden_hotline($id,undef,undef); next; }
		if($act eq "a") { add_stunde($id,undef,$kn); next; }

		if(defined $pbe and $verwaltung) {
			if($act eq "p") { list_perso($id,$kn); next; }
			if($act eq "lg") { list_stunden_ueber($id,$kn); next; }
			if($act eq "llg") { list_stunden_ueber($id,$kn,1); next; }
			if($act eq "del") { delete_perso($id,$kn); $pbe = undef; next; }
			if($act eq "x") { set_perso_abschluss($id,$kn); next; }
			if($act eq "#") { set_perso_personr($id,$kn); next; }
			if($act eq "r") { flip_perso_back($id,$kn); next; }
			if($act eq "u") { set_perso_urlaub($id,$kn); next; }
			if($act eq "ru") { set_perso_resturlaub($id,$kn); next; }
			if($act eq "v") { set_perso_vorgesetzter($id,$kn); next; }
			if($act eq "b") { edit_stundenlisten($id,$kn); next; }
			if($act eq "j") { set_perso_jahresurlaub($id,$kn); next; }
			if($act eq "s") { set_perso_anfang($id,$kn); next; }
			if($act eq "t") { set_perso_tagstunden($id,$kn); next; }
			if($act eq "X") {
				set_perso_datum($id,$kn);
				($pbe,$pen) = DoFn("select beginn,ende from perso where person=$id");
				next;
			}
			if($act eq "ue" or $act eq "ü") { set_perso_ueberstunden($id,$kn); next; }
			if($act eq "gg") { set_perso_ueberstundenlimit($id,$kn); next; }
			if($act eq "e") { set_perso_letzter($id,$kn); next; }
			if($act =~ /^(\d{4})-(\d\d)$/) {
				$act = edit_person_monat($1*100+$2,$id,$kn);
				next;
			}
		} elsif($verwaltung) {
			if($act eq "p") {
				add_perso($id,$kn);
				$pbe = 1;
				next;
			}
		}
		if($act =~ /^\d+$/) {
			$act = edit_stunde($act,$id,undef,$kn);
			next;
		}
		print "Aktion '$act' kenne ich nicht.\n";
		next; fehler: report_fehler(4);
	}
	undef;
}
1;
