Skip to content

Commit

Permalink
[IMP] l10n_ar_account_withholding: Incorporate the padron detection b…
Browse files Browse the repository at this point in the history
…y file localy
  • Loading branch information
nicomacr committed Feb 16, 2022
1 parent e9ef336 commit 8266dc1
Show file tree
Hide file tree
Showing 12 changed files with 176 additions and 113 deletions.
1 change: 1 addition & 0 deletions l10n_ar_account_withholding/__manifest__.py
Expand Up @@ -26,6 +26,7 @@
'security/ir.model.access.csv',
'security/security.xml',
'wizard/res_config_settings_views.xml',
'wizard/padron_file_wizard_views.xml',
'reports/report_withholding_certificate.xml',
'views/account_payment_group_view.xml',
'views/afip_tabla_ganancias_escala_view.xml',
Expand Down
1 change: 1 addition & 0 deletions l10n_ar_account_withholding/models/__init__.py
Expand Up @@ -9,3 +9,4 @@
from . import account_payment_group
from . import res_partner
from . import mail_compose_message
from . import res_company_jurisdiction_aliquot
14 changes: 13 additions & 1 deletion l10n_ar_account_withholding/models/account_tax.py
Expand Up @@ -161,8 +161,20 @@ def get_partner_alicuot(self, partner, date):
('to_date', '=', False),
('to_date', '>=', date),
], limit=1)
padron_file = self.env['res.company.jurisdiction.aliquot'].search([
('tag_id', 'in', self.invoice_repartition_line_ids.mapped('tag_ids').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)
# solo buscamos en padron para estas responsabilidades
if not alicuot and \
if not alicuot and padron_file:
alicuot = padron_file._get_aliquit()
elif not alicuot and \
commercial_partner.l10n_ar_afip_responsibility_type_id.code in \
['1', '1FM', '2', '3', '4', '6', '11', '13']:
from_date = date + relativedelta(day=1)
Expand Down
54 changes: 4 additions & 50 deletions l10n_ar_account_withholding/models/res_company.py
Expand Up @@ -9,7 +9,6 @@
import logging
import json
import requests
import csv
# from dateutil.relativedelta import relativedelta
_logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -47,10 +46,6 @@ class ResCompany(models.Model):
'Rentas Córdoba: Alícuota no inscripto percepción'
)

l10n_ar_padron_witholding_arba = fields.Binary()
l10n_ar_padron_percepcion_arba = fields.Binary()
l10n_ar_padron_arba_date = fields.Date()

def _localization_use_withholdings(self):
""" Argentinian localization use documents """
self.ensure_one()
Expand Down Expand Up @@ -145,12 +140,10 @@ def get_arba_data(self, partner, from_date, to_date):
cuit)

if ws.Excepcion:
if self.l10n_ar_padron_arba_date and self.l10n_ar_padron_arba_date.month != from_date.month:
action = self.env.ref('l10n_ar_account_withholding.arba_file_wizard_form')
raise RedirectWarning(_("We get an error with ARBA conextion and you don't have padro files for the date. \n"
"Go to upload files for ARBA padron"), action.id, _('Padron Files Upload'))
elif self.l10n_ar_padron_arba_date and self.l10n_ar_padron_witholding_arba and self.l10n_ar_padron_percepcion_arba:
self._get_partner_arba_data_from_file(partner, from_date, to_date)
# if self.l10n_ar_padron_arba_date and self.l10n_ar_padron_arba_date.month != from_date.month:
# action = self.env.ref('l10n_ar_account_withholding.arba_file_wizard_form')
# raise RedirectWarning(_("We get an error with ARBA conextion and you don't have padro files for the date. \n"
# "Go to upload files for ARBA padron"), action.id, _('Padron Files Upload'))

raise UserError("%s\nExcepcion: %s" % (
ws.Traceback, ws.Excepcion))
Expand Down Expand Up @@ -185,45 +178,6 @@ def get_arba_data(self, partner, from_date, to_date):
return data


@api.model
def arba_descompress_file(self, rar_file_name):
_logger.log(25, 'ARBA: Descompress rar file')
from unrar import rarfile
rar = rarfile.RarFile(rar_file_name)
extracted_file_name = rar.namelist()[0]
rar.extractall(path='/tmp')
return '/tmp/' + extracted_file_name

def _get_partner_arba_data_from_file(partner, from_date, to_date):
ret_destination = self.arba_descompress_file(self.l10n_ar_padron_witholding_arba)
perc_destination = self.arba_descompress_file(self.l10n_ar_padron_percepcion_arba)

with open(perc_destination, 'r', encoding="ISO-8859-1", newline='') as csvfile:
perc_data = {row[4]: row for row in csv.reader(csvfile, delimiter=';')}
if next(iter(perc_data.values()))[0] != 'P':
raise UserError('error, el archivo %s no parece ser de percepciones') % perc_file_id

with open(ret_destination, 'r', encoding="ISO-8859-1", newline='') as csvfile:
ret_data = {row[4]: row for row in csv.reader(csvfile, delimiter=';')}
if next(iter(ret_data.values()))[0] != 'R':
raise UserError('error, el archivo %s no parece ser de retenciones') % ret_file_id

arba_tag = self.env.ref('l10n_ar_ux.tag_tax_jurisdiccion_902')
company = self
partner_alicuot = partner.arba_alicuot_ids.search([('tag_id', '=', arba_tag.id), ('company_id', '=', company_id), ('partner_id', '=', partner.id), ('from_date', '=', from_date), ('to_date', '=', to_date)], limit=1)
perc_row = perc_data.get(partner.vat)
ret_row = ret_data.get(partner.vat)
alicuota_percepcion = float(perc_row[8].replace(',', '.')) if perc_row else False
alicuota_retencion = float(ret_row[8].replace(',', '.')) if ret_row else False
data = {
'numero_comprobante': 'Importacion Manual',
'alicuota_percepcion': alicuota_percepcion,
'alicuota_retencion': alicuota_retencion,
'grupo_percepcion':perc_row[9] if perc_row else False,
'grupo_retencion': ret_row[9] if ret_row else False,
}
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
@@ -0,0 +1,59 @@
from odoo import models, fields, api, _
from odoo.exceptions import UserError
import zipfile
import os, re


class ResCompanyJurisdictionAliquot(models.Model):
_name = "res.company.jurisdiction.aliquot"
_descrption = "res.company.jurisdiction.aliquot"

company_id = fields.Many2one(
"res.company",
)
jurisdiction_code = fields.Many2many(
"account.account.tag", domain="[('applicability', '=', 'taxes')]"
)

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

def descompress_file(self, archivo_zip):
_logger.log(25, "Descompress rar file")
# ruta_zip = "/home/nmr/Descargas/PadronRGS122021.zip"
# archivo_zip = zipfile.ZipFile(rar_file_name, "r")
ruta_extraccion = "/tmp"
try:
archivo_zip.extractall(path=ruta_extraccion)
except:
pass
archivo_zip.close()

def find_aliquot(self, path, cuit):
with open(path, "r") as fp:
res = False
for line in fp.readlines():
values = line.split(";")
if values[4] == cuit:
res = values[8]
break
return res

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

def _get_alicuot(self, partner):
padron_type = "Per" if self.jurisdiction_code else "Ret"
path_file = self.find_file("/tmp/", padron_type)
if path_file:
self.descompress_file(self.file_padron)
aliquot = self.find_aliquot("tmp/" + path_file, partner.vat)
return aliquot
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_aliquot_base,access_res_partner_res_company_jurisdiction_aliquot_base,model_res_company_jurisdiction_aliquot,base.group_user,1,0,0,0
access_res_partner_res_company_jurisdiction_aliquot_manager,access_res_partner_res_company_jurisdiction_aliquot_manager,model_res_company_jurisdiction_aliquot,account.group_account_manager,1,1,1,1
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record model="ir.ui.view" id="view_res_company_jurisdiction_aliquot_form">
<field name="name">res.company.jurisdiction.aliquot.form.inherit</field>
<field name="model">res.company.jurisdiction.aliquot</field>
<field name="arch" type="xml">
<!-- <field name="imp_ganancias_padron" position="after">
<field name="default_regimen_ganancias_id" attrs="{'invisible': [('imp_ganancias_padron', 'in', ['EX', 'NC'])]}"/>
</field>
<group name="others_col_1">
<field name="drei"/>
</group>
<group name="others" position="after">
<label for="arba_alicuot_ids"/>
<field name="arba_alicuot_ids"/>
</group> -->
</field>
</record>

</odoo>
1 change: 1 addition & 0 deletions l10n_ar_account_withholding/wizard/__init__.py
Expand Up @@ -4,3 +4,4 @@
##############################################################################
from . import res_config_settings
from . import account_move_reversal
from . import padron_file_wizard
31 changes: 0 additions & 31 deletions l10n_ar_account_withholding/wizard/arba_padron_file.py

This file was deleted.

This file was deleted.

42 changes: 42 additions & 0 deletions l10n_ar_account_withholding/wizard/padron_file_wizard.py
@@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo import models, fields


class PadronFileWizard(models.TransientModel):
_name = "padron.file.wizard"
_description = 'padron.file.wizard'

l10n_ar_padron_date = fields.Date(
string='Date Padron',
required=True,
)

file_padron = fields.Binary(
string='File padron',
required=True,
)

jurisdiction_code = fields.Many2many(
comodel_name="account.account.tag",
domain="[('applicability', '=', 'taxes')]",
required=True,
)

def upload_file(self):
self.ensure_one()
company = self.env.company

last_day_of_month = fields.Date.subtract(fields.Date.add(
self.l10n_ar_padron_date.replace(day=1),
months=1), days=1)

start_day_of_month = self.l10n_ar_padron_date.replace(day=1)
self.env['res.company.jurisdiction.aliquot'].create({
'l10n_ar_padron_from_date': start_day_of_month,
'l10n_ar_padron_to_date': last_day_of_month,
'file_padron': self.file_padron,
'jurisdiction_code': self.jurisdiction_code,
'company_id': company.id,
})
32 changes: 32 additions & 0 deletions l10n_ar_account_withholding/wizard/padron_file_wizard_views.xml
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="file_wizard_form" model="ir.ui.view">
<field name="name">padron.file.wizard.form</field>
<field name="model">padron.file.wizard</field>
<field name="arch" type="xml">
<form string="Padron Wizard">
<group>
<group>
<field name="l10n_ar_padron_date" />
</group>
<group>
<field name="jurisdiction_code" widget="many2many_tags"/>
<field name="file_padron"/>
</group>
</group>
<footer>
<button string="Upload" class="btn-primary" type="object" name="upload_file" />
<button string="Close" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>

<record id="file_wizard_action" model="ir.actions.act_window">
<field name="name">Padron Files Upload</field>
<field name="res_model">padron.file.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<menuitem id="menu_action_file_wizard" name="Partner Aliqut wizard" parent="account.account_invoicing_menu" action="file_wizard_action" sequence="25"/>
</odoo>

0 comments on commit 8266dc1

Please sign in to comment.