- Fix discount indicator with 100.0% discount. - Fix reported tax amount with group of taxes. - Fix reported tax_base_amount with foreign currency. - Fix invoice summary according the facturx xsd. closes odoo/odoo#54080 X-original-commit: e97333f6d80eaa5807467a863a9c8f5850e1d644 Related: odoo/enterprise#11657 Signed-off-by: Quentin De Paoli (qdp) <qdp@openerp.com> Signed-off-by: Laurent Smet <smetl@users.noreply.github.com>
236 lines
13 KiB
XML
236 lines
13 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<data>
|
|
<template id="account_invoice_line_facturx_export">
|
|
<t t-set="line" t-value="line_values['line']"/>
|
|
<t xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100"
|
|
xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100"
|
|
xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100">
|
|
<ram:IncludedSupplyChainTradeLineItem>
|
|
<!-- Line number. -->
|
|
<ram:AssociatedDocumentLineDocument>
|
|
<ram:LineID t-esc="line_values['index']"/>
|
|
</ram:AssociatedDocumentLineDocument>
|
|
|
|
<!-- Product. -->
|
|
<ram:SpecifiedTradeProduct>
|
|
<ram:GlobalID
|
|
schemeID="0160"
|
|
t-if="line.product_id and line.product_id.barcode"
|
|
t-esc="line.product_id.barcode"/>
|
|
<ram:SellerAssignedID
|
|
t-if="line.product_id and line.product_id.default_code"
|
|
t-esc="line.product_id.default_code"/>
|
|
<ram:Name t-esc="line.name"/>
|
|
</ram:SpecifiedTradeProduct>
|
|
|
|
<!-- Amounts. -->
|
|
<ram:SpecifiedLineTradeAgreement>
|
|
<ram:GrossPriceProductTradePrice>
|
|
<ram:ChargeAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(line.price_unit, currency)"/>
|
|
|
|
<!-- Discount. -->
|
|
<ram:AppliedTradeAllowanceCharge t-if="line.discount">
|
|
<ram:ChargeIndicator>
|
|
<udt:Indicator t-esc="'false' if line.discount == 100 else 'true'"/>
|
|
</ram:ChargeIndicator>
|
|
<ram:CalculationPercent t-esc="line.discount"/>
|
|
</ram:AppliedTradeAllowanceCharge>
|
|
</ram:GrossPriceProductTradePrice>
|
|
</ram:SpecifiedLineTradeAgreement>
|
|
|
|
<!-- Quantity. -->
|
|
<ram:SpecifiedLineTradeDelivery>
|
|
<ram:BilledQuantity
|
|
t-esc="line.quantity"/>
|
|
</ram:SpecifiedLineTradeDelivery>
|
|
|
|
<ram:SpecifiedLineTradeSettlement>
|
|
<t t-foreach="line_values['tax_details']" t-as="tax_vals">
|
|
<t t-set="tax" t-value="tax_vals['tax']"/>
|
|
<ram:ApplicableTradeTax t-if="tax.amount_type == 'percent'">
|
|
<ram:RateApplicablePercent t-esc="tax.amount"/>
|
|
</ram:ApplicableTradeTax>
|
|
</t>
|
|
<!-- Subtotal. -->
|
|
<ram:SpecifiedTradeSettlementLineMonetarySummation>
|
|
<ram:LineTotalAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(line.price_subtotal, currency)"/>
|
|
</ram:SpecifiedTradeSettlementLineMonetarySummation>
|
|
</ram:SpecifiedLineTradeSettlement>
|
|
|
|
</ram:IncludedSupplyChainTradeLineItem>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="account_invoice_partner_facturx_export">
|
|
<t xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100"
|
|
xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100"
|
|
xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100">
|
|
<!-- Contact. -->
|
|
<ram:Name t-if="partner.name" t-esc="partner.name"/>
|
|
<ram:DefinedTradeContact>
|
|
<ram:PersonName t-esc="partner.name"/>
|
|
<ram:TelephoneUniversalCommunication t-if="partner.phone or partner.mobile">
|
|
<ram:CompleteNumber t-esc="partner.phone or partner.mobile"/>
|
|
</ram:TelephoneUniversalCommunication>
|
|
<ram:EmailURIUniversalCommunication t-if="partner.email">
|
|
<ram:URIID schemeID='SMTP' t-esc="partner.email"/>
|
|
</ram:EmailURIUniversalCommunication>
|
|
</ram:DefinedTradeContact>
|
|
|
|
<!-- Address. -->
|
|
<ram:PostalTradeAddress>
|
|
<ram:PostcodeCode t-if="partner.zip" t-esc="partner.zip"/>
|
|
<ram:LineOne t-if="partner.street" t-esc="partner.street"/>
|
|
<ram:LineTwo t-if="partner.street2" t-esc="partner.street2"/>
|
|
<ram:CityName t-if="partner.city" t-esc="partner.city"/>
|
|
<ram:CountryID t-if="partner.country_id" t-esc="partner.country_id.code"/>
|
|
</ram:PostalTradeAddress>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="account_invoice_facturx_export">
|
|
<t t-set="currency" t-value="record.currency_id or record.company_currency_id"/>
|
|
<rsm:CrossIndustryInvoice
|
|
xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100"
|
|
xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100"
|
|
xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100">
|
|
<!-- Factur-x level:
|
|
* minimum or basicwl: urn:factur-x.eu:1p0...
|
|
* basic: urn:cen.eu:en16931:2017:compliant:factur-x.eu:1p0:basic
|
|
* en16931: urn:cen.eu:en16931:2017
|
|
-->
|
|
<rsm:ExchangedDocumentContext>
|
|
<ram:GuidelineSpecifiedDocumentContextParameter>
|
|
<ram:ID>urn:cen.eu:en16931:2017</ram:ID>
|
|
</ram:GuidelineSpecifiedDocumentContextParameter>
|
|
</rsm:ExchangedDocumentContext>
|
|
|
|
<!-- Document Headers. -->
|
|
<rsm:ExchangedDocument>
|
|
<ram:ID t-esc="record.ref"/>
|
|
<ram:TypeCode t-esc="'381' if 'refund' in record.move_type else '380'"/>
|
|
<ram:IssueDateTime>
|
|
<udt:DateTimeString format="102" t-esc="format_date(record.invoice_date)"/>
|
|
</ram:IssueDateTime>
|
|
<ram:IncludedNote t-if="record.narration">
|
|
<ram:Content t-esc="record.narration"/>
|
|
</ram:IncludedNote>
|
|
</rsm:ExchangedDocument>
|
|
|
|
<rsm:SupplyChainTradeTransaction>
|
|
<!-- Invoice lines. -->
|
|
<t t-foreach="invoice_line_values" t-as="line_values">
|
|
<t t-call="account_edi_facturx.account_invoice_line_facturx_export"/>
|
|
</t>
|
|
|
|
<!-- Partners. -->
|
|
<ram:ApplicableHeaderTradeAgreement>
|
|
<!-- Seller. -->
|
|
<ram:SellerTradeParty>
|
|
<!-- Address. -->
|
|
<t t-call="account_edi_facturx.account_invoice_partner_facturx_export">
|
|
<t t-set="partner" t-value="record.company_id.partner_id"/>
|
|
</t>
|
|
|
|
<!-- VAT. -->
|
|
<ram:SpecifiedTaxRegistration t-if="record.company_id.vat">
|
|
<ram:ID schemeID="VA" t-esc="record.company_id.vat"/>
|
|
</ram:SpecifiedTaxRegistration>
|
|
</ram:SellerTradeParty>
|
|
|
|
<!-- Customer. -->
|
|
<ram:BuyerTradeParty>
|
|
<!-- Address. -->
|
|
<t t-call="account_edi_facturx.account_invoice_partner_facturx_export">
|
|
<t t-set="partner" t-value="record.commercial_partner_id"/>
|
|
</t>
|
|
|
|
<!-- VAT. -->
|
|
<ram:SpecifiedTaxRegistration t-if="record.commercial_partner_id.vat">
|
|
<ram:ID schemeID="VA" t-esc="record.commercial_partner_id.vat"/>
|
|
</ram:SpecifiedTaxRegistration>
|
|
</ram:BuyerTradeParty>
|
|
|
|
<!-- Reference. -->
|
|
<ram:BuyerOrderReferencedDocument>
|
|
<ram:IssuerAssignedID t-esc="'%s: %s' % (record.name, record.payment_reference) if record.payment_reference else record.name"/>
|
|
</ram:BuyerOrderReferencedDocument>
|
|
</ram:ApplicableHeaderTradeAgreement>
|
|
|
|
<!-- Delivery. Don't make a dependency with sale only for one field. -->
|
|
<ram:ApplicableHeaderTradeDelivery>
|
|
<ram:ShipToTradeParty
|
|
t-if="'partner_shipping_id' in record._fields and record.partner_shipping_id">
|
|
<t t-call="account_edi_facturx.account_invoice_partner_facturx_export">
|
|
<t t-set="partner" t-value="record.partner_shipping_id"/>
|
|
</t>
|
|
</ram:ShipToTradeParty>
|
|
</ram:ApplicableHeaderTradeDelivery>
|
|
|
|
<!-- Taxes. -->
|
|
<ram:ApplicableHeaderTradeSettlement>
|
|
|
|
<!-- Bank account. -->
|
|
<ram:SpecifiedTradeSettlementPaymentMeans t-if="record.partner_bank_id.acc_type == 'iban'">
|
|
<ram:PayeePartyCreditorFinancialAccount>
|
|
<ram:IBANID t-esc="record.partner_bank_id.sanitized_acc_number"/>
|
|
</ram:PayeePartyCreditorFinancialAccount>
|
|
</ram:SpecifiedTradeSettlementPaymentMeans>
|
|
|
|
<!-- Tax Summary. -->
|
|
<t t-foreach="tax_details" t-as="tax_vals">
|
|
<t t-set="tax_line" t-value="tax_vals['line']"/>
|
|
<ram:ApplicableTradeTax>
|
|
<ram:CalculatedAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(tax_vals['tax_amount'], currency)"/>
|
|
<ram:BasisAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(tax_vals['tax_base_amount'], currency)"/>
|
|
<ram:RateApplicablePercent
|
|
t-if="tax_line.tax_line_id.amount_type == 'percent'"
|
|
t-esc="tax_line.tax_line_id.amount"/>
|
|
</ram:ApplicableTradeTax>
|
|
</t>
|
|
|
|
<!-- Payment Term. -->
|
|
<ram:SpecifiedTradePaymentTerms>
|
|
<ram:Description t-if="record.invoice_payment_term_id" t-esc="record.invoice_payment_term_id.name"/>
|
|
<ram:DueDateDateTime t-if="record.invoice_date_due">
|
|
<udt:DateTimeString t-esc="format_date(record.invoice_date_due)"/>
|
|
</ram:DueDateDateTime>
|
|
</ram:SpecifiedTradePaymentTerms>
|
|
|
|
<!-- Summary. -->
|
|
<ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
|
<ram:LineTotalAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(record.amount_untaxed, currency)"/>
|
|
<ram:TaxBasisTotalAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(record.amount_untaxed, currency)"/>
|
|
<ram:TaxTotalAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(record.amount_tax, currency)"/>
|
|
<ram:GrandTotalAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(record.amount_total, currency)"/>
|
|
<ram:TotalPrepaidAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(record.amount_total - record.amount_residual, currency)"/>
|
|
<ram:DuePayableAmount
|
|
t-att-currencyID="currency.name"
|
|
t-esc="format_monetary(record.amount_residual, currency)"/>
|
|
</ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
|
</ram:ApplicableHeaderTradeSettlement>
|
|
</rsm:SupplyChainTradeTransaction>
|
|
</rsm:CrossIndustryInvoice>
|
|
</template>
|
|
</data>
|
|
</odoo>
|