Skip to content

Commit

Permalink
[IMP] l10n_ar_account_withholding: Wizard to ...
Browse files Browse the repository at this point in the history
... upload padron ARBA
  • Loading branch information
nicomacr authored and ica-adhoc committed Nov 25, 2022
1 parent 008d2d0 commit 48cc8e3
Show file tree
Hide file tree
Showing 7 changed files with 208 additions and 5 deletions.
1 change: 1 addition & 0 deletions l10n_ar_account_withholding/__manifest__.py
Expand Up @@ -32,6 +32,7 @@
'views/afip_tabla_ganancias_alicuotasymontos_view.xml',
'views/account_payment_view.xml',
'views/res_partner_arba_alicuot_views.xml',
'views/res_company_jurisdiction_padron_view.xml',
'views/res_partner_view.xml',
'views/account_tax_view.xml',
'data/tabla_ganancias_data.xml',
Expand Down
1 change: 1 addition & 0 deletions l10n_ar_account_withholding/models/__init__.py
Expand Up @@ -10,3 +10,4 @@
from . import account_payment_group
from . import res_partner
from . import mail_compose_message
from . import res_company_jurisdiction_padron
28 changes: 26 additions & 2 deletions l10n_ar_account_withholding/models/account_tax.py
Expand Up @@ -161,24 +161,48 @@ def get_partner_alicuot(self, partner, date):
('to_date', '=', False),
('to_date', '>=', date),
], limit=1)

# solo buscamos en padron para estas responsabilidades
if not alicuot and \
commercial_partner.l10n_ar_afip_responsibility_type_id.code in \
['1', '1FM', '2', '3', '4', '6', '11', '13']:

invoice_tags = self.invoice_repartition_line_ids.mapped('tag_ids')
padron_file = self.env['res.company.jurisdiction.padron'].search([
('jurisdiction_id', 'in', invoice_tags.ids),
('company_id', '=', company.id),
'|',
('l10n_ar_padron_from_date', '=', False),
('l10n_ar_padron_from_date', '<=', date),
'|',
('l10n_ar_padron_to_date', '=', False),
('l10n_ar_padron_to_date', '>=', date),
], limit=1)
from_date = date + relativedelta(day=1)
to_date = date + relativedelta(day=1, days=-1, months=+1)

agip_tag = self.env.ref('l10n_ar_ux.tag_tax_jurisdiccion_901')
arba_tag = self.env.ref('l10n_ar_ux.tag_tax_jurisdiccion_902')
cdba_tag = self.env.ref('l10n_ar_ux.tag_tax_jurisdiccion_904')
invoice_tags = self.invoice_repartition_line_ids.mapped('tag_ids')
if padron_file:
nro, alicuot_ret, alicuot_per = padron_file._get_aliquit(commercial_partner)
if nro:
return partner.arba_alicuot_ids.sudo().create({
'numero_comprobante': nro,
'alicuota_retencion': float(alicuot_ret),
'alicuota_percepcion': float(alicuot_per),
'partner_id': commercial_partner.id,
'company_id': company.id,
'tag_id': padron_file.jurisdiction_id.id,
'from_date': from_date,
'to_date': to_date,

})
if arba_tag and arba_tag.id in invoice_tags.ids:
arba_data = company.get_arba_data(
commercial_partner,
from_date, to_date,
)

# si no hay numero de comprobante entonces es porque no
# figura en el padron, aplicamos alicuota no inscripto
if not arba_data['numero_comprobante']:
Expand Down
11 changes: 8 additions & 3 deletions l10n_ar_account_withholding/models/res_company.py
Expand Up @@ -5,7 +5,7 @@
except ImportError:
IIBB = None
# from pyafipws.padron import PadronAFIP
from odoo.exceptions import UserError
from odoo.exceptions import UserError, RedirectWarning
import logging
import json
import requests
Expand Down Expand Up @@ -147,8 +147,12 @@ def get_arba_data(self, partner, from_date, to_date):
cuit)

if ws.Excepcion:
raise UserError("%s\nExcepcion: %s" % (
ws.Traceback, ws.Excepcion))
action = self.env.ref('l10n_ar_account_withholding.act_company_jurisdiction_padron')
raise RedirectWarning(_(
"Obtuvimos un error de conexión con ARBA y no encontramos padrón almacenado para las fechas dadas.\n"
"Puede intentar nuevamente más tarde, cargar la alícuota manualmente en el partner o subir el archivo del padrón en: "),
action.id, _('Ir a Carga de Padrones'))
# raise UserError("%s\nExcepcion: %s" % (ws.Traceback, ws.Excepcion))

# ' Hubo error general de ARBA?
if ws.CodigoError:
Expand Down Expand Up @@ -179,6 +183,7 @@ def get_arba_data(self, partner, from_date, to_date):
_logger.info('We get the following data: \n%s' % data)
return data


def get_cordoba_data(self, partner, date):
""" Obtener alícuotas desde app.rentascordoba.gob.ar
:param partner: El partner sobre el cual trabajamos
Expand Down
113 changes: 113 additions & 0 deletions l10n_ar_account_withholding/models/res_company_jurisdiction_padron.py
@@ -0,0 +1,113 @@
from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError
from io import BytesIO
import zipfile
import tempfile
import os
import re
import logging
import base64
_logger = logging.getLogger(__name__)


class ResCompanyJurisdictionPadron(models.Model):
_name = "res.company.jurisdiction.padron"
_description = "res.company.jurisdiction.padron"

company_id = fields.Many2one(
"res.company",
required=True,
default=lambda self: self.env.company,
)
jurisdiction_id = fields.Many2one(
"account.account.tag",
domain="[('applicability', '=', 'taxes'),('jurisdiction_code', '!=', False)]",
required=True,
)

file_padron = fields.Binary(
"File",
required=True,
)
l10n_ar_padron_from_date = fields.Date(
"From Date",
required=True,
)
l10n_ar_padron_to_date = fields.Date(
"To Date",
required=True,
)

@api.constrains('jurisdiction_id')
def check_jurisdiction_id(self):
arba_tag = self.env.ref('l10n_ar_ux.tag_tax_jurisdiccion_902')
for rec in self:
if rec.jurisdiction_id != arba_tag:
raise ValidationError("El padron para (%s) no está implementado." % rec.jurisdiction_id.name)

@api.depends('company_id', 'jurisdiction_id')
def name_get(self):
res = []
for padron in self:
name = "%s: %s" % (padron.company_id.name,
padron.jurisdiction_id.name)
res += [(padron.id, name)]
return res

def descompress_file(self, file_padron):
_logger.log(25, "Descompress zip file")
ruta_extraccion = "/tmp"
file = base64.decodestring(file_padron)
fobj = tempfile.NamedTemporaryFile(delete=False)
fname = fobj.name
fobj.write(file)
fobj.close()
f = open(fname, 'r+b')
data = f.read()
f.write(base64.b64decode(file_padron))
with zipfile.ZipFile(f, 'r') as zip_file:
zip_file.extractall(path=ruta_extraccion)
zip_file.close()

def find_aliquot(self, path, cuit):
"""We try to find aliqut and number for a partner given
"""
with open(path, "r") as fp:
aliq = False
nro = False
for line in fp.readlines():
values = line.split(";")
if values[4] == cuit:
aliq = values[8]
nro = values[3]
break
return nro, aliq

def find_file(self, rootdir, type_code):
res = False
date = str(self.l10n_ar_padron_from_date.month) + \
str(self.l10n_ar_padron_from_date.year)
pattern = "%s.{1}|.TXT\Z" % type_code + date
for subdir, dirs, files in os.walk(rootdir):
for f in files:
if re.search(pattern, f):
res = f
break
return res

def _get_aliquit(self, partner):
padron_types = ["Per", "Ret"]
nro = False
aliquot_ret = 0.0
aliquot_per = 0.0
for padron_type in padron_types:
path_file = self.find_file("/tmp/", padron_type)
if not path_file:
self.descompress_file(self.file_padron)
path_file = self.find_file("/tmp/", padron_type)
nro, aliquot = self.find_aliquot("/tmp/" + path_file, partner.vat)
if padron_type == "Per":
aliquot_per = aliquot and aliquot.replace(",", ".")
else:
aliquot_ret = aliquot and aliquot.replace(",", ".")
return nro, aliquot_ret, aliquot_per
2 changes: 2 additions & 0 deletions l10n_ar_account_withholding/security/ir.model.access.csv
Expand Up @@ -5,3 +5,5 @@ access_afip_tabla_ganancias_alicuotasymontos_manager,access_afip_tabla_ganancias
access_afip_tabla_ganancias_alicuotasymontos_all,access_afip_tabla_ganancias_alicuotasymontos_all,model_afip_tabla_ganancias_alicuotasymontos,,1,0,0,0
access_res_partner_arba_alicuot_all,access_res_partner_arba_alicuot_all,model_res_partner_arba_alicuot,base.group_user,1,0,0,0
access_res_partner_arba_alicuot_manager,access_res_partner_arba_alicuot_manager,model_res_partner_arba_alicuot,account.group_account_manager,1,1,1,1
access_res_partner_res_company_jurisdiction_padron_base,access_res_partner_res_company_jurisdiction_padron_base,model_res_company_jurisdiction_padron,base.group_user,1,0,0,0
access_res_partner_res_company_jurisdiction_padron_manager,access_res_partner_res_company_jurisdiction_padron_manager,model_res_company_jurisdiction_padron,account.group_account_manager,1,1,1,1
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record model="ir.ui.view" id="view_res_company_jurisdiction_padron_tree">
<field name="name">res.company.jurisdiction.padron.tree.inherit</field>
<field name="model">res.company.jurisdiction.padron</field>
<field name="arch" type="xml">
<tree string="Padron Alicuotas">
<field name="jurisdiction_id"/>
<field name="company_id"/>
<field name="l10n_ar_padron_from_date"/>
<field name="l10n_ar_padron_to_date"/>
</tree>
</field>
</record>

<record model="ir.ui.view" id="view_res_company_jurisdiction_padron_form">
<field name="name">res.company.jurisdiction.padron.form.inherit</field>
<field name="model">res.company.jurisdiction.padron</field>
<field name="arch" type="xml">
<form string="Padron Alicuotas">
<sheet>

<group>
<group>
<field name="company_id"/>
<field name="jurisdiction_id"/>
<field name="file_padron"/>
</group>
<group>
<field name="l10n_ar_padron_from_date"/>
<field name="l10n_ar_padron_to_date"/>
</group>
</group>
<p class="alert alert-info" role="alert" style="margin-bottom:0px;">
Padrones implementados:
<ul>
<li>ARBA: por lo general no es necesario cargarlo aquí ya que las alícuotas se obtienen automáticamente mediante webservice.
Si igualmente desea cargarlo, debe subir el archivo zip que descarga de arba y que tiene nombre de forma "PadronRGSMMAAAA.zip
</li>
</ul>
</p>
</sheet>
</form>
</field>
</record>

<record model="ir.actions.act_window" id="act_company_jurisdiction_padron">
<field name="name">Padron Alicuotas</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.company.jurisdiction.padron</field>
<field name="view_mode">tree,form</field>
</record>

<menuitem name="Padron de Alicuotas por compania" action="act_company_jurisdiction_padron" id="menu_action_company_jurisdiction_padron" sequence="100" parent="l10n_ar.menu_afip_config"/>

</odoo>

0 comments on commit 48cc8e3

Please sign in to comment.