# baut einen Rechnungstext aus Positionen zusammen.

use utf8;
use warnings; no warnings "redefine";
use strict;
use Fehler qw(problem);
use Loader qw($base acct_text_kopf acct_text_buchung acct_text_page
	acct_text_fuss acct_text_zahlung);
use Dbase::Help qw(DoSelect DoFn);
use Dbase::Globals qw(find_descr bignum);

BEGIN {
	do "$base/acct/text_vars";
}

my $eigene_re;

sub acct_text($) {
	my($rech) = @_;
	my($kunde,$datum,$rflags,$betrag,$steuer,$auftrag,$fuss) = DoFn("select kunde,datum,flags,betrag,steuer,auftragsnr,fusstext from rechnungen where rnr=$rech");
	my($oberkunde,$kflags) = DoFn("select kunde,flags from kunde where id=$kunde");
	$kflags=bignum($kflags);

	$eigene_re = bignum(1)<<find_descr("kunde","eigene_re")
		if not $eigene_re;
	$oberkunde=undef if $kflags & $eigene_re;

	return problem "keine manuelle Rechnung"
		unless $rflags&(bignum(1)<<find_descr("rstatus","manuell"));

	my $data = acct_text_kopf($rech,$kunde,$datum,$auftrag,undef,undef, (($betrag<0)?1:0) | ($oberkunde?2:0));
	my $lines = 0+@{[ split(/\n/,$data) ]};
	my $done=0;
	my $page=1;
	if(not defined $fuss) {
		$fuss="";
	} elsif($fuss ne "" and substr($fuss,0,1) ne "\n") {
		$fuss="\n".$fuss;
	}

	my $ft = acct_text_fuss($kunde,$betrag,$steuer)."\n".acct_text_zahlung($kunde,$datum,$betrag).$fuss;
	my $ftlen = 2+@{[ split(/\n/,$ft) ]};

	my $maxseq = DoFn("select max(seq) from buchung where rnr=$rech");
	my $fsum = 0;
	my $oline = "";
	my $flg_no_lf = 1 << find_descr("buchung","no_lf");

	my $attach = sub {
		my($seq,$line) = @_;

		my $llen = 0+@{[ split(/\n/,$line) ]};
		# der letzte Eintrag kommt auf eine neue Seite,
		# wenn er nicht zusammen mit der Summenzeile draufpasst
		if($lines+$llen+(($seq == $maxseq)?$ftlen:0) < $maxll) {
			if($done++) {
				$lines++;
				$data .= "\n";
			}
			$lines+=$llen;
		} else {
			my $dt;
			($dt,$lines) = acct_text_page(++$page,$fsum);
			$data .= $dt;
		}
		$data .= $line;
	};
	DoSelect {
		my($seq) = @_;
		
		my ($line,$betr,$flag) = acct_text_buchung($rech,$seq);
		$line = $oline.$line;
		if($flag & $flg_no_lf) {
			$oline = $line;
			return;
		}
		$oline = "";
		$fsum += $betr;
		&$attach($seq,$line);

	} "select seq from buchung where rnr=$rech order by seq";
	&$attach($maxseq,$oline) if $oline ne "";

	$data .= $ft;
	$lines += $ftlen;

	if( $betrag < 0 || DoFn("SELECT flags FROM kunde WHERE id=$kunde") & bignum(1) << find_descr kunde => 'steuernr' ) {
		my $stnr = DoFn("select steuernr from kunde where id=$kunde");
		$stnr = DoFn("select steuernr from kunde where id=".oberkunde($kunde))
			unless $stnr;
		$stnr="???" unless $stnr;
        $data .= "\n"x($maxll-$lines+2) . <<END;

Ihre Steuernummer:    $stnr
END
	}
	
	# Rabattangaben wegfiltern
	if($data =~ /\s\d{2,3}\:\%/ or $data =~ /\s[1-9]\:\%/) {
		$data =~ s/\b(\d{1,3})\:\%/$1 %/g;
	} else {
		$data =~ s/Rabatt/      /g;
		$data =~ s/0\:\%/   /g;
	}
	$data =~ s/[\001\002\005]//g;
	$data;
}
1;
