feat: added xmp data

This commit is contained in:
2026-02-07 16:09:34 +01:00
parent b659359a79
commit 1196274498
17 changed files with 513 additions and 46 deletions
+1
View File
@@ -1,2 +1,3 @@
.idea .idea
dist dist
tmp
-31
View File
File diff suppressed because one or more lines are too long
+2 -1
View File
@@ -5,6 +5,7 @@ go 1.25.5
require ( require (
github.com/pdfcpu/pdfcpu v0.11.1 github.com/pdfcpu/pdfcpu v0.11.1
github.com/urfave/cli/v2 v2.27.7 github.com/urfave/cli/v2 v2.27.7
gitlab.com/romalor/pdflib v0.2.2
) )
require ( require (
@@ -17,8 +18,8 @@ require (
github.com/mattn/go-runewidth v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.19 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/trimmer-io/go-xmp v1.0.0 // indirect
github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect
gitlab.com/romalor/pdflib v0.2.2 // indirect
golang.org/x/crypto v0.46.0 // indirect golang.org/x/crypto v0.46.0 // indirect
golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect
golang.org/x/image v0.34.0 // indirect golang.org/x/image v0.34.0 // indirect
+2
View File
@@ -18,6 +18,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/trimmer-io/go-xmp v1.0.0 h1:zY8bolSga5kOjBAaHS6hrdxLgEoYuT875xTy0QDwZWs=
github.com/trimmer-io/go-xmp v1.0.0/go.mod h1:Aaptr9sp1lLv7UnCAdQ+gSHZyY2miYaKmcNVj7HRBwA=
github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU=
github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4=
github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg= github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg=
+85 -12
View File
@@ -1,6 +1,7 @@
package lib package lib
import ( import (
"bytes"
"errors" "errors"
"fmt" "fmt"
"io" "io"
@@ -19,10 +20,13 @@ func AppendToPdf(
outputFilePath string, outputFilePath string,
embedName string, embedName string,
description string, description string,
) error { ) (err error) {
logger := GetDebugLogger() logger := GetDebugLogger()
logger.Log(fmt.Sprintf("enter appendToPdf(%s, %s, %s)", inputPdfFilePath, inputXmlFilePath, outputFilePath)) logger.Log(fmt.Sprintf("enter appendToPdf(%s, %s, %s)", inputPdfFilePath, inputXmlFilePath, outputFilePath))
defer func() { defer func() {
if err != nil {
logger.Log("append err:", err)
}
logger.Log("leave appendToPdf") logger.Log("leave appendToPdf")
}() }()
@@ -58,30 +62,62 @@ func AppendToPdf(
), ),
) )
inputFile, err := os.Open(inputPdfFilePath) var inputFile *os.File
inputFile, err = os.Open(inputPdfFilePath)
if err != nil { if err != nil {
return err return err
} }
defer inputFile.Close() defer inputFile.Close()
var doc *pdf.Document var result io.Reader
doc, err = pdf.OpenReaderWithOptions(inputFile, pdf.OpenOptions{ result, err = addAttachment(inputFile, inputXmlFilePath, embedName, description)
if err != nil {
return err
}
result, err = addXmpData(result)
if err != nil {
return err
}
var outputFile *os.File
outputFile, err = os.Create(outputFilePath)
if err != nil {
return err
}
defer outputFile.Close()
_, err = io.Copy(outputFile, result)
if err != nil {
return err
}
return nil
}
func addAttachment(
data io.Reader,
inputXmlFilePath string,
embedName string,
description string,
) (io.Reader, error) {
doc, err := pdf.OpenReaderWithOptions(data, pdf.OpenOptions{
Writable: true, Writable: true,
}) })
if err != nil { if err != nil {
return err return nil, err
} }
var inputXmlFile *os.File var inputXmlFile *os.File
inputXmlFile, err = os.Open(inputXmlFilePath) inputXmlFile, err = os.Open(inputXmlFilePath)
if err != nil { if err != nil {
return err return nil, err
} }
var inputData []byte var inputData []byte
inputData, err = io.ReadAll(inputXmlFile) inputData, err = io.ReadAll(inputXmlFile)
if err != nil { if err != nil {
return err return nil, err
} }
err = doc.AddAttachment(attachment.Attachment{ err = doc.AddAttachment(attachment.Attachment{
@@ -93,15 +129,52 @@ func AppendToPdf(
ModDate: time.Now(), ModDate: time.Now(),
}, inputData) }, inputData)
if err != nil { if err != nil {
return err return nil, err
} }
logger.Log(doc.Writer().Version) result := bytes.NewBuffer([]byte{})
err = doc.Writer().SaveAs(outputFilePath) _, err = doc.Writer().WriteTo(result)
if err != nil { if err != nil {
return err return nil, err
} }
return nil return result, nil
}
func addXmpData(data io.Reader) (io.Reader, error) {
doc, err := pdf.OpenReaderWithOptions(data, pdf.OpenOptions{
Writable: true,
})
if err != nil {
return nil, err
}
var xmpData []byte
xmpData, err = doc.XMPMetadata()
if err != nil {
return nil, err
}
xmpData, err = addFacturXXmpData(xmpData)
if err != nil {
return nil, err
}
err = doc.SetXMPMetadata(xmpData)
if err != nil {
return nil, err
}
xmpData, err = doc.XMPMetadata()
if err != nil {
return nil, err
}
result := bytes.NewBuffer([]byte{})
_, err = doc.Writer().WriteTo(result)
if err != nil {
return nil, err
}
return result, nil
} }
+73
View File
@@ -0,0 +1,73 @@
package lib
import (
xmpbase "github.com/trimmer-io/go-xmp/models/xmp_base"
"github.com/trimmer-io/go-xmp/xmp"
)
const (
FacturXNamespace = "Factur-X PDFA Erweiterungsschema"
FacturXUri = "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#"
FacturXPrefix = "fx:"
)
func addFacturXXmpData(data []byte) ([]byte, error) {
doc := &xmp.Document{}
err := xmp.Unmarshal(data, doc)
if err != nil {
return nil, err
}
// --- Register Factur-X namespace ---
ns := &xmp.Namespace{
Name: "fx",
URI: FacturXUri,
Factory: func(name string) xmp.Model {
return &xmpbase.XmpBase{}
},
}
xmp.Register(ns)
_, err = doc.MakeModel(ns)
if err != nil {
return nil, err
}
// --- Set Factur-X properties ---
err = doc.SetPath(xmp.PathValue{
Path: FacturXPrefix + "ConformanceLevel",
Namespace: FacturXUri,
Value: "EN 16931",
})
if err != nil {
return nil, err
}
err = doc.SetPath(xmp.PathValue{
Path: FacturXPrefix + "DocumentType",
Namespace: FacturXUri,
Value: "INVOICE",
})
if err != nil {
return nil, err
}
err = doc.SetPath(xmp.PathValue{
Path: FacturXPrefix + "DocumentFileName",
Namespace: FacturXUri,
Value: "factur-x.xml",
})
if err != nil {
return nil, err
}
err = doc.SetPath(xmp.PathValue{
Path: FacturXPrefix + "Version",
Namespace: FacturXUri,
Value: "1.0",
})
if err != nil {
return nil, err
}
return xmp.Marshal(doc)
}
+8 -2
View File
@@ -3,6 +3,7 @@ package main
import ( import (
"log" "log"
"os" "os"
"path"
"pdf/lib" "pdf/lib"
@@ -10,10 +11,16 @@ import (
) )
func main() { func main() {
exeName, err := os.Executable()
if err != nil {
log.Fatal(err)
}
app := &cli.App{ app := &cli.App{
Name: "pdf_invoice", Name: path.Base(exeName),
Usage: "Pdf xml invoice helper cli", Usage: "Pdf xml invoice helper cli",
UseShortOptionHandling: true, UseShortOptionHandling: true,
Version: "1.0.0",
Commands: []*cli.Command{ Commands: []*cli.Command{
{ {
Name: "extract", Name: "extract",
@@ -86,7 +93,6 @@ func main() {
}, },
}, },
} }
var err error
err = app.Run(os.Args) err = app.Run(os.Args)
if err != nil { if err != nil {
BIN
View File
Binary file not shown.
+342
View File
@@ -0,0 +1,342 @@
<?xml version="1.0" standalone="yes"?>
<rsm:CrossIndustryInvoice xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100" xmlns:qdt="urn:un:unece:uncefact:data:standard:QualifiedDataType:100">
<rsm:ExchangedDocumentContext>
<ram:BusinessProcessSpecifiedDocumentContextParameter>
<ram:ID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</ram:ID>
</ram:BusinessProcessSpecifiedDocumentContextParameter>
<ram:GuidelineSpecifiedDocumentContextParameter>
<ram:ID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</ram:ID>
</ram:GuidelineSpecifiedDocumentContextParameter>
</rsm:ExchangedDocumentContext>
<rsm:ExchangedDocument>
<ram:ID>32096</ram:ID>
<ram:TypeCode>380</ram:TypeCode>
<ram:IssueDateTime>
<udt:DateTimeString format="102">20250915</udt:DateTimeString>
</ram:IssueDateTime>
<ram:IncludedNote>
<ram:Content>Gerateinfo:
Hersteller:Yamaha
Geraetetyp:AX450
SeriennNr.:098765431</ram:Content>
<ram:SubjectCode>AAI</ram:SubjectCode>
</ram:IncludedNote>
<ram:IncludedNote>
<ram:Content>Fehler:
Brummen
geht nicht
riecht schlecht
ist zu klein
ist zu groß
ist nicht rund</ram:Content>
<ram:SubjectCode>AAI</ram:SubjectCode>
</ram:IncludedNote>
<ram:IncludedNote>
<ram:Content>Zubehoer:
Fernbedienung,</ram:Content>
<ram:SubjectCode>AAI</ram:SubjectCode>
</ram:IncludedNote>
<ram:IncludedNote>
<ram:Content>Zustand:
neuwertig</ram:Content>
<ram:SubjectCode>AAI</ram:SubjectCode>
</ram:IncludedNote>
<ram:IncludedNote>
<ram:Content>Verpackung:
Original</ram:Content>
<ram:SubjectCode>AAI</ram:SubjectCode>
</ram:IncludedNote>
<ram:IncludedNote>
<ram:Content>Ausgefuehrte Arbeiten:
Kondensator in der Audiostufe erneuert
Widerstand in der Audiostufe erneuert
Kondensator in der Audiostufe erneuert
Widerstand in der Audiostufe erneuert
Kondensator in der Audiostufe erneuert
Widerstand in der Audiostufe erneuert</ram:Content>
<ram:SubjectCode>AAI</ram:SubjectCode>
</ram:IncludedNote>
</rsm:ExchangedDocument>
<rsm:SupplyChainTradeTransaction>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID> 1</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:SellerAssignedID>Versand</ram:SellerAssignedID>
<ram:Name>Versandkosten</ram:Name>
<ram:Description>Versandkosten</ram:Description>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:GrossPriceProductTradePrice>
<ram:ChargeAmount>12.00</ram:ChargeAmount>
<ram:BasisQuantity unitCode="C62">1.00</ram:BasisQuantity>
<ram:AppliedTradeAllowanceCharge>
<ram:ChargeIndicator>
<udt:Indicator>false</udt:Indicator>
</ram:ChargeIndicator>
<ram:ActualAmount>0.00</ram:ActualAmount>
</ram:AppliedTradeAllowanceCharge>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>12.00</ram:ChargeAmount>
<ram:BasisQuantity unitCode="C62">1.00</ram:BasisQuantity>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode="C62">1.0000</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>12.00</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID> 2</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:SellerAssignedID>Lohn</ram:SellerAssignedID>
<ram:Name>Lohnkosten</ram:Name>
<ram:Description>Lohnkosten</ram:Description>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:GrossPriceProductTradePrice>
<ram:ChargeAmount>12.00</ram:ChargeAmount>
<ram:BasisQuantity unitCode="C62">1.00</ram:BasisQuantity>
<ram:AppliedTradeAllowanceCharge>
<ram:ChargeIndicator>
<udt:Indicator>false</udt:Indicator>
</ram:ChargeIndicator>
<ram:ActualAmount>0.00</ram:ActualAmount>
</ram:AppliedTradeAllowanceCharge>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>12.00</ram:ChargeAmount>
<ram:BasisQuantity unitCode="C62">1.00</ram:BasisQuantity>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode="C62">10.0000</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>120.00</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID> 3</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:SellerAssignedID>ZZ10129</ram:SellerAssignedID>
<ram:Name>Tieftöner</ram:Name>
<ram:Description>Tieftöner</ram:Description>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>1.00</ram:ChargeAmount>
<ram:BasisQuantity unitCode="H87">1.00</ram:BasisQuantity>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode="H87">1.0000</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>1.00</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID> 4</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:SellerAssignedID>XX674380</ram:SellerAssignedID>
<ram:Name>Andruckrolle</ram:Name>
<ram:Description>Andruckrolle
mit besonders viel Text zum Drucken
und noch eine Zeile
das ist das Ende</ram:Description>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>12.27</ram:ChargeAmount>
<ram:BasisQuantity unitCode="H87">1.00</ram:BasisQuantity>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode="H87">2.0000</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>24.54</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID> 5</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:SellerAssignedID>YEFC024201L</ram:SellerAssignedID>
<ram:Name>Gehäuse Front</ram:Name>
<ram:Description>Gehäuse Front</ram:Description>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>22.4640</ram:ChargeAmount>
<ram:BasisQuantity unitCode="H87">1.00</ram:BasisQuantity>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode="H87">1.0000</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>22.46</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:ApplicableHeaderTradeAgreement>
<ram:BuyerReference>non-existent</ram:BuyerReference>
<ram:SellerTradeParty>
<ram:Name>Meisterhand Service GmbH</ram:Name>
<ram:SpecifiedLegalOrganization>
<ram:TradingBusinessName>Meisterhand Service GmbH</ram:TradingBusinessName>
</ram:SpecifiedLegalOrganization>
<ram:DefinedTradeContact>
<ram:PersonName>Meusel</ram:PersonName>
<ram:TelephoneUniversalCommunication>
<ram:CompleteNumber>040/6684948</ram:CompleteNumber>
</ram:TelephoneUniversalCommunication>
<ram:EmailURIUniversalCommunication>
<ram:URIID>Service@Meisterhand-Service.de</ram:URIID>
</ram:EmailURIUniversalCommunication>
</ram:DefinedTradeContact>
<ram:PostalTradeAddress>
<ram:PostcodeCode>022926</ram:PostcodeCode>
<ram:LineOne>Ewige Weide 7</ram:LineOne>
<ram:CityName>Ahrensburg</ram:CityName>
<ram:CountryID>DE</ram:CountryID>
<ram:CountrySubDivisionName>Schleswig Holstein</ram:CountrySubDivisionName>
</ram:PostalTradeAddress>
<ram:URIUniversalCommunication>
<ram:URIID schemeID="EM">Service@Meisterhand-Service.de</ram:URIID>
</ram:URIUniversalCommunication>
<ram:SpecifiedTaxRegistration>
<ram:ID schemeID="VA">DE118676283</ram:ID>
</ram:SpecifiedTaxRegistration>
<ram:SpecifiedTaxRegistration>
<ram:ID schemeID="FC">30/296/06200</ram:ID>
</ram:SpecifiedTaxRegistration>
</ram:SellerTradeParty>
<ram:BuyerTradeParty>
<ram:ID>20735</ram:ID>
<ram:Name>Klemp</ram:Name>
<ram:SpecifiedLegalOrganization>
<ram:TradingBusinessName>Klemp</ram:TradingBusinessName>
</ram:SpecifiedLegalOrganization>
<ram:DefinedTradeContact>
<ram:PersonName>Klemp</ram:PersonName>
<ram:TelephoneUniversalCommunication>
<ram:CompleteNumber>04202/881361</ram:CompleteNumber>
</ram:TelephoneUniversalCommunication>
<ram:EmailURIUniversalCommunication>
<ram:URIID>jklemp@gmx.de</ram:URIID>
</ram:EmailURIUniversalCommunication>
</ram:DefinedTradeContact>
<ram:PostalTradeAddress>
<ram:PostcodeCode>28832</ram:PostcodeCode>
<ram:LineOne>Bergstr. 106</ram:LineOne>
<ram:CityName>Achim</ram:CityName>
<ram:CountryID>DE</ram:CountryID>
</ram:PostalTradeAddress>
<ram:URIUniversalCommunication>
<ram:URIID schemeID="EM">jklemp@gmx.de</ram:URIID>
</ram:URIUniversalCommunication>
</ram:BuyerTradeParty>
<ram:SellerOrderReferencedDocument>
<ram:IssuerAssignedID>180274</ram:IssuerAssignedID>
</ram:SellerOrderReferencedDocument>
<ram:BuyerOrderReferencedDocument>
<ram:IssuerAssignedID>1234567890</ram:IssuerAssignedID>
</ram:BuyerOrderReferencedDocument>
</ram:ApplicableHeaderTradeAgreement>
<ram:ApplicableHeaderTradeDelivery/>
<ram:ApplicableHeaderTradeSettlement>
<ram:PaymentReference>Rechnung 32096</ram:PaymentReference>
<ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
<ram:SpecifiedTradeSettlementPaymentMeans>
<ram:TypeCode>58</ram:TypeCode>
<ram:PayeePartyCreditorFinancialAccount>
<ram:IBANID>DE19200505501295129140</ram:IBANID>
<ram:AccountName>Meisterhand Service GmbH</ram:AccountName>
</ram:PayeePartyCreditorFinancialAccount>
<ram:PayeeSpecifiedCreditorFinancialInstitution>
<ram:BICID>HASPDEHHXXX</ram:BICID>
</ram:PayeeSpecifiedCreditorFinancialInstitution>
</ram:SpecifiedTradeSettlementPaymentMeans>
<ram:ApplicableTradeTax>
<ram:CalculatedAmount>34.20</ram:CalculatedAmount>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:BasisAmount>180.00</ram:BasisAmount>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:BillingSpecifiedPeriod>
<ram:StartDateTime>
<udt:DateTimeString format="102">20250915</udt:DateTimeString>
</ram:StartDateTime>
<ram:EndDateTime>
<udt:DateTimeString format="102">20250915</udt:DateTimeString>
</ram:EndDateTime>
</ram:BillingSpecifiedPeriod>
<ram:SpecifiedTradePaymentTerms>
<ram:DueDateDateTime>
<udt:DateTimeString format="102">19961023</udt:DateTimeString>
</ram:DueDateDateTime>
</ram:SpecifiedTradePaymentTerms>
<ram:SpecifiedTradeSettlementHeaderMonetarySummation>
<ram:LineTotalAmount>180.00</ram:LineTotalAmount>
<ram:ChargeTotalAmount>0.00</ram:ChargeTotalAmount>
<ram:AllowanceTotalAmount>0.00</ram:AllowanceTotalAmount>
<ram:TaxBasisTotalAmount>180.00</ram:TaxBasisTotalAmount>
<ram:TaxTotalAmount currencyID="EUR">34.20</ram:TaxTotalAmount>
<ram:GrandTotalAmount>214.20</ram:GrandTotalAmount>
<ram:TotalPrepaidAmount>0.00</ram:TotalPrepaidAmount>
<ram:DuePayableAmount>214.20</ram:DuePayableAmount>
</ram:SpecifiedTradeSettlementHeaderMonetarySummation>
</ram:ApplicableHeaderTradeSettlement>
</rsm:SupplyChainTradeTransaction>
</rsm:CrossIndustryInvoice>
View File
View File
View File
View File
View File
View File