#!/usr/bin/perl -w

# Source: @RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@

BEGIN {
        select(STDERR); $|=1; select(STDOUT);
        unshift(@INC,($ENV{'POPHOME'}||'@POPHOME@').'/lib')
			unless $ENV{'KUNDE_NO_PERLPATH'};
      }

print STDERR "*** Über/Krank/Urlaubsstundenliste\n\n" if -t STDIN;

use utf8;
use strict;
use warnings;
use Umlaut qw(textmodus);

use Dbase::Help;
use Dbase::Globals qw(def_or_minus get_person stunden_bereich);
use Fehler qw(fehler);
use Loader qw(check_perm);

die unless check_perm("verwaltung");

sub Usage() {
	my $vers = '@RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@';

	textmodus(\*STDERR);
    die <<END;
Usage: $0 [-g|-k|-a|-u|-i] Jahr [Person...] -- listet Überstunden
          -g        stattdessen: bereinigte Überstunden
          -k        stattdessen: Krank-Stunden
          -a        stattdessen: ausgezahlte Überstunden
          -u        stattdessen: Urlaub-Stunden
          -i        stattdessen: alles (zwecks Excel-Import)
          Jahr      für dieses Jahr
          Person... nur für diese Mitarbeiter

Version: $vers
END
  exit 1;
}

use Getopt::Std;
use vars qw( $opt_h $opt_a $opt_k $opt_u $opt_i $opt_g );
getopts("haikug") or Usage;
Usage if $opt_h;
Usage if ($opt_a||0)+($opt_k||0)+($opt_u||0)+($opt_i||0)+($opt_g||0) > 1;

Usage if @ARGV == 0;


## CODE ##

sub upri($);
my $jahr = shift @ARGV;
my @mon = qw(01 02 03 04 05 06 07 08 09 10 11 12);
if($opt_i) {
	my $pstr = "\tSumme\tF=2\tF=1.5\tF=1.0\tF=0.5\tF=0\tUrlaub\tkrank";
	print "$jahr\t\t".join("$pstr\t",@mon)."$pstr\n";
} else {
	print "$jahr\t\t".join("\t",@mon)."\n";
}
if(@ARGV) {
	foreach my $arg(@ARGV) { $arg = get_person $arg; upri($arg) if $arg; }
} else {
	DoSelect {
		upri($_[0]);
	} "select distinct perso.person from perso,stunden where perso.person = stunden.person and stunden.beginn >= ".unixdate($jahr,1,1)." and stunden.beginn < ".unixdate($jahr+1,1,1)." order by perso.personr";
}

sub lss_zeit($) {
	my($z) = @_;
	return "  --:--" if $z == 0;
	my $res = sprintf " %3d:%02d",abs($z)/3600,(abs($z)%3600)/60;
	$res =~ s/^ /-/ if $z < 0;
	$res;
}

use Dbase::Help qw(Do DoFn);

sub upr($$);
sub upri($) {
	my($pid) = @_;
	my $sum = 0;
	my($pname,$pnr)=DoFn("select LOWER(person.user), perso.personr from person,perso where person.id = $pid and perso.person = person.id");
	$pname = "#$pid" unless defined $pname;
	$pnr="?" unless $pnr;
	print "$pnr\t$pname";
	foreach my $m(1..12) {
		my $u = upr($pid,$m);
		print "\t$u";
		# $sum += $u if $u =~ /^-?\d+(\.\d+)?$/;
	}
	print "\n";
}
sub upr($$) {
	my($pid,$monat) = @_;
	my $sum=0; # Stundensumme nach Faktor
	my $ausz=0; # Auszahlung
	my $ksum=0; # 
	my $usum=0; # Urlaub
	my $sdif=0; # Stundendifferenz

	my $sum20=0;
	my $sum15=0;
	my $sum10=0;
	my $sum05=0;
	my $sum0=0;

	my $beginn = unixdate($jahr,$monat,1);
	my $mon; my $moni;
	my $ende;
	{
		my($j,$m,$t) = isodate($beginn);
		$mon = $j*100+$m;
		$moni = sprintf("%04d-%02d",$j,$m);
		if(++$m == 13) {
			$j++; $m = 1;
		}
		$ende = unixdate($j,$m,$t);
	}
	my $head;
	my $tag = "";
	my $pers = 0;
	my($voll,$paus,$spaus,$mehr,$smehr,$beg,$end,$str);

	my $artUrlaub = DoFn("select id from stunden_art where name='Urlaub'");
	my $artKrank = DoFn("select id from stunden_art where name='krank'");

	($ausz,$sdif) = DoFn("select auszahl,diff from persomonat where person=$pid and monat=$mon");
	$ausz=0 unless defined $ausz;
	$sdif=0 unless defined $sdif;

	unless($opt_g) {
		stunden_bereich($pid,undef,$beginn,$ende,1|2, sub {
			my($sid,$sbeg,$sdau,$person,$kunde,$faktor,$txt,$ticket,$art) = @_;

			if($art == $artUrlaub) {
				$usum += $sdau;
				$sum += $sdau;
			} elsif($art == $artKrank) {
				$ksum += $sdau;
				$sum += $sdau;
			} else {
				if($faktor == 200) {
					$sum20 += $sdau;
				} elsif($faktor == 150) {
					$sum15 += $sdau;
				} elsif($faktor == 100) {
					$sum10 += $sdau;
				} elsif($faktor == 50) {
					$sum05 += $sdau;
				} elsif($faktor == 0) {
					$sum0 += $sdau;
				} else {
					warn "Faktor: '$faktor'!\n";
				}
				$sdau *= $faktor/100;
				$sum += $sdau;
			}
		});
		return $opt_i ? "-\t-\t-\t-\t-\t-\t-\t-\t-" : "-" if not $sum;
	}

	my $soll;
	$soll = DoFn("select soll from persomonat where monat = $mon and person = $pid");
	$soll = DoFn("select soll from persomonat where monat = $mon and (person = 0 or person is NULL)") unless $soll;
	$soll ||= 0;

	if($opt_k) {
		int($ksum/36)/100;
	} elsif($opt_g) {
		int($sdif/36)/100;
	} elsif($opt_a) {
		int($ausz/36)/100;
	} elsif($opt_u) {
		int($usum/36)/100;
	} elsif($opt_i) {
		join "\t", map { int($_/36)/100 } 
		(
			$soll, $sum,
			$sum20, $sum15, $sum10, $sum05, $sum0,
			$usum, $ksum
		);
	} else {
		int(($sum-$soll)/36)/100;
	}
}

1;
