diff --git a/account_tax_settlement/models/account_journal.py b/account_tax_settlement/models/account_journal.py
index 6f575e617..1de019083 100644
--- a/account_tax_settlement/models/account_journal.py
+++ b/account_tax_settlement/models/account_journal.py
@@ -32,7 +32,7 @@ class AccountJournal(models.Model):
settlement_tax = fields.Selection(
[],
string="Impuesto de liquidación",
- help="Si elije un impuesto se puede agregar alguna funcionalidad, como" " por ej. descargar archivos txt",
+ help="Si elije un impuesto se puede agregar alguna funcionalidad, como por ej. descargar archivos txt",
)
settlement_partner_id = fields.Many2one(
"res.partner",
@@ -79,17 +79,15 @@ def check_tax_settlement(self):
if rec.tax_settlement:
if rec.type != "general":
raise ValidationError(
- _('Solo se puede usar "Impuesto de liquidación" en ' 'diarios del tipo "Miscelánea"')
+ _('Solo se puede usar "Impuesto de liquidación" en diarios del tipo "Miscelánea"')
)
if not rec.settlement_partner_id:
- raise ValidationError(
- _('Si usa "Impuesto de liquidación" debe setear un ' '"Partner de liquidación"')
- )
+ raise ValidationError(_('Si usa "Impuesto de liquidación" debe setear un "Partner de liquidación"'))
def action_create_payment(self):
partner = self.settlement_partner_id
if not partner:
- raise ValidationError(_("You can only create payment if journal has settlement partner" " configured!"))
+ raise ValidationError(_("You can only create payment if journal has settlement partner configured!"))
return {
"name": _("Register Payment"),
"view_type": "form",
@@ -125,11 +123,11 @@ def create_tax_settlement_entry(self, move_lines):
% draft_lines.ids
)
if not self.tax_settlement:
- raise ValidationError(_("Settlement only allowed on journals with Tax Settlement " "enable"))
+ raise ValidationError(_("Settlement only allowed on journals with Tax Settlement enable"))
if move_lines.filtered("tax_settlement_move_id"):
raise ValidationError(
- _("You can not settle lines that has already been settled!\n" "* Lines ids: %s")
+ _("You can not settle lines that has already been settled!\n* Lines ids: %s")
% (move_lines.filtered("tax_settlement_move_id").ids)
)
# if not self.tax_id:
diff --git a/l10n_ar_account_tax_settlement/models/account_journal.py b/l10n_ar_account_tax_settlement/models/account_journal.py
index 38f299513..f4be25cb5 100644
--- a/l10n_ar_account_tax_settlement/models/account_journal.py
+++ b/l10n_ar_account_tax_settlement/models/account_journal.py
@@ -904,7 +904,7 @@ def iibb_aplicado_sircar_files_values(self, move_lines):
content.append("2")
# 4 Número del comprobante
- content.append("%012d" % int(re.sub("[^0-9]", "", line.payment_id.name or "")))
+ content.append("%012d" % int(re.sub("[^0-9]", "", line.name or "")))
# 5 Cuit del contribuyene
content.append(line.partner_id.ensure_vat())
diff --git a/l10n_ar_account_tax_settlement_mendoza/README.rst b/l10n_ar_account_tax_settlement_mendoza/README.rst
index 07114876f..4cf82927f 100644
--- a/l10n_ar_account_tax_settlement_mendoza/README.rst
+++ b/l10n_ar_account_tax_settlement_mendoza/README.rst
@@ -31,12 +31,16 @@ Configuration
To configure this module, you need to:
* 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.
-* 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.
-* Importar archivo actividades afip en 'Contabilidad / Configuracioń / AFIP / Actividades'.
+* El impuesto 'Retención IIBB Mendoza Aplicada' debe tener código de régimen (campo 'Código AFIP' l10n_ar_code)
Usage
=====
+* 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.
+* Subir el archivo csv de actividades AFIP en el modelo afip.activity.
+* 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 .
+* 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.
+
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: http://runbot.adhoc.com.ar/
diff --git a/l10n_ar_account_tax_settlement_mendoza/__manifest__.py b/l10n_ar_account_tax_settlement_mendoza/__manifest__.py
index 6c15bf9ae..ff5a4e7f7 100644
--- a/l10n_ar_account_tax_settlement_mendoza/__manifest__.py
+++ b/l10n_ar_account_tax_settlement_mendoza/__manifest__.py
@@ -1,21 +1,21 @@
{
"name": "Tax settlement Mendoza",
- "version": "17.0.1.0.0",
+ "version": "18.0.1.0.0",
"category": "Accounting",
"author": "ADHOC SA",
"license": "LGPL-3",
"depends": [
+ "base_import_match",
"l10n_ar_account_tax_settlement",
- "l10n_ar_withholding_ux",
- #'base_import_match',
+ "l10n_ar_tax_python",
+ "l10n_ar_tax",
],
"data": [
"views/account_move_views.xml",
"views/afip_activity_view.xml",
- "views/account_payment_view.xml",
"wizard/res_config_settings_views.xml",
],
- "installable": False,
+ "installable": True,
"auto_install": False,
"application": False,
"post_init_hook": "post_init_hook",
diff --git a/l10n_ar_account_tax_settlement_mendoza/hooks.py b/l10n_ar_account_tax_settlement_mendoza/hooks.py
index 79b739a7e..6106d3d53 100644
--- a/l10n_ar_account_tax_settlement_mendoza/hooks.py
+++ b/l10n_ar_account_tax_settlement_mendoza/hooks.py
@@ -1,35 +1,80 @@
import logging
-from odoo import SUPERUSER_ID, api
-
_logger = logging.getLogger(__name__)
-def post_init_hook(cr, registry):
+def post_init_hook(env):
"""Loaded after installing the module. Configuramos impuesto de Retención IIBB Mendoza Aplicada para que tengan código python.
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."""
- env = api.Environment(cr, SUPERUSER_ID, {})
- ar_companies = env["res.company"].search([]).filtered(lambda x: x.country_code == "AR")
- for company in ar_companies:
- ret_mendoza_aplicada_ext_id = "l10n_ar_account_withholding.%s_ri_tax_retencion_iibb_za_aplicada" % (company.id)
- ret_mendoza_aplicada_tax = env.ref(ret_mendoza_aplicada_ext_id, False)
- if not ret_mendoza_aplicada_tax:
+ # Crear registros de fiscal position para todas las compañías argentinas
+ for company in env["res.company"].search([]).filtered(lambda x: x.country_code == "AR"):
+ # Buscar la posición fiscal "Retenciones" de esta compañía --> esta se crea en la ul 1415 [RET18] Migración retenciones de Ganancias
+ fiscal_position = env["account.fiscal.position"].search(
+ [("name", "=", "Retenciones"), ("company_id", "=", company.id)], limit=1
+ )
+
+ if not fiscal_position:
+ # No se encontró la posición fiscal 'Retenciones' para la compañía
continue
- ret_mendoza_aplicada_tax.withholding_type = "code"
- ret_mendoza_aplicada_tax.withholding_python_compute = (
- "\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\n"
- "if 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 "
+
+ tax_ext_id_option_a = "account.%s_ex_tax_withholding_iibb_mza_applied" % company.id
+ tax_ext_id_option_b = "l10n_ar_tax.%s_ri_tax_retencion_iibb_za_aplicada" % company.id
+ default_tax = env.ref(tax_ext_id_option_a, raise_if_not_found=False) or env.ref(
+ tax_ext_id_option_b, raise_if_not_found=False
)
- _logger.info(
- "Se establece código python en impuesto de Retención IIBB Mendoza Aplicada para la compañía %s"
- % (company.name)
+ if not default_tax:
+ _logger.warning(
+ "No se encontró el impuesto %s ni %s para la compañía %s"
+ % (tax_ext_id_option_a, tax_ext_id_option_b, company.name)
+ )
+ continue
+
+ # Verificar si ya existe el registro para esta compañía
+ existing_record = env["account.fiscal.position.l10n_ar_tax"].search(
+ [
+ ("fiscal_position_id", "=", fiscal_position.id),
+ ("default_tax_id", "=", default_tax.id),
+ ("tax_type", "=", "withholding"),
+ ],
+ limit=1,
)
+
+ if not existing_record:
+ python_formula = """
+# payment: account.payment object
+# partner: res.partner object (commercial partner of payment)
+
+move_to_pay = payment.to_pay_move_line_ids.move_id
+if not move_to_pay:
+ raise UserError(
+ "No puede calcular retenciones automáticas de aplicadas de Mendoza si no seleccionó una factura para pagar"
+ )
+activities = move_to_pay.activities_mendoza_ids
+if activities:
+ activity_codes = activities.mapped('code')
+ partner_vat = move_to_pay.partner_id.l10n_ar_formatted_vat
+ actividades_con_riesgo, actividades_con_alicuota_cero = payment.company_id.process_mendoza_csv_file(partner_vat, activity_codes)
+ menor_alicuota = activities.menor_alicuota(actividades_con_alicuota_cero)
+
+ if menor_alicuota[0] in actividades_con_riesgo:
+ aliquot = menor_alicuota[1] * 2
+ else:
+ aliquot = menor_alicuota[1]
+else:
+ aliquot = 0
+"""
+ env["account.fiscal.position.l10n_ar_tax"].create(
+ {
+ "fiscal_position_id": fiscal_position.id,
+ "default_tax_id": default_tax.id,
+ "tax_type": "withholding",
+ "webservice": "python_formula",
+ "python_formula": python_formula,
+ }
+ )
+ _logger.info("Se crea registro de fiscal position para IIBB Mendoza en la compañía %s" % (company.name))
+
afip_activity_model_id = env["ir.model"].search([("name", "=", "afip.activity")]).id
# 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.
diff --git a/l10n_ar_account_tax_settlement_mendoza/models/__init__.py b/l10n_ar_account_tax_settlement_mendoza/models/__init__.py
index c037b5a68..3f3e766fa 100644
--- a/l10n_ar_account_tax_settlement_mendoza/models/__init__.py
+++ b/l10n_ar_account_tax_settlement_mendoza/models/__init__.py
@@ -1,6 +1,4 @@
from . import account_move
from . import afip_activity
from . import res_company
-from . import account_payment
-from . import account_tax
from . import account_journal
diff --git a/l10n_ar_account_tax_settlement_mendoza/models/account_journal.py b/l10n_ar_account_tax_settlement_mendoza/models/account_journal.py
index dfbc38c13..eaaaa7632 100644
--- a/l10n_ar_account_tax_settlement_mendoza/models/account_journal.py
+++ b/l10n_ar_account_tax_settlement_mendoza/models/account_journal.py
@@ -1,5 +1,5 @@
from odoo import _, models
-from odoo.exceptions import RedirectWarning
+from odoo.exceptions import UserError
class AccountJournal(models.Model):
@@ -7,27 +7,18 @@ class AccountJournal(models.Model):
def iibb_aplicado_sircar_files_values(self, move_lines):
"""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."""
- tax_group_id_mendoza_id = self.env.ref("l10n_ar_ux.tax_group_retencion_iibb_za")
- mendoza_lines = move_lines.filtered(
+ mendoza_state = self.env.ref("base.state_ar_m")
+ if missing_codigo_regimen_mendoza_taxes := move_lines.filtered(
lambda x: x.payment_id
- and x.tax_line_id.withholding_type == "code"
- and x.tax_group_id == tax_group_id_mendoza_id
- )
- missing_codigo_regimen = mendoza_lines.filtered(lambda x: not x.payment_id.tax_withholding_id.codigo_regimen)
- if mendoza_lines and missing_codigo_regimen:
- raise RedirectWarning(
- message=_(
- "El impuesto '%s' not tiene código de regimen en solapa 'Opciones avanzadas' campo 'Codigo de regimen IVA'.",
- missing_codigo_regimen.payment_id.tax_withholding_id.name,
- ),
- action={
- "type": "ir.actions.act_window",
- "res_model": "account.tax",
- "views": [(False, "form")],
- "res_id": mendoza_lines.tax_line_id.id,
- "name": _("Tax"),
- "view_mode": "form",
- },
- button_text=_("Editar Impuesto"),
+ and x.tax_line_id.l10n_ar_state_id == mendoza_state
+ and not x.tax_line_id.l10n_ar_code
+ ).mapped("tax_line_id"):
+ tax_lines = []
+ for mdza_tax in missing_codigo_regimen_mendoza_taxes:
+ tax_lines.append(_("ID: %(id)s\t\t- Name: %(name)s", id=mdza_tax.id, name=mdza_tax.display_name))
+ details = _(
+ "Los siguientes impuestos de Mendoza no tienen código de régimen (campo 'Código AFIP' l10n_ar_code):\n\n%(taxes)s",
+ taxes="\n".join(tax_lines),
)
+ raise UserError(details)
return super().iibb_aplicado_sircar_files_values(move_lines)
diff --git a/l10n_ar_account_tax_settlement_mendoza/models/account_payment.py b/l10n_ar_account_tax_settlement_mendoza/models/account_payment.py
deleted file mode 100644
index 51ecb3015..000000000
--- a/l10n_ar_account_tax_settlement_mendoza/models/account_payment.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from odoo import fields, models
-from odoo.exceptions import ValidationError
-
-
-class AccountPayment(models.Model):
- _inherit = "account.payment"
-
- # IMPORTANTE: alicuota_mendoza se guarda al momento de correr el código python del impuesto 'Retención IIBB Mendoza Aplicada' --> payment.write({'alicuota_mendoza': alicuota}). Ver por interfaz.
- alicuota_mendoza = fields.Float(help="Guardamos la alícuota para el txt de mendoza.", readonly=True)
-
- def compute_withholdings(self):
- """Para el cálculo de retenciones automáticas de aplicadas de Mendoza siempre tiene que haber una factura vinculada al payment. Además debemos guardar en el payment de mendoza la alícuota aplicada."""
- res = super().compute_withholdings()
- tax_group_mendoza_id = self.env.ref("l10n_ar.tax_group_withholding_vat").id
- payment_mendoza = self.payment_ids.filtered(
- lambda x: x.tax_withholding_id.tax_group_id.id == tax_group_mendoza_id
- and x.tax_withholding_id.withholding_type == "code"
- and x.state == "draft"
- )
- if payment_mendoza:
- if not self.to_pay_move_line_ids:
- raise ValidationError(
- "No puede calcular retenciones automáticas de aplicadas de Mendoza si no seleccionó una factura para pagar"
- )
- # Agregamos la alícuota de mendoza al payment (es necesario para generar el txt iibb_aplicado_sircar_files_values)
- payment_mendoza.alicuota_mendoza = self.alicuota_mendoza
- return res
diff --git a/l10n_ar_account_tax_settlement_mendoza/models/account_tax.py b/l10n_ar_account_tax_settlement_mendoza/models/account_tax.py
deleted file mode 100644
index 7b8f2b3f8..000000000
--- a/l10n_ar_account_tax_settlement_mendoza/models/account_tax.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from odoo import models
-
-
-class AccountTax(models.Model):
- _inherit = "account.tax"
-
- def get_partner_alicuot(self, partner, date, line=None):
- """La alícuota para el archivo txt de mendoza que se genera desde el método iibb_aplicado_sircar_files_values
- no se obtiene del partner sino que se obtiene del payment, y el código de régimen se obtiene del impuesto pero
- extendemos el método get_partner_alicuot original para usarlo como puente, agregamos 'line' como parámentro."""
- if (
- line
- and line.payment_id
- and line.payment_id.alicuota_mendoza
- and line.payment_id.tax_withholding_id.codigo_regimen
- ):
- return self.env["res.partner.arba_alicuot"].new(
- {
- "alicuota_retencion": line.payment_id.alicuota_mendoza * 100,
- "partner_id": partner,
- "regimen_retencion": line.payment_id.tax_withholding_id.codigo_regimen,
- }
- )
- return super().get_partner_alicuot(partner, date, line=line)
diff --git a/l10n_ar_account_tax_settlement_mendoza/views/account_payment_view.xml b/l10n_ar_account_tax_settlement_mendoza/views/account_payment_view.xml
deleted file mode 100644
index 287a6bb24..000000000
--- a/l10n_ar_account_tax_settlement_mendoza/views/account_payment_view.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
- account.payment.form
- account.payment
-
-
-
-
-
-
-
-
diff --git a/l10n_ar_account_tax_settlement_mendoza/views/afip_activity_view.xml b/l10n_ar_account_tax_settlement_mendoza/views/afip_activity_view.xml
index 09d878b89..c647419c1 100644
--- a/l10n_ar_account_tax_settlement_mendoza/views/afip_activity_view.xml
+++ b/l10n_ar_account_tax_settlement_mendoza/views/afip_activity_view.xml
@@ -15,7 +15,7 @@
- afip.activity.tree
+ afip.activity.list
afip.activity
diff --git a/l10n_ar_txt_sire/__manifest__.py b/l10n_ar_txt_sire/__manifest__.py
index 16844c1fc..603bced46 100644
--- a/l10n_ar_txt_sire/__manifest__.py
+++ b/l10n_ar_txt_sire/__manifest__.py
@@ -1,6 +1,6 @@
{
"name": "Txt SIRE",
- "version": "17.0.1.0.0",
+ "version": "18.0.1.0.0",
"category": "Accounting",
"author": "ADHOC SA",
"website": "www.adhoc.com.ar",
@@ -9,13 +9,9 @@
"l10n_ar_account_tax_settlement",
"l10n_ar_tax",
],
- "data": [
- "data/account_account_tag.xml",
- "views/res_partner_view.xml",
- "views/l10n_ar_payment_withholding_views.xml",
- ],
+ "data": ["data/account_account_tag.xml", "views/res_partner_view.xml", "views/account_payment_view.xml"],
"demo": [],
- "installable": False,
+ "installable": True,
"auto_install": False,
"application": False,
}
diff --git a/l10n_ar_txt_sire/models/__init__.py b/l10n_ar_txt_sire/models/__init__.py
index 6178539ab..5a6e0c9bb 100644
--- a/l10n_ar_txt_sire/models/__init__.py
+++ b/l10n_ar_txt_sire/models/__init__.py
@@ -1,3 +1,3 @@
from . import account_journal
from . import res_partner
-from . import l10n_ar_payment_withholding
+from . import account_payment
diff --git a/l10n_ar_txt_sire/models/account_journal.py b/l10n_ar_txt_sire/models/account_journal.py
index fcffa6fc2..9a8ebd6b5 100644
--- a/l10n_ar_txt_sire/models/account_journal.py
+++ b/l10n_ar_txt_sire/models/account_journal.py
@@ -49,7 +49,8 @@ def sire_files_values(self, move_lines):
# fijo "218"
content += "218"
# 6 Régimen (integer long 3, 33-35, obligatorio)
- content += payment.withholding_id.tax_id.l10n_ar_code.zfill(3)
+ tax = line._get_settlement_tax()
+ content += tax.l10n_ar_code.zfill(3)
# 7 Cuit ordenante (integer 11, 36-46, obligatorio)
content += company_vat
# 8 Fecha retención (date long 10, 59-68, obligatorio)
@@ -84,11 +85,11 @@ def sire_files_values(self, move_lines):
# 19 No retención motivo (string 30, 193-222, no obligatorio)
content += "0" * 30
# 20 Aplica CDI (boolean 1, 223-223, obligatorio) --> especificación 40906, mt 11/12/24
- content += "1" if payment.withholding_id.sire_aplica_cdi else "0"
+ content += "1" if payment.sire_aplica_cdi else "0"
# 21 Código de alícuota (integer, 4, 224-227, obligatorio)
- content += payment.withholding_id.sire_codigo_alicuota.zfill(4)
+ content += payment.sire_codigo_alicuota.zfill(4)
# 22 Aplica acrecentamiento (boolean, 1, 228-228)
- content += "1" if payment.withholding_id.sire_aplica_acrecentamiento else "0"
+ content += "1" if payment.sire_aplica_acrecentamiento else "0"
# 23 Retenido clave nif (string 50, 229-278, obligatorio)
# Cuit del pais del sujeto retenido s/ especificación tarea 40906, mt 11/12/24
content += pais.l10n_ar_natural_vat if es_persona else pais.l10n_ar_legal_entity_vat
@@ -133,16 +134,16 @@ def _sire_validations(self, move_lines):
corregir para poder generar el archivo."""
# Validamos que el impuesto SIRE tenga código de régimen establecido
for line in move_lines.sorted(key=lambda r: (r.date, r.id)):
- payment = line.payment_id
- if not payment.withholding_id.tax_id.l10n_ar_code:
+ tax = line._get_settlement_tax()
+ if not tax.l10n_ar_code:
raise RedirectWarning(
message=_(
- "El impuesto '%s' no tiene código de régimen establecido. Es obligatorio para generar el"
- " archivo txt Sire. Editar campo 'Codigo de regimen IVA' en solapa 'Opciones avanzadas'"
- " en la vista formulario",
- payment.withholding_id.tax_id.name,
+ "El impuesto '%(tax_name)s' (id: %(tax_id)s) no tiene código de régimen establecido. Es obligatorio para generar el"
+ " archivo txt Sire. Editar campo 'Codigo AFIP' (l10n_ar_code) en la vista formulario del impuesto.",
+ tax_id=tax.id,
+ tax_name=tax.name,
),
- action=payment.withholding_id.tax_id.get_formview_action(),
+ action=tax.get_formview_action(),
button_text=_("Editar impuesto"),
)
@@ -165,7 +166,7 @@ def _sire_validations(self, move_lines):
# Validamos que el contacto tenga país establecido
if not line.partner_id.country_id:
raise RedirectWarning(
- message=_("El contacto '%s' debe tener país establecido", payment.partner_id.name),
+ message=_("El contacto '%s' debe tener país establecido", line.payment_id.partner_id.name),
action=line.partner_id.get_formview_action(),
button_text=_("Editar contacto"),
)
@@ -187,13 +188,13 @@ def _sire_validations(self, move_lines):
)
# Validamos que el código de alícuota se encuentre entre 1 y 83 si no aplica CDI
- if not payment.withholding_id.sire_aplica_cdi and int(payment.withholding_id.sire_codigo_alicuota) > 83:
+ if not line.payment_id.sire_aplica_cdi and int(line.payment_id.sire_codigo_alicuota) > 83:
raise UserError(
_(
"El pago %(payment_name)s (id: %(payment_id)s) debe tener código de alícuota"
" menor a 83 ya que no aplica CDI",
- payment_name=payment.name,
- payment_id=payment.id,
+ payment_name=line.payment_id.name,
+ payment_id=line.payment_id.id,
)
)
@@ -206,19 +207,20 @@ def certificado_retencion_impositiva_files_values(self, move_lines):
content = ""
for line in move_lines.sorted(key=lambda r: (r.date, r.id)):
payment = line.payment_id
- if not payment.withholding_id.tax_id.l10n_ar_code:
+ tax = line._get_settlement_tax()
+ if not tax.l10n_ar_code:
raise RedirectWarning(
message=_(
"El impuesto '%s' no tiene código de régimen establecido."
" Editar campo 'Codigo de regimen IVA' en solapa 'Opciones avanzadas'"
"en la vista formulario",
- payment.withholding_id.tax_id.name,
+ tax.name,
),
action={
"type": "ir.actions.act_window",
"res_model": "account.tax",
"views": [(False, "form")],
- "res_id": payment.withholding_id.tax_id.id,
+ "res_id": tax.id,
"name": _("Tax"),
"view_mode": "form",
},
@@ -232,7 +234,8 @@ def certificado_retencion_impositiva_files_values(self, move_lines):
# 3 Impuesto (integer long 3, 41-43, obligatorio)
content += "216"
# 4 Régimen (integer long 3, 44-46, obligatorio)
- content += payment.withholding_id.tax_id.l10n_ar_code
+
+ content += tax.l10n_ar_code
# 5 Fecha retención (date long 10, 47-56, obligatorio)
content += fecha_impuesto
# 6 Condición (integer 2, 57-58, no obligatorio)
@@ -244,15 +247,11 @@ def certificado_retencion_impositiva_files_values(self, move_lines):
# 9 Importe retención (decimal 14, 90-103, obligatorio)
content += "%014.2f" % abs(line.balance)
# 10 Importe de la base de cálculo/cantidad (decimal 14, 104-117, obligatorio)
- content += "%014.2f" % abs(payment.withholding_id.base_amount)
+ content += "%014.2f" % abs(line.withholding_id.base_amount)
# 11 Régimen de exclusión (boolean 1, 118-118, obligatorio)
content += "0"
# 12 Porcentaje de exclusión (decimal 6, 119-124, no obligatorio)
- content += (
- "%06.2f" % payment.withholding_id.tax_id.porcentaje_exclusion
- if payment.withholding_id.tax_id.porcentaje_exclusion != "0.0"
- else "000.00"
- )
+ content += "%06.2f" % tax.porcentaje_exclusion if tax.porcentaje_exclusion != "0.0" else "000.00"
# 13 Fecha publicación o finalización de la vigencia (date 10, 125-134, no obligatorio)
content += " " * 10
# 14 Tipo comprobante (integer 2, 135-136, obligatorio)
diff --git a/l10n_ar_txt_sire/models/account_payment.py b/l10n_ar_txt_sire/models/account_payment.py
new file mode 100644
index 000000000..bb0f87a34
--- /dev/null
+++ b/l10n_ar_txt_sire/models/account_payment.py
@@ -0,0 +1,38 @@
+from odoo import api, fields, models
+
+
+class AccountPayment(models.Model):
+ _inherit = "account.payment"
+
+ sire_aplica_cdi = fields.Boolean(
+ readonly=False, help="Campo para archivo txt Ganancias SIRE. Marcar si aplica CDI", store=True
+ )
+ sire_aplica_acrecentamiento = fields.Boolean(
+ readonly=False, help="Campo para archivo txt Ganancias SIRE. Marcar si aplica CDI", store=True
+ )
+ sire_codigo_alicuota = fields.Char(readonly=False, size=4, store=True)
+ es_sire = fields.Boolean(store=True)
+
+ @api.onchange("l10n_ar_withholding_line_ids", "partner_id")
+ def _compute_sire_fields(self):
+ """
+ This method is triggered when the partner or tax withholding is changed.
+ It computes the SIRE fields based on the partner's properties.
+ """
+ tag_tax_sire = self.env["account.account.tag"].search(
+ [("name", "=", "Sire"), ("applicability", "=", "taxes"), ("country_id", "=", self.env.ref("base.ar").id)]
+ )
+ for payment in self:
+ has_sire_withholdings = payment.l10n_ar_withholding_line_ids.filtered(
+ lambda pay: tag_tax_sire in pay.tax_id.invoice_repartition_line_ids.tag_ids
+ )
+ if has_sire_withholdings:
+ payment.es_sire = True
+ payment.sire_aplica_cdi = payment.partner_id.sire_aplica_cdi
+ payment.sire_aplica_acrecentamiento = payment.partner_id.sire_aplica_acrecentamiento
+ payment.sire_codigo_alicuota = payment.partner_id.sire_codigo_alicuota
+ else:
+ payment.es_sire = False
+ payment.sire_aplica_cdi = False
+ payment.sire_aplica_acrecentamiento = False
+ payment.sire_codigo_alicuota = ""
diff --git a/l10n_ar_txt_sire/models/l10n_ar_payment_withholding.py b/l10n_ar_txt_sire/models/l10n_ar_payment_withholding.py
deleted file mode 100644
index 7c75ed1d7..000000000
--- a/l10n_ar_txt_sire/models/l10n_ar_payment_withholding.py
+++ /dev/null
@@ -1,37 +0,0 @@
-from odoo import api, fields, models
-
-
-class l10nArPaymentWithholding(models.Model):
- _inherit = "l10n_ar.payment.withholding"
-
- sire_aplica_cdi = fields.Boolean(
- readonly=False, help="Campo para archivo txt Ganancias SIRE. Marcar si aplica CDI", store=True
- )
- sire_aplica_acrecentamiento = fields.Boolean(
- readonly=False, help="Campo para archivo txt Ganancias SIRE. Marcar si aplica CDI", store=True
- )
- sire_codigo_alicuota = fields.Char(readonly=False, size=4, store=True)
- es_sire = fields.Boolean(store=True)
-
- @api.onchange("partner_id", "tax_withholding_id")
- def _compute_sire_fields(self):
- """
- This method is triggered when the partner or tax withholding is changed.
- It computes the SIRE fields based on the partner's properties.
- """
- tag_tax_sire = self.env["account.account.tag"].search(
- [("name", "=", "Sire"), ("applicability", "=", "taxes"), ("country_id", "=", self.env.ref("base.ar").id)]
- )
- sire_payments = self.filtered(
- lambda pay: tag_tax_sire in pay.tax_withholding_id.invoice_repartition_line_ids.tag_ids
- )
- for payment in sire_payments:
- payment.es_sire = True
- payment.sire_aplica_cdi = payment.partner_id.sire_aplica_cdi
- payment.sire_aplica_acrecentamiento = payment.partner_id.sire_aplica_acrecentamiento
- payment.sire_codigo_alicuota = payment.partner_id.sire_codigo_alicuota
- for payment in self - sire_payments:
- payment.es_sire = False
- payment.sire_aplica_cdi = False
- payment.sire_aplica_acrecentamiento = False
- payment.sire_codigo_alicuota = ""
diff --git a/l10n_ar_txt_sire/views/account_payment_view.xml b/l10n_ar_txt_sire/views/account_payment_view.xml
index 3e8decc29..e662b0e14 100644
--- a/l10n_ar_txt_sire/views/account_payment_view.xml
+++ b/l10n_ar_txt_sire/views/account_payment_view.xml
@@ -5,13 +5,11 @@
account.payment
-
+
-
-
-
-
-
+
+
+
diff --git a/l10n_ar_txt_sire/views/l10n_ar_payment_withholding_views.xml b/l10n_ar_txt_sire/views/l10n_ar_payment_withholding_views.xml
deleted file mode 100644
index 5a0e65783..000000000
--- a/l10n_ar_txt_sire/views/l10n_ar_payment_withholding_views.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- l10n_ar.payment.withholding.form
- l10n_ar.payment.withholding
-
-
-
-
-
-
-
-
-
-
-
-
-
-