#!/usr/bin/perl -w

use utf8;
use strict;
use warnings;

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

use Dbase::Getopt qw(:DEFAULT getopt_date);
use Dbase::Globals qw(get_person kpersinfo);
use Dbase::Help qw(:readonly DoSelect);
use Loader qw(current_user);

sub betrag($) {
    my ($betrag) = @_;
    ( $betrag = sprintf '%.2f', $betrag ) =~ y/./,/;
    $betrag;
}

my ( $Beginn, $Ende );
my @Args = GetOptions(
    'alle!'    => \my $Alle,
    'beginn=s' => sub { $Beginn = &getopt_date },
    'ende=s'   => sub { $Ende = &getopt_date },
);

my $select_ansprechpartner = '';
die "Vagisses(c)!\n"
  if $Alle || @Args
  and !{ 3 => 1, 3050 => 1, 6210 => 1, 8415 => 1, 12446 => 1 }
  ->{ current_user() };    # Hack mangels besserem Konzept

unless ($Alle) {
    $select_ansprechpartner = "\t     AND kunde.ap_vertrieb IN (" . join(
        ',',
        @Args
        ? map {
                 get_person($_)
              or problem(qq(Person "$_" ist mir nicht bekannt.\n))
          } @Args
        : current_user()
      )
      . ")\n";
}

unless ( defined $Beginn ) {
    require Time::Local and Time::Local->import('timelocal');
    $Beginn = timelocal( 0, 0, 0, 1, 0, (localtime)[5] );
}

my $previous_ap_sales;
my $summe = 0;
DoSelect {
    my ( $ap_sales_id, $ap_sales, $kunde_id, $kunde_name, $betrag ) = @_;
    $ap_sales = defined $ap_sales_id ? kpersinfo($ap_sales_id) : '-'
      unless defined $ap_sales;
    if ( !defined $previous_ap_sales || $ap_sales ne $previous_ap_sales ) {
        if ( defined $previous_ap_sales ) {
            print ';;Gesamt:;' . betrag($summe) . "\n;;;;\n";
            $summe = 0;
        }
        print "$ap_sales;;;;\n";
        $previous_ap_sales = $ap_sales;
    }
    print "$kunde_id;$kunde_name;$ap_sales;" . betrag($betrag) . "\n";
    $summe += $betrag;
  }
  <<1 . ( defined $Ende && <<2 ) . $select_ansprechpartner . <<'4';
	SELECT    person.id, person.user, kunde.id, kunde.name, SUM(rechnungen.betrag)/100
	FROM      ( kunde, rechnungen )
	LEFT JOIN person ON kunde.ap_vertrieb = person.id
	WHERE     kunde.id              = rechnungen.kunde
	      AND rechnungen.storniert IS NULL
	      AND rechnungen.datum     >= $Beginn
1
	      AND rechnungen.datum     <  $Ende
2
	GROUP BY kunde.id
	ORDER BY person.user, kunde.id
4
print ';;Gesamt:;' . betrag($summe) . "\n";

__END__

=head1 NAME

umsatzliste - Umsatzauswertungen

=head1 GEBRAUCH

    umsatzliste --alle --beginn 2006-04-01

    umsatzliste --beginn 2006-06-01 --ende 2006-07-01 stoffel

=head1 BESCHREIBUNG

Wirft eine primär nach vertrieblichem Ansprechpartner und sekundär nach
Kunden-IDs sortierte Liste aller Kunden aus, für die im angegebenen Zeitraum
Rechnungen (oder Gutschriften) erstellt wurden, aus der hervorgeht, wieviel
Umsatz unterm Strich mit dem jeweiligen Kunden generiert wurde.
Zusätzlich wird die Umsatzsumme pro vertrieblichem Ansprechpartner ausgegeben.
Stornierte Rechnungen werden ignoriert.

Optional kann auf der Kommandozeile eine Liste von Mitarbeitern übergeben
werden, für die die Auswertung erfolgen soll.
Ansonsten werden per Default nur Umsätze für Kunden berücksichtigt, bei denen
der das Programm aufrufende Mitarbeiter als vertrieblicher Ansprechpartner
eingetragen ist.

=head1 OPTIONEN

=over 4

=item alle!

um nicht nur die persönlichen, sondern die Umsätze für alle Mitarbeiter
anzeigen zu lassen.
Darf nur von bestimmten Mitarbeiter(inne)n genutzt werden.

=item beginn=s

Zeitpunkt, ab dem Umsätze berücksichtigt werden sollen.
Default: 1. Januar 0:00 Uhr des aktuellen Jahres

=item ende=s

Zeitpunkt, bis (exklusive) zu dem Umsätze berücksichtigt werden sollen.
Per Default nicht gesetzt, wodurch alle Umsätze ab dem
L<Beginn-Zeitpunkt|/beginn=s> ausgewertet werden.

=item help|?

um (nur) diese Dokumentation anzeigen zu lassen

=back

=head1 BEKANNTE FEHLER

Kunden, für die kein vertrieblicher Ansprechpartner definiert ist, werden nicht
berücksichtigt.

=head1 AUTOR

 Martin H. Sluka <fany@noris.net>
 für die noris network AG
 RT#232701

=cut

