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

use Dbase::Globals qw(
	bignum
	content
	find_descr
	flag_names
	get_descr
	get_gruppen
	get_person
	kpersinfo
	list_descr
	name_kunde
	oberkunden
	test_gruppe
  );
use Dbase::Help qw(Do DoFn);
use Fehler qw(hat_problem problem warnung);
use Loader qw(line_in edit_personen log_update select_descr edit_person
	add_person);

sub add_kunde_person($;$$$) {
	my($id,$kn,$dienst,$prio) = @_;

	content( my $pers = line_in( $id ? 'Person ("+" = neue): ' : 'Person: ' ) )
	  or return;

	my $act;
	if ( $pers eq '+' ) {
		return problem(
			'Personen-Assoziierungen sind nur für einzelnen Kunden möglich.')
		  unless $id;
		$act = add_person( $id, $kn ) or return;
	}
	else {
		defined( $act = get_person($pers) )
		  or return problem('Person unbekannt.');

		my $person_kunde = DoFn("SELECT kunde FROM person WHERE id = $act");
		warnung("Diese Person gehört zu Kunde #$person_kunde:"
			  . name_kunde($person_kunde)
			  . ",\nder mit diesem Kunden eigentlich nichts zu tun hat." )
		  if $person_kunde != 1 && !grep $person_kunde == $_, oberkunden($id);
	}

	$dienst = select_descr( dienst => 1024 | 262144, '', 'Rolle', '!hide' )
	  unless defined $dienst;
	return undef unless defined $dienst;

	return problem('Diese Person hat diese Rolle bei diesem Kunden bereits.')
	  if DoFn(<<_);
	SELECT COUNT(*) FROM kundemail
	WHERE  kunde = $id AND dienst = $dienst AND person = $act
_

	content( $prio = line_in( 'Priorität>', 0, undef, 0 ) ) or return
		unless defined $prio;
	return problem('Die Priorität muss eine ganze Zahl zwischen 0 und 99 sein.')
	  if $prio !~ /^\d{1,2}\z/;

	list_descr(
		dienst_ident => undef,
		undef,
		sub {
			my ( $ident, $num_id, $name, $info ) = @_;
			my ($attr) = $name =~ /^requires_(\w+)\z/i or return;
			my ( $grs, $grc ) = get_gruppen( dienst_ident => $name, 1 );
			problem($info)
			  if test_gruppe( dienst => $dienst, $grs, $grc )
			  && !defined( DoFn("SELECT $attr FROM person WHERE id = $act") );
		}
	);
	return if hat_problem();
	
	log_update("kundemail","kunde",$id,undef,"person","dienst","dringend","*",undef,$act,get_descr("dienst",$dienst),$prio);
	Do("insert into kundemail set kunde=$id, dienst=$dienst, dringend=$prio, person=$act");

	#10136515: Admins müssen noch diverse Einstellungen im OTRS vornehmen
	my $rtwebdescr = find_descr( dienst => 'rtweb' );
	warnung( <<_ ) if ( $rtwebdescr && $dienst == $rtwebdescr );
Bitte nun noch den OTRS-Zugang für diese Person von Team Admin freischalten lassen!
_

	if ( defined( my $flag_no_tts = find_descr( kunde  => 'no_tts' ) ) &&
	     defined( my $dienst_tt   = find_descr( dienst => 'tt'     ) )
	   ) {
	   	$flag_no_tts = bignum(1) << $flag_no_tts;
		if ( $dienst == $dienst_tt && ( my $flags = DoFn(<<_) ) ) {
			SELECT flags FROM kunde WHERE id = $id AND flags & $flag_no_tts != 0
_
			my $old_flags = $flags = bignum($flags);
			$flags &= ~$flag_no_tts;
			log_update( kunde => id => $id, undef, flags => undef, scalar flag_names( $flags, 'kunde', $old_flags ) );
			Do("UPDATE kunde SET flags=$flags WHERE id = $id");
			warnung('Ich habe das no_tts-Flag bei diesem Kunden gelöscht.');
		}
	}

	$act;
}

1;
