feat: added xmp data
This commit is contained in:
@@ -1,2 +1,3 @@
|
|||||||
.idea
|
.idea
|
||||||
dist
|
dist
|
||||||
|
tmp
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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)
|
||||||
|
}
|
||||||
@@ -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
Binary file not shown.
+342
@@ -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>
|
||||||
BIN
Binary file not shown.
Reference in New Issue
Block a user