diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/l10n_ch/report | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/l10n_ch/report')
| -rw-r--r-- | addons/l10n_ch/report/__init__.py | 3 | ||||
| -rw-r--r-- | addons/l10n_ch/report/isr_report.xml | 163 | ||||
| -rw-r--r-- | addons/l10n_ch/report/swissqr_report.py | 22 | ||||
| -rw-r--r-- | addons/l10n_ch/report/swissqr_report.xml | 163 |
4 files changed, 351 insertions, 0 deletions
diff --git a/addons/l10n_ch/report/__init__.py b/addons/l10n_ch/report/__init__.py new file mode 100644 index 00000000..304ccd1f --- /dev/null +++ b/addons/l10n_ch/report/__init__.py @@ -0,0 +1,3 @@ +# -*- coding:utf-8 -*- + +from . import swissqr_report
\ No newline at end of file diff --git a/addons/l10n_ch/report/isr_report.xml b/addons/l10n_ch/report/isr_report.xml new file mode 100644 index 00000000..58f09b55 --- /dev/null +++ b/addons/l10n_ch/report/isr_report.xml @@ -0,0 +1,163 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <data> + + <record id="paperformat_euro_no_margin" model="report.paperformat"> + <field name="name">European A4 without borders</field> + <field name="default" eval="False" /> + <field name="format">A4</field> + <field name="orientation">Portrait</field> + <field name="margin_top">0</field> + <field name="margin_bottom">0</field> + <field name="margin_left">0</field> + <field name="margin_right">0</field> + <field name="header_line" eval="False" /> + <field name="header_spacing">0</field> + </record> + + <!--Report containing an ISR corrresponding to an invoice.--> + <record id="l10n_ch_isr_report" model="ir.actions.report"> + <field name="name">ISR</field> + <field name="model">account.move</field> + <field name="report_type">qweb-pdf</field> + <field name="report_name">l10n_ch.isr_report_main</field> + <field name="report_file">l10n_ch.isr_report_main</field> + <field name="print_report_name">'ISR-%s' % object.name</field> + <field name="paperformat_id" ref="paperformat_euro_no_margin"/> + <field name="attachment">'ISR-' + object.name + '.pdf'</field> + <field name="attachment_use">True</field> + </record> + <!--No additional condition in report name on invoice state or type as this + report is only available to be printed for out invoices after + 'draft' state, if the fields required by the ISR have been set.--> + + <template id="assets_common" name="l10n_ch_isr_report" inherit_id="web.report_assets_common"> + <xpath expr="." position="inside"> + <link rel="stylesheet" type="text/scss" href="/l10n_ch/static/src/scss/report_isr.scss"/> + </xpath> + </template> + + <template id="l10n_ch_isr_report_template"> + <t t-call="web.external_layout"> + <t t-set="split_total_amount" t-value="invoice.split_total_amount()"/> + <t t-set="print_bank" t-value="invoice.company_id.l10n_ch_isr_print_bank_location"/> + + <!-- add class to body tag --> + <script>document.body.className += " l10n_ch_isr";</script> + + <!-- since the body content take the whole page we need a way to add margin + back on content outside the ISR so it does not overlap with the header --> + <div id="content_outside_isr"> + <h1>ISR for invoice <t t-esc="invoice.name"/></h1> + </div> + + <div id="isr" t-att-class="'isr-print-bank' if print_bank else None"> + + <!--Voucher, left part of the ISR.--> + <div id="voucher"> + <!--Einzahlung für/Versement pour/Versamento per--> + + <!--If we use the alternate ISR layout, displaying name + and location of the bank.--> + <t t-if="print_bank"> + <div id="voucher-for-bank"> + <p t-if="not invoice.company_id.l10n_ch_isr_preprinted_bank"> + <t t-esc="invoice.partner_bank_id.bank_id.name"/><br /> + <t t-esc="invoice.partner_bank_id.bank_id.zip"/> + <t t-esc="invoice.partner_bank_id.bank_id.city"/> + </p> + </div> + <!--Zugunsten von/En faveur de/A favore di--> + </t> + <div id="voucher-for-contact"> + <p id="voucher-for_name" t-field="invoice.company_id.display_name"/> + <p id="voucher-for_address1" t-field="invoice.company_id.street"/> + <p id="voucher-for_address2" t-field="invoice.company_id.street2"/> + <p id="voucher-for_address3"> + <t t-esc="invoice.company_id.zip"/> + <t t-esc="invoice.company_id.city"/> + </p> + </div> + + <div id="voucher-bank" t-if="not print_bank or not invoice.company_id.l10n_ch_isr_preprinted_account"> + <!--Konto/Compte/Conto--> + <p id="voucher-bank_ref" t-field="invoice.l10n_ch_isr_subscription_formatted"/> + </div> + + <p id="voucher-amount_units" t-esc="split_total_amount[0]"/> + <p id="voucher-amount_cents" t-esc="split_total_amount[1]"/> + + <div id="voucher-by"> + <!--Einbezahlt von/Versé par/Versato da--> + <p id="voucher-by_reference_number" t-field="invoice.l10n_ch_isr_number"/> + <address id="voucher-by_customer_address" t-field="invoice.partner_id" t-options='{"widget": "contact", "fields": ["address","name"], "no_marker": True}' /> + </div> + </div> + + <!--Slip, right part of the ISR.--> + <div id="slip"> + <!--Einzahlung für/Versement pour/Versamento per--> + + <!--If we use the alternate ISR layout, displaying name + and location of the bank.--> + <t t-if="print_bank"> + <div id="slip-for-bank"> + <p t-if="not invoice.company_id.l10n_ch_isr_preprinted_bank"> + <t t-esc="invoice.partner_bank_id.bank_id.name"/><br /> + <t t-esc="invoice.partner_bank_id.bank_id.zip"/> + <t t-esc="invoice.partner_bank_id.bank_id.city"/> + </p> + </div> + <!--Zugunsten von/En faveur de/A favore di--> + </t> + + <div id="slip-for-contact"> + <p id="slip-for_name" t-field="invoice.company_id.display_name"/> + <p id="slip-for_address1" t-field="invoice.company_id.street"/> + <p id="slip-for_address2" t-field="invoice.company_id.street2"/> + <p id="slip-for_address3"> + <t t-esc="invoice.company_id.zip"/> + <t t-esc="invoice.company_id.city"/> + </p> + </div> + + <div id="slip-bank" t-if="not print_bank or not invoice.company_id.l10n_ch_isr_preprinted_account"> + <!--Konto/Compte/Conto--> + <!--aka ISR Subscriber number provided by the financial institution--> + <p id="slip-bank_ref" t-field="invoice.l10n_ch_isr_subscription_formatted"/> + </div> + + <p id="slip-amount_units" t-esc="split_total_amount[0]"/> + <p id="slip-amount_cents" t-esc="split_total_amount[1]"/> + + <div id="slip-reference"> + <!--Referenz-Nr./N°de référence/N°di riferimento--> + <p id="slip-reference_number" t-field="invoice.l10n_ch_isr_number_spaced"/> + </div> + + <div id="slip-by"> + <!--Einbezahlt von/Versé par/Versato da--> + <address id="slip-by_customer_address" t-field="invoice.partner_id" t-options='{"widget": "contact", "fields": ["address","name"], "no_marker": True}' /> + </div> + + <div id="slip-optical-line"> + <!--Optical reference--> + <div t-attf-style="top: {{ invoice.company_id.l10n_ch_isr_scan_line_top }}mm; left: {{ invoice.company_id.l10n_ch_isr_scan_line_left }}mm;"> + <div t-foreach="invoice.l10n_ch_isr_optical_line" t-as="char" t-esc="char" t-attf-style="right: {{ round((char_size - char_index - 1) * 0.1, 1) }}in"/> + </div> + </div> + </div> + </div> + </t> + </template> + + <template id="l10n_ch.isr_report_main"> + <t t-call="web.html_container"> + <t t-foreach="docs" t-as="invoice"> + <t t-set="o" t-value="invoice"/> + <t t-call="l10n_ch.l10n_ch_isr_report_template"/> + </t> + </t> + </template> + </data> +</odoo> diff --git a/addons/l10n_ch/report/swissqr_report.py b/addons/l10n_ch/report/swissqr_report.py new file mode 100644 index 00000000..9c3efd91 --- /dev/null +++ b/addons/l10n_ch/report/swissqr_report.py @@ -0,0 +1,22 @@ +# -*- coding:utf-8 -*- + +from odoo import api, models + +class ReportSwissQR(models.AbstractModel): + _name = 'report.l10n_ch.qr_report_main' + _description = 'Swiss QR-bill report' + + @api.model + def _get_report_values(self, docids, data=None): + docs = self.env['account.move'].browse(docids) + + qr_code_urls = {} + for invoice in docs: + qr_code_urls[invoice.id] = invoice.partner_bank_id.build_qr_code_url(invoice.amount_residual, invoice.ref or invoice.name, invoice.payment_reference, invoice.currency_id, invoice.partner_id, qr_method='ch_qr', silent_errors=False) + + return { + 'doc_ids': docids, + 'doc_model': 'account.move', + 'docs': docs, + 'qr_code_urls': qr_code_urls, + }
\ No newline at end of file diff --git a/addons/l10n_ch/report/swissqr_report.xml b/addons/l10n_ch/report/swissqr_report.xml new file mode 100644 index 00000000..4d9181f1 --- /dev/null +++ b/addons/l10n_ch/report/swissqr_report.xml @@ -0,0 +1,163 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <data> + + <record id="l10n_ch_qr_report" model="ir.actions.report"> + <field name="name">QR-bill</field> + <field name="model">account.move</field> + <field name="report_type">qweb-pdf</field> + <field name="report_name">l10n_ch.qr_report_main</field> + <field name="report_file">l10n_ch.qr_report_main</field> + <field name="print_report_name">'QR-bill-%s' % object.name</field> + <field name="paperformat_id" ref="l10n_ch.paperformat_euro_no_margin"/> + <field name="attachment">'QR-bill-' + object.name + '.pdf'</field> + </record> + + <template id="assets_common_qr" inherit_id="web.report_assets_common"> + <xpath expr="." position="inside"> + <link type="text/scss" rel="stylesheet" href="/l10n_ch/static/src/scss/report_swissqr.scss"/> + </xpath> + </template> + + <template id="l10n_ch_swissqr_template"> + <t t-set="o" t-value="o.with_context(lang=lang)"/> + <t t-call="web.external_layout"> + <!-- add class to body tag --> + <script>document.body.className += " l10n_ch_qr";</script> + <!-- add default margin for header (matching A4 European margin) --> + <t t-set="report_header_style">padding-top:6.2mm; padding-left:8.2mm; padding-right:8.2mm;</t> + + <t t-set="formated_amount" t-value="'{:,.2f}'.format(o.amount_residual).replace(',','\xa0')"/> + + <div class="swissqr_title"> + <h1>QR-bill for invoice <t t-esc="o.name"/></h1> + </div> + + <div class="swissqr_content"> + + <div class="swissqr_receipt"> + <div id="receipt_title_zone" class="main_title swissqr_column_left"> + <span>Receipt</span> + </div> + + <div id="receipt_indication_zone" class="swissqr_column_left receipt_indication_zone"> + <div class="swissqr_text"> + <span class="title">Account / Payable to</span><br/> + <span class="content" t-field="o.partner_bank_id.acc_number"/><br/> + <span class="content" t-field="o.company_id.name"/><br/> + <span class="content" t-field="o.company_id.street"/><br/> + <span class="content" t-field="o.company_id.country_id.code"/> + <span class="content" t-field="o.company_id.zip"/> + <span class="content" t-field="o.company_id.city"/><br/> + </div> + + <t t-if="o.partner_bank_id._is_qr_iban()"> + <div class="swissqr_text"> + <span class="title">Reference</span><br/> + <span class="content" t-esc="o.space_qrr_reference(o.payment_reference)"/><br/> + </div> + </t> + + <div class="swissqr_text"> + <span class="title">Payable by</span><br/> + <span class="content" t-field="o.partner_id.commercial_partner_id.name"/><br/> + <span class="content" t-field="o.partner_id.street"> </span> + <span class="content" t-field="o.partner_id.street2"/><br/> + <span class="content" t-field="o.partner_id.country_id.code"/> + <span class="content" t-field="o.partner_id.zip"/> + <span class="content" t-field="o.partner_id.city"/><br/> + </div> + + </div> + <div id="receipt_amount_zone" class="swissqr_column_left receipt_amount_zone"> + <div class="swissqr_text"> + <div class="column"> + <span class="title">Currency</span><br/> + <span class="content" t-field="o.currency_id.name"/> + </div> + <div class="column"> + <span class="title">Amount</span><br/> + <span class="content" t-esc="formated_amount"/> + </div> + </div> + </div> + + <div id="receipt_acceptance_point_zone" class="receipt_acceptance_point_zone"> + <div class="swissqr_text content"> + <span class="title">Acceptance point</span> + </div> + </div> + </div> + + <div class="swissqr_body"> + <div class="main_title swissqr_column_left"> + <span>Payment Part</span> + </div> + + <img class="swissqr" t-att-src="qr_code_urls[o.id]"/> + + <div id="indications_zone" class="swissqr_column_right indication_zone"> + <div class="swissqr_text"> + <span class="title">Account / Payable to</span><br/> + <span class="content" t-field="o.partner_bank_id.acc_number"/><br/> + <span class="content" t-field="o.company_id.name"/><br/> + <span class="content" t-field="o.company_id.street"/><br/> + <span class="content" t-field="o.company_id.country_id.code"/> + <span class="content" t-field="o.company_id.zip"/> + <span class="content" t-field="o.company_id.city"/><br/> + </div> + + <t t-if="o.partner_bank_id._is_qr_iban()"> + <div class="swissqr_text"> + <span class="title">Reference</span><br/> + <span class="content" t-esc="o.space_qrr_reference(o.payment_reference)"/><br/> + </div> + </t> + + <t t-set="additional_info" t-value="(o.ref or o.name if o.partner_bank_id._is_qr_iban() else o.payment_reference or o.ref or o.name)"/> + <t t-if="additional_info"> + <div class="swissqr_text"> + <span class="title">Additional information</span><br/> + <span class="content" t-esc="additional_info"/> + </div> + </t> + + <div class="swissqr_text"> + <span class="title">Payable by</span><br/> + <span class="content" t-field="o.partner_id.commercial_partner_id.name"/><br/> + <span class="content" t-field="o.partner_id.street"> </span> + <span class="content" t-field="o.partner_id.street2"/><br/> + <span class="content" t-field="o.partner_id.country_id.code"/> + <span class="content" t-field="o.partner_id.zip"/> + <span class="content" t-field="o.partner_id.city"/><br/> + </div> + + </div> + <div id="amount_zone" class="swissqr_column_left amount_zone"> + <div class="swissqr_text"> + <div class="column"> + <span class="title">Currency</span><br/> + <span class="content" t-field="o.currency_id.name"/> + </div> + <div class="column"> + <span class="title">Amount</span><br/> + <span class="content" t-esc="formated_amount"/> + </div> + </div> + </div> + </div> + + </div> + </t> + </template> + + <template id="l10n_ch.qr_report_main"> + <t t-call="web.html_container"> + <t t-foreach="docs" t-as="o"> + <t t-set="lang" t-value="o.partner_id.lang"/> + <t t-call="l10n_ch.l10n_ch_swissqr_template" t-lang="lang"/> + </t> + </t> + </template> + </data> +</odoo> |
