Skip to content

Commit 69621b5

Browse files
[MIG] l10n_ar_account_tax_settlement_mendoza, l10n_ar_txt_sire: Migration to 18.0
1 parent 30a909f commit 69621b5

File tree

18 files changed

+168
-221
lines changed

18 files changed

+168
-221
lines changed

account_tax_settlement/models/account_journal.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class AccountJournal(models.Model):
3232
settlement_tax = fields.Selection(
3333
[],
3434
string="Impuesto de liquidación",
35-
help="Si elije un impuesto se puede agregar alguna funcionalidad, como" " por ej. descargar archivos txt",
35+
help="Si elije un impuesto se puede agregar alguna funcionalidad, como por ej. descargar archivos txt",
3636
)
3737
settlement_partner_id = fields.Many2one(
3838
"res.partner",
@@ -79,17 +79,15 @@ def check_tax_settlement(self):
7979
if rec.tax_settlement:
8080
if rec.type != "general":
8181
raise ValidationError(
82-
_('Solo se puede usar "Impuesto de liquidación" en ' 'diarios del tipo "Miscelánea"')
82+
_('Solo se puede usar "Impuesto de liquidación" en diarios del tipo "Miscelánea"')
8383
)
8484
if not rec.settlement_partner_id:
85-
raise ValidationError(
86-
_('Si usa "Impuesto de liquidación" debe setear un ' '"Partner de liquidación"')
87-
)
85+
raise ValidationError(_('Si usa "Impuesto de liquidación" debe setear un "Partner de liquidación"'))
8886

8987
def action_create_payment(self):
9088
partner = self.settlement_partner_id
9189
if not partner:
92-
raise ValidationError(_("You can only create payment if journal has settlement partner" " configured!"))
90+
raise ValidationError(_("You can only create payment if journal has settlement partner configured!"))
9391
return {
9492
"name": _("Register Payment"),
9593
"view_type": "form",
@@ -125,11 +123,11 @@ def create_tax_settlement_entry(self, move_lines):
125123
% draft_lines.ids
126124
)
127125
if not self.tax_settlement:
128-
raise ValidationError(_("Settlement only allowed on journals with Tax Settlement " "enable"))
126+
raise ValidationError(_("Settlement only allowed on journals with Tax Settlement enable"))
129127

130128
if move_lines.filtered("tax_settlement_move_id"):
131129
raise ValidationError(
132-
_("You can not settle lines that has already been settled!\n" "* Lines ids: %s")
130+
_("You can not settle lines that has already been settled!\n* Lines ids: %s")
133131
% (move_lines.filtered("tax_settlement_move_id").ids)
134132
)
135133
# if not self.tax_id:

l10n_ar_account_tax_settlement/models/account_journal.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -904,7 +904,7 @@ def iibb_aplicado_sircar_files_values(self, move_lines):
904904
content.append("2")
905905

906906
# 4 Número del comprobante
907-
content.append("%012d" % int(re.sub("[^0-9]", "", line.payment_id.name or "")))
907+
content.append("%012d" % int(re.sub("[^0-9]", "", line.name or "")))
908908

909909
# 5 Cuit del contribuyene
910910
content.append(line.partner_id.ensure_vat())

l10n_ar_account_tax_settlement_mendoza/README.rst

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,16 @@ Configuration
3131
To configure this module, you need to:
3232

3333
* En 'Contabilidad / Configuración / Ajustes' en sección "Localización para Argentina" el usuario debe subir todas las semanas el archivo csv de riesgo fiscal en la sección de riesgo fiscal. Lo debe hacer para cada una de las compañías.
34-
* El impuesto 'Retención IIBB Mendoza Aplicada' debe tener código de regimen en el campo 'Codigo de regimen IVA' en solapa 'Opciones avanzadas' y debe calcularse con código python "\n# withholdable_base_amount\n# payment: account.payment.group object\n# partner: res.partner object (commercial partner of payment group)\n# withholding_tax: account.tax.withholding object\n\nmove_to_pay = payment.to_pay_move_line_ids.move_id\nactivities = move_to_pay.activities_mendoza_ids\nif activities:\n activity_codes = activities.mapped('code')\n partner_vat = move_to_pay.partner_id.l10n_ar_formatted_vat\n actividades_con_riesgo, actividades_con_alicuota_cero = payment.company_id.process_mendoza_csv_file(partner_vat, activity_codes)\n menor_alicuota = activities.menor_alicuota(actividades_con_alicuota_cero)\n\n if menor_alicuota[0] in actividades_con_riesgo:\n alicuota = menor_alicuota[1] * 2\n else:\n alicuota = menor_alicuota[1]\n payment.write({'alicuota_mendoza': alicuota})\n result = withholdable_base_amount * alicuota\nelse:\n result = False\n ". No hace falta establecer la configuración de código python en compañías existentes antes de instalar este módulo pero si es necesario hacerlo para compañías nuevas.
35-
* Importar archivo actividades afip en 'Contabilidad / Configuracioń / AFIP / Actividades'.
34+
* El impuesto 'Retención IIBB Mendoza Aplicada' debe tener código de régimen (campo 'Código AFIP' l10n_ar_code)
3635

3736
Usage
3837
=====
3938

39+
* Subir semanalmente el archivo csv de riesgo fiscal provisto por la provincia de Mendoza en 'Contabilidad / Configuración / Ajustes' en sección "Localización para Argentina" en la sección de riesgo fiscal.
40+
* Subir el archivo csv de actividades AFIP en el modelo afip.activity.
41+
* La posición fiscal "Retenciones" creada por upgrade line 1415 [RET18] Migración retenciones de Ganancias debe tener el impuesto "Ret IIBB MZA 0%" en la pestaña de Percepciones y Retenciones con código python. Esto se hace en odoo-argentina-ee/l10n_ar_account_tax_settlement_mendoza/hooks.py .
42+
* Cuando se hace una factura de proveedor que tiene activities_mendoza_ids asociadas, y luego se realiza el pago correspondiente de dicha factura, el sistema automáticamente aplicará la retención de IIBB Mendoza según el riesgo fiscal del proveedor y la alícuota de la actividad en el modelo afip.activity.
43+
4044
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
4145
:alt: Try me on Runbot
4246
:target: http://runbot.adhoc.com.ar/

l10n_ar_account_tax_settlement_mendoza/__manifest__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
{
22
"name": "Tax settlement Mendoza",
3-
"version": "17.0.1.0.0",
3+
"version": "18.0.1.0.0",
44
"category": "Accounting",
55
"author": "ADHOC SA",
66
"license": "LGPL-3",
77
"depends": [
8+
"base_import_match",
89
"l10n_ar_account_tax_settlement",
9-
"l10n_ar_withholding_ux",
10-
#'base_import_match',
10+
"l10n_ar_tax_python",
11+
"l10n_ar_tax",
1112
],
1213
"data": [
1314
"views/account_move_views.xml",
1415
"views/afip_activity_view.xml",
15-
"views/account_payment_view.xml",
1616
"wizard/res_config_settings_views.xml",
1717
],
18-
"installable": False,
18+
"installable": True,
1919
"auto_install": False,
2020
"application": False,
2121
"post_init_hook": "post_init_hook",

l10n_ar_account_tax_settlement_mendoza/hooks.py

Lines changed: 66 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,80 @@
11
import logging
22

3-
from odoo import SUPERUSER_ID, api
4-
53
_logger = logging.getLogger(__name__)
64

75

8-
def post_init_hook(cr, registry):
6+
def post_init_hook(env):
97
"""Loaded after installing the module. Configuramos impuesto de Retención IIBB Mendoza Aplicada para que tengan código python.
108
Se crea registro de coincidencia de importación para importar archivo de actividades de mendoza para que se actualice en base a los códigos
119
existentes."""
12-
env = api.Environment(cr, SUPERUSER_ID, {})
13-
ar_companies = env["res.company"].search([]).filtered(lambda x: x.country_code == "AR")
14-
for company in ar_companies:
15-
ret_mendoza_aplicada_ext_id = "l10n_ar_account_withholding.%s_ri_tax_retencion_iibb_za_aplicada" % (company.id)
16-
ret_mendoza_aplicada_tax = env.ref(ret_mendoza_aplicada_ext_id, False)
17-
if not ret_mendoza_aplicada_tax:
10+
# Crear registros de fiscal position para todas las compañías argentinas
11+
for company in env["res.company"].search([]).filtered(lambda x: x.country_code == "AR"):
12+
# Buscar la posición fiscal "Retenciones" de esta compañía --> esta se crea en la ul 1415 [RET18] Migración retenciones de Ganancias
13+
fiscal_position = env["account.fiscal.position"].search(
14+
[("name", "=", "Retenciones"), ("company_id", "=", company.id)], limit=1
15+
)
16+
17+
if not fiscal_position:
18+
# No se encontró la posición fiscal 'Retenciones' para la compañía
1819
continue
19-
ret_mendoza_aplicada_tax.withholding_type = "code"
20-
ret_mendoza_aplicada_tax.withholding_python_compute = (
21-
"\n# withholdable_base_amount\n# payment: account.payment.group object\n# partner: res.partner object (commercial partner of payment group)\n"
22-
"# withholding_tax: account.tax.withholding object\n\nmove_to_pay = payment.to_pay_move_line_ids.move_id\nactivities = move_to_pay.activities_mendoza_ids\n"
23-
"if activities:\n activity_codes = activities.mapped('code')\n partner_vat = move_to_pay.partner_id.l10n_ar_formatted_vat\n"
24-
" actividades_con_riesgo, actividades_con_alicuota_cero = payment.company_id.process_mendoza_csv_file(partner_vat, activity_codes)\n"
25-
" menor_alicuota = activities.menor_alicuota(actividades_con_alicuota_cero)\n\n if menor_alicuota[0] in actividades_con_riesgo:\n"
26-
" alicuota = menor_alicuota[1] * 2\n else:\n alicuota = menor_alicuota[1]\n payment.write({'alicuota_mendoza': alicuota})\n"
27-
" result = withholdable_base_amount * alicuota\nelse:\n result = False\n "
20+
21+
tax_ext_id_option_a = "account.%s_ex_tax_withholding_iibb_mza_applied" % company.id
22+
tax_ext_id_option_b = "l10n_ar_tax.%s_ri_tax_retencion_iibb_za_aplicada" % company.id
23+
default_tax = env.ref(tax_ext_id_option_a, raise_if_not_found=False) or env.ref(
24+
tax_ext_id_option_b, raise_if_not_found=False
2825
)
29-
_logger.info(
30-
"Se establece código python en impuesto de Retención IIBB Mendoza Aplicada para la compañía %s"
31-
% (company.name)
26+
if not default_tax:
27+
_logger.warning(
28+
"No se encontró el impuesto %s ni %s para la compañía %s"
29+
% (tax_ext_id_option_a, tax_ext_id_option_b, company.name)
30+
)
31+
continue
32+
33+
# Verificar si ya existe el registro para esta compañía
34+
existing_record = env["account.fiscal.position.l10n_ar_tax"].search(
35+
[
36+
("fiscal_position_id", "=", fiscal_position.id),
37+
("default_tax_id", "=", default_tax.id),
38+
("tax_type", "=", "withholding"),
39+
],
40+
limit=1,
3241
)
42+
43+
if not existing_record:
44+
python_formula = """
45+
# payment: account.payment object
46+
# partner: res.partner object (commercial partner of payment)
47+
48+
move_to_pay = payment.to_pay_move_line_ids.move_id
49+
if not move_to_pay:
50+
raise UserError(
51+
"No puede calcular retenciones automáticas de aplicadas de Mendoza si no seleccionó una factura para pagar"
52+
)
53+
activities = move_to_pay.activities_mendoza_ids
54+
if activities:
55+
activity_codes = activities.mapped('code')
56+
partner_vat = move_to_pay.partner_id.l10n_ar_formatted_vat
57+
actividades_con_riesgo, actividades_con_alicuota_cero = payment.company_id.process_mendoza_csv_file(partner_vat, activity_codes)
58+
menor_alicuota = activities.menor_alicuota(actividades_con_alicuota_cero)
59+
60+
if menor_alicuota[0] in actividades_con_riesgo:
61+
aliquot = menor_alicuota[1] * 2
62+
else:
63+
aliquot = menor_alicuota[1]
64+
else:
65+
aliquot = 0
66+
"""
67+
env["account.fiscal.position.l10n_ar_tax"].create(
68+
{
69+
"fiscal_position_id": fiscal_position.id,
70+
"default_tax_id": default_tax.id,
71+
"tax_type": "withholding",
72+
"webservice": "python_formula",
73+
"python_formula": python_formula,
74+
}
75+
)
76+
_logger.info("Se crea registro de fiscal position para IIBB Mendoza en la compañía %s" % (company.name))
77+
3378
afip_activity_model_id = env["ir.model"].search([("name", "=", "afip.activity")]).id
3479

3580
# Se crea registro de coincidencia de importación para importar archivo de actividades de mendoza para que se actualice en base a los códigos existentes.
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
from . import account_move
22
from . import afip_activity
33
from . import res_company
4-
from . import account_payment
5-
from . import account_tax
64
from . import account_journal
Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,24 @@
11
from odoo import _, models
2-
from odoo.exceptions import RedirectWarning
2+
from odoo.exceptions import UserError
33

44

55
class AccountJournal(models.Model):
66
_inherit = "account.journal"
77

88
def iibb_aplicado_sircar_files_values(self, move_lines):
99
"""Extendemos este método del original de l10n_ar_account_tax_settlement para mendoza. El objetivo de este método es validar que el impuesto de mendoza tenga código de régimen."""
10-
tax_group_id_mendoza_id = self.env.ref("l10n_ar_ux.tax_group_retencion_iibb_za")
11-
mendoza_lines = move_lines.filtered(
10+
mendoza_state = self.env.ref("base.state_ar_m")
11+
if missing_codigo_regimen_mendoza_taxes := move_lines.filtered(
1212
lambda x: x.payment_id
13-
and x.tax_line_id.withholding_type == "code"
14-
and x.tax_group_id == tax_group_id_mendoza_id
15-
)
16-
missing_codigo_regimen = mendoza_lines.filtered(lambda x: not x.payment_id.tax_withholding_id.codigo_regimen)
17-
if mendoza_lines and missing_codigo_regimen:
18-
raise RedirectWarning(
19-
message=_(
20-
"El impuesto '%s' not tiene código de regimen en solapa 'Opciones avanzadas' campo 'Codigo de regimen IVA'.",
21-
missing_codigo_regimen.payment_id.tax_withholding_id.name,
22-
),
23-
action={
24-
"type": "ir.actions.act_window",
25-
"res_model": "account.tax",
26-
"views": [(False, "form")],
27-
"res_id": mendoza_lines.tax_line_id.id,
28-
"name": _("Tax"),
29-
"view_mode": "form",
30-
},
31-
button_text=_("Editar Impuesto"),
13+
and x.tax_line_id.l10n_ar_state_id == mendoza_state
14+
and not x.tax_line_id.l10n_ar_code
15+
).mapped("tax_line_id"):
16+
tax_lines = []
17+
for mdza_tax in missing_codigo_regimen_mendoza_taxes:
18+
tax_lines.append(_("ID: %(id)s\t\t- Name: %(name)s", id=mdza_tax.id, name=mdza_tax.display_name))
19+
details = _(
20+
"Los siguientes impuestos de Mendoza no tienen código de régimen (campo 'Código AFIP' l10n_ar_code):\n\n%(taxes)s",
21+
taxes="\n".join(tax_lines),
3222
)
23+
raise UserError(details)
3324
return super().iibb_aplicado_sircar_files_values(move_lines)

l10n_ar_account_tax_settlement_mendoza/models/account_payment.py

Lines changed: 0 additions & 27 deletions
This file was deleted.

l10n_ar_account_tax_settlement_mendoza/models/account_tax.py

Lines changed: 0 additions & 24 deletions
This file was deleted.

l10n_ar_account_tax_settlement_mendoza/views/account_payment_view.xml

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)