kivitendo/SL/DATEV/KNEFile.pm @ 79b7fc43
40d52f50 | Moritz Bunkus | package SL::DATEV::KNEFile;
|
||
c510d88b | Sven Schöling | use strict;
|
||
40d52f50 | Moritz Bunkus | sub new {
|
||
my $type = shift;
|
||||
my $self = {};
|
||||
bless $self, $type;
|
||||
$self->_init(@_);
|
||||
return $self;
|
||||
}
|
||||
sub _init {
|
||||
my $self = shift;
|
||||
my %params = @_;
|
||||
map { $self->{$_} = $params{$_} } keys %params;
|
||||
$self->{remaining_bytes} = 250;
|
||||
$self->{block_count} = 0;
|
||||
$self->{data} = '';
|
||||
}
|
||||
sub get_data {
|
||||
my $self = shift;
|
||||
return $self->{data} || '';
|
||||
}
|
||||
sub get_block_count {
|
||||
my $self = shift;
|
||||
return $self->{block_count};
|
||||
}
|
||||
sub add_block {
|
||||
my $self = shift;
|
||||
my $block = shift;
|
||||
my $block_len = length $block;
|
||||
$self->flush() if ($block_len > $self->{remaining_bytes});
|
||||
$self->{data} .= $block;
|
||||
$self->{remaining_bytes} -= $block_len;
|
||||
return $self;
|
||||
}
|
||||
sub flush {
|
||||
my $self = shift;
|
||||
if (250 == $self->{remaining_bytes}) {
|
||||
return $self;
|
||||
}
|
||||
my $num_zeros = 6 + $self->{remaining_bytes};
|
||||
$self->{data} .= "\x00" x $num_zeros;
|
||||
$self->{remaining_bytes} = 250;
|
||||
$self->{block_count}++;
|
||||
return $self;
|
||||
}
|
||||
sub format_amount {
|
||||
my $self = shift;
|
||||
my $amount = shift;
|
||||
my $width = shift;
|
||||
c510d88b | Sven Schöling | our $stellen;
|
||
40d52f50 | Moritz Bunkus | |||
$amount =~ s/-//;
|
||||
my ($places, $decimal_places) = split m/\./, "$amount";
|
||||
$places *= 1;
|
||||
$decimal_places ||= 0;
|
||||
if (0 < $width) {
|
||||
$width -= 2;
|
||||
$places = sprintf("\%0${stellen}d", $places);
|
||||
}
|
||||
$decimal_places .= '0' if (2 > length $decimal_places);
|
||||
$amount = $places . substr($decimal_places, 0, 2);
|
||||
$amount *= 1 if (!$width);
|
||||
return $amount;
|
||||
}
|
||||
1;
|