use utf8;
use warnings; no warnings "redefine";
use strict;
use Loader qw(
	add_ticket_text
	check_perm
	edit_ticket_personen
	edit_ticket_seq
	line_in
	line_printer
	list_ticket_ids
	log_view
	set_ticket_acted
	set_ticket_area
	set_ticket_datum
	set_ticket_kunde
	set_ticket_person
	set_ticket_queue
	set_ticket_status
	set_ticket_termin
	set_ticket_ticket
	set_ticket_titel
	set_ticket_told
	set_ticket_wichtig
	set_ticket_zeit
	strip_kn
	ticket_delete
	ticket_get_header
	ticket_get_text
	valid_kunde
	valid_ticket
	warn_arbeit
	warn_kunde
);
use Fehler qw(hat_problem problem report_fehler);
use Dbase::Globals qw(get_descr);
use Dbase::Help qw(DoFn in_test);

my $did_auth;
sub et_auth() {
	return 1 if in_test();
	unless(defined $did_auth) {
		$did_auth=0 unless check_perm("rt_admin");
	}
	unless(defined $did_auth) {
		my $act = line_in "Wieso nimmst du nicht das RT?",1;
		$did_auth=1 if $act eq "geheim";
	}
	return hat_problem() ? undef : problem "Das darfst du nicht"
		unless $did_auth;
	1;
}

sub edit_ticket($;$$) {
	my($tid,$id,$kn) = @_;

	return unless valid_ticket($tid);
	if($id) {
		return unless valid_kunde($id,1);
	} else {
		$id = DoFn("select kunde from ticket where id = $tid");
	}
	
	warn_kunde("ticket",$tid,$id);
	$kn = strip_kn($kn)."Ticket_$tid:";
	my $work = warn_arbeit("ticket",$tid,"*",$kn);

	tickedit: while(1) {
		my $act = line_in "$kn >",4; last if $act eq "";
		if($act eq '?') {
			print <<'END';
l   Header ausgeben                   p   Gespeicherte Texte ausgeben
a   Text hinzufügen                   v   Verteiler bearbeiten
m   Ticket mailen (öffentliche Texte) mm  ... an explizite Adresse
M   Ticket mailen (Interna)           MM  ... an explizite Adresse
??  genauere Doku                     mi  Liste Message-IDs

s   Titel setzen                      B   Bearbeiter wechseln
T   Tickettyp setzen                  x   Beginn/Ende setzen
d   Priorität ändern
w   Wiedervorlagedatum setzen         t   Abschlusstermin setzen
K   anderem Kunden zuordnen           a-  Änderungen automatisch mailen
an  Änderungen nicht automailen       a=  ganzes Ticket automatisch mailen
rs  RT-Status setzen                  rt  d_told setzen
rq  RT-Queue setzen                   ra  d_acted setzen
rr  RT-Area setzen                    Z   Bezugsticket setzen
### Text Nr. # des Tickets aufrufen   z   budgetierte Zeit setzen

del Ticket komplett löschen

Angabe '-' löscht den jeweiligen Eintrag.

END
			next;
		}
		# 'p' is below
		if($act eq "l") { no warnings 'once';
						  line_printer(0);
		                  print $Db::pr_fh (ticket_get_header($tid,4),"\n");
						  next; }
		if($act eq "mi") { list_ticket_ids($tid,$kn); next; }
		if($act eq '??') {
			print <<'END';

Tickets bestehen aus eine Anzahl von Texten und einer Latte von
Adressen (Personeneinträge, explizit angegebene Adressen), die
festlegen, wer Updates des Tickets bekommen soll. Die Texte wissen,
wer sie geschrieben hat und ob sie für die Öffentichkeit bestimmt sind.

Editiert wird die Liste der Personen mit 'v', siehe dort. Normalerweise
besteht die Liste aus Personeneinträgen mit einem Merker, wie das Ticket
zur Person soll (Email oder Fax oder ...). Personen, die dem POP doer
seinen Unterkunden gehören, sind intern, der Rest ist extern.
Zusätzlich können explizit Adressen hinzugefügt werden, die nicht in
irgendwelchen Personeneinträgen auftauchen. Diese gelten immer als extern.

Danach wird das Ticket verteilt. Das geschieht entweder manuell, oder
automatisch wenn sich der Status ändert oder ein neuer Text dazukommt.

Beim Rundmailen von Tickets kann man sich aussuchen, ob das Teil inkl. der
vertraulichen Texte an POP-Mitarbeiter geht (inkl. Unterkunden) oder ohne
vertrauliche Texte an alle anderen in der Verteilerliste eingetragenen 
Adressen.

Tickets können einen Termin haben, bis zu dem sie erledigt sein müssen, und
einen Bearbeiter, der für die Erledigung zuständig ist. "Erledigt" heißt
hier "das Problem ist erstmal behoben" (kann aber wieder auftreten).
Daneben gibt es noch den Zustand "die Ursache an sich ist beseitigt, das
Problem wird nicht mehr auftauchen".

Termine werden momentan NICHT automatisch kontrolliert.

END
			next;
		}
		if($act eq 'p') {
			my $mmax = DoFn("select max(seq) from ticketid where ticket = $tid");
			if(not $mmax) {
				print "Keine Texte gespeichert.\n";
				next;
			}
			line_printer(1);

			my $fd = ticket_get_text($tid,$mmax,1+2+16+64+128);
			while(<$fd>) {
				goto out unless
				print $Db::pr_fh $_;
			}
		out:
			close $fd;
			next;
		}

		next unless et_auth;

		if($act eq "a") { $act = add_ticket_text($tid,$kn);
		               next if $act == 0; } # ELSE FALL THRU TO:
		if($act =~ /^\d+$/) { edit_ticket_seq($tid,$act,$kn); next; }

		if($act eq "del") { return undef if ticket_delete($tid); next; }
		if($act eq "v") { edit_ticket_personen ($tid,0,$kn,$id); next; }
		if($act eq "H") { log_view($kn,"ticket","id",$tid); next; }
		if($act eq "s") { set_ticket_titel($tid,$kn); next; }
		if($act eq "t") { set_ticket_termin($tid,$kn); next; }
		if($act eq "rt") { set_ticket_told($tid,$kn); next; }
		if($act eq "ra") { set_ticket_acted($tid,$kn); next; }
		if($act eq "rs") { set_ticket_status($tid,$kn); next; }
		if($act eq "rr") { set_ticket_area($tid,$kn); next; }
		if($act eq "rq") { set_ticket_queue($tid,$kn); next; }
		if($act eq 't') { set_ticket_endtermin($tid,$kn); next; }
		if($act eq 'w') { set_ticket_termin($tid,$kn); next; }
		if($act eq "x") { set_ticket_datum($tid,$kn); next; }
		if($act eq "B") { set_ticket_person($tid,$kn); next; }
		if($act eq "d") { set_ticket_wichtig($tid,$kn); next; }
		if($act eq "Z") { set_ticket_ticket($tid,$kn,$id); next; }
		if($act eq "z") { set_ticket_zeit($tid,$kn,$id); next; }
		if($act eq "K") { set_ticket_kunde($tid,$kn); next; }
		print "Aktion '$act' kenne ich nicht. Liste mit '?'.\n";
		next; fehler: report_fehler(4);
	}
	$tid;
}

1;
