Implemented EInvoiceReader
This commit is contained in:
parent
f96885ca42
commit
7ab88390f1
|
@ -53,6 +53,30 @@ class MustangMapper {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun mapToInvoice(invoice: Invoice) = net.codinux.invoicing.model.Invoice(
|
||||||
|
invoiceNumber = invoice.number,
|
||||||
|
invoicingDate = map(invoice.issueDate),
|
||||||
|
sender = mapParty(invoice.sender),
|
||||||
|
recipient = mapParty(invoice.recipient),
|
||||||
|
items = invoice.zfItems.map { mapLineItem(it) },
|
||||||
|
|
||||||
|
dueDate = map(invoice.dueDate ?: invoice.paymentTerms?.dueDate),
|
||||||
|
paymentDescription = invoice.paymentTermDescription ?: invoice.paymentTerms?.description,
|
||||||
|
|
||||||
|
buyerReference = invoice.referenceNumber
|
||||||
|
)
|
||||||
|
|
||||||
|
fun mapParty(party: TradeParty) = Party(
|
||||||
|
party.name, party.street, party.zip, party.location, party.country, party.vatID,
|
||||||
|
party.email ?: party.contact?.eMail, party.contact?.phone, party.contact?.fax, party.contact?.name,
|
||||||
|
party.bankDetails?.firstOrNull()?.let { net.codinux.invoicing.model.BankDetails(it.iban, it.bic, it.accountName) }
|
||||||
|
)
|
||||||
|
|
||||||
|
fun mapLineItem(item: IZUGFeRDExportableItem) = LineItem(
|
||||||
|
item.product.name, item.product.unit, item.quantity, item.price, item.product.vatPercent, item.product.description.takeUnless { it.isBlank() }
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@JvmName("mapNullable")
|
@JvmName("mapNullable")
|
||||||
private fun map(date: LocalDate?) =
|
private fun map(date: LocalDate?) =
|
||||||
date?.let { map(it) }
|
date?.let { map(it) }
|
||||||
|
@ -63,4 +87,11 @@ class MustangMapper {
|
||||||
private fun mapToInstant(date: LocalDate): Instant =
|
private fun mapToInstant(date: LocalDate): Instant =
|
||||||
date.atStartOfDay(ZoneId.systemDefault()).toInstant()
|
date.atStartOfDay(ZoneId.systemDefault()).toInstant()
|
||||||
|
|
||||||
|
@JvmName("mapNullable")
|
||||||
|
private fun map(date: Date?) =
|
||||||
|
date?.let { map(it) }
|
||||||
|
|
||||||
|
private fun map(date: Date): LocalDate =
|
||||||
|
date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package net.codinux.invoicing.reader
|
||||||
|
|
||||||
|
import net.codinux.invoicing.mapper.MustangMapper
|
||||||
|
import net.codinux.invoicing.model.Invoice
|
||||||
|
import org.mustangproject.ZUGFeRD.ZUGFeRDInvoiceImporter
|
||||||
|
import java.io.File
|
||||||
|
import java.io.InputStream
|
||||||
|
|
||||||
|
class EInvoiceReader(
|
||||||
|
private val mapper: MustangMapper = MustangMapper()
|
||||||
|
) {
|
||||||
|
|
||||||
|
fun readFromXml(file: File) = readFromXml(file.inputStream())
|
||||||
|
|
||||||
|
fun readFromXml(stream: InputStream): Invoice? {
|
||||||
|
val importer = ZUGFeRDInvoiceImporter() // XRechnungImporter only reads properties but not to a Invoice object
|
||||||
|
importer.fromXML(stream.reader().readText())
|
||||||
|
|
||||||
|
return extractInvoice(importer)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun extractFromPdf(file: File) = extractFromPdf(file.inputStream())
|
||||||
|
|
||||||
|
fun extractFromPdf(stream: InputStream): Invoice? {
|
||||||
|
val importer = ZUGFeRDInvoiceImporter(stream)
|
||||||
|
|
||||||
|
return extractInvoice(importer)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun extractInvoice(importer: ZUGFeRDInvoiceImporter): Invoice? {
|
||||||
|
val invoice = importer.extractInvoice()
|
||||||
|
|
||||||
|
// TODO: the values LineTotalAmount, ChargeTotalAmount, AllowanceTotalAmount, TaxBasisTotalAmount, TaxTotalAmount,
|
||||||
|
// GrandTotalAmount, TotalPrepaidAmount adn DuePayableAmount are not extracted from XML document
|
||||||
|
// we could use TransactionCalculator to manually calculate these values - Importer also does this and asserts
|
||||||
|
// that its calculated value matches XML doc's GrandTotalAmount value. But then we would have to make some
|
||||||
|
// methods of TransactionCalculator public
|
||||||
|
// Another option would be to manually extract these values from XML document.
|
||||||
|
|
||||||
|
return mapper.mapToInvoice(invoice)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
package net.codinux.invoicing.reader
|
||||||
|
|
||||||
|
import assertk.assertThat
|
||||||
|
import assertk.assertions.hasSize
|
||||||
|
import assertk.assertions.isEqualTo
|
||||||
|
import assertk.assertions.isNotNull
|
||||||
|
import assertk.assertions.isNull
|
||||||
|
import net.codinux.invoicing.model.BankDetails
|
||||||
|
import net.codinux.invoicing.model.Invoice
|
||||||
|
import net.codinux.invoicing.model.LineItem
|
||||||
|
import net.codinux.invoicing.model.Party
|
||||||
|
import net.codinux.invoicing.test.DataGenerator
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.math.BigDecimal
|
||||||
|
import kotlin.test.Test
|
||||||
|
|
||||||
|
class EInvoiceReaderTest {
|
||||||
|
|
||||||
|
private val underTest = EInvoiceReader()
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun readFromXml() {
|
||||||
|
val result = underTest.readFromXml(getTestFile("XRechnung.xml"))
|
||||||
|
|
||||||
|
assertInvoice(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun extractFromPdf() {
|
||||||
|
val result = underTest.extractFromPdf(getTestFile("ZUGFeRD.pdf"))
|
||||||
|
|
||||||
|
assertInvoice(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun getTestFile(filename: String): InputStream =
|
||||||
|
this.javaClass.classLoader.getResourceAsStream("files/$filename")!!
|
||||||
|
|
||||||
|
private fun assertInvoice(invoice: Invoice?) {
|
||||||
|
assertThat(invoice).isNotNull()
|
||||||
|
|
||||||
|
assertThat(invoice!!.invoiceNumber).isEqualTo(DataGenerator.InvoiceNumber)
|
||||||
|
assertThat(invoice.invoicingDate).isEqualTo(DataGenerator.InvoicingDate)
|
||||||
|
|
||||||
|
assertParty(invoice.sender, DataGenerator.SenderName, DataGenerator.SenderStreet, DataGenerator.SenderPostalCode, DataGenerator.SenderCity, DataGenerator.SenderCountry, DataGenerator.SenderVatId, DataGenerator.SenderEmail, DataGenerator.SenderPhone, DataGenerator.SenderBankDetails)
|
||||||
|
|
||||||
|
assertParty(invoice.recipient, DataGenerator.RecipientName, DataGenerator.RecipientStreet, DataGenerator.RecipientPostalCode, DataGenerator.RecipientCity, DataGenerator.RecipientCountry, DataGenerator.RecipientVatId, DataGenerator.RecipientEmail, DataGenerator.RecipientPhone, DataGenerator.RecipientBankDetails)
|
||||||
|
|
||||||
|
assertThat(invoice.items).hasSize(1)
|
||||||
|
assertLineItem(invoice.items.first(), DataGenerator.ItemName, DataGenerator.ItemUnit, DataGenerator.ItemQuantity, DataGenerator.ItemPrice, DataGenerator.ItemVatPercentage, DataGenerator.ItemDescription)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun assertParty(party: Party, name: String, street: String, postalCode: String, city: String, country: String?, vatId: String, email: String, phone: String, bankDetails: BankDetails?) {
|
||||||
|
assertThat(party.name).isEqualTo(name)
|
||||||
|
|
||||||
|
assertThat(party.street).isEqualTo(street)
|
||||||
|
assertThat(party.postalCode).isEqualTo(postalCode)
|
||||||
|
assertThat(party.city).isEqualTo(city)
|
||||||
|
assertThat(party.countryIsoCode).isEqualTo(country)
|
||||||
|
|
||||||
|
assertThat(party.vatId).isEqualTo(vatId)
|
||||||
|
|
||||||
|
assertThat(party.email).isEqualTo(email)
|
||||||
|
assertThat(party.phone).isEqualTo(phone)
|
||||||
|
|
||||||
|
if (bankDetails == null) {
|
||||||
|
assertThat(party.bankDetails).isNull()
|
||||||
|
} else {
|
||||||
|
assertThat(party.bankDetails!!.accountNumber).isEqualTo(bankDetails.accountNumber)
|
||||||
|
assertThat(party.bankDetails!!.bankCode).isEqualTo(bankDetails.bankCode)
|
||||||
|
// due to a bug in Mustang accountName doesn't get extracted from XML, see https://github.com/ZUGFeRD/mustangproject/issues/558
|
||||||
|
// assertThat(party.bankDetails!!.accountHolderName).isEqualTo(bankDetails.accountHolderName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun assertLineItem(item: LineItem, name: String, unit: String, quantity: BigDecimal, price: BigDecimal, vatPercentage: BigDecimal, description: String?) {
|
||||||
|
assertThat(item.name).isEqualTo(name)
|
||||||
|
|
||||||
|
assertThat(item.unit).isEqualTo(unit)
|
||||||
|
assertThat(item.quantity).isEqualTo(quantity.setScale(4))
|
||||||
|
|
||||||
|
assertThat(item.price).isEqualTo(price.setScale(4))
|
||||||
|
assertThat(item.vatPercentage).isEqualTo(vatPercentage.setScale(2))
|
||||||
|
|
||||||
|
// assertThat(item.description).isEqualTo(description)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,140 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<rsm:CrossIndustryInvoice xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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">
|
||||||
|
<!-- generated by: mustangproject.org vnull-->
|
||||||
|
<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>12345</ram:ID>
|
||||||
|
<ram:TypeCode>380</ram:TypeCode>
|
||||||
|
<ram:IssueDateTime>
|
||||||
|
<udt:DateTimeString format="102">20151021</udt:DateTimeString>
|
||||||
|
</ram:IssueDateTime>
|
||||||
|
</rsm:ExchangedDocument>
|
||||||
|
<rsm:SupplyChainTradeTransaction>
|
||||||
|
<ram:IncludedSupplyChainTradeLineItem>
|
||||||
|
<ram:AssociatedDocumentLineDocument>
|
||||||
|
<ram:LineID>1</ram:LineID>
|
||||||
|
</ram:AssociatedDocumentLineDocument>
|
||||||
|
<ram:SpecifiedTradeProduct>
|
||||||
|
<ram:Name>Erbrachte Dienstleistungen</ram:Name>
|
||||||
|
</ram:SpecifiedTradeProduct>
|
||||||
|
<ram:SpecifiedLineTradeAgreement>
|
||||||
|
<ram:NetPriceProductTradePrice>
|
||||||
|
<ram:ChargeAmount>99.0000</ram:ChargeAmount>
|
||||||
|
<ram:BasisQuantity unitCode="HUR">1.0000</ram:BasisQuantity>
|
||||||
|
</ram:NetPriceProductTradePrice>
|
||||||
|
</ram:SpecifiedLineTradeAgreement>
|
||||||
|
<ram:SpecifiedLineTradeDelivery>
|
||||||
|
<ram:BilledQuantity unitCode="HUR">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>99.00</ram:LineTotalAmount>
|
||||||
|
</ram:SpecifiedTradeSettlementLineMonetarySummation>
|
||||||
|
</ram:SpecifiedLineTradeSettlement>
|
||||||
|
</ram:IncludedSupplyChainTradeLineItem>
|
||||||
|
<ram:ApplicableHeaderTradeAgreement>
|
||||||
|
<ram:SellerTradeParty>
|
||||||
|
<ram:Name>Hochwürdiger Leistungserbringer</ram:Name>
|
||||||
|
<ram:DefinedTradeContact>
|
||||||
|
<ram:TelephoneUniversalCommunication>
|
||||||
|
<ram:CompleteNumber>+4917012345678</ram:CompleteNumber>
|
||||||
|
</ram:TelephoneUniversalCommunication>
|
||||||
|
<ram:EmailURIUniversalCommunication>
|
||||||
|
<ram:URIID>working-class-hero@rock.me</ram:URIID>
|
||||||
|
</ram:EmailURIUniversalCommunication>
|
||||||
|
</ram:DefinedTradeContact>
|
||||||
|
<ram:PostalTradeAddress>
|
||||||
|
<ram:PostcodeCode>12345</ram:PostcodeCode>
|
||||||
|
<ram:LineOne>Fun Street 1</ram:LineOne>
|
||||||
|
<ram:CityName>Glückstadt</ram:CityName>
|
||||||
|
<ram:CountryID>DE</ram:CountryID>
|
||||||
|
</ram:PostalTradeAddress>
|
||||||
|
<ram:URIUniversalCommunication>
|
||||||
|
<ram:URIID schemeID="EM">working-class-hero@rock.me</ram:URIID>
|
||||||
|
</ram:URIUniversalCommunication>
|
||||||
|
<ram:SpecifiedTaxRegistration>
|
||||||
|
<ram:ID schemeID="VA">DE123456789</ram:ID>
|
||||||
|
</ram:SpecifiedTaxRegistration>
|
||||||
|
</ram:SellerTradeParty>
|
||||||
|
<ram:BuyerTradeParty>
|
||||||
|
<ram:Name>Untertänigster Leistungsempfänger</ram:Name>
|
||||||
|
<ram:DefinedTradeContact>
|
||||||
|
<ram:TelephoneUniversalCommunication>
|
||||||
|
<ram:CompleteNumber>+491234567890</ram:CompleteNumber>
|
||||||
|
</ram:TelephoneUniversalCommunication>
|
||||||
|
<ram:EmailURIUniversalCommunication>
|
||||||
|
<ram:URIID>exploiter@your.boss</ram:URIID>
|
||||||
|
</ram:EmailURIUniversalCommunication>
|
||||||
|
</ram:DefinedTradeContact>
|
||||||
|
<ram:PostalTradeAddress>
|
||||||
|
<ram:PostcodeCode>12345</ram:PostcodeCode>
|
||||||
|
<ram:LineOne>Party Street 1</ram:LineOne>
|
||||||
|
<ram:CityName>Glückstadt</ram:CityName>
|
||||||
|
<ram:CountryID>DE</ram:CountryID>
|
||||||
|
</ram:PostalTradeAddress>
|
||||||
|
<ram:URIUniversalCommunication>
|
||||||
|
<ram:URIID schemeID="EM">exploiter@your.boss</ram:URIID>
|
||||||
|
</ram:URIUniversalCommunication>
|
||||||
|
<ram:SpecifiedTaxRegistration>
|
||||||
|
<ram:ID schemeID="VA">DE987654321</ram:ID>
|
||||||
|
</ram:SpecifiedTaxRegistration>
|
||||||
|
</ram:BuyerTradeParty>
|
||||||
|
</ram:ApplicableHeaderTradeAgreement>
|
||||||
|
<ram:ApplicableHeaderTradeDelivery/>
|
||||||
|
<ram:ApplicableHeaderTradeSettlement>
|
||||||
|
<ram:PaymentReference>12345</ram:PaymentReference>
|
||||||
|
<ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
|
||||||
|
<ram:SpecifiedTradeSettlementPaymentMeans>
|
||||||
|
<ram:TypeCode>58</ram:TypeCode>
|
||||||
|
<ram:Information>SEPA credit transfer</ram:Information>
|
||||||
|
<ram:PayeePartyCreditorFinancialAccount>
|
||||||
|
<ram:IBANID>DE00123456780987654321</ram:IBANID>
|
||||||
|
<ram:AccountName>Manuela Musterfrau</ram:AccountName>
|
||||||
|
</ram:PayeePartyCreditorFinancialAccount>
|
||||||
|
<ram:PayeeSpecifiedCreditorFinancialInstitution>
|
||||||
|
<ram:BICID>ABZODEFFXXX</ram:BICID>
|
||||||
|
</ram:PayeeSpecifiedCreditorFinancialInstitution>
|
||||||
|
</ram:SpecifiedTradeSettlementPaymentMeans>
|
||||||
|
<ram:ApplicableTradeTax>
|
||||||
|
<ram:CalculatedAmount>18.81</ram:CalculatedAmount>
|
||||||
|
<ram:TypeCode>VAT</ram:TypeCode>
|
||||||
|
<ram:BasisAmount>99.00</ram:BasisAmount>
|
||||||
|
<ram:CategoryCode>S</ram:CategoryCode>
|
||||||
|
<ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
|
||||||
|
</ram:ApplicableTradeTax>
|
||||||
|
<ram:SpecifiedTradePaymentTerms>
|
||||||
|
<ram:Description>Zahlbar ohne Abzug bis 15.06.2016</ram:Description>
|
||||||
|
<ram:DueDateDateTime>
|
||||||
|
<udt:DateTimeString format="102">20160615</udt:DateTimeString>
|
||||||
|
</ram:DueDateDateTime>
|
||||||
|
</ram:SpecifiedTradePaymentTerms>
|
||||||
|
<ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
||||||
|
<ram:LineTotalAmount>99.00</ram:LineTotalAmount>
|
||||||
|
<ram:ChargeTotalAmount>0.00</ram:ChargeTotalAmount>
|
||||||
|
<ram:AllowanceTotalAmount>0.00</ram:AllowanceTotalAmount>
|
||||||
|
<ram:TaxBasisTotalAmount>99.00</ram:TaxBasisTotalAmount>
|
||||||
|
<ram:TaxTotalAmount currencyID="EUR">18.81</ram:TaxTotalAmount>
|
||||||
|
<ram:GrandTotalAmount>117.81</ram:GrandTotalAmount>
|
||||||
|
<ram:TotalPrepaidAmount>0.00</ram:TotalPrepaidAmount>
|
||||||
|
<ram:DuePayableAmount>117.81</ram:DuePayableAmount>
|
||||||
|
</ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
||||||
|
</ram:ApplicableHeaderTradeSettlement>
|
||||||
|
</rsm:SupplyChainTradeTransaction>
|
||||||
|
</rsm:CrossIndustryInvoice>
|
Binary file not shown.
|
@ -0,0 +1,134 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<rsm:CrossIndustryInvoice xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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">
|
||||||
|
<!-- generated by: mustangproject.org vnull-->
|
||||||
|
<rsm:ExchangedDocumentContext>
|
||||||
|
|
||||||
|
<ram:GuidelineSpecifiedDocumentContextParameter>
|
||||||
|
<ram:ID>urn:cen.eu:en16931:2017</ram:ID>
|
||||||
|
</ram:GuidelineSpecifiedDocumentContextParameter>
|
||||||
|
</rsm:ExchangedDocumentContext>
|
||||||
|
<rsm:ExchangedDocument>
|
||||||
|
<ram:ID>12345</ram:ID>
|
||||||
|
<ram:TypeCode>380</ram:TypeCode>
|
||||||
|
<ram:IssueDateTime>
|
||||||
|
<udt:DateTimeString format="102">20151021</udt:DateTimeString>
|
||||||
|
</ram:IssueDateTime>
|
||||||
|
</rsm:ExchangedDocument>
|
||||||
|
<rsm:SupplyChainTradeTransaction>
|
||||||
|
<ram:IncludedSupplyChainTradeLineItem>
|
||||||
|
<ram:AssociatedDocumentLineDocument>
|
||||||
|
<ram:LineID>1</ram:LineID>
|
||||||
|
</ram:AssociatedDocumentLineDocument>
|
||||||
|
<ram:SpecifiedTradeProduct>
|
||||||
|
<ram:Name>Erbrachte Dienstleistungen</ram:Name>
|
||||||
|
</ram:SpecifiedTradeProduct>
|
||||||
|
<ram:SpecifiedLineTradeAgreement>
|
||||||
|
<ram:NetPriceProductTradePrice>
|
||||||
|
<ram:ChargeAmount>99.0000</ram:ChargeAmount>
|
||||||
|
<ram:BasisQuantity unitCode="HUR">1.0000</ram:BasisQuantity>
|
||||||
|
</ram:NetPriceProductTradePrice>
|
||||||
|
</ram:SpecifiedLineTradeAgreement>
|
||||||
|
<ram:SpecifiedLineTradeDelivery>
|
||||||
|
<ram:BilledQuantity unitCode="HUR">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>99.00</ram:LineTotalAmount>
|
||||||
|
</ram:SpecifiedTradeSettlementLineMonetarySummation>
|
||||||
|
</ram:SpecifiedLineTradeSettlement>
|
||||||
|
</ram:IncludedSupplyChainTradeLineItem>
|
||||||
|
<ram:ApplicableHeaderTradeAgreement>
|
||||||
|
<ram:SellerTradeParty>
|
||||||
|
<ram:Name>Hochwürdiger Leistungserbringer</ram:Name>
|
||||||
|
<ram:DefinedTradeContact>
|
||||||
|
<ram:TelephoneUniversalCommunication>
|
||||||
|
<ram:CompleteNumber>+4917012345678</ram:CompleteNumber>
|
||||||
|
</ram:TelephoneUniversalCommunication>
|
||||||
|
<ram:EmailURIUniversalCommunication>
|
||||||
|
<ram:URIID>working-class-hero@rock.me</ram:URIID>
|
||||||
|
</ram:EmailURIUniversalCommunication>
|
||||||
|
</ram:DefinedTradeContact>
|
||||||
|
<ram:PostalTradeAddress>
|
||||||
|
<ram:PostcodeCode>12345</ram:PostcodeCode>
|
||||||
|
<ram:LineOne>Fun Street 1</ram:LineOne>
|
||||||
|
<ram:CityName>Glückstadt</ram:CityName>
|
||||||
|
<ram:CountryID>DE</ram:CountryID>
|
||||||
|
</ram:PostalTradeAddress>
|
||||||
|
<ram:URIUniversalCommunication>
|
||||||
|
<ram:URIID schemeID="EM">working-class-hero@rock.me</ram:URIID>
|
||||||
|
</ram:URIUniversalCommunication>
|
||||||
|
<ram:SpecifiedTaxRegistration>
|
||||||
|
<ram:ID schemeID="VA">DE123456789</ram:ID>
|
||||||
|
</ram:SpecifiedTaxRegistration>
|
||||||
|
</ram:SellerTradeParty>
|
||||||
|
<ram:BuyerTradeParty>
|
||||||
|
<ram:Name>Untertänigster Leistungsempfänger</ram:Name>
|
||||||
|
<ram:DefinedTradeContact>
|
||||||
|
<ram:TelephoneUniversalCommunication>
|
||||||
|
<ram:CompleteNumber>+491234567890</ram:CompleteNumber>
|
||||||
|
</ram:TelephoneUniversalCommunication>
|
||||||
|
<ram:EmailURIUniversalCommunication>
|
||||||
|
<ram:URIID>exploiter@your.boss</ram:URIID>
|
||||||
|
</ram:EmailURIUniversalCommunication>
|
||||||
|
</ram:DefinedTradeContact>
|
||||||
|
<ram:PostalTradeAddress>
|
||||||
|
<ram:PostcodeCode>12345</ram:PostcodeCode>
|
||||||
|
<ram:LineOne>Party Street 1</ram:LineOne>
|
||||||
|
<ram:CityName>Glückstadt</ram:CityName>
|
||||||
|
<ram:CountryID>DE</ram:CountryID>
|
||||||
|
</ram:PostalTradeAddress>
|
||||||
|
<ram:URIUniversalCommunication>
|
||||||
|
<ram:URIID schemeID="EM">exploiter@your.boss</ram:URIID>
|
||||||
|
</ram:URIUniversalCommunication>
|
||||||
|
<ram:SpecifiedTaxRegistration>
|
||||||
|
<ram:ID schemeID="VA">DE987654321</ram:ID>
|
||||||
|
</ram:SpecifiedTaxRegistration>
|
||||||
|
</ram:BuyerTradeParty>
|
||||||
|
</ram:ApplicableHeaderTradeAgreement>
|
||||||
|
<ram:ApplicableHeaderTradeDelivery/>
|
||||||
|
<ram:ApplicableHeaderTradeSettlement>
|
||||||
|
<ram:PaymentReference>12345</ram:PaymentReference>
|
||||||
|
<ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
|
||||||
|
<ram:SpecifiedTradeSettlementPaymentMeans>
|
||||||
|
<ram:TypeCode>58</ram:TypeCode>
|
||||||
|
<ram:Information>SEPA credit transfer</ram:Information>
|
||||||
|
<ram:PayeePartyCreditorFinancialAccount>
|
||||||
|
<ram:IBANID>DE00123456780987654321</ram:IBANID>
|
||||||
|
<ram:AccountName>Manuela Musterfrau</ram:AccountName>
|
||||||
|
</ram:PayeePartyCreditorFinancialAccount>
|
||||||
|
<ram:PayeeSpecifiedCreditorFinancialInstitution>
|
||||||
|
<ram:BICID>ABZODEFFXXX</ram:BICID>
|
||||||
|
</ram:PayeeSpecifiedCreditorFinancialInstitution>
|
||||||
|
</ram:SpecifiedTradeSettlementPaymentMeans>
|
||||||
|
<ram:ApplicableTradeTax>
|
||||||
|
<ram:CalculatedAmount>18.81</ram:CalculatedAmount>
|
||||||
|
<ram:TypeCode>VAT</ram:TypeCode>
|
||||||
|
<ram:BasisAmount>99.00</ram:BasisAmount>
|
||||||
|
<ram:CategoryCode>S</ram:CategoryCode>
|
||||||
|
<ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
|
||||||
|
</ram:ApplicableTradeTax>
|
||||||
|
<ram:SpecifiedTradePaymentTerms>
|
||||||
|
<ram:Description>Zahlbar ohne Abzug bis 15.06.2016</ram:Description>
|
||||||
|
<ram:DueDateDateTime>
|
||||||
|
<udt:DateTimeString format="102">20160615</udt:DateTimeString>
|
||||||
|
</ram:DueDateDateTime>
|
||||||
|
</ram:SpecifiedTradePaymentTerms>
|
||||||
|
<ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
||||||
|
<ram:LineTotalAmount>99.00</ram:LineTotalAmount>
|
||||||
|
<ram:ChargeTotalAmount>0.00</ram:ChargeTotalAmount>
|
||||||
|
<ram:AllowanceTotalAmount>0.00</ram:AllowanceTotalAmount>
|
||||||
|
<ram:TaxBasisTotalAmount>99.00</ram:TaxBasisTotalAmount>
|
||||||
|
<ram:TaxTotalAmount currencyID="EUR">18.81</ram:TaxTotalAmount>
|
||||||
|
<ram:GrandTotalAmount>117.81</ram:GrandTotalAmount>
|
||||||
|
<ram:TotalPrepaidAmount>0.00</ram:TotalPrepaidAmount>
|
||||||
|
<ram:DuePayableAmount>117.81</ram:DuePayableAmount>
|
||||||
|
</ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
||||||
|
</ram:ApplicableHeaderTradeSettlement>
|
||||||
|
</rsm:SupplyChainTradeTransaction>
|
||||||
|
</rsm:CrossIndustryInvoice>
|
Loading…
Reference in New Issue