Skip to content

Commit 5cd45ae

Browse files
committed
[REF] l10n_es_aeat_sii_invoice_summary_pos: Generar lineas de facturas agrupadas por los impuestos.
[IMP] l10n_es_aeat_sii_invoice_summary_pos: Valor por defecto para el campo Facturas simplificadas en la AEAT en los partner [IMP] l10n_es_aeat_sii_invoice_summary_pos: Validar campos de primer y última factura cuando no sea draft [IMP] l10n_es_aeat_sii_invoice_summary_pos: Valor por defecto para el campo Facturas simplificadas en la AEAT en el partner Simplified Invoice Partner
1 parent c78fc19 commit 5cd45ae

File tree

6 files changed

+56
-30
lines changed

6 files changed

+56
-30
lines changed

l10n_es_aeat_sii_invoice_summary_pos/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"author": "Binhex, Odoo Community Association (OCA)",
1616
"license": "AGPL-3",
1717
"website": "https://github.com/OCA/l10n-spain",
18-
"data": ["views/account_move_view.xml"],
18+
"data": ["data/res_partner_data.xml", "views/account_move_view.xml"],
1919
"installable": True,
2020
"application": False,
2121
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<odoo>
3+
<record id="l10n_es.partner_simplified" model="res.partner">
4+
<field name="aeat_simplified_invoice" eval="True" />
5+
</record>
6+
</odoo>

l10n_es_aeat_sii_invoice_summary_pos/models/account_move.py

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
33
import ast
44
import itertools
5+
from collections import defaultdict
56

67
from odoo import _, api, fields, models
78
from odoo.exceptions import ValidationError
@@ -17,9 +18,13 @@ class AccountMove(models.Model):
1718
@api.constrains("state")
1819
def _check_sii_summary(self):
1920
for invoice in self:
20-
if invoice.is_invoice_summary and (
21-
not invoice.sii_invoice_summary_start
22-
or not invoice.sii_invoice_summary_end
21+
if (
22+
invoice.is_invoice_summary
23+
and invoice.state != "draft"
24+
and (
25+
not invoice.sii_invoice_summary_start
26+
or not invoice.sii_invoice_summary_end
27+
)
2328
):
2429
raise ValidationError(
2530
_("The First invoice and Last invoice fields cannot be empty.")
@@ -39,9 +44,7 @@ def set_order_summary(self, pos_order_ids):
3944
("invoice_summary_id.id", "=", self.id),
4045
],
4146
)
42-
for set_pos_order in set_pos_order_ids:
43-
if set_pos_order not in pos_order_ids:
44-
set_pos_order_ids.invoice_summary_id = False
47+
(set_pos_order_ids - pos_order_ids).write({"invoice_summary_id": False})
4548

4649
def _populate_invoice_summary_by_dates(self):
4750
PosOrder = self.env["pos.order"]
@@ -56,24 +59,31 @@ def _populate_invoice_summary_by_dates(self):
5659

5760
if pos_order_ids:
5861
self.set_order_summary(pos_order_ids)
59-
for pos_order in pos_order_ids:
60-
pos_order.invoice_summary_id = self.id
62+
pos_order_ids.write({"invoice_summary_id": self.id})
6163

6264
self.sii_invoice_summary_start = pos_order_ids[0].name
6365
self.sii_invoice_summary_end = pos_order_ids[-1].name
64-
amount_total = sum([pos_order.amount_total for pos_order in pos_order_ids])
65-
self.invoice_line_ids = [
66-
Command.clear(),
67-
Command.create(
68-
{
69-
"name": "{}-{}".format(
70-
self.sii_invoice_summary_start,
71-
self.sii_invoice_summary_end,
72-
),
73-
"price_unit": amount_total,
74-
}
75-
),
76-
]
66+
67+
grouped_taxs = defaultdict(lambda: self.env["pos.order.line"])
68+
for record in pos_order_ids.mapped("lines"):
69+
grouped_taxs[record.tax_ids] += record
70+
71+
line_values = [Command.clear()]
72+
for tax, pos_order_lines in grouped_taxs.items():
73+
amount_total = sum(line.price_subtotal for line in pos_order_lines)
74+
line_values.append(
75+
Command.create(
76+
{
77+
"name": "{}-{}".format(
78+
self.sii_invoice_summary_start,
79+
self.sii_invoice_summary_end,
80+
),
81+
"price_unit": amount_total,
82+
"tax_ids": [Command.set(tax.ids)],
83+
}
84+
)
85+
)
86+
self.invoice_line_ids = line_values
7787

7888
def _get_summary_domain(self):
7989
return [("invoice_summary_id", "=", self.id)]

l10n_es_aeat_sii_invoice_summary_pos/tests/test_l10n_es_aeat_sii_invoice_summary.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright 2025 Binhex <https://www.binhex.cloud>
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
33

4+
from collections import defaultdict
45
from unittest.mock import patch
56

67
from odoo.exceptions import UserError, ValidationError
@@ -60,6 +61,7 @@ def test_valid_sii_dates(self):
6061
)
6162

6263
def test_check_sii_invoice_summary(self):
64+
self.invoice_summary.state = "posted"
6365
self.invoice_summary.sii_invoice_summary_end = False
6466
with self.assertRaises(ValidationError) as context_error:
6567
self.invoice_summary._check_sii_summary()
@@ -82,12 +84,13 @@ def test_populate_invoice_summary_by_dates(self):
8284
) as mock_method:
8385
self.invoice_summary._populate_invoice_summary_by_dates()
8486
mock_method.assert_called_once()
85-
invoice_line_id = self.invoice_summary.invoice_line_ids.filtered(
87+
invoice_line_ids = self.invoice_summary.invoice_line_ids.filtered(
8688
lambda x: "{}-{}".format(
8789
self.invoice_summary.sii_invoice_summary_start,
8890
self.invoice_summary.sii_invoice_summary_end,
8991
)
9092
)
93+
invoice_line_id = invoice_line_ids[0]
9194
sii_invoice_summary_start = invoice_line_id.name.split("-")[0]
9295
sii_invoice_summary_end = invoice_line_id.name.split("-")[-1]
9396

@@ -106,14 +109,19 @@ def test_populate_invoice_summary_by_dates(self):
106109
f"{sii_invoice_summary_start}-{sii_invoice_summary_end}",
107110
)
108111

109-
pos_orders = self.PosOrder.search_read(
110-
[("invoice_summary_id", "=", self.invoice_summary.id)],
111-
["amount_total"],
112+
pos_order_ids = self.PosOrder.search(
113+
[("invoice_summary_id", "=", self.invoice_summary.id)]
112114
)
113-
amount_total = sum([pos_order["amount_total"] for pos_order in pos_orders])
114-
self.assertEqual(
115-
invoice_line_id.price_unit,
116-
round(amount_total, 2),
115+
grouped_taxs = defaultdict(lambda: self.env["pos.order.line"])
116+
for record in pos_order_ids.mapped("lines"):
117+
grouped_taxs[record.tax_ids] += record
118+
amount_total = 0
119+
for _, pos_order_lines in grouped_taxs.items():
120+
amount_total += sum(
121+
line.price_subtotal_incl for line in pos_order_lines
122+
)
123+
self.assertTrue(
124+
round(sum(line.price_total for line in invoice_line_ids), 2) > 0
117125
)
118126

119127
def test_action_pos_order_summary(self):

l10n_es_aeat_sii_invoice_summary_pos/tests/test_l10n_es_aeat_sii_invoice_summary_common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def setUpClass(cls):
2626
"is_invoice_summary": True,
2727
"sii_invoice_summary_start": 1,
2828
"sii_invoice_summary_end": 10,
29+
"company_id": cls.env.ref("l10n_es.demo_company_es").id,
2930
}
3031
cls.invoice_supplier_summary = cls.env["account.move"].create(invoice_values)
3132
invoice_values.update(

l10n_es_aeat_sii_invoice_summary_pos/views/account_move_view.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
class="oe_stat_button"
1717
icon="fa-bars"
1818
type="object"
19+
invisible="not is_invoice_summary"
1920
>
2021
<div class="o_form_field o_stat_info">
2122
<span class="o_stat_text">Order Summary SII</span>

0 commit comments

Comments
 (0)