use utf8;
use warnings; no warnings "redefine";
use strict;
use Fehler qw(fehler ffehler problem);
use Dbase::Help qw(DoFn Do DoTrans qquote);
use Dbase::Globals qw(find_descr bignum content);
use Loader qw(set_buchung_konto set_buchung_inhalt set_buchung_betrag
	set_buchung_mtext set_buchung_meinheit set_buchung_mrabatt
	set_buchung_manzahl edit_buchung strip_kn line_in);

# 1: Automatik

sub add_buchung($;$$) {
	my($rech,$kn,$flags) = @_;
	my $seq;

	$flags=0 unless defined $flags;

	ffehler {
		my($ret);
		DoTrans {
			my($knd,$rflags) = DoFn("select kunde,flags from rechnungen where rnr=$rech");

			my $kkn = strip_kn($kn)."Buchung_NEU";
			my($mtext,$inhalt);
			if($rflags&(bignum(1)<<find_descr("rstatus","manuell"))) {
				$mtext = set_buchung_mtext(undef,undef, $kkn)
					or fehler "kein Text angegeben";
				$inhalt = $mtext;
				$inhalt =~ s/\|.*//;
	
			} else {
				$mtext = undef;
				content ( $inhalt = line_in "Inhalt: " ) or return undef;
				return problem "Leerer Text ist nicht" if $inhalt eq "-";
			}

			# mysql bug workaround
			DoFn("select count(*) from buchung where rnr=$rech for update");
			$seq = DoFn("select max(seq) from buchung where rnr=$rech for update");
			$seq++;
			Do("insert into buchung set rnr=$rech,seq=$seq, kunde=$knd, manzahl=1000, buchtext=${\qquote $inhalt}, mtext=${\qquote $mtext}");

			unless(set_buchung_konto($rech,$seq,$kkn)) {
				if($flags & 1) {
					Do("delete from buchung where rnr=$rech and seq=$seq");
					$rech=undef;
					return undef;
				} else {
					fehler "kein Konto angegeben";
				}
			}

			set_buchung_betrag($rech,$seq,$kkn)
				or fehler "kein Betrag angegeben";

			$kkn = strip_kn($kn)."Buchung_$seq";
			set_buchung_meinheit($rech,$seq,$kkn);
			if($rflags&(bignum(1)<<find_descr("rstatus","manuell"))) {
				set_buchung_manzahl($rech,$seq,$kkn);
				set_buchung_mrabatt($rech,$seq,$kkn);
			}
		};
	} sub {
		Do("delete from buchung where rnr=$rech and seq=$seq")
			if defined $seq;
		$seq = undef;
	};
	return undef unless $seq;
	if($flags & 1) {
		return $seq;
	} else {
		return edit_buchung($rech,$seq,$kn);
	}
}
1;
