Skip to content
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
14 changes: 6 additions & 8 deletions account_tax_settlement/models/account_journal.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion l10n_ar_account_tax_settlement/models/account_journal.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
8 changes: 6 additions & 2 deletions l10n_ar_account_tax_settlement_mendoza/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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/
Expand Down
10 changes: 5 additions & 5 deletions l10n_ar_account_tax_settlement_mendoza/__manifest__.py
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
87 changes: 66 additions & 21 deletions l10n_ar_account_tax_settlement_mendoza/hooks.py
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
2 changes: 0 additions & 2 deletions l10n_ar_account_tax_settlement_mendoza/models/__init__.py
Original file line number Diff line number Diff line change
@@ -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
35 changes: 13 additions & 22 deletions l10n_ar_account_tax_settlement_mendoza/models/account_journal.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,24 @@
from odoo import _, models
from odoo.exceptions import RedirectWarning
from odoo.exceptions import UserError


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

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)
27 changes: 0 additions & 27 deletions l10n_ar_account_tax_settlement_mendoza/models/account_payment.py

This file was deleted.

24 changes: 0 additions & 24 deletions l10n_ar_account_tax_settlement_mendoza/models/account_tax.py

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
</record>

<record id="view_afip_activity_tree" model="ir.ui.view">
<field name="name">afip.activity.tree</field>
<field name="name">afip.activity.list</field>
<field name="model">afip.activity</field>
<field name="inherit_id" ref="l10n_ar_ux.view_afip_activity_tree"/>
<field name="arch" type="xml">
Expand Down
10 changes: 3 additions & 7 deletions l10n_ar_txt_sire/__manifest__.py
Original file line number Diff line number Diff line change
@@ -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",
Expand All @@ -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,
}
2 changes: 1 addition & 1 deletion l10n_ar_txt_sire/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from . import account_journal
from . import res_partner
from . import l10n_ar_payment_withholding
from . import account_payment
Loading