Skip to content

[FIX] l10n_it_split_payment: fix compute of split payment writeoff when creating two lines at once with different vat amount #4783

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: 16.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 37 additions & 32 deletions l10n_it_split_payment/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -52,34 +52,34 @@ Configuration

Per configurare questo modulo è necessario:

- andare in Contabilità → Configurazione → Impostazioni e configura
"Conto storno scissione pagamenti" (es. 'IVA n/debito sospesa SP'). Il
conto storno dovrebbe essere diverso dall'IVA a debito standard, in
modo da aggiungerlo separatamente nella dichiarazione IVA.
- andare in Contabilità → Configurazione → Impostazioni e configura
"Conto storno scissione pagamenti" (es. 'IVA n/debito sospesa SP').
Il conto storno dovrebbe essere diverso dall'IVA a debito standard,
in modo da aggiungerlo separatamente nella dichiarazione IVA.

**English**

To configure this module, you need to:

- go to Accounting → Configuration → Settings and configure 'Split
Payment Write-off account' (like 'IVA n/debito sospesa SP'). Write-off
account should be different from standard debit VAT, in order to
separately add it in VAT statement.
- go to Accounting → Configuration → Settings and configure 'Split
Payment Write-off account' (like 'IVA n/debito sospesa SP').
Write-off account should be different from standard debit VAT, in
order to separately add it in VAT statement.

|image1|

--------------

**Italiano**

- aggiungere una nuova imposta (Contabilità → Configurazione →
Contabilità → Imposte). IVA al 22% SPL deve essere configurata nel
modo seguente:
- aggiungere una nuova imposta (Contabilità → Configurazione →
Contabilità → Imposte). IVA al 22% SPL deve essere configurata nel
modo seguente:

**English**

- add a new tax (Accounting → Configuration → Accounting → Taxes). IVA
al 22% SPL should be configured like the following:
- add a new tax (Accounting → Configuration → Accounting → Taxes). IVA
al 22% SPL should be configured like the following:

|image2|

Expand All @@ -89,17 +89,18 @@ To configure this module, you need to:

**Italiano**

- configurare la posizione fiscale (Contabilità → Configurazione →
Contabilità → Posizioni fiscali) usata per la scissione dei pagamenti,
selezionando la casella "Scissione pagamenti". Nella posizione fiscale
mappare l'IVA standard con l'IVA SP, come indicato di seguito:
- configurare la posizione fiscale (Contabilità → Configurazione →
Contabilità → Posizioni fiscali) usata per la scissione dei
pagamenti, selezionando la casella "Scissione pagamenti". Nella
posizione fiscale mappare l'IVA standard con l'IVA SP, come indicato
di seguito:

**English**

- configure the fiscal position (Accounting → Configuration → Accounting
→ Fiscal Positions) used for split payment, setting 'Split Payment'
flag. In fiscal position, map standard VAT with SP VAT, like the
following:
- configure the fiscal position (Accounting → Configuration →
Accounting → Fiscal Positions) used for split payment, setting 'Split
Payment' flag. In fiscal position, map standard VAT with SP VAT, like
the following:

|image4|

Expand Down Expand Up @@ -143,17 +144,21 @@ Authors
Contributors
------------

- Davide Corio <davide.corio@abstract.it>
- Lorenzo Battistini <lorenzo.battistini@agilebg.com>
- Alessio Gerace <alessio.gerace@agilebg.com>
- Giacomo Grasso <giacomo.grasso.82@gmail.com>
- Ruben Tonetto <https://github.com/ruben-tonetto>
- Giuseppe Borruso - Dinamiche Aziendali srl
<gborruso@dinamicheaziendali.it>
- Alex Comba <alex.comba@agilebg.com>
- `Ooops <https://www.ooops404.com>`__:

- Giovanni Serra <giovanni@gslab.it>
- Davide Corio <davide.corio@abstract.it>
- Lorenzo Battistini <lorenzo.battistini@agilebg.com>
- Alessio Gerace <alessio.gerace@agilebg.com>
- Giacomo Grasso <giacomo.grasso.82@gmail.com>
- Ruben Tonetto <https://github.com/ruben-tonetto>
- Giuseppe Borruso - Dinamiche Aziendali srl
<gborruso@dinamicheaziendali.it>
- Alex Comba <alex.comba@agilebg.com>
- `Ooops <https://www.ooops404.com>`__:

- Giovanni Serra <giovanni@gslab.it>

- `Stesi Consulting <https://www.stesi.consulting>`__:

- Michele Di Croce <dicroce.m@stesi.consulting>

Maintainers
-----------
Expand Down
52 changes: 27 additions & 25 deletions l10n_it_split_payment/models/account_move.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@
if self.env.context.get("skip_split_payment_computation"):
return res
self.compute_split_payment()
container = {"records": self}
self._check_balanced(container)
return res

def copy(self, default=None):
Expand All @@ -64,26 +62,30 @@
return res

def compute_split_payment(self):
for move in self:
if move.split_payment:
line_sp = fields.first(
move.line_ids.filtered(lambda move_line: move_line.is_split_payment)
)
for line in move.line_ids:
if line.display_type == "tax" and not line.is_split_payment:
write_off_line_vals = line._build_writeoff_line()
if line_sp:
if (
float_compare(
line_sp.price_unit,
write_off_line_vals["price_unit"],
precision_rounding=move.currency_id.rounding,
)
!= 0
):
line_sp.write(write_off_line_vals)
else:
if move.amount_sp:
move.with_context(
skip_split_payment_computation=True
).line_ids = [Command.create(write_off_line_vals)]
move_ids = self.filtered("split_payment")
for move in move_ids:
line_sp = fields.first(
move.line_ids.filtered(lambda move_line: move_line.is_split_payment)
)
lines = move.line_ids.filtered(
lambda line: line.display_type == "tax" and not line.is_split_payment
)
if lines:
write_off_line_vals = lines._build_writeoff_line()
if line_sp:
if (
float_compare(
line_sp.price_unit,
write_off_line_vals["price_unit"],
precision_rounding=move.currency_id.rounding,
)
!= 0
):
line_sp.write(write_off_line_vals)

Check warning on line 84 in l10n_it_split_payment/models/account_move.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_split_payment/models/account_move.py#L84

Added line #L84 was not covered by tests
else:
if move.amount_sp:
move.with_context(
skip_split_payment_computation=True
).line_ids = [Command.create(write_off_line_vals)]
container = {"records": move_ids}
self._check_balanced(container)
41 changes: 19 additions & 22 deletions l10n_it_split_payment/models/account_move_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@
line.is_split_payment = True

def _build_writeoff_line(self):
self.ensure_one()

if len(self.mapped("move_id")) != 1:
raise UserError(

Check warning on line 25 in l10n_it_split_payment/models/account_move_line.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_split_payment/models/account_move_line.py#L25

Added line #L25 was not covered by tests
_("Cannot create a split payment write-off line for multiple moves.")
)
if not self.move_id.company_id.sp_account_id:
raise UserError(
_(
Expand All @@ -37,32 +39,27 @@
"journal_id": self.move_id.journal_id.id,
"date": self.move_id.invoice_date,
"date_maturity": self.move_id.invoice_date,
"price_unit": -self.credit,
"amount_currency": self.credit,
"debit": self.credit,
"credit": self.debit,
"price_unit": -sum(self.mapped("credit")),
"amount_currency": sum(self.mapped("credit")),
"debit": sum(self.mapped("credit")),
"credit": sum(self.mapped("debit")),
"display_type": "tax",
}
if self.move_id.move_type == "out_refund":
vals["amount_currency"] = -self.debit
vals["debit"] = self.credit
vals["credit"] = self.debit
vals["amount_currency"] = -sum(self.mapped("debit"))
vals["debit"] = sum(self.mapped("credit"))
vals["credit"] = sum(self.mapped("debit"))
return vals

@api.model_create_multi
def create(self, vals_list):
lines = super().create(vals_list)
for line in lines:
if (
line.display_type == "tax"
and line.move_id.split_payment
and line.move_id.is_sale_document(include_receipts=True)
and not line.is_split_payment
and not any(ml.is_split_payment for ml in line.move_id.line_ids)
):
write_off_line_vals = line._build_writeoff_line()
line.move_id.line_ids = [(0, 0, write_off_line_vals)]
line.move_id._sync_dynamic_lines(
container={"records": line.move_id, "self": line.move_id}
)
move_ids = lines.filtered(
lambda line: line.display_type == "tax"
and line.move_id.split_payment
and line.move_id.is_sale_document(include_receipts=True)
and not line.is_split_payment
and not any(ml.is_split_payment for ml in line.move_id.line_ids)
).mapped("move_id")
move_ids.compute_split_payment()
return lines
2 changes: 2 additions & 0 deletions l10n_it_split_payment/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@
- Alex Comba \<<alex.comba@agilebg.com>\>
- [Ooops](https://www.ooops404.com):
- Giovanni Serra \<<giovanni@gslab.it>\>
- [Stesi Consulting](https://www.stesi.consulting):
- Michele Di Croce \<<dicroce.m@stesi.consulting>\>
31 changes: 18 additions & 13 deletions l10n_it_split_payment/static/description/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -396,17 +396,17 @@ <h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>Per configurare questo modulo è necessario:</p>
<ul class="simple">
<li>andare in Contabilità → Configurazione → Impostazioni e configura
“Conto storno scissione pagamenti” (es. ‘IVA n/debito sospesa SP’). Il
conto storno dovrebbe essere diverso dall’IVA a debito standard, in
modo da aggiungerlo separatamente nella dichiarazione IVA.</li>
“Conto storno scissione pagamenti” (es. ‘IVA n/debito sospesa SP’).
Il conto storno dovrebbe essere diverso dall’IVA a debito standard,
in modo da aggiungerlo separatamente nella dichiarazione IVA.</li>
</ul>
<p><strong>English</strong></p>
<p>To configure this module, you need to:</p>
<ul class="simple">
<li>go to Accounting → Configuration → Settings and configure ‘Split
Payment Write-off account’ (like ‘IVA n/debito sospesa SP’). Write-off
account should be different from standard debit VAT, in order to
separately add it in VAT statement.</li>
Payment Write-off account’ (like ‘IVA n/debito sospesa SP’).
Write-off account should be different from standard debit VAT, in
order to separately add it in VAT statement.</li>
</ul>
<p><img alt="image1" src="https://raw.githubusercontent.com/OCA/l10n-italy/16.0/l10n_it_split_payment/static/settings.png" /></p>
<hr class="docutils" />
Expand All @@ -427,16 +427,17 @@ <h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p><strong>Italiano</strong></p>
<ul class="simple">
<li>configurare la posizione fiscale (Contabilità → Configurazione →
Contabilità → Posizioni fiscali) usata per la scissione dei pagamenti,
selezionando la casella “Scissione pagamenti”. Nella posizione fiscale
mappare l’IVA standard con l’IVA SP, come indicato di seguito:</li>
Contabilità → Posizioni fiscali) usata per la scissione dei
pagamenti, selezionando la casella “Scissione pagamenti”. Nella
posizione fiscale mappare l’IVA standard con l’IVA SP, come indicato
di seguito:</li>
</ul>
<p><strong>English</strong></p>
<ul class="simple">
<li>configure the fiscal position (Accounting → Configuration → Accounting
→ Fiscal Positions) used for split payment, setting ‘Split Payment’
flag. In fiscal position, map standard VAT with SP VAT, like the
following:</li>
<li>configure the fiscal position (Accounting → Configuration →
Accounting → Fiscal Positions) used for split payment, setting ‘Split
Payment’ flag. In fiscal position, map standard VAT with SP VAT, like
the following:</li>
</ul>
<p><img alt="image4" src="https://raw.githubusercontent.com/OCA/l10n-italy/16.0/l10n_it_split_payment/static/fiscal_position.png" /></p>
</div>
Expand Down Expand Up @@ -481,6 +482,10 @@ <h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<li>Giovanni Serra &lt;<a class="reference external" href="mailto:giovanni&#64;gslab.it">giovanni&#64;gslab.it</a>&gt;</li>
</ul>
</li>
<li><a class="reference external" href="https://www.stesi.consulting">Stesi Consulting</a>:<ul>
<li>Michele Di Croce &lt;<a class="reference external" href="mailto:dicroce.m&#64;stesi.consulting">dicroce.m&#64;stesi.consulting</a>&gt;</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
Expand Down
62 changes: 61 additions & 1 deletion l10n_it_split_payment/tests/test_splitpayment.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,24 @@ def setUp(self):
"amount": 22,
}
)
self.tax10sp = self.tax_model.create(
{
"name": "10% SP",
"amount": 10,
}
)
self.tax22 = self.tax_model.create(
{
"name": "22%",
"amount": 22,
}
)
self.tax10 = self.tax_model.create(
{
"name": "10%",
"amount": 10,
}
)
self.sp_fp = self.fp_model.create(
{
"name": "Split payment",
Expand All @@ -42,7 +54,12 @@ def setUp(self):
0,
0,
{"tax_src_id": self.tax22.id, "tax_dest_id": self.tax22sp.id},
)
),
(
0,
0,
{"tax_src_id": self.tax10.id, "tax_dest_id": self.tax10sp.id},
),
],
}
)
Expand Down Expand Up @@ -272,3 +289,46 @@ def test_balanced_lines(self):
self.assertEqual(invoice.amount_total, 200)
self.assertEqual(invoice.amount_residual, 200)
self.assertEqual(invoice.amount_tax, 0)

def test_invoice_two_sp_taxes(self):
self.assertTrue(self.tax22sp.is_split_payment)
self.assertTrue(self.tax10sp.is_split_payment)
invoice = self.move_model.with_context(default_move_type="out_invoice").create(
{
"invoice_date": self.recent_date,
"partner_id": self.env.ref("base.res_partner_3").id,
"journal_id": self.sales_journal.id,
"fiscal_position_id": self.sp_fp.id,
"move_type": "out_refund",
"invoice_line_ids": [
(
0,
0,
{
"name": "service",
"account_id": self.a_sale.id,
"quantity": 1,
"price_unit": 100,
"tax_ids": [(6, 0, {self.tax22sp.id})],
},
),
(
0,
0,
{
"name": "service2",
"account_id": self.a_sale.id,
"quantity": 1,
"price_unit": 100,
"tax_ids": [(6, 0, {self.tax10sp.id})],
},
),
],
}
)
line_sp = invoice.line_ids.filtered(
lambda line: line.account_id.id == self.company.sp_account_id.id
)

self.assertTrue(len(line_sp) == 1)
self.assertEqual(line_sp.credit, 32)