2
0

Merge PR #1572 into 16.0

Signed-off-by rafaelbn
This commit is contained in:
OCA-git-bot 2023-02-02 15:44:32 +00:00
commit e72fa0b085
21 changed files with 945 additions and 0 deletions

View File

@ -0,0 +1,112 @@
===================================
Optional validation of VAT via VIES
===================================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
: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--financial--tools-lightgray.png?logo=github
:target: https://github.com/OCA/account-financial-tools/tree/15.0/base_vat_optional_vies
:alt: OCA/account-financial-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/account-financial-tools-15-0/account-financial-tools-15-0-base_vat_optional_vies
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/92/15.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends base_vat module features allowing to know if VIES
validation was passed or not.
Then you can use "VIES validation passed" field in order to show VAT ID with
or without country preffix in invoices, for instance.
*NOTE*: Although VIES validation is set in your company, this validation
will not block VAT ID write (main difference to Odoo standard behavior) if this
VAT ID is valid in its country.
**Table of contents**
.. contents::
:local:
Configuration
=============
In order to activate VIES validation, you must set this option in Settings:
Settings > Account > Verify VAT Numbers
Usage
=====
When VIES VAT Check is activated:
* Odoo will try to validate VAT against VIES online service
* If passed, then "VIES validation passed" field will be True
* If not passed, then try to validate using country validation method
* If validated, then "VIES validation passed" field will be False
* If not validated, then a ValidationError will be shown to user
When VIES VAT Check is not activated:
* "VIES validation passed" field will be always False
You must prefix VAT with country code (ISO 3166-1 alpha-2) and if you want to
bypass country validation you can use "EU" code
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-tools/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-financial-tools/issues/new?body=module:%20base_vat_optional_vies%0Aversion:%2015.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.
Credits
=======
Authors
~~~~~~~
* Tecnativa
Contributors
~~~~~~~~~~~~
* Rafael Blasco <rblasco@moduon.team>
* Antonio Espinosa <antonio.espinosa@tecnativa.com>
* Sergio Teruel <sergio.teruel@tecnativa.com>
* David Vidal <david.vidal@tecnativa.com>
* Rodrigo Bonilla <rodrigo.bonilla@factorlibre.com>
* Alexandre Díaz <alexandre.diaz@tecnativa.com>
* Harald Panten <harald.panten@sygel.es>
* Eduardo de Miguel <edu@moduon.team>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
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-financial-tools <https://github.com/OCA/account-financial-tools/tree/15.0/base_vat_optional_vies>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@ -0,0 +1 @@
from . import models

View File

@ -0,0 +1,17 @@
# Copyright 2015 Tecnativa - Antonio Espinosa
# Copyright 2016 Tecnativa - Sergio Teruel
# Copyright 2017 Tecnativa - David Vidal
# Copyright 2019 FactorLibre - Rodrigo Bonilla
# Copyright 2022 Moduon - Eduardo de Miguel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Optional validation of VAT via VIES",
"category": "Accounting",
"version": "16.0.1.0.0",
"depends": ["base_vat"],
"data": ["views/res_partner_view.xml"],
"author": "Tecnativa," "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/account-financial-tools",
"license": "AGPL-3",
"installable": True,
}

View File

View File

@ -0,0 +1,33 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_vat_optional_vies
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: base_vat_optional_vies
#: model:ir.model,name:base_vat_optional_vies.model_res_partner
msgid "Contact"
msgstr ""
#. module: base_vat_optional_vies
#: code:addons/base_vat_optional_vies/models/res_partner.py:0
#, python-format
msgid ""
"The VAT number [%(wrong_vat)s] for %(record_label)s does not seem to be valid. \n"
"Note: the expected format is %(expected_format)s"
msgstr ""
#. module: base_vat_optional_vies
#: model:ir.model.fields,field_description:base_vat_optional_vies.field_res_partner__vies_passed
#: model:ir.model.fields,field_description:base_vat_optional_vies.field_res_users__vies_passed
msgid "VIES validation"
msgstr ""

View File

@ -0,0 +1,37 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_vat_optional_vies
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-11-10 17:34+0000\n"
"Last-Translator: Galoperd <jvcsan@gmail.com>\n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.8\n"
#. module: base_vat_optional_vies
#: model:ir.model,name:base_vat_optional_vies.model_res_partner
msgid "Contact"
msgstr "Contacto"
#. module: base_vat_optional_vies
#: code:addons/base_vat_optional_vies/models/res_partner.py:0
#, python-format
msgid ""
"The VAT number [%(wrong_vat)s] for %(record_label)s does not seem to be "
"valid. \n"
"Note: the expected format is %(expected_format)s"
msgstr ""
#. module: base_vat_optional_vies
#: model:ir.model.fields,field_description:base_vat_optional_vies.field_res_partner__vies_passed
#: model:ir.model.fields,field_description:base_vat_optional_vies.field_res_users__vies_passed
msgid "VIES validation"
msgstr "Validación automática VIES"

View File

@ -0,0 +1,38 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_vat_optional_vies
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-11-12 15:34+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>\n"
"Language-Team: none\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 3.8\n"
#. module: base_vat_optional_vies
#: model:ir.model,name:base_vat_optional_vies.model_res_partner
msgid "Contact"
msgstr "Kontakt"
#. module: base_vat_optional_vies
#: code:addons/base_vat_optional_vies/models/res_partner.py:0
#, python-format
msgid ""
"The VAT number [%(wrong_vat)s] for %(record_label)s does not seem to be "
"valid. \n"
"Note: the expected format is %(expected_format)s"
msgstr ""
#. module: base_vat_optional_vies
#: model:ir.model.fields,field_description:base_vat_optional_vies.field_res_partner__vies_passed
#: model:ir.model.fields,field_description:base_vat_optional_vies.field_res_users__vies_passed
msgid "VIES validation"
msgstr "VIES Provjera"

View File

@ -0,0 +1,39 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_vat_optional_vies
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-07-29 12:06+0000\n"
"Last-Translator: Pedro Castro Silva <pedrocs@exo.pt>\n"
"Language-Team: none\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: base_vat_optional_vies
#: model:ir.model,name:base_vat_optional_vies.model_res_partner
msgid "Contact"
msgstr "Contacto"
#. module: base_vat_optional_vies
#: code:addons/base_vat_optional_vies/models/res_partner.py:0
#, python-format
msgid ""
"The VAT number [%(wrong_vat)s] for %(record_label)s does not seem to be "
"valid. \n"
"Note: the expected format is %(expected_format)s"
msgstr ""
"O NIF [%(wrong_vat)s] para %(record_label)s não parece válido. \n"
"Nota: o formato esperado é %(expected_format)s"
#. module: base_vat_optional_vies
#: model:ir.model.fields,field_description:base_vat_optional_vies.field_res_partner__vies_passed
#: model:ir.model.fields,field_description:base_vat_optional_vies.field_res_users__vies_passed
msgid "VIES validation"
msgstr "Validação do VIES"

View File

@ -0,0 +1 @@
from . import res_partner

View File

@ -0,0 +1,74 @@
# Copyright 2015 Tecnativa - Antonio Espinosa
# Copyright 2017 Tecnativa - David Vidal
# Copyright 2019 FactorLibre - Rodrigo Bonilla
# Copyright 2022 Moduon - Eduardo de Miguel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import _, api, fields, models
from odoo.addons.base_vat.models.res_partner import _ref_vat
class ResPartner(models.Model):
_inherit = "res.partner"
vies_passed = fields.Boolean(string="VIES validation", readonly=True)
@api.model
def simple_vat_check(self, country_code, vat_number):
res = super().simple_vat_check(country_code, vat_number)
partner = self._context.get("vat_partner")
if res is False and partner:
partner.update({"vies_passed": False})
elif partner:
if self.env.context.get("company_id"):
company = self.env["res.company"].browse(self.env.context["company_id"])
else:
company = self.env.company
if company.vat_check_vies:
self.vies_vat_check(country_code, vat_number)
return res
@api.model
def vies_vat_check(self, country_code, vat_number):
partner = self._context.get("vat_partner")
res = super().vies_vat_check(country_code, vat_number)
if res is False and partner:
partner.update({"vies_passed": False})
elif partner:
partner.update({"vies_passed": True})
return res
@api.constrains("vat", "country_id")
def check_vat(self):
self.update({"vies_passed": False})
for partner in self.sorted(lambda p: bool(p.commercial_partner_id)):
partner = partner.with_context(vat_partner=partner)
if (
partner.commercial_partner_id
and partner.commercial_partner_id != partner
):
partner.update(
{"vies_passed": partner.commercial_partner_id.vies_passed}
)
else:
super(ResPartner, partner).check_vat()
return True
@api.onchange("vat", "country_id")
def _onchange_check_vies(self):
self.update({"vies_passed": False})
return super(
ResPartner, self.with_context(vat_partner=self)
)._onchange_check_vies()
@api.model
def _build_vat_error_message(self, country_code, wrong_vat, record_label):
return "\n" + _(
"The VAT number [%(wrong_vat)s] for %(record_label)s does not seem to be valid. "
"\nNote: the expected format is %(expected_format)s",
wrong_vat=wrong_vat,
record_label=record_label,
expected_format=_ref_vat.get(
country_code, "'CC##' (CC=Country Code, ##=VAT Number)"
),
)

View File

@ -0,0 +1,2 @@
In order to activate VIES validation, you must set this option in Settings:
Settings > Account > Verify VAT Numbers

View File

@ -0,0 +1,8 @@
* Rafael Blasco <rblasco@moduon.team>
* Antonio Espinosa <antonio.espinosa@tecnativa.com>
* Sergio Teruel <sergio.teruel@tecnativa.com>
* David Vidal <david.vidal@tecnativa.com>
* Rodrigo Bonilla <rodrigo.bonilla@factorlibre.com>
* Alexandre Díaz <alexandre.diaz@tecnativa.com>
* Harald Panten <harald.panten@sygel.es>
* Eduardo de Miguel <edu@moduon.team>

View File

@ -0,0 +1,9 @@
This module extends base_vat module features allowing to know if VIES
validation was passed or not.
Then you can use "VIES validation passed" field in order to show VAT ID with
or without country preffix in invoices, for instance.
*NOTE*: Although VIES validation is set in your company, this validation
will not block VAT ID write (main difference to Odoo standard behavior) if this
VAT ID is valid in its country.

View File

@ -0,0 +1,14 @@
When VIES VAT Check is activated:
* Odoo will try to validate VAT against VIES online service
* If passed, then "VIES validation passed" field will be True
* If not passed, then try to validate using country validation method
* If validated, then "VIES validation passed" field will be False
* If not validated, then a ValidationError will be shown to user
When VIES VAT Check is not activated:
* "VIES validation passed" field will be always False
You must prefix VAT with country code (ISO 3166-1 alpha-2) and if you want to
bypass country validation you can use "EU" code

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,456 @@
<?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 0.15.1: http://docutils.sourceforge.net/" />
<title>Optional validation of VAT via VIES</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* 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 }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="optional-validation-of-vat-via-vies">
<h1 class="title">Optional validation of VAT via VIES</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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-financial-tools/tree/15.0/base_vat_optional_vies"><img alt="OCA/account-financial-tools" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-tools-15-0/account-financial-tools-15-0-base_vat_optional_vies"><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/92/15.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module extends base_vat module features allowing to know if VIES
validation was passed or not.</p>
<p>Then you can use “VIES validation passed” field in order to show VAT ID with
or without country preffix in invoices, for instance.</p>
<p><em>NOTE</em>: Although VIES validation is set in your company, this validation
will not block VAT ID write (main difference to Odoo standard behavior) if this
VAT ID is valid in its country.</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="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<p>In order to activate VIES validation, you must set this option in Settings:
Settings &gt; Account &gt; Verify VAT Numbers</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>When VIES VAT Check is activated:</p>
<ul class="simple">
<li>Odoo will try to validate VAT against VIES online service</li>
<li>If passed, then “VIES validation passed” field will be True</li>
<li>If not passed, then try to validate using country validation method</li>
<li>If validated, then “VIES validation passed” field will be False</li>
<li>If not validated, then a ValidationError will be shown to user</li>
</ul>
<p>When VIES VAT Check is not activated:</p>
<ul class="simple">
<li>“VIES validation passed” field will be always False</li>
</ul>
<p>You must prefix VAT with country code (ISO 3166-1 alpha-2) and if you want to
bypass country validation you can use “EU” code</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-tools/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-financial-tools/issues/new?body=module:%20base_vat_optional_vies%0Aversion:%2015.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="#id4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<ul class="simple">
<li>Rafael Blasco &lt;<a class="reference external" href="mailto:rblasco&#64;moduon.team">rblasco&#64;moduon.team</a>&gt;</li>
<li>Antonio Espinosa &lt;<a class="reference external" href="mailto:antonio.espinosa&#64;tecnativa.com">antonio.espinosa&#64;tecnativa.com</a>&gt;</li>
<li>Sergio Teruel &lt;<a class="reference external" href="mailto:sergio.teruel&#64;tecnativa.com">sergio.teruel&#64;tecnativa.com</a>&gt;</li>
<li>David Vidal &lt;<a class="reference external" href="mailto:david.vidal&#64;tecnativa.com">david.vidal&#64;tecnativa.com</a>&gt;</li>
<li>Rodrigo Bonilla &lt;<a class="reference external" href="mailto:rodrigo.bonilla&#64;factorlibre.com">rodrigo.bonilla&#64;factorlibre.com</a>&gt;</li>
<li>Alexandre Díaz &lt;<a class="reference external" href="mailto:alexandre.diaz&#64;tecnativa.com">alexandre.diaz&#64;tecnativa.com</a>&gt;</li>
<li>Harald Panten &lt;<a class="reference external" href="mailto:harald.panten&#64;sygel.es">harald.panten&#64;sygel.es</a>&gt;</li>
<li>Eduardo de Miguel &lt;<a class="reference external" href="mailto:edu&#64;moduon.team">edu&#64;moduon.team</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id7">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>
<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-financial-tools/tree/15.0/base_vat_optional_vies">OCA/account-financial-tools</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>
</div>
</body>
</html>

View File

@ -0,0 +1 @@
from . import test_res_partner

View File

@ -0,0 +1,83 @@
# Copyright 2015 Tecnativa - Antonio Espinosa
# Copyright 2016 Tecnativa - Sergio Teruel
# Copyright 2017 Tecnativa - David Vidal
# Copyright 2022 Moduon - Eduardo de Miguel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from unittest.mock import patch
from odoo.exceptions import ValidationError
from odoo.tests import common
class TestResPartner(common.TransactionCase):
@classmethod
def setUpClass(cls):
def check_vies(vat_number):
return {"valid": vat_number == "ESB87530432"}
super().setUpClass()
cls.company = cls.env.user.company_id
cls.company.vat_check_vies = True
cls.partner = cls.env["res.partner"].create(
{"name": "Test partner", "is_company": True}
)
cls.vatnumber_path = "odoo.addons.base_vat.models.res_partner.check_vies"
cls._vies_check_func = check_vies
def test_validate_vat_vies(self):
with patch(self.vatnumber_path, type(self)._vies_check_func):
values = {"vat": "ESB87530432", "country_id": self.env.ref("base.be").id}
field_onchange = self.partner._onchange_spec()
result = self.partner.onchange(
values=values,
field_name=["vat", "country_id"],
field_onchange=field_onchange,
)
self.assertEqual(result.get("value", {}).get("vies_passed"), True)
self.assertEqual(self.partner.vies_passed, False)
self.partner.write(values)
self.assertEqual(self.partner.vies_passed, True)
def test_exception_vat_vies(self):
with patch(self.vatnumber_path, side_effect=Exception()):
values = {"vat": "87530432", "country_id": self.env.ref("base.es").id}
field_onchange = self.partner._onchange_spec()
result = self.partner.onchange(
values=values,
field_name=["vat", "country_id"],
field_onchange=field_onchange,
)
self.assertEqual(result.get("value", {}).get("vies_passed"), True)
with self.assertRaises(ValidationError):
self.partner.write(values)
self.assertEqual(self.partner.vies_passed, False)
def test_no_validate_vat(self):
with patch(self.vatnumber_path) as mock_vatnumber:
mock_vatnumber.check_vies.return_value = False
with self.assertRaises(ValidationError):
self.partner.vat = "ESB11"
self.assertEqual(self.partner.vies_passed, False)
def test_validate_simple_vat_vies(self):
with patch(self.vatnumber_path) as mock_vatnumber:
self.company.vat_check_vies = False
mock_vatnumber.check_vies.return_value = False
self.partner.vat = "MXGODE561231GR8"
self.partner.country_id = self.env.ref("base.mx")
self.assertEqual(self.partner.vies_passed, False)
def test_validate_vies_passed_false_when_vat_set_to_false(self):
with patch(self.vatnumber_path) as mock_vatnumber:
mock_vatnumber.check_vies.return_value = True
self.partner.vat = "ESB87530432"
self.partner.country_id = self.env.ref("base.be")
self.assertEqual(self.partner.vies_passed, True)
self.partner.vat = False
self.assertEqual(self.partner.vies_passed, False)
def test_validate_wrong_vat_shows_simple_message(self):
with self.assertRaisesRegex(ValidationError, "does not seem to be valid"):
self.partner.vat = "ES11111111A"

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">Add VIES passed fields</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<field name="vat" position="after">
<field name="vies_passed" force_save="1" />
</field>
</field>
</record>
</odoo>

View File

@ -0,0 +1 @@
../../../../base_vat_optional_vies

View File

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)