=head1 delete_kunde

Löscht einen Kunden.

=head2 Parameter

=over 4

=item $id

ID des zu löschenden Kunden.

=item $flag

Es bedeuten:

=over 4

=item 1

Nicht nachfragen.

=item 2

Referenzierte Daten (Tickets, Personen) löschen, anstatt auf Null setzen.

=back

=item $kn

Standardprompt.

=back

=cut

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

use Loader qw(line_in ticket_delete delete_person
	log_update delete_domain delete_ipnr delete_ipregion
	delete_ktarif delete_hardware delete_rechstep delete_leitung);
use Dbase::Help qw(DoSelect Do);
use Dbase::Globals qw(aufzaehlung mpersinfo name_kunde);
use Fehler qw(problem);

# Perl ist wiedermal bescheuert
no warnings 'redefine';

sub delete_kunde($;$$);
sub delete_kunde($;$$) {
	my($id,$flag,$kn) = @_;

	unless ( $flag & 2 ) {
		my @personen;
		DoSelect { push @personen, @_ }
		  "SELECT id FROM person WHERE kunde = $id";
		return problem( 'Das ist der primäre Kunde für folgende '
		                . ( @personen == 1 ? 'Person' : @personen . ' Personen' )
		                . ":\n"
		                . join ",\n", map mpersinfo($_), @personen )
		  if @personen;
		{
			my @tickets;
			DoSelect { push @tickets, "RT#@_" }
			"SELECT id FROM ticket WHERE kunde = $id ORDER BY id";
			return problem( 'Der Kunde kann nicht gelöscht werden, da ihm d'
							. ( @tickets == 1 ? 'as Ticket' : 'ie Tickets' )
							. ' '
							. aufzaehlung(@tickets)
						. ' zugeordnet '
							. ( @tickets == 1 ? 'ist' : 'sind' )
							. '.'
						)
			if @tickets;
		}
		{
			my @buchungen;
			DoSelect {
				my ($rnr, $seq) = @_;
				push @buchungen, "#$rnr-$seq";
			} "SELECT rnr, seq FROM buchung WHERE kunde = $id ORDER BY rnr, seq";
			return problem( 'Der Kunde kann nicht gelöscht weden, da ihm die Buchung'
							. ( @buchungen != 1 && 'en' )
							. ' '
							. aufzaehlung(@buchungen)
							. ' zugeordnet '
							. ( @buchungen == 1 ? 'ist' : 'sind' )
							. '.'
						)
			if @buchungen;
		}
	}

	unless($flag&1) {
		return undef if line_in("Erst das geheime Paßwort: ",1) ne "geheim";
	}

	log_update("kunde","id",$id,undef,"name","-",undef,name_kunde($id));
	Do("delete from tarifacct where kunde = $id");
	DoSelect {
		my($iid) = @_;
		delete_rechstep($iid,$kn);
	} "select id from rechstep where kunde = $id";
	Do("update tarifacct set dkunde = NULL where dkunde = $id");
	DoSelect {
		my($tk) = @_;
		delete_ktarif($tk,$kn);
	} "select id from tarifkunde where kunde = $id";
	Do("delete from uucpkunde where kunde = $id");
	DoSelect {
		my($hid) = @_;
		delete_hardware($hid,$kn);
	} "select id from hardware where kunde = $id";
	DoSelect {
		my($iid) = @_;
		delete_ipnr($iid,$kn);
	} "select id from ipkunde where kunde = $id";
	DoSelect {
		my($did) = @_;
		delete_domain($did,$kn);
	} "select id from domainkunde where kunde = $id";
	DoSelect {
		my($iid) = @_;
		delete_ipregion($iid,$kn);
	} "select id from ipregion where kunde = $id";
	DoSelect {
		my($iid) = @_;
		delete_leitung($iid,$kn);
	} "select id from leitung where kunde = $id";
	Do("delete from knextrech where kunde = $id");
	DoSelect {
		my($rnr) = @_;
		Do("delete from buchung where rnr = $rnr");
	} "select rnr from rechnungen where kunde = $id";
	Do("delete from buchung where kunde = $id");
	Do("delete from rechnungen where kunde = $id");
	Do("delete from resellernic where reseller = $id");
	Do("delete from passwort where kunde = $id");
	Do("delete from kundemail where kunde = $id");
	Do("delete from radacct where kunde = $id");
	Do("update stunden set kunde = 1 where kunde = $id");
	Do("update rack set kunde = 1 where kunde = $id");
	Do("delete from acct,acctassoc using acct,acctassoc where acct.kunde=$id and acct.`hash`=acctassoc.`hash` and acct.seq=acctassoc.seq");
	Do("delete from acct where kunde = $id");
	Do("DELETE FROM mailrules WHERE kunde = $id");
	Do("delete from reseller where kunde = $id");
	Do("update kunde set reseller = NULL where reseller = $id");
	Do("delete from confitem where kunde = $id");
	Do("delete from konten where kunde = $id");
	Do("delete from stundenliste where kunde = $id");
	Do("delete from ipassacct where kunde = $id");
	Do("update kunde set hauptperson=null,adminc=null,billc=null,ap_vertrieb=null,ap_technik=null where id=$id");

	Do("delete tarif from tarif,tarifklasse where tarif.klasse=tarifklasse.id and tarifklasse.kunde = $id");
	Do("delete from tarifklasse where kunde = $id");
	if($flag & 2) {
		DoSelect { 
			my($tid) = @_;
			ticket_delete($tid);
		} "select id from ticket where kunde = $id";
		DoSelect {
			my($pid) = @_;
			delete_person($pid);
		} "select id from person where kunde = $id";
		DoSelect {
			my($kid) = @_;
			delete_kunde($kid,3);
		} "select id from kunde where kunde = $id";
	} else {
		Do("update kunde set kunde = NULL where kunde = $id");
	}
	Do("delete from kunde where id = $id");
	$id;
}

1;
