Skip to content

Commit

Permalink
[MIG] account_invoice_qr_code_sepa_payconiq: Migration to 16.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Samir GUESMI committed Oct 29, 2024
1 parent 79715a9 commit 7c21932
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 54 deletions.
23 changes: 13 additions & 10 deletions account_invoice_qr_code_sepa_payconiq/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@
Account Invoice Qr Code Sepa Payconiq
=====================================

.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:0211e221ca8675a6785589d60584e334602617ea0c90110a42c4812af441b20e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
Expand All @@ -14,16 +17,16 @@ Account Invoice Qr Code Sepa Payconiq
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--invoicing-lightgray.png?logo=github
:target: https://github.com/OCA/account-invoicing/tree/14.0/account_invoice_qr_code_sepa_payconiq
:target: https://github.com/OCA/account-invoicing/tree/16.0/account_invoice_qr_code_sepa_payconiq
:alt: OCA/account-invoicing
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/account-invoicing-14-0/account-invoicing-14-0-account_invoice_qr_code_sepa_payconiq
:target: https://translation.odoo-community.org/projects/account-invoicing-16-0/account-invoicing-16-0-account_invoice_qr_code_sepa_payconiq
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/95/14.0
:alt: Try me on Runbot
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/account-invoicing&target_branch=16.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|
|badge1| |badge2| |badge3| |badge4| |badge5|

This module allows to generate a QR code to be displayed on invoices.

Expand Down Expand Up @@ -59,8 +62,8 @@ Bug Tracker

Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-invoicing/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/account-invoicing/issues/new?body=module:%20account_invoice_qr_code_sepa_payconiq%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/account-invoicing/issues/new?body=module:%20account_invoice_qr_code_sepa_payconiq%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Expand Down Expand Up @@ -90,6 +93,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/account-invoicing <https://github.com/OCA/account-invoicing/tree/14.0/account_invoice_qr_code_sepa_payconiq>`_ project on GitHub.
This module is part of the `OCA/account-invoicing <https://github.com/OCA/account-invoicing/tree/16.0/account_invoice_qr_code_sepa_payconiq>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
2 changes: 1 addition & 1 deletion account_invoice_qr_code_sepa_payconiq/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"name": "Account Invoice Qr Code Sepa Payconiq",
"summary": """
Allows to generate a qr code for Payconiq provider containing the url""",
"version": "14.0.1.0.0",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "ACSONE SA/NV,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/account-invoicing",
Expand Down
12 changes: 9 additions & 3 deletions account_invoice_qr_code_sepa_payconiq/models/res_partner_bank.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,14 +92,18 @@ def _get_qr_code_url(
structured_communication,
)

def _eligible_for_qr_code(self, qr_method, debtor_partner, currency):
def _eligible_for_qr_code(
self, qr_method, debtor_partner, currency, raises_error=True
):
if qr_method == "payconiq_qr":
return (
currency.name == "EUR"
and self.acc_type == "iban"
and self.sanitized_acc_number[:2] in ["LU"]
)
return super()._eligible_for_qr_code(qr_method, debtor_partner, currency)
return super()._eligible_for_qr_code(
qr_method, debtor_partner, currency, raises_error=raises_error
)

def _get_qr_code_base64(
self,
Expand Down Expand Up @@ -134,7 +138,9 @@ def _get_qr_code_base64(
"s": "S",
"c": c_url + urllib.parse.urlencode(params),
}
response = requests.get(PAYCONIQ_QR_URL, params=new_params, stream=True)
response = requests.get(
PAYCONIQ_QR_URL, params=new_params, stream=True, timeout=60
)
raw_image = response.raw
img = Image.open(raw_image)

Expand Down
58 changes: 31 additions & 27 deletions account_invoice_qr_code_sepa_payconiq/static/description/index.html
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Account Invoice Qr Code Sepa Payconiq</title>
<style type="text/css">

/*
:Author: David Goodger ([email protected])
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.

See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

Expand Down Expand Up @@ -275,7 +275,7 @@
margin-left: 2em ;
margin-right: 2em }

pre.code .ln { color: grey; } /* line numbers */
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
Expand All @@ -301,7 +301,7 @@
span.pre {
white-space: pre }

span.problematic {
span.problematic, pre.problematic {
color: red }

span.section-subtitle {
Expand Down Expand Up @@ -366,74 +366,78 @@ <h1 class="title">Account Invoice Qr Code Sepa Payconiq</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:0211e221ca8675a6785589d60584e334602617ea0c90110a42c4812af441b20e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/account-invoicing/tree/14.0/account_invoice_qr_code_sepa_payconiq"><img alt="OCA/account-invoicing" src="https://img.shields.io/badge/github-OCA%2Faccount--invoicing-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-invoicing-14-0/account-invoicing-14-0-account_invoice_qr_code_sepa_payconiq"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/95/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/account-invoicing/tree/16.0/account_invoice_qr_code_sepa_payconiq"><img alt="OCA/account-invoicing" src="https://img.shields.io/badge/github-OCA%2Faccount--invoicing-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/account-invoicing-16-0/account-invoicing-16-0-account_invoice_qr_code_sepa_payconiq"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/account-invoicing&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module allows to generate a QR code to be displayed on invoices.</p>
<p>This differs from the SEPA QR Code as Payconiq in some countries (e.g.: LU)
requires invoices emitters to pay a fee per paid transactions through this mean.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id3">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id7">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id8">Maintainers</a></li>
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="toc-entry-3">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-7">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-8">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<ol class="arabic simple">
<li>Go to Accounting &gt; Settings &gt; Customer Payments &gt; QR Codes</li>
</ol>
<p>Fill in the Payconiq Profile Id you’ve been given.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>See Odoo documentation for SEPA QR code.</p>
<p><a class="reference external" href="https://www.odoo.com/documentation/master/applications/finance/accounting/receivables/customer_invoices/epc_qr_code.html">https://www.odoo.com/documentation/master/applications/finance/accounting/receivables/customer_invoices/epc_qr_code.html</a></p>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id3">Known issues / Roadmap</a></h1>
<h1><a class="toc-backref" href="#toc-entry-3">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>At the time being, this is only available in Luxembourg.</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id4">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#toc-entry-4">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-invoicing/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/account-invoicing/issues/new?body=module:%20account_invoice_qr_code_sepa_payconiq%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/account-invoicing/issues/new?body=module:%20account_invoice_qr_code_sepa_payconiq%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id5">Credits</a></h1>
<h1><a class="toc-backref" href="#toc-entry-5">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id6">Authors</a></h2>
<h2><a class="toc-backref" href="#toc-entry-6">Authors</a></h2>
<ul class="simple">
<li>ACSONE SA/NV</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id7">Contributors</a></h2>
<h2><a class="toc-backref" href="#toc-entry-7">Contributors</a></h2>
<ul class="simple">
<li>Denis Roussel &lt;<a class="reference external" href="mailto:denis.roussel&#64;acsone.eu">denis.roussel&#64;acsone.eu</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id8">Maintainers</a></h2>
<h2><a class="toc-backref" href="#toc-entry-8">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-invoicing/tree/14.0/account_invoice_qr_code_sepa_payconiq">OCA/account-invoicing</a> project on GitHub.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-invoicing/tree/16.0/account_invoice_qr_code_sepa_payconiq">OCA/account-invoicing</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
Expand Down
50 changes: 37 additions & 13 deletions account_invoice_qr_code_sepa_payconiq/tests/test_payconiq_qr.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
# Copyright 2022 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import urllib
from unittest import mock

import mock
import qrcode
import requests
import urllib3
from urllib3._collections import HTTPHeaderDict

from odoo.tests import Form, SavepointCase
from odoo.tests import Form
from odoo.tests.common import TransactionCase


def get_image():
Expand All @@ -34,20 +35,25 @@ def mocked_requests_get(*args, **kwargs):
return response


class TestAccountInvoicePayconiq(SavepointCase):
class TestAccountInvoicePayconiq(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# Create a Luxembourgish company with at least a bank account

# Create a Luxembourgish company with EUR currency
cls.company = cls.env["res.company"].create(
{
"name": "Lux Company",
"currency_id": cls.env.ref("base.EUR").id,
}
)

# Load chart of accounts for the new company
cls.env["account.chart.template"].browse(1).with_company(
cls.company
).try_loading()
cls.company.currency_id = cls.env.ref("base.EUR")

# Create a pricelist in EUR and ensure the currency aligns
pricelist = cls.env["product.pricelist"].create(
{
"name": "Pricelist EUR",
Expand All @@ -66,22 +72,31 @@ def setUpClass(cls):
],
}
)

# Create a bank account for the company
cls.env["res.partner.bank"].create(
{
"acc_number": "LU 28 001 9400644750000",
"acc_number": "LU280019400644750000",
"partner_id": cls.company.partner_id.id,
"company_id": cls.company.id,
}
)
cls.company.qr_code = True
# Set the Payconiq profile
cls.company.payconiq_qr_profile_id = "1234567890"

# Create an invoice with EUR as the currency
cls.account_move = cls.env["account.move"]
# Create a customer invoice
invoice_form = Form(
cls.account_move.with_context(default_move_type="out_invoice").with_company(
cls.company
)
cls.invoice = cls.env["account.move"].create(
{
"name": "Test Invoice",
"move_type": "out_invoice",
"currency_id": cls.env.ref("base.EUR").id,
"company_id": cls.company.id,
}
)

# Create a user and set it up for the Luxembourgish company
cls.user = cls.env["res.users"].create(
{
"name": "My Lux User",
Expand All @@ -91,27 +106,36 @@ def setUpClass(cls):
}
)
cls.user.groups_id |= cls.env.ref("account.group_account_manager")

# Change Environment to make all operations in user's Lux company
cls.env = cls.env(
context=dict(cls.env.context, tracking_disable=True, user=cls.user)
)

# Create a partner and link it to the EUR pricelist
cls.partner = cls.env["res.partner"].create(
{"name": "test partner", "property_product_pricelist": pricelist.id}
)

# Create an invoice line through a form to ensure currency consistency
invoice_form = Form(cls.invoice)
invoice_form.partner_id = cls.partner
invoice_form.currency_id = cls.env.ref("base.EUR")

with invoice_form.invoice_line_ids.new() as line_form:
line_form.name = "Test invoice line"
line_form.price_unit = 30.1
line_form.tax_ids.clear()
cls.invoice = invoice_form.save()

# Set QR code method to Payconiq
cls.invoice.qr_code_method = "payconiq_qr"

def test_payconiq(self):
with mock.patch("requests.get", side_effect=mocked_requests_get), mock.patch(
"PIL.Image.open"
) as image_mock:
image_mock.return_value = get_image()
url = self.invoice.generate_qr_code()
url = self.invoice._generate_qr_code()

self.assertTrue(url)
self.assertIn(
Expand Down
6 changes: 6 additions & 0 deletions setup/account_invoice_qr_code_sepa_payconiq/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

0 comments on commit 7c21932

Please sign in to comment.