odoo-addon-l10n-es-verifactu-oca 15.0.1.0.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of odoo-addon-l10n-es-verifactu-oca might be problematic. Click here for more details.

Files changed (74) hide show
  1. odoo/addons/l10n_es_verifactu_oca/README.rst +154 -0
  2. odoo/addons/l10n_es_verifactu_oca/__init__.py +3 -0
  3. odoo/addons/l10n_es_verifactu_oca/__manifest__.py +48 -0
  4. odoo/addons/l10n_es_verifactu_oca/data/account_fiscal_position_template_data.xml +129 -0
  5. odoo/addons/l10n_es_verifactu_oca/data/ir_config_parameter.xml +9 -0
  6. odoo/addons/l10n_es_verifactu_oca/data/ir_cron.xml +14 -0
  7. odoo/addons/l10n_es_verifactu_oca/data/mail_activity_data.xml +11 -0
  8. odoo/addons/l10n_es_verifactu_oca/data/verifactu_map_data.xml +120 -0
  9. odoo/addons/l10n_es_verifactu_oca/data/verifactu_registration_key_data.xml +207 -0
  10. odoo/addons/l10n_es_verifactu_oca/data/verifactu_tax_agency_data.xml +19 -0
  11. odoo/addons/l10n_es_verifactu_oca/hooks.py +43 -0
  12. odoo/addons/l10n_es_verifactu_oca/i18n/ca.po +1630 -0
  13. odoo/addons/l10n_es_verifactu_oca/i18n/ca_ES.po +1599 -0
  14. odoo/addons/l10n_es_verifactu_oca/i18n/es.po +1640 -0
  15. odoo/addons/l10n_es_verifactu_oca/i18n/l10n_es_verifactu_oca.pot +1673 -0
  16. odoo/addons/l10n_es_verifactu_oca/models/__init__.py +16 -0
  17. odoo/addons/l10n_es_verifactu_oca/models/account_fiscal_position.py +40 -0
  18. odoo/addons/l10n_es_verifactu_oca/models/account_fiscal_position_template.py +18 -0
  19. odoo/addons/l10n_es_verifactu_oca/models/account_journal.py +64 -0
  20. odoo/addons/l10n_es_verifactu_oca/models/account_move.py +556 -0
  21. odoo/addons/l10n_es_verifactu_oca/models/aeat_mixin.py +163 -0
  22. odoo/addons/l10n_es_verifactu_oca/models/aeat_tax_agency.py +30 -0
  23. odoo/addons/l10n_es_verifactu_oca/models/res_company.py +48 -0
  24. odoo/addons/l10n_es_verifactu_oca/models/res_partner.py +33 -0
  25. odoo/addons/l10n_es_verifactu_oca/models/verifactu_chaining.py +30 -0
  26. odoo/addons/l10n_es_verifactu_oca/models/verifactu_developer.py +16 -0
  27. odoo/addons/l10n_es_verifactu_oca/models/verifactu_invoice_entry.py +401 -0
  28. odoo/addons/l10n_es_verifactu_oca/models/verifactu_invoice_entry_response.py +121 -0
  29. odoo/addons/l10n_es_verifactu_oca/models/verifactu_invoice_entry_response_line.py +35 -0
  30. odoo/addons/l10n_es_verifactu_oca/models/verifactu_map.py +66 -0
  31. odoo/addons/l10n_es_verifactu_oca/models/verifactu_mixin.py +449 -0
  32. odoo/addons/l10n_es_verifactu_oca/models/verifactu_registration_key.py +24 -0
  33. odoo/addons/l10n_es_verifactu_oca/readme/CONFIGURE.rst +18 -0
  34. odoo/addons/l10n_es_verifactu_oca/readme/CONTRIBUTORS.rst +19 -0
  35. odoo/addons/l10n_es_verifactu_oca/readme/DESCRIPTION.rst +1 -0
  36. odoo/addons/l10n_es_verifactu_oca/readme/INSTALL.rst +4 -0
  37. odoo/addons/l10n_es_verifactu_oca/readme/ROADMAP.rst +15 -0
  38. odoo/addons/l10n_es_verifactu_oca/readme/USAGE.rst +1 -0
  39. odoo/addons/l10n_es_verifactu_oca/security/ir.model.access.csv +22 -0
  40. odoo/addons/l10n_es_verifactu_oca/security/verifactu_security.xml +6 -0
  41. odoo/addons/l10n_es_verifactu_oca/static/description/icon.png +0 -0
  42. odoo/addons/l10n_es_verifactu_oca/static/description/index.html +508 -0
  43. odoo/addons/l10n_es_verifactu_oca/tests/__init__.py +5 -0
  44. odoo/addons/l10n_es_verifactu_oca/tests/common.py +304 -0
  45. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_mocked_response_1.json +35 -0
  46. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_mocked_response_2.json +35 -0
  47. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_out_invoice_s_iva10b_s_iva21s_dict.json +59 -0
  48. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_out_invoice_s_iva21s_s_req52_dict.json +58 -0
  49. odoo/addons/l10n_es_verifactu_oca/tests/json/verifactu_out_refund_s_iva10b_s_iva10b_s_iva21s_dict.json +66 -0
  50. odoo/addons/l10n_es_verifactu_oca/tests/test_10n_es_verifactu.py +451 -0
  51. odoo/addons/l10n_es_verifactu_oca/tests/test_account_journal.py +78 -0
  52. odoo/addons/l10n_es_verifactu_oca/tests/test_account_move_reversal.py +93 -0
  53. odoo/addons/l10n_es_verifactu_oca/tests/test_res_partner.py +48 -0
  54. odoo/addons/l10n_es_verifactu_oca/tests/test_verifactu_invoice.py +350 -0
  55. odoo/addons/l10n_es_verifactu_oca/views/account_fiscal_position_view.xml +30 -0
  56. odoo/addons/l10n_es_verifactu_oca/views/account_journal_view.xml +28 -0
  57. odoo/addons/l10n_es_verifactu_oca/views/account_move_view.xml +219 -0
  58. odoo/addons/l10n_es_verifactu_oca/views/aeat_tax_agency_view.xml +31 -0
  59. odoo/addons/l10n_es_verifactu_oca/views/report_invoice.xml +55 -0
  60. odoo/addons/l10n_es_verifactu_oca/views/res_company_view.xml +50 -0
  61. odoo/addons/l10n_es_verifactu_oca/views/res_partner_view.xml +27 -0
  62. odoo/addons/l10n_es_verifactu_oca/views/verifactu_chaining_view.xml +47 -0
  63. odoo/addons/l10n_es_verifactu_oca/views/verifactu_developer_view.xml +48 -0
  64. odoo/addons/l10n_es_verifactu_oca/views/verifactu_invoice_entry_response_view.xml +149 -0
  65. odoo/addons/l10n_es_verifactu_oca/views/verifactu_invoice_entry_view.xml +124 -0
  66. odoo/addons/l10n_es_verifactu_oca/views/verifactu_map_lines_view.xml +20 -0
  67. odoo/addons/l10n_es_verifactu_oca/views/verifactu_map_view.xml +53 -0
  68. odoo/addons/l10n_es_verifactu_oca/views/verifactu_registration_keys_view.xml +42 -0
  69. odoo/addons/l10n_es_verifactu_oca/wizards/__init__.py +1 -0
  70. odoo/addons/l10n_es_verifactu_oca/wizards/account_move_reversal.py +16 -0
  71. odoo_addon_l10n_es_verifactu_oca-15.0.1.0.0.2.dist-info/METADATA +171 -0
  72. odoo_addon_l10n_es_verifactu_oca-15.0.1.0.0.2.dist-info/RECORD +74 -0
  73. odoo_addon_l10n_es_verifactu_oca-15.0.1.0.0.2.dist-info/WHEEL +5 -0
  74. odoo_addon_l10n_es_verifactu_oca-15.0.1.0.0.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,304 @@
1
+ # Copyright 2024 FactorLibre - Luis J. Salvatierra
2
+ # Copyright 2025 Tecnativa - Pedro M. Baeza
3
+ from odoo import fields
4
+
5
+ from odoo.addons.l10n_es_aeat.tests.test_l10n_es_aeat_certificate import (
6
+ TestL10nEsAeatCertificateBase,
7
+ )
8
+ from odoo.addons.l10n_es_aeat.tests.test_l10n_es_aeat_mod_base import (
9
+ TestL10nEsAeatModBase,
10
+ )
11
+
12
+
13
+ class TestVerifactuCommon(TestL10nEsAeatModBase, TestL10nEsAeatCertificateBase):
14
+ """Common base class for VeriFactu tests with shared setup and utilities."""
15
+
16
+ @classmethod
17
+ def setUpClass(cls):
18
+ super().setUpClass()
19
+ cls.maxDiff = None
20
+ cls.fp_nacional = cls.env.ref(f"l10n_es.{cls.company.id}_fp_nacional")
21
+ cls.fp_registration_key_01 = cls.env.ref(
22
+ "l10n_es_verifactu_oca.verifactu_registration_keys_01"
23
+ )
24
+ cls.fp_nacional.verifactu_registration_key = cls.fp_registration_key_01
25
+ cls.fp_recargo = cls.env.ref(f"l10n_es.{cls.company.id}_fp_recargo")
26
+ cls.fp_recargo.verifactu_registration_key = cls.fp_registration_key_01
27
+ cls.partner = cls.env["res.partner"].create(
28
+ {
29
+ "name": "Test partner",
30
+ "vat": "89890001K",
31
+ "country_id": cls.env.ref("base.es").id,
32
+ }
33
+ )
34
+ cls.product = cls.env["product.product"].create({"name": "Test product"})
35
+ cls.account_expense = cls.env.ref(
36
+ "l10n_es.%s_account_common_600" % cls.company.id
37
+ )
38
+ cls.verifactu_developer = cls.env["verifactu.developer"].create(
39
+ {
40
+ "name": "Odoo Developer",
41
+ "vat": "A12345674",
42
+ "sif_name": "odoo",
43
+ "version": "1.0",
44
+ }
45
+ )
46
+ cls.verifactu_chaining = cls.env["verifactu.chaining"].create(
47
+ {"name": "VERI*FACTU Chaining", "sif_id": "11", "installation_number": 1}
48
+ )
49
+ cls.company.write(
50
+ {
51
+ "verifactu_enabled": True,
52
+ "verifactu_test": True,
53
+ "vat": "G87846952",
54
+ "country_id": cls.env.ref("base.es").id,
55
+ "tax_agency_id": cls.env.ref("l10n_es_aeat.aeat_tax_agency_spain"),
56
+ "verifactu_developer_id": cls.verifactu_developer.id,
57
+ "verifactu_chaining_id": cls.verifactu_chaining.id,
58
+ }
59
+ )
60
+ # Configure taxes for test invoice
61
+ cls.tax_21 = cls.env.ref(
62
+ "l10n_es.{}_account_tax_template_s_iva21s".format(cls.company.id)
63
+ )
64
+ cls.invoice = cls.env["account.move"].create(
65
+ {
66
+ "company_id": cls.company.id,
67
+ "partner_id": cls.partner.id,
68
+ "invoice_date": "2026-01-01",
69
+ "move_type": "out_invoice",
70
+ "fiscal_position_id": cls.fp_nacional.id,
71
+ "invoice_line_ids": [
72
+ (
73
+ 0,
74
+ 0,
75
+ {
76
+ "product_id": cls.product.id,
77
+ "account_id": cls.account_expense.id,
78
+ "name": "Test line",
79
+ "price_unit": 100,
80
+ "quantity": 1,
81
+ "tax_ids": [(6, 0, cls.tax_21.ids)],
82
+ },
83
+ )
84
+ ],
85
+ }
86
+ )
87
+
88
+ def _create_test_invoice(
89
+ self,
90
+ company=None,
91
+ date="2024-01-01",
92
+ amount=100,
93
+ partner=None,
94
+ move_type="out_invoice",
95
+ product=None,
96
+ account=None,
97
+ name=None,
98
+ ):
99
+ """
100
+ Helper method to create a test invoice with customizable parameters.
101
+
102
+ Args:
103
+ company: Company for the invoice (defaults to self.company)
104
+ date: Invoice date (defaults to "2024-01-01")
105
+ amount: Invoice line amount (defaults to 100)
106
+ partner: Invoice partner (defaults to self.partner)
107
+ move_type: Invoice type (defaults to "out_invoice")
108
+ product: Product for invoice line (defaults to self.product)
109
+ account: Account for invoice line (defaults to self.account_expense)
110
+ name: Invoice line description (defaults to "Test line")
111
+
112
+ Returns:
113
+ account.move: Created invoice record
114
+ """
115
+ company = company or self.company
116
+ partner = partner or self.partner
117
+ product = product or self.product
118
+ if account is None:
119
+ if company == self.company:
120
+ account = self.account_expense
121
+ else:
122
+ # First try to find an expense account
123
+ account = self.env["account.account"].search(
124
+ [
125
+ ("company_id", "=", company.id),
126
+ ("user_type_id.name", "ilike", "expense"),
127
+ ],
128
+ limit=1,
129
+ )
130
+ # If no expense account found, try other suitable account types
131
+ if not account:
132
+ account = self.env["account.account"].search(
133
+ [
134
+ ("company_id", "=", company.id),
135
+ ("user_type_id.type", "=", "other"),
136
+ ],
137
+ limit=1,
138
+ )
139
+ # Fallback to any account in the company
140
+ if not account:
141
+ account = self.env["account.account"].search(
142
+ [("company_id", "=", company.id)], limit=1
143
+ )
144
+ if name is None:
145
+ name = f"Test line - {amount}"
146
+ return (
147
+ self.env["account.move"]
148
+ .with_company(company)
149
+ .create(
150
+ {
151
+ "company_id": company.id,
152
+ "partner_id": partner.id,
153
+ "invoice_date": date,
154
+ "move_type": move_type,
155
+ "invoice_line_ids": [
156
+ (
157
+ 0,
158
+ 0,
159
+ {
160
+ "product_id": product.id,
161
+ "account_id": account.id,
162
+ "name": name,
163
+ "price_unit": amount,
164
+ "quantity": 1,
165
+ },
166
+ )
167
+ ],
168
+ "aeat_state": "sent",
169
+ }
170
+ )
171
+ )
172
+
173
+ def _create_test_company(
174
+ self,
175
+ name="Test Company",
176
+ vat="B87654321",
177
+ verifactu_enabled=True,
178
+ ):
179
+ """
180
+ Helper method to create a test company configured for verifactu.
181
+
182
+ Args:
183
+ name: Company name
184
+ vat: Company VAT number (must be in valid Spanish format without country code)
185
+ verifactu_enabled: Enable verifactu for the company
186
+ verifactu_test: Set verifactu test mode
187
+
188
+ Returns:
189
+ res.company: Created company record
190
+ """
191
+ company = self.env["res.company"].create(
192
+ {"name": name, "vat": vat, "country_id": self.env.ref("base.es").id}
193
+ )
194
+ if not company.chart_template_id:
195
+ coa = self.env.ref("l10n_es.account_chart_template_pymes", False)
196
+ coa.try_loading(company=company)
197
+ company.write(
198
+ {
199
+ "verifactu_enabled": verifactu_enabled,
200
+ "verifactu_test": True,
201
+ "tax_agency_id": self.env.ref("l10n_es_aeat.aeat_tax_agency_spain").id,
202
+ "verifactu_developer_id": self.verifactu_developer.id,
203
+ }
204
+ )
205
+ return company
206
+
207
+ def _prepare_invoice_for_verifactu(self, invoice):
208
+ """
209
+ Helper method to prepare an invoice for verifactu processing.
210
+ This includes posting the invoice and setting the registration date.
211
+
212
+ Args:
213
+ invoice: Invoice to prepare
214
+
215
+ Returns:
216
+ account.move: The prepared invoice
217
+ """
218
+ invoice.action_post()
219
+ invoice.verifactu_registration_date = fields.Datetime.now()
220
+ return invoice
221
+
222
+ def _create_and_prepare_invoice(self, **kwargs):
223
+ """
224
+ Helper method to create and prepare an invoice for verifactu in one step.
225
+
226
+ Args:
227
+ **kwargs: Arguments passed to _create_test_invoice
228
+
229
+ Returns:
230
+ account.move: Created and prepared invoice
231
+ """
232
+ invoice = self._create_test_invoice(**kwargs)
233
+ return self._prepare_invoice_for_verifactu(invoice)
234
+
235
+ def _verify_queue_creation(self, invoice):
236
+ """
237
+ Helper method to verify that a queue record was created for an invoice.
238
+
239
+ Args:
240
+ invoice: Invoice to verify queue creation for
241
+
242
+ Returns:
243
+ verifactu.invoice.entry: The created queue record
244
+ """
245
+ entry = invoice.last_verifactu_invoice_entry_id
246
+ self.assertTrue(
247
+ entry,
248
+ "Invoice should have a VERI*FACTU invoice entry after posting",
249
+ )
250
+ response_lines = entry.response_line_ids
251
+ self.assertEqual(len(response_lines), 1, "Should have exactly one queue record")
252
+ response_line = response_lines[-1]
253
+ self.assertEqual(
254
+ response_line.entry_id,
255
+ entry,
256
+ "Queue record should link to the VERI*FACTU invoice entry",
257
+ )
258
+ self.assertEqual(
259
+ response_line.company_id,
260
+ invoice.company_id,
261
+ "Queue record should belong to the same company",
262
+ )
263
+ return response_line
264
+
265
+ def _verify_response_integration(self, invoice, response_line):
266
+ """
267
+ Helper method to verify response line integration with verifactu.invoice.
268
+
269
+ Args:
270
+ invoice: Original invoice
271
+ response_line: Response line to verify
272
+
273
+ Returns:
274
+ bool: True if integration is correct
275
+ """
276
+ self.assertTrue(
277
+ response_line.document_id,
278
+ "Response line should have verifactu invoice reference",
279
+ )
280
+ self.assertEqual(
281
+ response_line.entry_id,
282
+ invoice.last_verifactu_invoice_entry_id,
283
+ "Response line should link to the correct VERI*FACTU invoice entry",
284
+ )
285
+ self.assertEqual(
286
+ response_line.entry_id.document_id,
287
+ invoice,
288
+ "Response line should reference the original invoice through verifactu entry",
289
+ )
290
+ return True
291
+
292
+ def _generate_invoice_entry(self, invoice):
293
+ """
294
+ Helper method to generate VERI*FACTU invoice entry for an invoice.
295
+ This assumes the invoice is already prepared for verifactu.
296
+
297
+ Args:
298
+ invoice: Prepared invoice
299
+
300
+ Returns:
301
+ verifactu.invoice: Created invoice entry
302
+ """
303
+ invoice._generate_verifactu_chaining()
304
+ return invoice.last_verifactu_invoice_entry_id
@@ -0,0 +1,35 @@
1
+ {
2
+ "CSV": "A-Y23JP3582934",
3
+ "DatosPresentacion": {
4
+ "NIFPresentador": "G87846952",
5
+ "TimestampPresentacion": "2026-01-01T16:54:41+02:00"
6
+ },
7
+ "Cabecera": {
8
+ "ObligadoEmision": {
9
+ "NombreRazon": "Spanish test company",
10
+ "NIF": "G87846952"
11
+ },
12
+ "Representante": "",
13
+ "RemisionVoluntaria": "",
14
+ "RemisionRequerimiento": ""
15
+ },
16
+ "TiempoEsperaEnvio": "60",
17
+ "EstadoEnvio": "Correcto",
18
+ "RespuestaLinea": [
19
+ {
20
+ "IDFactura": {
21
+ "IDEmisorFactura": "89890001K",
22
+ "NumSerieFactura": "INV/2026/00001",
23
+ "FechaExpedicionFactura": "01-01-2026"
24
+ },
25
+ "Operacion": {
26
+ "TipoOperacion": "Alta",
27
+ "Subsanacion": "",
28
+ "RechazoPrevio": "",
29
+ "SinRegistroPrevio": ""
30
+ },
31
+ "RefExterna": "",
32
+ "EstadoRegistro": "Correcto"
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "CSV": "A-Y23JP3582934",
3
+ "DatosPresentacion": {
4
+ "NIFPresentador": "G87846952",
5
+ "TimestampPresentacion": "2026-01-01T16:54:41+02:00"
6
+ },
7
+ "Cabecera": {
8
+ "ObligadoEmision": {
9
+ "NombreRazon": "Spanish test company",
10
+ "NIF": "G87846952"
11
+ },
12
+ "Representante": "",
13
+ "RemisionVoluntaria": "",
14
+ "RemisionRequerimiento": ""
15
+ },
16
+ "TiempoEsperaEnvio": "60",
17
+ "EstadoEnvio": "Correcto",
18
+ "RespuestaLinea": [
19
+ {
20
+ "IDFactura": {
21
+ "IDEmisorFactura": "89890001K",
22
+ "NumSerieFactura": "INV/2026/00001",
23
+ "FechaExpedicionFactura": "01-01-2026"
24
+ },
25
+ "Operacion": {
26
+ "TipoOperacion": "Alta",
27
+ "Subsanacion": "",
28
+ "RechazoPrevio": "",
29
+ "SinRegistroPrevio": ""
30
+ },
31
+ "RefExterna": "",
32
+ "EstadoRegistro": "AceptadoConErrores"
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "RegistroAlta": {
3
+ "IDVersion": 1.0,
4
+ "IDFactura": {
5
+ "IDEmisorFactura": "G87846952",
6
+ "NumSerieFactura": "TEST001",
7
+ "FechaExpedicionFactura": "01-01-2026"
8
+ },
9
+ "NombreRazonEmisor": "Spanish test company",
10
+ "TipoFactura": "F1",
11
+ "DescripcionOperacion": "/",
12
+ "Destinatarios": {
13
+ "IDDestinatario": {
14
+ "NombreRazon": "Test partner",
15
+ "NIF": "89890001K"
16
+ }
17
+ },
18
+ "Desglose": {
19
+ "DetalleDesglose": [
20
+ {
21
+ "Impuesto": "01",
22
+ "ClaveRegimen": "01",
23
+ "CalificacionOperacion": "S1",
24
+ "TipoImpositivo": "10.0",
25
+ "BaseImponibleOimporteNoSujeto": 100.0,
26
+ "CuotaRepercutida": 10.0
27
+ },
28
+ {
29
+ "Impuesto": "01",
30
+ "ClaveRegimen": "01",
31
+ "CalificacionOperacion": "S1",
32
+ "TipoImpositivo": "21.0",
33
+ "BaseImponibleOimporteNoSujeto": 200.0,
34
+ "CuotaRepercutida": 42.0
35
+ }
36
+ ]
37
+ },
38
+ "CuotaTotal": 52.0,
39
+ "ImporteTotal": 352.0,
40
+ "Encadenamiento": {
41
+ "PrimerRegistro": "S"
42
+ },
43
+ "SistemaInformatico": {
44
+ "NombreRazon": "Odoo Developer",
45
+ "NIF": "A12345674",
46
+ "NombreSistemaInformatico": "odoo",
47
+ "IdSistemaInformatico": "11",
48
+ "Version": "1.0",
49
+ "NumeroInstalacion": 1,
50
+ "TipoUsoPosibleSoloVerifactu": "S",
51
+ "TipoUsoPosibleMultiOT": "S",
52
+ "IndicadorMultiplesOT": "N",
53
+ "IDOtro": {
54
+ "IDType": "",
55
+ "ID": ""
56
+ }
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "RegistroAlta": {
3
+ "IDVersion": 1.0,
4
+ "IDFactura": {
5
+ "IDEmisorFactura": "G87846952",
6
+ "NumSerieFactura": "TEST003",
7
+ "FechaExpedicionFactura": "01-01-2026"
8
+ },
9
+ "NombreRazonEmisor": "Spanish test company",
10
+ "TipoFactura": "F1",
11
+ "DescripcionOperacion": "/",
12
+ "Destinatarios": {
13
+ "IDDestinatario": {
14
+ "NombreRazon": "Test partner",
15
+ "NIF": "89890001K"
16
+ }
17
+ },
18
+ "Desglose": {
19
+ "DetalleDesglose": [
20
+ {
21
+ "Impuesto": "01",
22
+ "ClaveRegimen": "01",
23
+ "CalificacionOperacion": "S1",
24
+ "TipoImpositivo": "21.0",
25
+ "BaseImponibleOimporteNoSujeto": 200.0,
26
+ "CuotaRepercutida": 42.0,
27
+ "TipoRecargoEquivalencia": 5.2,
28
+ "CuotaRecargoEquivalencia": 10.4
29
+ }
30
+ ]
31
+ },
32
+ "CuotaTotal": 52.4,
33
+ "ImporteTotal": 252.4,
34
+ "Encadenamiento": {
35
+ "RegistroAnterior": {
36
+ "FechaExpedicionFactura": "01-01-2026",
37
+ "Huella": "97303DAE5BDF62521F9462A1F431A4F88F1B68C4A8E1A72B067000668FACB023",
38
+ "IDEmisorFactura": "G87846952",
39
+ "NumSerieFactura": "TEST002"
40
+ }
41
+ },
42
+ "SistemaInformatico": {
43
+ "NombreRazon": "Odoo Developer",
44
+ "NIF": "A12345674",
45
+ "NombreSistemaInformatico": "odoo",
46
+ "IdSistemaInformatico": "11",
47
+ "Version": "1.0",
48
+ "NumeroInstalacion": 1,
49
+ "TipoUsoPosibleSoloVerifactu": "S",
50
+ "TipoUsoPosibleMultiOT": "S",
51
+ "IndicadorMultiplesOT": "N",
52
+ "IDOtro": {
53
+ "IDType": "",
54
+ "ID": ""
55
+ }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,66 @@
1
+ {
2
+ "RegistroAlta": {
3
+ "IDVersion": 1.0,
4
+ "IDFactura": {
5
+ "IDEmisorFactura": "G87846952",
6
+ "NumSerieFactura": "TEST002",
7
+ "FechaExpedicionFactura": "01-01-2026"
8
+ },
9
+ "NombreRazonEmisor": "Spanish test company",
10
+ "TipoFactura": "R1",
11
+ "TipoRectificativa": "I",
12
+ "DescripcionOperacion": "/",
13
+ "Destinatarios": {
14
+ "IDDestinatario": {
15
+ "NombreRazon": "Test partner",
16
+ "NIF": "89890001K"
17
+ }
18
+ },
19
+ "Desglose": {
20
+ "DetalleDesglose": [
21
+ {
22
+ "Impuesto": "01",
23
+ "ClaveRegimen": "01",
24
+ "CalificacionOperacion": "S1",
25
+ "TipoImpositivo": "10.0",
26
+ "BaseImponibleOimporteNoSujeto": -200.0,
27
+ "CuotaRepercutida": -20.0
28
+ },
29
+ {
30
+ "Impuesto": "01",
31
+ "ClaveRegimen": "01",
32
+ "CalificacionOperacion": "S1",
33
+ "TipoImpositivo": "21.0",
34
+ "BaseImponibleOimporteNoSujeto": -200.0,
35
+ "CuotaRepercutida": -42.0
36
+ }
37
+ ]
38
+ },
39
+ "CuotaTotal": -62.0,
40
+ "ImporteTotal": -462.0,
41
+ "Encadenamiento": {
42
+ "RegistroAnterior": {
43
+ "FechaExpedicionFactura": "01-01-2026",
44
+ "Huella": "27656D2A18B1F7E6823B7C134F0AFA3B979D0DCDB37846593F9E4E089F9383B0",
45
+ "IDEmisorFactura": "G87846952",
46
+ "NumSerieFactura": "TEST001"
47
+ }
48
+ },
49
+ "FacturasRectificadas": [],
50
+ "SistemaInformatico": {
51
+ "NombreRazon": "Odoo Developer",
52
+ "NIF": "A12345674",
53
+ "NombreSistemaInformatico": "odoo",
54
+ "IdSistemaInformatico": "11",
55
+ "Version": "1.0",
56
+ "NumeroInstalacion": 1,
57
+ "TipoUsoPosibleSoloVerifactu": "S",
58
+ "TipoUsoPosibleMultiOT": "S",
59
+ "IndicadorMultiplesOT": "N",
60
+ "IDOtro": {
61
+ "IDType": "",
62
+ "ID": ""
63
+ }
64
+ }
65
+ }
66
+ }