X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/b7c38d9911493355f6626d5b9be2a53175323f63..59b1c4c2f5f09f6cffa9b9240ee31ca56b80bb7e:/SL/DB/Helper/ZUGFeRD.pm diff --git a/SL/DB/Helper/ZUGFeRD.pm b/SL/DB/Helper/ZUGFeRD.pm index d4e5b4294..fdf66fdd3 100644 --- a/SL/DB/Helper/ZUGFeRD.pm +++ b/SL/DB/Helper/ZUGFeRD.pm @@ -148,7 +148,7 @@ sub _line_item { # $params{xml}->startTag("ram:SpecifiedLineTradeDelivery"); - $params{xml}->dataElement("ram:BilledQuantity", $params{item}->qty, "unitCode" => _unit_code($params{item}->unit)); + $params{xml}->dataElement("ram:BilledQuantity", $params{item}->qty, unitCode => _unit_code($params{item}->unit)); $params{xml}->endTag; # @@ -209,7 +209,7 @@ sub _taxes { } } -sub _format_payment_terms_description { +sub _calculate_payment_terms_values { my ($self) = @_; my (%vars, %amounts, %formatted_amounts); @@ -243,9 +243,19 @@ sub _format_payment_terms_description { $formatted_amounts{$_} = $::form->format_amount(\%::myconfig, $amounts{$_}, 2); } + return ( + vars => \%vars, + amounts => \%amounts, + formatted_amounts => \%formatted_amounts, + ); +} + +sub _format_payment_terms_description { + my ($self, %params) = @_; + my $description = ($self->payment_terms->translated_attribute('description_long_invoice', $self->language_id) // '') || $self->payment_terms->description_long_invoice; - $description =~ s{<\%$_\%>}{ $vars{$_} }ge for keys %vars; - $description =~ s{<\%$_\%>}{ $formatted_amounts{$_} }ge for keys %formatted_amounts; + $description =~ s{<\%$_\%>}{ $params{vars}->{$_} }ge for keys %{ $params{vars} }; + $description =~ s{<\%$_\%>}{ $params{formatted_amounts}->{$_} }ge for keys %{ $params{formatted_amounts} }; return $description; } @@ -255,21 +265,26 @@ sub _payment_terms { return unless $self->payment_terms; + my %payment_terms_vars = _calculate_payment_terms_values($self); + # $params{xml}->startTag("ram:SpecifiedTradePaymentTerms"); - $params{xml}->dataElement("ram:Description", _u8(_format_payment_terms_description($self))); + $params{xml}->dataElement("ram:Description", _u8(_format_payment_terms_description($self, %payment_terms_vars))); # $params{xml}->startTag("ram:DueDateDateTime"); - $params{xml}->dataElement("udt:DateTimeString", $self->duedate->strftime('%Y%m%d'), "format" => "102"); + $params{xml}->dataElement("udt:DateTimeString", $self->duedate->strftime('%Y%m%d'), format => "102"); $params{xml}->endTag; # if ($self->payment_terms->percent_skonto && $self->payment_terms->terms_skonto) { + my $currency_id = _u8(SL::Helper::ISO4217::map_currency_name_to_code($self->currency->name) // 'EUR'); + # $params{xml}->startTag("ram:ApplicableTradePaymentDiscountTerms"); - $params{xml}->dataElement("ram:BasisPeriodMeasure", $self->payment_terms->terms_skonto, "unitCode" => "DAY"); + $params{xml}->dataElement("ram:BasisPeriodMeasure", $self->payment_terms->terms_skonto, unitCode => "DAY"); + $params{xml}->dataElement("ram:BasisAmount", _r2($payment_terms_vars{amounts}->{invtotal}), currencyID => $currency_id); $params{xml}->dataElement("ram:CalculationPercent", _r2($self->payment_terms->percent_skonto * 100)); $params{xml}->endTag; # @@ -287,7 +302,7 @@ sub _totals { $params{xml}->dataElement("ram:LineTotalAmount", _r2($self->netamount)); $params{xml}->dataElement("ram:TaxBasisTotalAmount", _r2($self->netamount)); - $params{xml}->dataElement("ram:TaxTotalAmount", _r2(sum(values %{ $params{ptc_data}->{taxes} })), "currencyID" => "EUR"); + $params{xml}->dataElement("ram:TaxTotalAmount", _r2(sum(values %{ $params{ptc_data}->{taxes} })), currencyID => "EUR"); $params{xml}->dataElement("ram:GrandTotalAmount", _r2($self->amount)); $params{xml}->dataElement("ram:TotalPrepaidAmount", _r2($self->paid)); $params{xml}->dataElement("ram:DuePayableAmount", _r2($self->amount - $self->paid)); @@ -335,7 +350,7 @@ sub _exchanged_document { # $params{xml}->startTag("ram:IssueDateTime"); - $params{xml}->dataElement("udt:DateTimeString", $self->transdate->strftime('%Y%m%d'), "format" => "102"); + $params{xml}->dataElement("udt:DateTimeString", $self->transdate->strftime('%Y%m%d'), format => "102"); $params{xml}->endTag; # @@ -368,6 +383,20 @@ sub _exchanged_document { # } +sub _specified_tax_registration { + my ($ustid_nr, %params) = @_; + + return unless $ustid_nr; + + $ustid_nr = "DE$ustid_nr" unless $ustid_nr =~ m{^[A-Z]{2}}; + + # + $params{xml}->startTag("ram:SpecifiedTaxRegistration"); + $params{xml}->dataElement("ram:ID", _u8($ustid_nr), schemeID => "VA"); + $params{xml}->endTag; + # +} + sub _seller_trade_party { my ($self, %params) = @_; @@ -414,15 +443,7 @@ sub _seller_trade_party { # } - my $ustid_nr = $::instance_conf->get_co_ustid; - if ($ustid_nr) { - $ustid_nr = "DE$ustid_nr" unless $ustid_nr =~ m{^[A-Z]{2}}; - # - $params{xml}->startTag("ram:SpecifiedTaxRegistration"); - $params{xml}->dataElement("ram:ID", _u8($ustid_nr), "schemeID" => "VA"); - $params{xml}->endTag; - # - } + _specified_tax_registration($::instance_conf->get_co_ustid, %params); $params{xml}->endTag; # @@ -437,6 +458,7 @@ sub _buyer_trade_party { $params{xml}->dataElement("ram:Name", _u8($self->customer->name)); _customer_postal_trade_address(%params, customer => $self->customer); + _specified_tax_registration($self->customer->ustid, %params); $params{xml}->endTag; # @@ -482,7 +504,7 @@ sub _applicable_header_trade_delivery { $params{xml}->startTag("ram:ActualDeliverySupplyChainEvent"); $params{xml}->startTag("ram:OccurrenceDateTime"); - $params{xml}->dataElement("udt:DateTimeString", ($self->deliverydate // $self->transdate)->strftime('%Y%m%d'), "format" => "102"); + $params{xml}->dataElement("udt:DateTimeString", ($self->deliverydate // $self->transdate)->strftime('%Y%m%d'), format => "102"); $params{xml}->endTag; $params{xml}->endTag;