=noris.netheads Name

rechnungdatum


=head1 Ziel

Testen der Generierung von Rechnungsdatumsangaben


=head1 Testfälle

Beim Test-Rechnungstellen gibt der Benutzer genau ein Datum an, 
nämlich das der Rechnung. Das Sytem soll daraus automatisch die
korrekten Datumswerte berechnen.

=cut


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

# +OK +PROB
use Test::More tests => 3 +6*11 +2*5; $| = 1;
use Dbase::Test;

my $time=time;

use Dbase::Help qw(Do isodate unixdate isotime DoFn);
use Dbase::Globals qw(gen_descr get_kunde);
use Fehler qw(hat_problem probleme);
use Loader qw(acct_rechnung delete_kunde);

okS "kunde//voraus",sub {gen_descr("kunde",undef,"vorausberechnen")};

{
	my $kid;
	
	$kid = DoFn("select id from kunde where name = 'rdtest'");
	if($kid) {
		okS "Kunde löschen",sub {delete_kunde($kid,3);};
	} else {
		pass("kein Altlast-Kunde");
	}
}
okF "insert into kunde set name='rdtest'";
my $kid = get_kunde('rdtest');

# JETZT ist 2000-06-15
#nx: "next"-Flag. n:gelöscht,j=gesetzt,*:wird gesetzt.  #t: "test"-Flag.
# p?: gesetzt wenn ein Problem gemeldet werden soll.

#next? rdatum      zuletzt  acctStart   rechStart   =RD
#T     voraus?     p?           Stop        Stop    tarifStop

my $tests = <<END;
@ Standardfall: nächste Rechnung
n      -           200005   2000-05-01  2000-05-01  2000-05-31
n      n           n        2000-06-01  2000-06-01  2000-06-01

@ dito bei Vorauszahlung
n      -           200005   2000-05-01  2000-06-01  2000-06-01
n      j           n        2000-06-01  2000-07-01  2000-07-01

@ noch im alten Zeitraum: nix passiert
n      -           200006   - - -
n      n           j        - - -

@ dito bei Vorauszahlung
n      -           200006   - - -
n      j           j        - - -

@ ... bei Testrechnungen wird aber das aktuelle Intervall verwendet
*      -           200006   2000-06-01  2000-06-01  2000-06-30
j      n           n        2000-07-01  2000-07-01  2000-07-01

@ dito bei Vorauszahlung
*      -           200006   2000-06-01  2000-07-01  2000-07-01
j      j           n        2000-07-01  2000-08-01  2000-08-01

@ ... dito wenn das "next"-Flag vorher schon gesetzt ist
j      -           200005   2000-06-01  2000-06-01  2000-06-30
j      n           n        2000-07-01  2000-07-01  2000-07-01

@ dito bei Vorauszahlung
j      -           200005   2000-06-01  2000-07-01  2000-07-01
j      j           n        2000-07-01  2000-08-01  2000-08-01

END
my @l1;
foreach my $line(split(/\n/,$tests)) {
	$line =~ s/\s*$//; $line =~ s/#.*//; next if $line eq "";
	if ($line =~ /^\@\s*/) {
		pass $line;
		next;
	}
	if(not @l1) {
		@l1 = split(/\s+/,$line);
		next;
	}
	my($nx,$rd,$zuletzt,$abe,$rbe,$rdatum) = @l1; @l1 = ();
	my($t,$voraus,$p,$aen,$ren,$ten) = split(/\s+/,$line);
	if($rd eq "-") { $rd = undef; }
	okF "update kunde set zuletzt=$zuletzt where id=$kid", "Rechnung ab $zuletzt";
	if($voraus eq "n") {
		okF "update kunde set flags=flags&~(1<<%DESCR%kunde%vorausberechnen%) where id=$kid", "Vorauszahlung aus";
	} else {
		okF "update kunde set flags=flags|(1<<%DESCR%kunde%vorausberechnen%) where id=$kid", "Vorauszahlung an";
	}
	my $r = acct_rechnung(kunde => $kid);
	$r->{'rechnungsdatum'} = unixdate($rd);
	if($t eq "j") { $r->{'flags'}{'test'} = 1; }
	if($nx eq "j") { $r->{'flags'}{'next'} = 1; }
	$r->{'now'} = unixdate "2000-06-15";
	$r->prep();
	print "# ",$r->dump(),"\n";

	if($p eq "j") {
		ok hat_problem(), "Problem erkannt:";
		probleme { print "#@_\n"; 1; };
		pass "Datumstests uebersprungen.";
		next;
	} elsif(hat_problem()) {
		fail "Sporadisches Problem";
		probleme { print "#@_\n"; 1; };
		pass "Dummy"; pass "Dummy"; pass "Dummy"; pass "Dummy";
		pass "Dummy"; pass "Dummy"; pass "Dummy";
		next;
	}
	if(hat_problem()) {
		is $p,"j","hat Problem";
		next;
	} else {
		is $p,"n","keine Probleme";
	}
	is isotime($r->{'rechnungsdatum'}),$rdatum,"Rechnungsdatum passt";
	is isotime($r->{'acct_beginn'}),$abe,"Accounting-Start passt";
	is isotime($r->{'acct_ende'}),$aen,"Accounting-Stop passt";
	is isotime($r->{'rech_beginn'}),$rbe,"Rechnung-Start passt";
	is isotime($r->{'rech_ende'}),$ren,"Rechnung-Stop passt";
	is isotime($r->{'tarif_ende'}),$ren,"Tarif-Stop passt";
	$nx = "j" if $nx eq "*";
	my $rnx = $r->{'flags'}{'next'} ? "j" : "n";
	is $rnx,$nx,"'next' gesetzt?";
}

