package SL::DATEV::CSV;
use strict;
+use Carp;
+use DateTime;
+use Encode qw(encode);
+use Scalar::Util qw(looks_like_number);
-use SL::Locale::String qw(t8);
use SL::DB::Datev;
-use DateTime; # safer before the Helper
+use SL::DB::Chart;
use SL::Helper::DateTime;
-
-use Carp;
-use Encode qw(decode);
-use Scalar::Util qw(looks_like_number);
+use SL::Locale::String qw(t8);
+use SL::Util qw(trim);
use Rose::Object::MakeMethods::Generic (
scalar => [ qw(datev_lines from to locked warnings) ],
max_length => 13,
type => 'Value',
required => 1,
- input_check => sub { my ($input) = @_; return (looks_like_number($input) && length($input) <= 13) },
+ input_check => sub { my ($input) = @_; return (looks_like_number($input) && length($input) <= 13 && $input > 0) },
formatter => \&_format_amount,
valid_check => sub { my ($check) = @_; return ($check =~ m/^\d{1,10}(\,\d{1,2})?$/) },
},
},
{
kivi_datev_name => 'not yet implemented',
- sv_header_name => t8('Base Transaction Value'),
+ csv_header_name => t8('Base Transaction Value'),
},
{
kivi_datev_name => 'not yet implemented',
formatter => sub { my ($input) = @_; return substr($input, 0, 12) },
},
{
- kivi_datev_name => 'not yet implemented',
+ kivi_datev_name => 'belegfeld2',
csv_header_name => t8('Invoice Field 2'),
max_length => 12,
type => 'Text',
default => '',
- valid_check => sub { my ($check) = @_; return ($check =~ m/[ -~]{1,12}/) },
+ input_check => sub { my ($check) = @_; return 1 unless $check; return (ref (DateTime->from_kivitendo($check)) eq 'DateTime') },
+ formatter => sub { my ($input) = @_; return undef unless $input; return trim(DateTime->from_kivitendo($input)->strftime('%e%m%y')) },
+ valid_check => sub { my ($check) = @_; return 1 unless $check; return ($check =~ m/^[0-9]{5,6}$/) },
},
{
kivi_datev_name => 'not yet implemented',
type => 'Value',
},
{
- kivi_datev_name => 'buchungsbes',
+ kivi_datev_name => 'buchungstext',
csv_header_name => t8('Posting Text'),
max_length => 60,
type => 'Text',
max_length => 15,
type => 'Text',
default => '',
- input_check => sub { my ($check) = @_; return ($check eq '' || $check =~ m/[A-Z]{2}\w{5,13}/) },
+ input_check => sub {
+ my ($ustid) = @_;
+ return 1 if ('' eq $ustid);
+ $ustid =~ s{\s+}{}g;
+ return ($ustid =~ m/^CH|^[A-Z]{2}\w{5,13}$/);
+ },
formatter => sub { my ($input) = @_; $input =~ s/\s//g; return $input },
valid_check => sub {
my ($ustid) = @_;
-# croak("hier" . $ustid) if $ustid;
return 1 if ('' eq $ustid);
return ($ustid =~ m/^CH|^[A-Z]{2}\w{5,13}$/);
},
my ($test) = @_;
return undef unless $test;
if (eval {
- decode('Windows-1252', $test, Encode::FB_CROAK|Encode::LEAVE_SRC);
+ encode('Windows-1252', $test, Encode::FB_CROAK|Encode::LEAVE_SRC);
1
}) {
return 1;
}
sub _kivitendo_to_datev {
- my ($self) = @_;
-
- my $entries = scalar (@kivitendo_to_datev);
- push @kivitendo_to_datev, { kivi_datev_name => 'not yet implemented' } for 1 .. (116 - $entries);
- return @kivitendo_to_datev;
+ @kivitendo_to_datev, ({ kivi_datev_name => 'not yet implemented' }) x (116 - @kivitendo_to_datev);
}
sub header {
my @header;
# we can safely set these defaults
- # TODO use Helper::DateTime and get length_of_accounts from DATEV.pm
- my $today = DateTime->now(time_zone => "local");
+ # TODO get length_of_accounts from DATEV.pm
+ my $today = DateTime->now_local;
my $created_on = $today->ymd('') . $today->hms('') . '000';
my $length_of_accounts = length(SL::DB::Manager::Chart->get_first(where => [charttype => 'A'])->accno) // 4;
my $default_curr = SL::DB::Default->get_default_currency;
}
my @header_row_1 = (
- "EXTF", "300", 21, "Buchungsstapel", 7, $created_on, "", "ki",
+ "EXTF", "510", 21, "Buchungsstapel", 7, $created_on, "", "ki",
"kivitendo-datev", "", $meta_datev{beraternr}, $meta_datev{mandantennr},
$self->first_day_of_fiscal_year->ymd(''), $length_of_accounts,
$self->from->ymd(''), $self->to->ymd(''), "", "", 1, "", $self->locked,
=head1 TODO CAVEAT
-
-Currently no effort has be done that _kivitenod_to_datev is only intializied once:
-Therefore the second call may generate integrity faults:
-
- my $datev_csv_1 = SL::DATEV::CSV->new(...)->lines;
- my $datev_csv_2 = SL::DATEV::CSV->new(...)->lines;
-
-Secondly one can circumevent the check of the warnings.quite easily,
+One can circumevent the check of the warnings.quite easily,
becaus warnings are generated after the call to lines:
# WRONG usage
my $lines = $datev_csv->lines;
die if @{ $datev_csv->warnings };
somethin_with($lines);
-