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

use Dbase::Help qw(Do DoFn DoTime);
use Dbase::Globals qw(rund);
use Fehler qw(report_fehler ffehler fehler problem);
use Loader qw( copy_ktarif
               delete_ktarif
               edit_acct edit_arechnungen edit_tarif
               line_in list_ktarif list_rechnungsdatum list_tarife log_view
               set_acct_assoc_info
               set_ktarif_ablauf
               set_ktarif_anzahl
               set_ktarif_berechne
               set_ktarif_datum set_ktarif_dienst
               set_ktarif_info
               set_ktarif_kunde
               set_ktarif_nextrechnung set_ktarif_notiz
               set_ktarif_tarif
               strip_kn
               valid_ktarif valid_kunde valid_tarif
               warn_arbeit warn_kunde
             );

sub edit_ktarif($;$$) {
	my($tari,$id,$kn) = @_; # TarifID Kunde

	return unless valid_ktarif($tari);
	if($id) {
		return unless valid_kunde($id,1);
	} else {
		$id = DoFn("select kunde from tarifkunde where id = $tari");
	}

	warn_kunde("tarifkunde",$tari,$id);
	$kn = strip_kn($kn)."KTarif_$tari";
	my $work = warn_arbeit("tarif",$tari,"*",$kn);

	tarifkt: while(1) {
		my $act = line_in "$kn >",4; last if $act eq "";
		if($act eq "?") {
			print <<'END';
l   auflisten      ll +SLA-Infos      lr  +Rechnungsdaten       ar  zu Rechnung
N   Kopie ('normale' Änderung)        T   Tarif wechseln            hinzufügen
z   Anzahl ändern                     x   Beginn/Ende setzen    dr  ... entf.
k   Kopie (= Änderung ab jetzt)       e   Ende der "sicheren" Laufzeit setzen
b   Installation etc. berechnen       bb  ... Typ-Angabe
K   anderem Kunden zuordnen           #-# Accountingdatensatz bearbeiten
r   Datum der ersten bzw. nächsten Berechnung ändern
i   Infotext setzen (Domain o.ä.)     n   Notiz (Dienst zuletzt genutzt am...)
td  Tarifdefinition(en) auflisten     #   Tarifdef. aufrufen

d   Dienst ändern (Fehleingabe)
del löschen (Fehleingabe)
END
			next;
		}
		if($act eq "K") { set_ktarif_kunde($tari,$kn); next; }
		if($act eq "RD") { list_rechnungsdatum($id,$kn,$tari); next; }
		if($act eq "T") { set_ktarif_tarif($tari,$kn); next; }
		if($act eq "H") { log_view($kn,"tarifkunde","id",$tari); next; }
		if($act eq "b") { set_ktarif_berechne($id,$tari,undef, $kn); next; }
		if($act eq "bb") { set_ktarif_berechne($id,$tari,"acctinfo", $kn); next; }
		if($act eq "i") { set_ktarif_info($tari,$kn); next; }
		if($act eq "del") { delete_ktarif($tari,$kn); return undef; }
		if($act eq "z") { set_ktarif_anzahl($tari,$kn); next; }
		if($act eq "r") { set_ktarif_nextrechnung($tari,$kn); next; }
		if($act eq "N") { copy_ktarif($tari,$kn); next; }
		if($act eq "k") { copy_ktarif($tari,$kn,DoTime); next; }
		if($act eq "x") { set_ktarif_datum($tari,$kn); next; }
		if($act eq "n") { set_ktarif_notiz($tari,$kn); next; }
		if($act eq "d") { set_ktarif_dienst($tari,$kn); next; }
		if($act eq "e") { set_ktarif_ablauf($tari,$kn); next; }
		if($act eq "td") {
			my($t,$tn,$d,$k) = DoFn("select tarifname.name,tarifname.id,tarifkunde.dienst,tarifkunde.kunde from tarifkunde,tarifname where tarifkunde.id=$tari and tarifkunde.tarifname=tarifname.id");
			my $tkid = DoFn("select id from tarifklasse where tarifname=$tn and kunde=$k")
				|| DoFn("select id from tarifklasse where tarifname=$tn and kunde is null");
			unless($tkid) {
				problem "Diesen Tarif scheint es nicht zu geben";
				next;
			}
			list_tarife($tkid,$kn,0,$d);
			next; }
		if($act =~ /^(\d+)$/) {
			next unless valid_tarif($act);
			edit_tarif($act,$kn,DoFn("select kunde from tarifkunde where id=$tari"));
			next; }
		if($act =~ /^(-?\d+)-(\d+)$/) {
			my $hash = $1; my $seq = $2;
			my $kt = DoFn("select tarifkunde from acctassoc where `hash`=$hash and seq=$seq");

			unless(defined $kt) {
				my $id;
				ffehler {
					print "...neu angelegt.\n";
					$id=Do("insert into acctassoc set `hash`=$hash, seq=$seq, tarifkunde=$tari");
					set_acct_assoc_info($hash,$seq,$kn)
						or fehler "keine Info angegeben";
				} sub {
					print "...unvollständig.\n";
					Do("delete from acctassoc where id=$id") if $id;
					$id=undef;
				};
				next unless $id;
			} elsif($kt != $tari) {
				print <<END;

*** Vorsicht: Du bearbeitest gerade Tarif #$tari.
              Dieser Eintrag gehört aber zu Tarif #$kt!

END
			}
			edit_acct($hash,$seq,$id,$kn,DoFn("select dienst from tarifkunde where id=$tari"));
			next;
		}

		if($act eq "l") { list_ktarif($tari,$kn); next; }
		if($act eq "ll") { list_ktarif($tari,$kn,1); next; }
		if($act eq "lr") { list_ktarif($tari,$kn,2); next; }
		if($act eq "ar") {
			my $kid = DoFn("select kunde from tarifkunde where id=$tari");
			my $rnr = edit_arechnungen(DoFn("select kunde from tarifkunde where id=$tari"),1,"zu");
			next unless $rnr;

			my($knr,$anf,$end) = DoFn("select id,beginn,ende from knextrech where rnr=$rnr and kunde=$kid");
			if($knr) {
				if(DoFn("select id from nextrech where knextrech=$knr and tarifkunde=$tari")) {
					problem "bereits in dieser Rechnung eingetragen";
					next;
				}
			} else {
				$knr = DoFn("select knextrech.id from rechnungen,knextrech where rechnungen.kunde=knextrech.kunde and rechnungen.rnr=$rnr and knextrech.rnr=$rnr");
				unless($knr) {
					problem "Rechnungsdatensatz zu $rnr nicht auffindbar.","Manuelle Rechnung?";
					next;
				}
				$knr = DoCopy("knextrech","id=$knr",kunde=>$kid);
			}
			my $anz = line_in "Anzahl [1]: ";
			next unless defined $anz;
			$anz=1 if $anz eq "";
			next unless $anz =~ /^\d+(?:\.\d+)?$/;
			$anz=rund($anz*100);

			Do("insert into nextrech set knextrech=$knr,tarifkunde=$tari, anzahl=$anz, beginn=$anf, ende=$end");
			next;
		}
		if($act eq "dr") {
			my $kid = DoFn("select kunde from tarifkunde where id=$tari");
			my $rnr = edit_arechnungen(DoFn("select kunde from tarifkunde where id=$tari"),1,"zu Rechnung");
			next unless $rnr;

			my $knr = DoFn("select id from knextrech where rnr=$rnr and kunde=$kid");
			unless($knr) {
				problem "Rechnungsdatensatz zu $rnr nicht auffindbar.","Manuelle Rechnung?";
				next;
			}
			unless(Do("delete from nextrech where knextrech=$knr and tarifkunde=$tari")) {
				problem "nicht in dieser Rechnung eingetragen";
				next;
			}
			print "... OK.\n";
			next;
		}
		print "Aktion '$act' kenne ich nicht.\n";
		next; fehler: report_fehler(4);
	}
	$tari;
}

1;
