use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Help qw(Do DoFn quote DoTrans isodate DoTime);
use Fehler qw(problem fehler ffehler report_fehler);
use Loader qw(check_perm select_descr select_date delete_fnbatch edit_fnbatch set_export_datum);
use IO::File;

# Flags&1: liefere Daten als Text zurück

#sowieso
#$Db::export_daten = undef;
#$Db::export_id = undef;

my $vers = '@RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@';
$vers = "test" if $vers =~ /^\@/;

sub export_fibunet(&$;$$$$) {
	my($data,$art,$flag,$kn,$mandant,$buchen) = @_;
	$flag=0 unless defined $flag;

	return undef unless check_perm("verwaltung");
	return undef if not $flag&2 and not check_perm("buchen");

	local $|=1;

	unless(defined $Db::export_id or $flag&1) {
		unless($flag & 2) { # Echtlauf
			$mandant=1;
		} elsif(not $mandant) {
			$mandant = select_descr("fnmandant",0,undef,"Mandant");
			print("Verarbeitung abgebrochen.\n"),return undef unless defined $mandant;
			fehler "Tests auf den Echtmandanten sind nicht drin!"
				if $mandant==1;
		}
		unless($buchen) {
			$buchen = select_date(256,"Buchdatum",undef, '='=>"jetzt",'x'=>"Rechnungs/etc.-Datum");
			print("Verarbeitung abgebrochen.\n"),return undef unless defined $buchen;
			$buchen=DoTime if $buchen eq "=";
			$buchen=undef if $buchen eq "x";
		}
	}

	my $id = $Db::export_id;
	ffehler {
		my $oid = $id;
		{
			local $Db::export_id = $id;
			my $prev_datum = $Db::export_datum;

			unless(defined $id) {
				if($flag & 1) {
					$id = 0;
				} else {
					DoTrans {
						$id = 1;
						$id++ while DoFn("select count(*) from fnbatch where id=$id");
						Do("insert into fnbatch set mandant=$mandant, id=$id, status=0, art='${\quote $art}'");
					};
				}
				$Db::export_id = $id;
				$Db::export_daten = "";
				set_export_datum($buchen);
				@Db::export_stack = ();
			}
			my $oldstack = $#Db::export_stack;
			push(@Db::export_stack,$art);

			$data = &$data();
			if($data ne "") {
				print " "x70,"\r  $kn\r" if -t STDIN and defined $kn;

				my $was;
				while(defined($was = shift @Db::export_stack)) {
					$Db::export_daten .= <<END;
( ):0004;"$was" 
END
				}
				$Db::export_daten .= $data;
				$Db::export_daten .= <<END;
( ):0005;"@{[scalar isodate(DoTime)]} $vers $art" 
END
			} else {
				$#Db::export_stack = $oldstack if $#Db::export_stack > $oldstack;
			}
			return if defined $oid;
		}

		if($Db::export_daten eq "") {
			Do("delete from fnbatch where id = $id") if $id;
			return problem $kn,"Keine Daten!";
		}
		if($flag&1) {
			$Db::export_id = undef;
			return $Db::export_daten;
		}
#		unless(defined $Db::export_datum) {
#			Do("delete from fnbatch where id = $id") if $id;
#			fehler "kein Datum bekannt";
#		}

		fehler "Problem" unless $id;

		set_export_datum(DoTime()) if not defined $Db::export_datum;

		no warnings 'void';
		$Db::db_export_datum; # once-Warnung
		Do("update fnbatch set status=1, buchen=".$Db::db_export_datum.", daten='".quote(<<END . $Db::export_daten)."' where id = $id");
( ):0001;1;0
END
		print length($Db::export_daten)." Bytes gesendet.\n";
		$Db::export_daten = "";

		print " "x70,"\r" if -t STDIN and defined $kn;
		edit_fnbatch($id);

		return $id;

	} sub {
		print " "x70,"\r" if -t STDIN and defined $kn;
		report_fehler();

		delete_fnbatch($id,$kn,1) if $id;
		@Db::export_stack = ();
		undef;
	}
}
1;
