=head1 maile_stunden

Generiere eine Stundenaufstellung.

=head2 Argumente

=over 4

=item id

ID der zu generierenden Aufstellung.

=item flags

Steuerflags.

=over 4

=item 1

Nicht mailen.

=item 2

Alte Daten wiederholen.

=item 4

Nicht meckern, wenn der Zeitpunkt noch nicht erreicht ist.

=item 8

Zeit nicht updaten.

=item 16

Weiteres Editieren verhindern.

=back

=cut

use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Help qw(DoFn isodate unixdate Do DoTime DoTrans);
use Dbase::Globals qw(sendmail find_descr info_descr name_kunde
		kpersinfo mmpersinfo svdaterange);
use Fehler qw(problem fehler hat_problem ffehler re_fehler);
use Date::Calc qw(Add_Delta_Days);
use Cf qw($MAILDOM $PERSO_AUTOMAT);
use Loader qw(list_stunden list_stunden_summe line_print_end log_update
	list_stunden_ueber list_stunden_hotline line_set);

sub maile_stunden($;$) {
	my($id,$flag) = @_;
	$flag=0 unless defined $flag;

  DoTrans {
	my($person,$ziel,$zuletzt,$zeitraum,$delay,$art,$kunde) = DoFn("select person,ziel,zuletzt,zeitraum,delay,art,kunde from stundenliste where id=$id");

	my $flags = DoFn("select pwuse from person where id=$person");

	my($start,$ende);
	if($flag&2) { # alte Daten
		if(defined $zeitraum) { # Tage
			my($ej,$em,$et) = isodate($zuletzt);
			my($sj,$sm,$st) = Add_Delta_Days($ej,$em,$et,-$zeitraum);
			$start = unixdate($sj,$sm,$st);
			$ende = $zuletzt;
		} else { # letzter Monat
			my($sj,$sm,$st) = isodate($zuletzt);
			return problem "Nicht Monatserster?"
				if $st != 1;
			$sj--,$sm=12 if --$sm == 0;
			$start = unixdate($sj,$sm,$st);
			$ende = $zuletzt;
		}
	} else { # neue Daten
		my($ej,$em,$et);
		if(defined $zeitraum) { # Tage
			($ej,$em,$et) = isodate($zuletzt);
			($ej,$em,$et) = Add_Delta_Days($ej,$em,$et,$zeitraum);
			$ende = unixdate($ej,$em,$et);
			$start = $zuletzt;
		} else { # dieser Monat
			($ej,$em,$et) = isodate($zuletzt);
			return problem "Nicht Monatserster?"
				if $et != 1;
			$ej++,$em=1 if ++$em > 12;
			$ende = unixdate($ej,$em,$et);
			$start = $zuletzt;
		}
		# Der Prototyp für unixdate sagt $$$ nicht @.
		# Durch das & wird der umgangen und ADD im Arraykontext aufgerufen.
		my $lt = &unixdate(Add_Delta_Days($ej,$em,$et,$delay));
		if($lt > DoTime) {
			return problem "Noch ist es nicht soweit."
				unless $flag & 4;
			return undef;
		}
	}

	# Liste bauen
	ffehler {
		line_set(5,3) unless $flag & 1;

		$kunde="-" unless defined $kunde;
		if($art == find_descr("std_liste","--")) {
			return problem "Dieser Eintrag wurde deaktiviert";
		} elsif($art == find_descr("std_liste","kurz")) {
			list_stunden_summe($person,$kunde,"",2,$start,$ende);
		} elsif($art == find_descr("std_liste","lang")) {
			list_stunden($person,$kunde,"","-",$start,$ende);
		} elsif($art == find_descr("std_liste","gesamt")) {
			no warnings 'once';
			list_stunden_summe($person,$kunde,"",2,$start,$ende);
			print $Db::pr_fh "\n\n";
			list_stunden_hotline($person,"-",$start,$ende);
			print $Db::pr_fh "\n\n";
			list_stunden_ueber($person);
		} elsif($art == find_descr("std_liste","hotline")) {
			list_stunden_hotline($person,"-",$start,$ende);
		} elsif($art == find_descr("std_liste","monat")) {
			list_stunden_summe($person,$kunde,"",0,$start,$ende);
		} elsif($art == find_descr("std_liste","ueber")) {
			list_stunden_ueber($person);
		} elsif($art == find_descr("std_liste","ende")) {
			unless($flag & 1) {
				if(DoFn("select count(*) from perso where person=$person and abschluss<$ende")) {
					log_update("perso","person",$person,undef,"abschluss",undef,DoFn("select abschluss from perso where person=$person"));
					Do("update perso set abschluss=$ende where person=$person");
				}
			}
			list_stunden_summe($person,$kunde,"", ($flag&2)?0:1, $start,$ende);
		} else {
			fehler "Art '$art' kann ich nicht!";
		}
		line_set(1,3) unless $flag & 1;
		line_print_end();
	} sub {
		line_set(1,3) unless $flag & 1;
		line_print_end();
		re_fehler; 
	};
	
	return undef if hat_problem;
	# Liste mailen
	unless($flag & 1) {
		my @adr;
		if(defined $ziel) {
			push(@adr,mmpersinfo($ziel));
		} else { # AL+perso
			push(@adr,"perso\@$MAILDOM");
			my($al) = DoFn("select vorgesetzter from perso where person=$person");
			push(@adr,mmpersinfo($al)) if $al;
			push(@adr,mmpersinfo($person));
		}
		my $kp = kpersinfo($person);
		$kp .= " ".name_kunde($kunde) if $kunde ne "-";
		$kp .= ": ".($zeitraum?($zeitraum==1)?"1 Tag, ":"$zeitraum Tage, ":"")." ".svdaterange($start,$ende).": ".info_descr("std_liste",$art);
		my $perso_automat = $PERSO_AUTOMAT . ( $PERSO_AUTOMAT !~ y/@// && "\@$MAILDOM" );
		sendmail(<<END .(($Db::output eq "") ? <<END : $Db::output), $perso_automat, @adr);
Subject: Stunden $kp
From: $perso_automat (der Perso-Automat)
To: @{[ join(", ",@adr) ]}

END
Diesmal gibt es leider eine leere Liste. :-/
END
	}

	Do "update stundenliste set zuletzt=$ende where id=$id and zuletzt=$start"
		unless $flag&(8|2);
	Do "update perso set abschluss=$ende where person=$person and abschluss<$ende"
		if $flag&16 and not defined $zeitraum;
  }
}

1;
