=noris.netheads Name

Stundensumme


=head1 Ziel

Testen diverser Funktionen zum Zählen von Stunden.


=head1 Testfälle

So viele wie möglich ...

=cut


package Test::ssum;
use utf8;
use warnings;
use strict; use warnings;
BEGIN { unshift(@INC,($ENV{'POPHOME'}||'@POPHOME@').'/lib')
			unless $ENV{'KUNDE_NO_PERLPATH'};
      }

#use Test::More tests => 60;
use Test::More skip_all => 'Muss noch umgebaut werden auf API::Test';
use Dbase::Test qw(okF okS okQ);

use Dbase::Globals qw(
  find_descr
  gen_descr
  is_hotline
  stunden_bereich
  time4kunde
  time4kunden
  time4ticket
  update_stunden_cache
);
use Dbase::Help qw(unixtime DoFn qquote);
use Loader qw(delete_kunde delete_person ticket_delete);
use CGI;
use RT;
use RT::database;
use RT::database::manipulate qw(add_new_request);
use Fehler qw(fehler);

my $time=time;


BEGIN {
	unless($ENV{'TESTING'}) {
		print STDERR " RT init...\r" if -t STDIN;
		no warnings qw(once);
		RT::initialize() unless $Db::RT_done++;
	}
}

foreach my $k(1,2) {
	my $kid = DoFn("select id from kunde where name = 'stdtest$k'");
	if($kid) {
			okS "Kunde l<F6>schen",sub {delete_kunde($kid,3);};
	} else {
			pass("Stundentest-Kunde $k nicht vorhanden");
	}
	okF "insert into kunde set name='stdtest$k'";
}

my $kid1 = DoFn("select id from kunde where name = 'stdtest1'");
my $kid2 = DoFn("select id from kunde where name = 'stdtest2'");


my $tsubj = "TEST: Stunden";
my $t1subj = "TEST: Stunden (Superticket)";
my $t2subj = "TEST: Stunden (Subticket)";
{
	my $tid = DoFn("select id from ticket where subject=${\qquote $tsubj}");
	if($tid) {
		okS "lösche Stunden-Ticket",sub{ticket_delete($tid)};
	} else {
		pass("kein Stunden-Ticket");
	}
}{
	my $tid = DoFn("select id from ticket where subject=${\qquote $t1subj}");
	if($tid) {
		okS "lösche Stunden-Ticket 1",sub{ticket_delete($tid)};
	} else {
		pass("kein Stunden-Ticket 1");
	}
}{
	my $tid = DoFn("select id from ticket where subject=${\qquote $t2subj}");
	if($tid) {
		okS "lösche Stunden-Ticket 2",sub{ticket_delete($tid)};
	} else {
		pass("kein Stunden-Ticket 2");
	}
}

my $ticketid;
okS "Neues Ticket",sub {
		my($trans,$res);
		($ticketid,$trans,$res)=add_new_request(CGI->new({
			queue=>"test",
			subject=>$tsubj,
			kunde=>"stdtest1",
			requestors=>"$ENV{'USER'}",
			auth_user=>$ENV{'USER'}}),<<END);
Content-Type: text/plain
Content-Transfer-Encoding: 8bit

Dies ist ein Test-Ticket für Arbeitszeit.

Bitte geflissentlich zu ignorieren. ;-)

END
		fehler "Create:$res" unless $ticketid;
};


my $t1id;
okS "Neues Sub-Ticket",sub {
		my($trans,$res);
		($t1id,$trans,$res)=add_new_request(CGI->new({
			queue=>"test",
			subject=>$t1subj,
			kunde=>"stdtest2",
			requestors=>"$ENV{'USER'}",
			auth_user=>$ENV{'USER'}}),<<END);
Content-Type: text/plain
Content-Transfer-Encoding: 8bit

Dies ist ein Test-Ticket für Arbeitszeit. (SUB)

Bitte geflissentlich zu ignorieren. ;-)

END
		fehler "Create:$res" unless $t1id;
};


my $t2id;
okS "Neues Sub-Ticket",sub {
		my($trans,$res);
		($t2id,$trans,$res)=add_new_request(CGI->new({
			queue=>"test",
			subject=>$t2subj,
			kunde=>"stdtest2",
			requestors=>"$ENV{'USER'}",
			auth_user=>$ENV{'USER'}}),<<END);
Content-Type: text/plain
Content-Transfer-Encoding: 8bit

Dies ist ein Test-Ticket für Arbeitszeit. (SUB)

Bitte geflissentlich zu ignorieren. ;-)

END
		fehler "Create:$res" unless $t2id;
};

okF "update ticket set ticket=$t1id where id=$t2id";


foreach my $k(1,2,3) {
	my $pid = DoFn("select id from person where user = 'stdtester$k'");
	my $kid = ($k == 2) ? $kid2 : $kid1;
	if($pid) {
			okS "Kunde l<F6>schen",sub {delete_person($pid,3);};
	} else {
			pass("Stundentest-Person $k nicht vorhanden");
	}
	okF "insert into person set user='stdtester$k',kunde=$kid";
}
my $p1 = DoFn("select id from person where user = 'stdtester1'");
my $p2 = DoFn("select id from person where user = 'stdtester2'");
my $p3 = DoFn("select id from person where user = 'stdtester3'");

my $pre = unixtime "2001-01-01";
my $beg = unixtime "2001-01-02";
my $end = unixtime "2001-01-03";
my $post= unixtime "2001-01-04";

okF "delete from stunden";
okF "delete from stunden_art";

okS 'stunden_art//hotline',
  sub { gen_descr( stunden_art => undef, 'hotline' ) };
my $hotline = find_descr( stunden_art => hotline => 1 );
okF "insert into stunden_art set id=1,name='normal',faktor=100,infotext='Standardeintrag',flags=0";
okF "insert into stunden_art set id=2,name='Hotline',faktor=150,infotext='Hotlinestunden',flags=(1<<$hotline)";
is is_hotline(1), '', 'normal ist nicht Hotline';
is is_hotline(2), 1, 'hotline ist Hotline';

okF "insert into stunden set kunde=$kid1,art=1,person=$p1, beginn=$beg-1200,dauer=1200";
okF "insert into stunden set kunde=$kid1,art=1,person=$p2, beginn=$beg,dauer=1200, ticket=$ticketid";
okF "insert into stunden set kunde=$kid1,art=2,person=$p1, beginn=$beg,dauer=3000";
okF "insert into stunden set kunde=$kid1,art=1,person=$p1, beginn=$end,dauer=1200";
okF "insert into stunden set kunde=$kid2,art=1,person=$p1, beginn=$beg,dauer=500";
okF "insert into stunden set kunde=$kid2,art=1,person=$p2, beginn=$beg+300,dauer=600, ticket=$ticketid";
okF "insert into stunden set kunde=$kid2,art=1,person=$p1, beginn=$beg+1000,dauer=1000";
okF "insert into stunden set kunde=$kid2,art=1,person=$p1, beginn=$beg+3000-500,dauer=500";
okF "insert into stunden set kunde=$kid2,art=2,person=$p1, beginn=$beg+3600,dauer=222";
okF "insert into stunden set kunde=$kid1,art=1,person=$p1, beginn=$beg+10000,dauer=234, ticket=$ticketid";

update_stunden_cache($pre,$post);

#  ID       Anfg    Dauer   Person  Kunde   Faktor
# Stunden für k1
my @werte = (
[ "k$kid1", 0,      0,      $p1,    $kid1,  150 ],
[ "k$kid1", 500,    500,    $p1,    $kid1,  150 ],
[ "k$kid1", 2000,   500,    $p1,    $kid1,  150 ],
[ "k$kid1", 10000,  234,    $p1,    $kid1,  100 ],
[ "k$kid1", 0,      300,    $p2,    $kid1,  100 ],
[ "k$kid1", 900,    300,    $p2,    $kid1,  100 ],
# Stunden für k2
[ "k$kid2", 0,      500,    $p1,    $kid2,  100 ],
[ "k$kid2", 1000,   1000,   $p1,    $kid2,  100 ],
[ "k$kid2", 2500,   500,    $p1,    $kid2,  100 ],
[ "k$kid2", 3600,   222,    $p1,    $kid2,  150 ],
[ "k$kid2", 300,    600,    $p2,    $kid2,  100 ],
# Stunden für p1
[ "p$p1",   0,      0,      $p1,    $kid1,  150 ],
[ "p$p1",   0,      500,    $p1,    $kid2,  100 ],
[ "p$p1",   500,    500,    $p1,    $kid1,  150 ],
[ "p$p1",   1000,   1000,   $p1,    $kid2,  100 ],
[ "p$p1",   2000,   500,    $p1,    $kid1,  150 ],
[ "p$p1",   2500,   500,    $p1,    $kid2,  100 ],
[ "p$p1",   3600,   222,    $p1,    $kid2,  150 ],
[ "p$p1",   10000,  234,    $p1,    $kid1,  100 ],
# Stunden für p2
[ "p$p2",   0,      300,    $p2,    $kid1,  100 ],
[ "p$p2",   300,    600,    $p2,    $kid2,  100 ],
[ "p$p2",   900,    300,    $p2,    $kid1,  100 ],
# Stunden für p3
## nix
# Stunden für alles
[ "*",   0,      0,      $p1,    $kid1,  150 ],
[ "*",   0,      500,    $p1,    $kid2,  100 ],
[ "*",   500,    500,    $p1,    $kid1,  150 ],
[ "*",   1000,   1000,   $p1,    $kid2,  100 ],
[ "*",   2000,   500,    $p1,    $kid1,  150 ],
[ "*",   2500,   500,    $p1,    $kid2,  100 ],
[ "*",   3600,   222,    $p1,    $kid2,  150 ],
[ "*",   10000,  234,    $p1,    $kid1,  100 ],
[ "*",   0,      300,    $p2,    $kid1,  100 ],
[ "*",   300,    600,    $p2,    $kid2,  100 ],
[ "*",   900,    300,    $p2,    $kid1,  100 ],
# Stunden für nur-Hotline
[ "H",   0,      3000,   $p1,    $kid1,  150 ],
[ "H",   3000,   600,    $p1,    "-",    150 ],
[ "H",   3600,   222,    $p1,    $kid2,  150 ],
# Stunden für nur-Hotline, mit Kappen
[ "H2",  1800,   1200,   $p1,    $kid1,  150 ],
# Stunden für nur-Hotline, mit Verbindung
[ "H1",  0,      3822,   $p1,    "-",    150 ],
# Stunden für nur-Hotline, mit Verbindung und Kappen
[ "H12", 1800,   2022,   $p1,    "-",    150 ],
);

my $is_ok = 1;
my $step = 0;

print "#ID	ID	Anfg	Dauer	Person	Kunde	Faktor\n";
sub pr(@) {
	my @arg = map { defined() ? (/^\d+\z/ and $_>=900000000) ? $_-978390000 : $_ : "-" } @_;
	my $eid = shift @arg;
	my $sid = shift @arg;
	++$step;
	unshift(@arg,$eid);
	#print "#".join("\t",$sid,@arg)."\n";
	my @nxt = @werte ? @{shift @werte} : ("leer");
	if("@arg" ne "@nxt") {
		print "##$step bad  @arg\n";
		print "##$step want @nxt\n";
		$is_ok=0;
	}
}

foreach my $k($kid1,$kid2) {
	print "# Stunden für k$k\n";
	stunden_bereich( undef, $k, $beg,$end,0, sub {
		pr("k$k", @_[0..5] );
	});
}
foreach my $k($p1,$p2,$p3) {
	print "# Stunden für p$k\n";
	stunden_bereich( $k, undef, $beg,$end,0, sub {
		pr("p$k", @_[0..5] );
	});
}
stunden_bereich( undef, undef, $beg,$end,0, sub {
	pr("*", @_[0..5] );
});
stunden_bereich( undef, undef, $beg,$end,4, sub {
	pr("H", @_[0..5] );
});
stunden_bereich( undef, undef, $beg,$end,4|2, sub {
	pr("H2", @_[0..5] );
});
stunden_bereich( undef, undef, $beg,$end,4|1, sub {
	pr("H1", @_[0..5] );
});
stunden_bereich( undef, undef, $beg,$end,4|1|2, sub {
	pr("H12", @_[0..5] );
});

$is_ok=0 if @werte;
is($is_ok,1,"Stundenbereichsausgaben sind OK");

use Data::Dumper;
$Data::Dumper::Terse = 1;
$Data::Dumper::Indent = 0;

sub tcheck() {
is(time4kunde($kid1,$beg,$end),1.5*1000+234+600,"Stundensumme 1");
is(time4kunde($kid2,$beg,$end),1.5*1200+800+1.5*222,"Stundensumme 2");
is(time4ticket($ticketid),234+1200,"Ticketsumme 1");
is(time4ticket($ticketid,undef,undef,[$kid1]),234+600,"Ticketsumme 2");
is(time4ticket($ticketid,undef,undef,undef,[$kid2]),234+600,"Ticketsumme 3");
is(time4ticket($ticketid,undef,undef,[$kid2]),600,"Ticketsumme 4");
is(time4ticket($ticketid,undef,undef,undef,[$kid1]),600,"Ticketsumme 5");
is(time4ticket($ticketid,$beg,$end,[$kid1]),234+600,"Ticketsumme 6");

like(Dumper(time4kunden($beg,$end,1)),qr/\['$kid2','2933(?:\.0*)?','2822(?:\.0*)?'\]/,"Stundensumme 3");
}

tcheck();
okQ "select count(*) from stunden where zeit is null",0;
okQ "select count(*) from stunden where zeit is null and beginn >= $beg",0;
tcheck();
is(time4ticket($ticketid,$pre,$beg),0,"Ticketsumme 7");
# durch Optimierung time4tickets() nicht mehr gewährleistet:
# okQ "select count(*) from stunden where zeit is null",0;

# Test verbundene Tickets
okF "insert into stunden set kunde=$kid1,art=1,person=$p1, ticket=$t2id, beginn=$beg-1200,dauer=10";
okF "insert into stunden set kunde=$kid1,art=1,person=$p1, ticket=$t1id, beginn=$beg+200,dauer=10";
okF "insert into stunden set kunde=$kid1,art=1,person=$p1, ticket=$t2id, beginn=$end+1200,dauer=10";
update_stunden_cache($pre,$post);

is(time4ticket($t1id),30,"Ticketsumme 8");

1;
