# Flag&1: Abbruch

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

use Fehler qw(report_fehler);
use Loader qw(
	acct_kunde add_buchung
	copy_arechnung_text
	delete_arechnung
	edit_buchungen export_acct_arechnung
	line_in line_set list_arechnung list_arechnung_text list_knextrech
	log_view
	renumber_arechnung
	select_descr
	set_arechnung_auftrag set_arechnung_auszug
	set_arechnung_betrag set_arechnung_buchung
	set_arechnung_datum
	set_arechnung_flags
	set_arechnung_fusstext
	set_arechnung_fusstext_template
	set_arechnung_inhalt
	set_arechnung_konto
	set_arechnung_kunde
	set_arechnung_rbetrag
	set_arechnung_steuer set_arechnung_storno
	set_arechnung_text
	strip_kn
	valid_arechnung
	warn_arbeit warn_kunde
  );
use Dbase::Help qw(DoFn);
use Dbase::Globals qw(find_descr bignum);

sub edit_arechnung($;$$$) {
	my($rech,$id,$kn,$flag) = @_;
	$flag = 0 unless $flag;

	return unless valid_arechnung($rech);

	$kn = strip_kn($kn)."Rechnung_$rech";
	my $work = warn_arbeit("rechnungen",$rech,"*",$kn);
	warn_kunde("rechnungen",$rech,$id,"rnr");

	while(1) {
		my $act = line_in "$kn >",4; last if $act eq "";
		my $rflags = DoFn("select flags from rechnungen where rnr=$rech");
		if($act eq "?") {

			if($rflags&(bignum(1)<<find_descr("rstatus","manuell"))) {
				print <<'END';
l   auflisten     ll Detail      f   Flags ändern
END
			} else {
				print <<'END';
l   auflisten     ll Detail      f   Flags ändern     L/LL  Berechnung/+Tarife
END
			}
			print <<'END';
p   Text ausgeben                e   Einzelposten anzeigen/editieren
XB  buchen     XBT -Test         S   Storno-Datum       ??  mehr Hilfstext
END
			unless($rflags&(bignum(1)<<find_descr("rstatus","manuell"))) {
				if($rflags&(bignum(1)<<find_descr("rstatus","gebucht"))) {
					print <<'END';
=   neu generieren (Ansicht)     ==  vergleichen
END
				} else {
					print <<'END';
=   neu generieren (Ansicht)     ==  vergleichen        =*  ersetzen
END
				}
			}
			unless($rflags&(bignum(1)<<find_descr("rstatus","gebucht"))) {
				print <<'END';
x   Datum ändern                 E   Text editieren (wehe...)
b   Betrag ändern                s   Steuer ändern
bu  Buchungsnr ändern            a   Auszugsnr ändern
i   Infotext ändern              #   Sachkonto ändern
A   Auftragsnummer ändern        F   Fußtext ändern     M ... aus Muster
END
				print <<'END' if $rflags&(bignum(1)<<find_descr("rstatus","manuell"));
n   neue Position anlegen
P   Text generieren              ok  Text generieren + drucken + Rechnung buchen
END
			}
			if($flag & 1) {
				print <<'END';

q        überspringe diese Rechnung
Q        Abbruch der Bearbeitung
END
			} else {
				print <<'END' unless $rflags&(bignum(1)<<find_descr("rstatus","gebucht"));
del      lösche die ganze Rechnung
END
				print <<'END' if not $rflags&(bignum(1)<<find_descr("rstatus","gebucht")) and $rflags&(bignum(1)<<find_descr("rstatus","manuell"));
ren      ändere die Rechnungsnummer
END
			}
			next;
		}
		if($act eq "??") {

			print <<'END';
ALT:
i1..i3   Infotext1...Infotext3 ändern
x1..x3   Datum1...Datum3 ändern
K        auf anderen Kunden ändern
r        bezahlten Betrag ändern
m        maile an den Kunden         d   drucke (via "lpt")
END
		}
		return $act if $flag & 8 and ($act eq "q" or $act eq "Q");
		if($act eq "XB") { export_acct_arechnung($rech,8|16,$kn); next; }
		if($act eq "XBT") { export_acct_arechnung($rech,2|8|16,$kn); next; }
		if($act eq "XBF") { export_acct_arechnung($rech,4|8|16,$kn); next; }
		if($act eq "XBTF" or $act eq "XBFT") {
			export_acct_arechnung($rech,2|4|8,$kn); next; }
		if($act eq "l") { list_arechnung($rech,0,$kn); next; }
		if($rflags&(bignum(1)<<find_descr("rstatus","manuell"))) {
			if($act eq "n") { add_buchung($rech,$kn,1); next; }
		} else {
			if($act =~ /^L(\d*)$/) { list_knextrech($rech,0,$kn,$1); next; }
			if($act =~ /^LL(\d*)$/) { list_knextrech($rech,8,$kn,$1); next; }
			if($act eq "=") { acct_kunde(DoFn("select kunde from rechnungen where rnr=$rech"),$kn, 0,$rech); next; }
			if($act eq "=="){ acct_kunde(DoFn("select kunde from rechnungen where rnr=$rech"),$kn,16,$rech); next; }
			if($act eq "=*" and not $rflags&(bignum(1)<<find_descr("rstatus","gebucht"))){ acct_kunde(DoFn("select kunde from rechnungen where rnr=$rech"),$kn,1,$rech); next; }
			if($act eq "=d") { acct_kunde(DoFn("select kunde from rechnungen where rnr=$rech"), $kn, 8, $rech); next; }
			if($act eq "=dd") { acct_kunde(DoFn("select kunde from rechnungen where rnr=$rech"), $kn, 8+4+2, $rech); next; }
		}
		if($act eq "ll") { list_arechnung($rech,8,$kn); next; }
		if($act eq "H") { log_view($kn,"rechnungen","rnr",$rech); next; }
		if($act eq "f") { set_arechnung_flags($rech,$kn); next; }
		if($act eq "S") { set_arechnung_storno($rech,$kn); next; }

		unless($rflags&(bignum(1)<<find_descr("rstatus","gebucht"))) {
			if($act eq "b") { set_arechnung_betrag($rech,$kn); next; }
			if($act eq "s") { set_arechnung_steuer($rech,$kn); next; }
			if($act eq "A") { set_arechnung_auftrag($rech,$kn); next; }
			if($act eq "#") { set_arechnung_konto($rech,$kn); next; }
			if($act eq "r") { set_arechnung_rbetrag($rech,$kn); next; }
			if($act eq "bu" or $act eq "u") { set_arechnung_buchung($rech,$kn); next; }
			if($act eq "a") { set_arechnung_auszug($rech,$kn); next; }
			if($act eq "i") { set_arechnung_inhalt($rech,$kn); next; }
			if($act eq "x") { set_arechnung_datum($rech,"",$kn); next; }
			if($act eq "E") { set_arechnung_text($rech,$kn); next; }
			if($act eq "F") { set_arechnung_fusstext($rech,$kn); next; }
			if($act eq "M") { set_arechnung_fusstext_template($rech,$kn); next; }
			if($act eq "K") { set_arechnung_kunde($rech,$kn); return undef; }
			if($rflags&(bignum(1)<<find_descr("rstatus","manuell"))) {
				if($act eq "P") { copy_arechnung_text($rech,$kn); next; }
				if($act eq "ok") {
					next unless defined copy_arechnung_text($rech,$kn);
					my $dest = select_descr("ausgabe",0,"","Ausgabe R#$rech an","!hide");
					next unless line_set($dest);
					list_arechnung_text($rech,$kn);
					export_acct_arechnung($rech,8|16|32,$kn);
					next;
				}
			}
			unless($flag & 1) {
				if($act eq "del") { delete_arechnung($rech,$kn); return undef; }
				if($rflags&(bignum(1)<<find_descr("rstatus","manuell"))) {
					if($act eq "ren") { renumber_arechnung($rech,$kn); return undef; }
				}
			}
		}
		if($act eq "e") { edit_buchungen($rech,0,$kn); next; }
		if($act eq "p") { list_arechnung_text($rech,$kn); next; }
		if($act eq "m") { print "noch nicht!\n"; next; }
		if($act eq "d") { print "noch nicht!\n"; next; }

		print "Aktion '$act' unbekannt.\n";
		next; fehler: report_fehler(4);
	}
	$rech;
}

1;
