l10n_ar_padron_afip/models/res_partner.py
# -*- coding: utf-8 -*-
##############################################################################
# For copyright and license notices, see __openerp__.py file in module root
# directory
##############################################################################
from openerp import models, fields, api, _
from pyafipws.padron import PadronAFIP
from openerp.exceptions import Warning
# import os
import base64
import logging
_logger = logging.getLogger(__name__)
class ResPartner(models.Model):
_inherit = "res.partner"
# campos desde
# http://www.sistemasagiles.com.ar/trac/wiki/PadronContribuyentesAFIP
# profits_tax_type = fields.Selection([
estado_padron = fields.Char(
'Estado AFIP',
)
imp_ganancias_padron = fields.Selection([
('NI', 'No Inscripto'),
('AC', 'Activo'),
('EX', 'Exento'),
# ('NA', 'No alcanzado'),
# ('XN', 'Exento no alcanzado'),
# ('AN', 'Activo no alcanzado'),
('NC', 'No corresponde'),
],
'Ganancias',
)
# vat_tax_type_padron = fields.Selection([
imp_iva_padron = fields.Selection([
('NI', 'No Inscripto'),
('AC', 'Activo'),
('EX', 'Exento'),
('NA', 'No alcanzado'),
('XN', 'Exento no alcanzado'),
('AN', 'Activo no alcanzado'),
# ('NC', 'No corresponde'),
],
'IVA',
)
integrante_soc_padron = fields.Selection(
[('N', 'No'), ('S', 'Si')],
'Integrante Sociedad',
)
monotributo_padron = fields.Selection(
[('N', 'No'), ('S', 'Si')],
'Monotributo',
)
actividad_monotributo_padron = fields.Char(
)
empleador_padron = fields.Boolean(
)
actividades_padron = fields.Many2many(
'afip.activity',
'res_partner_afip_activity_rel',
'partner_id', 'afip_activity_id',
'Actividades',
)
impuestos_padron = fields.Many2many(
'afip.tax',
'res_partner_afip_tax_rel',
'partner_id', 'afip_tax_id',
'Impuestos',
)
last_update_padron = fields.Date(
'Last Update Padron',
)
@api.multi
def update_constancia_from_padron_afip(self):
self.ensure_one()
return True
@api.multi
def get_data_from_padron_afip(self):
self.ensure_one()
cuit = self.document_number
# GET COMPANY
# if there is certificate for user company, use that one, if not
# use the company for the first certificate found
company = self.env.user.company_id
env_type = company._get_environment_type()
try:
certificate = company.get_key_and_certificate(company._get_environment_type())
except Exception:
certificate = self.env['afipws.certificate'].search([
('alias_id.type', '=', env_type),
('state', '=', 'confirmed'),
], limit=1)
if not certificate:
raise Warning(_(
'Not confirmed certificate found on database'))
company = certificate.alias_id.company_id
padron = company.get_connection('ws_sr_padron_a4').connect()
try:
padron.Consultar(cuit)
except Exception:
raise Warning(_(
'This cuit %s of the partner %s not exists in afip') % (
cuit, self.name))
# porque imp_iva activo puede ser S o AC
imp_iva = padron.imp_iva
if imp_iva == 'S':
imp_iva = 'AC'
elif imp_iva == 'N':
# por ej. monotributista devuelve N
imp_iva = 'NI'
vals = {
'name': padron.denominacion,
# 'name': padron.tipo_persona,
# 'name': padron.tipo_doc,
# 'name': padron.dni,
'estado_padron': padron.estado,
'street': padron.direccion,
'city': padron.localidad,
'zip': padron.cod_postal,
'actividades_padron': self.actividades_padron.search(
[('code', 'in', padron.actividades)]).ids,
'impuestos_padron': self.impuestos_padron.search(
[('code', 'in', padron.impuestos)]).ids,
'imp_iva_padron': imp_iva,
# TODAVIA no esta funcionando
# 'imp_ganancias_padron': padron.imp_ganancias,
'monotributo_padron': padron.monotributo,
'actividad_monotributo_padron': padron.actividad_monotributo,
'empleador_padron': padron.empleador == 'S' and True,
'integrante_soc_padron': padron.integrante_soc,
'last_update_padron': fields.Date.today(),
}
ganancias_inscripto = [10, 11]
ganancias_exento = [12]
if set(ganancias_inscripto) & set(padron.impuestos):
vals['imp_ganancias_padron'] = 'AC'
elif set(ganancias_exento) & set(padron.impuestos):
vals['imp_ganancias_padron'] = 'EX'
elif padron.monotributo == 'S':
vals['imp_ganancias_padron'] = 'NC'
else:
_logger.info(
"We couldn't get impuesto a las ganancias from padron, you must set it manually")
if padron.provincia:
# if not localidad then it should be CABA.
if not padron.localidad:
state = self.env['res.country.state'].search([
('code', '=', 'ABA'),
('country_id.code', '=', 'AR')], limit=1)
# If localidad cant be caba
else:
state = self.env['res.country.state'].search([
('name', 'ilike', padron.provincia),
('code', '!=', 'ABA'),
('country_id.code', '=', 'AR')], limit=1)
if state:
vals['state_id'] = state.id
if imp_iva == 'NI' and padron.monotributo == 'S':
vals['responsability_id'] = self.env.ref(
'l10n_ar_invoice.res_RM').id
elif imp_iva == 'AC':
vals['responsability_id'] = self.env.ref(
'l10n_ar_invoice.res_IVARI').id
elif imp_iva == 'EX':
vals['responsability_id'] = self.env.ref(
'l10n_ar_invoice.res_IVAE').id
else:
_logger.info(
"We couldn't infer the AFIP responsability from padron, you must set it manually.")
return vals