# 1 (von export_fibunet) liefere Daten als Text zurück
# 2 nicht markieren; buche auf Testmandant
# 4 auch wenn schon gebucht = force
# 8 $kn setzen
#16 auch wenn Buchdatum != Rechnungsdatum

use utf8;
use warnings; no warnings "redefine";
use strict;

use Cf qw($KERLOES $ZAHLUNGSZIEL);
use Fehler qw(warnung);
use Loader qw(
	check_perm
	export_fibunet export_fibunet_datum export_fibunet_id
	log_update
	set_export_datum strip_kn
	valid_arechnung
  );
use Dbase::Globals qw(find_descr bignum);
use Dbase::Help qw(DoTrans DoSelect Do);

my $vers = '@RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@';

sub export_abuche($$$$$$;$$) {
	my($datum,$rnr,$kunde,$zziel,$betrag,$text,$kst,$kto) = @_;
	my $res;
	return "" if $betrag == 0;
	$datum = export_fibunet_datum($datum);
	
	$text =~ s/[^-_\*\.,a-zA-Z0-9 ]+/_/g;
	substr($text,20)="" if length($text) > 20;
	my $fl = 5; # 15; # $kst ? 1 : 2;
	$kto ||= $KERLOES;
	my $kkto = $kst ? $kto : 0;
	$kst="" unless defined $kst;

	$res = <<END;
( ):1100;$betrag;;;$kunde;;;"A$rnr";;"$datum";$kkto;;;"$text";0;;;$zziel;$fl;;;;;$kst
END
	$res .= <<END if not $kst;
( ):1110;$betrag;;;1;$kunde;$kto;1;"M";"A$rnr";"";"$datum";;"$text"
END
	$res;
}

sub export_acct_arechnung($;$$) {
	my($rnr,$flag,$kn) = @_;
	$flag=0 unless defined $flag;
	return unless valid_arechnung($rnr,4|2,$kn);

	my $datum;
	$datum=DoFn("select datum from rechnungen where rnr=$rnr") if $flag&32;

	$kn = strip_kn($kn)."Rechnung_$rnr" unless $flag&8;
	return unless check_perm("rechnung");
	my $gebucht = bignum(1)<<find_descr("rstatus","gebucht");

	export_fibunet( sub {
		DoTrans {
			my $res = "";
			DoSelect {
				my($betrag,$steuer,$status,$datum,$kunde,$konto) = @_;
				return unless $betrag;
				unless($flag&4) {
					return unless $status & (bignum(1)<<find_descr("rstatus","buchen"));
					return if $status & $gebucht;
				}

				if(not defined $Db::db_export_datum) {
					set_export_datum($datum);

					no warnings 'void';
					$Db::db_export_datum; # once-Warnung
				} elsif(not($flag & 16) and ($Db::export_datum ne export_fibunet_datum($datum))) {
					print "R#$rnr: nicht gebucht, ".(scalar isodate $datum)."\n";

					no warnings 'void';
					$Db::export_datum; # once-Warnung
					return;
				}

    			my $zziel = DoFn("select zahlung from kunde where id=$kunde") || $ZAHLUNGSZIEL;

				$kunde += 10000;

				$res .= export_abuche($datum,$rnr,$kunde,$zziel,$betrag+$steuer,"R #$rnr",undef,$konto);
				
				DoSelect {
					my($pos,$text,$betrag,$kst) = @_;
					$res .= export_abuche($datum,$rnr,$kunde,$zziel,$betrag,$text,$kst,$konto);
				} "select seq,buchtext,betrag,konto from buchung where buchung.rnr = $rnr";

				unless($flag & 2) { # Testlauf
					log_update("rechnungen","rnr",$rnr,undef,"flags",undef,"+gebucht");
					Do("update rechnungen set flags = flags | $gebucht where rnr = $rnr");
				}
			} "select betrag,steuer,flags,datum,kunde,konto from rechnungen where rnr = $rnr";
			# warnung $kn,"Keine Buchungsdaten generiert." if $res eq "" and not $flag&1;
			$res =~ s/(.*)\n\( \)/$1\n(*)/s;
			return $res;
		rfalsch:
			return undef;
		};
	}, "buche Rechnung #$rnr",$flag,$kn );
}

1;
