use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(add_acct get_kunde);
use Fehler qw(problem);
use Loader qw(line_in select_descr edit_dienste);
use Time::DaysInMonth qw(days_in);

sub add_kunde_accounting($$) {
	my ( $kunde_id, $kn ) = @_;
	until ($kunde_id) {
		length( my $kunde = line_in 'Kunde      > ' ) or return;
		$kunde_id = get_kunde $kunde and last;
		print
		  qq(Kunde "$kunde" ist mit nicht bekannt; bitte versuch's nochmal:\n);
	}
	defined( my $dienst = edit_dienste 1, "" )
	  or return;
	defined( my $ziel = select_descr ziel => 0, undef, 'Ziel       ' )
	  or return;
	defined( my $quelle = select_descr quelle => 0, undef, 'Quelle     ' )
	  or return;

	sub _read_num($;&$) {
		my ( $name, $test, $errormsg ) = @_;
		while () {
			length( my $value = line_in sprintf '%-11s> ', $name ) or return;
			unless ( $value =~ /^\s*(\d+)\s*\z/ ) {
				print
qq("$value" ist keine positive Ganzzahl; bitte versuch's nochmal:\n);
			}
			elsif ( defined $test && !$test->($1) ) {
				printf "$errormsg; bitte versuch's nochmal:\n", $1;
			}
			else {
				return $1;
			}
		}
	}

	defined( my $bytes  = _read_num 'Bytes' )  or return;
	defined( my $pakete = _read_num 'Pakete' ) or return;
	defined(
		my $jahr = _read_num
		  Jahr => sub { shift >= 2000 },
		'"%s" ist keine gültige Jahreszahl'
	  )
	  or return;
	defined(
		my $monat = _read_num
		  Monat => sub { my $monat = shift; $monat >= 1 && $monat <= 12 },
		'"%s" ist kein gültiger Monat'
	  )
	  or return;
	my $tag;
	{
		my $days = days_in $jahr, $monat;
		defined(
			$tag = _read_num
			  Tag => sub { my $tag = shift; $tag && $tag <= $days },
			qq("%s" ist kein gültiger Tag innerhalb des Monats $monat/$jahr)
		  )
		  or return;
	}
	my $text = line_in 'Text (opt.)> ';
	my ( $hash, $seq ) = add_acct $kunde_id, $dienst, $ziel,
	  sprintf( '%d%02d', $jahr, $monat ), $tag, $quelle, $bytes, $pakete, $text;
	print "Accounting-Datensatz $hash-$seq eingefügt.\n";
}

1;
