Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision f9422f02

Von Werner Hahn vor 4 Monaten hinzugefügt

  • ID f9422f02f97d4de7deca35c4de0758e5b006873e
  • Vorgänger 48fa6dcc

XMLInvoice: gültige namespaces aus der xml holen ...

Die namespaces CrossIndustryInvoice, ReusableAggregateBusinessInformationEntity, UnqualifiedDataType
können beliebig sein und sind von ZUGfERD nicht festgelegt.
Deswegen werden die ns jetzt vorher ausgelesen.

Unterschiede anzeigen:

SL/XMLInvoice/CrossIndustryDocument.pm
use parent qw(SL::XMLInvoice::Base);
use constant ITEMS_XPATH => '//ram:IncludedSupplyChainTradeLineItem';
=head1 NAME
SL::XMLInvoice::CrossIndustryDocument - XML parser for UN/CEFACT Cross Industry Document
......
=head1 AUTHOR
Johannes Grassler <info@computer-grassler.de>
Werner Hahn <wh@futureworldsearch.net>
=cut
......
return 0;
}
sub namespaces {
my ($self, $dom) = @_;
my $rootnode = $dom->documentElement;
my @nodes = $rootnode->findnodes('namespace::*');
my @namespaces = map {[ $_->getData, $_->getLocalName]} @nodes;
return \@namespaces;
}
# XML XPath expressions for global metadata
sub scalar_xpaths {
my ($self) = @_;
my $rsm = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'};
my $ram = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'};
my $udt = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100'};
$ram .= ":" if $ram;
$rsm .= ":" if $rsm;
$udt .= ":" if $udt;
return {
currency => ['//ram:InvoiceCurrencyCode'],
direct_debit => ['//ram:SpecifiedTradeSettlementPaymentMeans/ram:TypeCode'],
duedate => ['//ram:DueDateDateTime/udt:DateTimeString', '//ram:EffectiveSpecifiedPeriod/ram:CompleteDateTime/udt:DateTimeString'],
gross_total => ['//ram:DuePayableAmount'],
iban => ['//ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeePartyCreditorFinancialAccount/ram:IBANID'],
invnumber => ['//rsm:HeaderExchangedDocument/ram:ID'],
net_total => ['//ram:TaxBasisTotalAmount'],
transdate => ['//ram:IssueDateTime/udt:DateTimeString'],
taxnumber => ['//ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="FC"]'],
type => ['//rsm:HeaderExchangedDocument/ram:TypeCode'],
ustid => ['//ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="VA"]'],
vendor_name => ['//ram:SellerTradeParty/ram:Name'],
currency => ['//' . $ram . 'InvoiceCurrencyCode'],
direct_debit => ['//' . $ram . 'SpecifiedTradeSettlementPaymentMeans/' . $ram . 'TypeCode'],
duedate => ['//' . $ram . 'DueDateDateTime/' . $udt . 'DateTimeString', '//' . $ram . 'EffectiveSpecifiedPeriod/' . $ram . 'CompleteDateTime/' . $udt . 'DateTimeString'],
gross_total => ['//' . $ram . 'DuePayableAmount'],
iban => ['//' . $ram . 'SpecifiedTradeSettlementPaymentMeans/' . $ram . 'PayeePartyCreditorFinancialAccount/' . $ram . 'IBANID'],
invnumber => ['//' . $rsm . 'HeaderExchangedDocument/' . $ram . 'ID'],
net_total => ['//' . $ram . 'TaxBasisTotalAmount'],
transdate => ['//' . $ram . 'IssueDateTime/' . $udt . 'DateTimeString'],
taxnumber => ['//' . $ram . 'SellerTradeParty/' . $ram . 'SpecifiedTaxRegistration/' . $ram . 'ID[@schemeID="FC"]'],
type => ['//' . $rsm . 'HeaderExchangedDocument/' . $ram . 'TypeCode'],
ustid => ['//' . $ram . 'SellerTradeParty/' . $ram . 'SpecifiedTaxRegistration/' . $ram . 'ID[@schemeID="VA"]'],
vendor_name => ['//' . $ram . 'SellerTradeParty/' . $ram . 'Name'],
};
}
sub item_xpaths {
my ($self) = @_;
my $rsm = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'};
my $ram = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'};
my $udt = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100'};
$ram .= ":" if $ram;
$rsm .= ":" if $rsm;
$udt .= ":" if $udt;
return {
'currency' => ['./ram:SpecifiedSupplyChainTradeAgreement/ram:GrossPriceProductTradePrice/ram:ChargeAmount[attribute::currencyID]',
'./ram:SpecifiedSupplyChainTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisAmount'],
'price' => ['./ram:SpecifiedSupplyChainTradeAgreement/ram:GrossPriceProductTradePrice/ram:ChargeAmount',
'./ram:SpecifiedSupplyChainTradeAgreement/ram:GrossPriceProductTradePrice/ram:BasisAmount'],
'description' => ['./ram:SpecifiedTradeProduct/ram:Name'],
'quantity' => ['./ram:SpecifiedSupplyChainTradeDelivery/ram:BilledQuantity',],
'subtotal' => ['./ram:SpecifiedSupplyChainTradeSettlement/ram:SpecifiedTradeSettlementMonetarySummation/ram:LineTotalAmount'],
'tax_rate' => ['./ram:SpecifiedSupplyChainTradeSettlement/ram:ApplicableTradeTax/ram:ApplicablePercent'],
'tax_scheme' => ['./ram:SpecifiedSupplyChainTradeSettlement/ram:ApplicableTradeTax/ram:TypeCode'],
'vendor_partno' => ['./ram:SpecifiedTradeProduct/ram:SellerAssignedID'],
'currency' => ['./' . $ram . ':SpecifiedSupplyChainTradeAgreement/' . $ram . ':GrossPriceProductTradePrice/' . $ram . ':ChargeAmount[attribute::currencyID]',
'./' . $ram . ':SpecifiedSupplyChainTradeAgreement/' . $ram . ':GrossPriceProductTradePrice/' . $ram . ':BasisAmount'],
'price' => ['./' . $ram . ':SpecifiedSupplyChainTradeAgreement/' . $ram . ':GrossPriceProductTradePrice/' . $ram . ':ChargeAmount',
'./' . $ram . ':SpecifiedSupplyChainTradeAgreement/' . $ram . ':GrossPriceProductTradePrice/' . $ram . ':BasisAmount'],
'description' => ['./' . $ram . ':SpecifiedTradeProduct/' . $ram . ':Name'],
'quantity' => ['./' . $ram . ':SpecifiedSupplyChainTradeDelivery/' . $ram . ':BilledQuantity',],
'subtotal' => ['./' . $ram . ':SpecifiedSupplyChainTradeSettlement/' . $ram . ':SpecifiedTradeSettlementMonetarySummation/' . $ram . ':LineTotalAmount'],
'tax_rate' => ['./' . $ram . ':SpecifiedSupplyChainTradeSettlement/' . $ram . ':ApplicableTradeTax/' . $ram . ':ApplicablePercent'],
'tax_scheme' => ['./' . $ram . ':SpecifiedSupplyChainTradeSettlement/' . $ram . ':ApplicableTradeTax/' . $ram . ':TypeCode'],
'vendor_partno' => ['./' . $ram . ':SpecifiedTradeProduct/' . $ram . ':SellerAssignedID'],
};
}
sub items_xpath {
my ($self) = @_;
my $rsm = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'};
my $ram = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'};
my $udt = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100'};
$ram .= ":" if $ram;
$rsm .= ":" if $rsm;
$udt .= ":" if $udt;
return '//' . $ram . 'IncludedSupplyChainTradeLineItem';
}
# Metadata accessor method
sub metadata {
......
$self->{_metadata} = {};
$self->{_items} = ();
my $ram = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'};
$ram .= ":" if $ram;
my $udt = $self->{namespaces}->{'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100'};
# Retrieve scalar metadata from DOM
foreach my $key ( keys %{$self->scalar_xpaths} ) {
foreach my $xpath ( @{${$self->scalar_xpaths}{$key}} ) {
......
next;
}
my $value = $self->{dom}->findnodes($xpath);
unless ($udt) {
$value = $self->{dom}->findnodes('//' . $ram . 'DueDateDateTime','DateTimeString') if $key eq 'duedate';
$value = $self->{dom}->findnodes('//' . $ram . 'IssueDateTime','DateTimeString') if $key eq 'transdate';
}
if ( $value ) {
# Get rid of extraneous white space
$value = $value->string_value;
......
my @items;
$self->{_items} = \@items;
foreach my $item ( $self->{dom}->findnodes(ITEMS_XPATH)) {
foreach my $item ( $self->{dom}->findnodes($self->items_xpath)) {
my %line_item;
foreach my $key ( keys %{$self->item_xpaths} ) {
foreach my $xpath ( @{${$self->item_xpaths}{$key}} ) {

Auch abrufbar als: Unified diff