#!/usr/bin/perl -w

use utf8;
use strict;
use warnings;

BEGIN {
    unshift @INC, ( $ENV{'POPHOME'} || '/usr/pop' ) . '/lib'
      unless $ENV{'KUNDE_NO_PERLPATH'};
}

use Dbase::Getopt qw(:DEFAULT);
use Dbase::Help qw(Do DoFn DoSelect in_list);
use Memoize qw(memoize);

my @dienste = GetOptions( 'ignore-flat' => \our $IgnoreFlat,
                          'delete-dups' => \our $DeleteDups);

Dbase::db_handle(no_write => 1) unless $DeleteDups;

exec perldoc => -F => $0 or die "exec('perldoc -F $0'): $!" unless @ARGV;

sub is_flat {
    my ( $tarif, $dienst )    = @_;
    my ( $preis, $unitpreis ) = DoFn(<<_);
	SELECT   tarif.preis, tarif.unitpreis
	FROM     tarif,tarifklasse
	WHERE    tarif.klasse = tarifklasse.id
	     AND tarifklasse.tarifname = $tarif
	     AND tarif.dienst = $dienst
	     AND tarifklasse.kunde IS NULL
	ORDER BY tarif.beginn DESC, tarif.preis DESC, tarif.unitpreis DESC
	LIMIT    1
_
    defined $preis ? $preis == 0 && $unitpreis == 0 : undef;
}
if ($IgnoreFlat) { memoize('is_flat') }
else {
    no warnings 'redefine';
    *is_flat = sub { '' };
}

sub tarifname($) {
	my($id) = @_;
	return DoFn "select name from tarifname where id=$id";
}

my ( $last_key, $last_tarif, $last_dienst );
my @drop;
DoSelect {
    my ( $key, $tarif, $dienst, $anzahl, $tarif_id ) = @_;
	my $drop = "";
	if ($DeleteDups and $last_tarif == $tarif and $last_key eq $key
			and !$anzahl) {
		push(@drop,$tarif_id);
		$drop = " (entfernt)";
	};
    printf "%s: %s + %s%s\n", $key, tarifname($last_tarif), tarifname($tarif),
		$drop
      if defined $last_key && $last_key eq $key
      and !is_flat( $last_tarif, $last_dienst )
      || !is_flat( $tarif, $dienst );
    ( $last_tarif, $last_dienst ) = ( $tarif, $dienst )
      if !defined $last_key
      || $last_key ne $key
      || is_flat( $last_tarif, $last_dienst );
    $last_key = $key;
} <<_;
	SELECT    CONCAT( kunde.name, '/', dienst.name ) K,
	          tarifkunde.tarifname,
	          tarifkunde.dienst,
	          tarifkunde.anzahl,
	          tarifkunde.id
	FROM      dienst, kunde, tarifkunde
	WHERE     tarifkunde.kunde  = kunde.id
	      AND tarifkunde.dienst = dienst.id
	      AND ${\ in_list( 'dienst.name', '', @ARGV ) }
	      AND tarifkunde.beginn <= UNIX_TIMESTAMP(NOW())
	      AND ( tarifkunde.ende IS NULL                  OR
	            tarifkunde.ende >= UNIX_TIMESTAMP(NOW()) )
	ORDER BY  K, tarifkunde.tarifname, tarifkunde.beginn
_

Do "delete from tarifkunde where ${\ in_list( 'id', '', @drop )}" if @drop;

__END__

=head1 NAME

finde_kunden_mit_mehreren_volumentarifen

=head1 SYNOPSE

    finde_kunden_mit_mehreren_volumentarifen ip mail

=head1 BESCHREIBUNG

Dieses Tool findet Kunden, bei denen es mehr als einen Tarif für
einen der angegebenen Dienste gibt.
Vgl. Ticket #10038462.

=head1 OPTIONEN

=over 4

=item -ignore-flat

Kunden/Dienst-Kombinationen, für die nur Flat-Tarife existieren, ignorieren

=item -delete-dups

Kombinationen, die keinen wirklichen Fehlerfall darstellen, automatisch
bereinigen:

=over 4

=item *

doppelt eingetragene Kundentarife mit Anzahl==0:
der zeitlich erste bleibt erhalten, der andere wird entfernt

=back

=item -help

=item -?

um (nur) diese Dokumentation anzeigen zu lassen

=back

