summaryrefslogtreecommitdiff
path: root/addons/account/views/report_invoice.xml
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/account/views/report_invoice.xml
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/account/views/report_invoice.xml')
-rw-r--r--addons/account/views/report_invoice.xml244
1 files changed, 244 insertions, 0 deletions
diff --git a/addons/account/views/report_invoice.xml b/addons/account/views/report_invoice.xml
new file mode 100644
index 00000000..319d985a
--- /dev/null
+++ b/addons/account/views/report_invoice.xml
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <data>
+ <template id="report_invoice_document">
+ <t t-call="web.external_layout">
+ <t t-set="o" t-value="o.with_context(lang=lang)" />
+ <t t-set="address">
+ <address t-field="o.partner_id" t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' />
+ <div t-if="o.partner_id.vat" class="mt16">
+ <t t-if="o.company_id.country_id.vat_label" t-esc="o.company_id.country_id.vat_label" id="inv_tax_id_label"/>
+ <t t-else="">Tax ID</t>: <span t-field="o.partner_id.vat"/></div>
+ </t>
+ <div class="page">
+ <h2>
+ <span t-if="o.move_type == 'out_invoice' and o.state == 'posted'">Invoice</span>
+ <span t-if="o.move_type == 'out_invoice' and o.state == 'draft'">Draft Invoice</span>
+ <span t-if="o.move_type == 'out_invoice' and o.state == 'cancel'">Cancelled Invoice</span>
+ <span t-if="o.move_type == 'out_refund'">Credit Note</span>
+ <span t-if="o.move_type == 'in_refund'">Vendor Credit Note</span>
+ <span t-if="o.move_type == 'in_invoice'">Vendor Bill</span>
+ <span t-if="o.name != '/'" t-field="o.name"/>
+ </h2>
+
+ <div id="informations" class="row mt32 mb32">
+ <div class="col-auto col-3 mw-100 mb-2" t-if="o.invoice_date" name="invoice_date">
+ <strong>Invoice Date:</strong>
+ <p class="m-0" t-field="o.invoice_date"/>
+ </div>
+ <div class="col-auto col-3 mw-100 mb-2" t-if="o.invoice_date_due and o.move_type == 'out_invoice' and o.state == 'posted'" name="due_date">
+ <strong>Due Date:</strong>
+ <p class="m-0" t-field="o.invoice_date_due"/>
+ </div>
+ <div class="col-auto col-3 mw-100 mb-2" t-if="o.invoice_origin" name="origin">
+ <strong>Source:</strong>
+ <p class="m-0" t-field="o.invoice_origin"/>
+ </div>
+ <div class="col-auto col-3 mw-100 mb-2" t-if="o.partner_id.ref" name="customer_code">
+ <strong>Customer Code:</strong>
+ <p class="m-0" t-field="o.partner_id.ref"/>
+ </div>
+ <div class="col-auto col-3 mw-100 mb-2" t-if="o.ref" name="reference">
+ <strong>Reference:</strong>
+ <p class="m-0" t-field="o.ref"/>
+ </div>
+ </div>
+
+ <t t-set="display_discount" t-value="any(l.discount for l in o.invoice_line_ids)"/>
+
+ <table class="table table-sm o_main_table" name="invoice_line_table">
+ <thead>
+ <tr>
+ <th name="th_description" class="text-left"><span>Description</span></th>
+ <th name="th_quantity" class="text-right"><span>Quantity</span></th>
+ <th name="th_priceunit" t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"><span>Unit Price</span></th>
+ <th name="th_price_unit" t-if="display_discount" t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
+ <span>Disc.%</span>
+ </th>
+ <th name="th_taxes" t-attf-class="text-left {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"><span>Taxes</span></th>
+ <th name="th_subtotal" class="text-right">
+ <span groups="account.group_show_line_subtotals_tax_excluded">Amount</span>
+ <span groups="account.group_show_line_subtotals_tax_included">Total Price</span>
+ </th>
+ </tr>
+ </thead>
+ <tbody class="invoice_tbody">
+ <t t-set="current_subtotal" t-value="0"/>
+ <t t-set="lines" t-value="o.invoice_line_ids.sorted(key=lambda l: (-l.sequence, l.date, l.move_name, -l.id), reverse=True)"/>
+
+ <t t-foreach="lines" t-as="line">
+ <t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
+ <t t-set="current_subtotal" t-value="current_subtotal + line.price_total" groups="account.group_show_line_subtotals_tax_included"/>
+
+ <tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''">
+ <t t-if="not line.display_type" name="account_invoice_line_accountable">
+ <td name="account_invoice_line_name"><span t-field="line.name" t-options="{'widget': 'text'}"/></td>
+ <td class="text-right">
+ <span t-field="line.quantity"/>
+ <span t-field="line.product_uom_id" groups="uom.group_uom"/>
+ </td>
+ <td t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
+ <span class="text-nowrap" t-field="line.price_unit"/>
+ </td>
+ <td t-if="display_discount" t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
+ <span class="text-nowrap" t-field="line.discount"/>
+ </td>
+ <td t-attf-class="text-left {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
+ <span t-esc="', '.join(map(lambda x: (x.description or x.name), line.tax_ids))" id="line_tax_ids"/>
+ </td>
+ <td class="text-right o_price_total">
+ <span class="text-nowrap" t-field="line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
+ <span class="text-nowrap" t-field="line.price_total" groups="account.group_show_line_subtotals_tax_included"/>
+ </td>
+ </t>
+ <t t-if="line.display_type == 'line_section'">
+ <td colspan="99">
+ <span t-field="line.name" t-options="{'widget': 'text'}"/>
+ </td>
+ <t t-set="current_section" t-value="line"/>
+ <t t-set="current_subtotal" t-value="0"/>
+ </t>
+ <t t-if="line.display_type == 'line_note'">
+ <td colspan="99">
+ <span t-field="line.name" t-options="{'widget': 'text'}"/>
+ </td>
+ </t>
+ </tr>
+
+ <t t-if="current_section and (line_last or lines[line_index+1].display_type == 'line_section')">
+ <tr class="is-subtotal text-right">
+ <td colspan="99">
+ <strong class="mr16">Subtotal</strong>
+ <span
+ t-esc="current_subtotal"
+ t-options='{"widget": "monetary", "display_currency": o.currency_id}'
+ />
+ </td>
+ </tr>
+ </t>
+ </t>
+ </tbody>
+ </table>
+
+ <div class="clearfix">
+ <div id="total" class="row">
+ <div t-attf-class="#{'col-6' if report_type != 'html' else 'col-sm-7 col-md-6'} ml-auto">
+ <table class="table table-sm" style="page-break-inside: avoid;">
+ <tr class="border-black o_subtotal" style="">
+ <td><strong>Subtotal</strong></td>
+ <td class="text-right">
+ <span t-field="o.amount_untaxed"/>
+ </td>
+ </tr>
+ <t t-foreach="o.amount_by_group" t-as="amount_by_group">
+ <tr style="">
+ <t t-if="len(o.line_ids.filtered(lambda line: line.tax_line_id)) in [0, 1] and o.amount_untaxed == amount_by_group[2]">
+ <td><span class="text-nowrap" t-esc="amount_by_group[0]"/></td>
+ <td class="text-right o_price_total">
+ <span class="text-nowrap" t-esc="amount_by_group[3]" />
+ </td>
+ </t>
+ <t t-else="">
+ <td>
+ <span t-esc="amount_by_group[0]"/>
+ <span class="text-nowrap"> on
+ <t t-esc="amount_by_group[4]"/>
+ </span>
+ </td>
+ <td class="text-right o_price_total">
+ <span class="text-nowrap" t-esc="amount_by_group[3]"/>
+ </td>
+ </t>
+ </tr>
+ </t>
+ <tr class="border-black o_total">
+ <td><strong>Total</strong></td>
+ <td class="text-right">
+ <span class="text-nowrap" t-field="o.amount_total"/>
+ </td>
+ </tr>
+ <t t-if="print_with_payments">
+ <t t-if="o.payment_state != 'invoicing_legacy'">
+ <t t-set="payments_vals" t-value="o.sudo()._get_reconciled_info_JSON_values()"/>
+ <t t-foreach="payments_vals" t-as="payment_vals">
+ <tr>
+ <td>
+ <i class="oe_form_field text-right oe_payment_label">Paid on <t t-esc="payment_vals['date']" t-options='{"widget": "date"}'/></i>
+ </td>
+ <td class="text-right">
+ <span t-esc="payment_vals['amount']" t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
+ </td>
+ </tr>
+ </t>
+ <t t-if="len(payments_vals) > 0">
+ <tr class="border-black">
+ <td><strong>Amount Due</strong></td>
+ <td class="text-right">
+ <span t-field="o.amount_residual"/>
+ </td>
+ </tr>
+ </t>
+ </t>
+ </t>
+ </table>
+ </div>
+ </div>
+ </div>
+ <p t-if="o.move_type in ('out_invoice', 'in_refund') and o.payment_reference" name="payment_communication">
+ Please use the following communication for your payment : <b><span t-field="o.payment_reference"/></b>
+ </p>
+ <p t-if="o.invoice_payment_term_id" name="payment_term">
+ <span t-field="o.invoice_payment_term_id.note"/>
+ </p>
+ <p t-if="o.narration" name="comment">
+ <span t-field="o.narration"/>
+ </p>
+ <p t-if="o.fiscal_position_id.note" name="note">
+ <span t-field="o.fiscal_position_id.note"/>
+ </p>
+ <p t-if="o.invoice_incoterm_id" name="incoterm">
+ <strong>Incoterm: </strong><span t-field="o.invoice_incoterm_id.code"/> - <span t-field="o.invoice_incoterm_id.name"/>
+ </p>
+ <div id="qrcode" t-if="o.display_qr_code">
+ <p t-if="qr_code_urls.get(o.id)">
+ <strong class="text-center">Scan me with your banking app.</strong><br/><br/>
+ <img class="border border-dark rounded" t-att-src="qr_code_urls[o.id]"/>
+ </p>
+ </div>
+ </div>
+ </t>
+ </template>
+
+ <template id="report_invoice">
+ <t t-call="web.html_container">
+ <t t-foreach="docs" t-as="o">
+ <t t-set="lang" t-value="o.invoice_user_id.sudo().lang if o.move_type in ('in_invoice', 'in_refund') else o.partner_id.lang"/>
+ <t t-if="o._get_name_invoice_report() == 'account.report_invoice_document'"
+ t-call="account.report_invoice_document" t-lang="lang"/>
+ </t>
+ </t>
+ </template>
+
+ <template id="report_invoice_with_payments">
+ <t t-call="web.html_container">
+ <t t-foreach="docs" t-as="o">
+ <t t-set="lang" t-value="o.invoice_user_id.sudo().lang if o.move_type in ('in_invoice', 'in_refund') else o.partner_id.lang"/>
+ <t t-set="print_with_payments" t-value="True"/>
+ <t t-if="o._get_name_invoice_report() == 'account.report_invoice_document'"
+ t-call="account.report_invoice_document" t-lang="lang"/>
+ </t>
+ </t>
+ </template>
+
+ <!--We need to create the following empty report template for the action report
+ "action_account_original_vendor_bill" to work. The action is merging the
+ original vendor bill(s) that were used to create the vendor bill(s) into one PDF. -->
+ <template id="report_original_vendor_bill">
+ <t t-call="web.html_container">
+ <t t-foreach="docs" t-as="o">
+ <div class="article" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')"></div>
+ </t>
+ </t>
+ </template>
+ </data>
+</odoo>