[IMP]V0.9.0 Integración con Servicio Regisro Empresas

Nota Importante : 

Antes de Aplicar la actualización, debe estar situado en la ficha del módulo, de lo contrario tendrán error 500, porque esta actualización afecta al model res.partner.

1.- El sistema funciona con un token gratuito público general , que permitirá hacer una cantidad máxima de consultas diarias por token, según disposiciones puestas en https://sre.cl

2.- Será opcional el uso de nuestro servicio, permitiendo así poder hacer instalaciones offline de los datos

3.- Por defecto estará activa la sincronización de datos, sin embargo pueden desactivar la sincronización en el panel de configuración general

4.- para lograr hacer un buen merge de la información y detectar cuál es la más reciente, se recopilarán además de los datos de partner, la url de de origen de la información, de esta forma generar una IA que haga un merge efectivo de la data nueva

5.- Existirán tokens premium que permitirá la consulta diaria según disposiciones en el sitio https://sre.cl, el costo y cantidad de consultas por token estarán definidos ahí.

6.- Queda planificado un CRON que mantenga la información local de los actuales contactos fresca


Al aplicar esta actualización, acepta el término de condiciones de marcar por defecto la sincronización de datos con la base de datos central y el envío de los datos dispuestos para sincronización, sin embargo, puede en todo momento desactivar esta opción o crear su servicio centralizado propio.
parent 75954d43
......@@ -4,6 +4,8 @@ Se crea este repositorio, para dar un enfoque de firma electrónica directa con
- Se tomaron los inicios de github.com/odoo-chile/l10n_cl_dte y otros módulos de odoo-chile y la continuación de estos en github.com/dansanti/l10n_cl_dte.
- Este repositorio se crea con la finalidad de unificar módulos y facilitar la mantención de la facturación electrónica, que se estaba muy complejo
- obtener módulo de exportación xlsx "Base report xlsx" desde https://github.com/OCA/reporting-engine
- Se integra la consulta de datos de empresas al repositorio https://sre.cl, para permitir obtener datos digitando el rut
- Al instalar este módulo acepta que por defecto estará activa la sincronización de datos de partners al repositorio https://sre.cl, sin embargo puede desactivarlo en todo momento desde el panel de configuración general.
Estado:
- - Factura Electrónica (FAC 33, FNA 34): Ok envío, Ok muestra impresa, Ok Certificación
......
......@@ -2,15 +2,15 @@
{
"name": """Facturación Electrónica para Chile\
""",
'version': '0.8.16',
'version': '0.9.0',
'category': 'Localization/Chile',
'sequence': 12,
'author': 'Daniel Santibáñez Polanco, Cooperativa OdooCoop',
'website': 'https://globalresponse.cl',
'license': 'AGPL-3',
'summary': 'Facturación Electrónica para Chile.',
'summary': 'Facturación Electrónica para Chile. Mayor información en https://odoocoop.cl',
'description': """
Facturación Electrónica para Chile.
Facturación Electrónica para Chile. Mayor infromación en https://odoocoop.cl
""",
'depends': [
'base',
......
......@@ -23,6 +23,18 @@ class ResConfigSettings(models.TransientModel):
string="Limitar Cantidad de líneas por documento",
default=False,
)
url_remote_partners = fields.Char(
string="Url Remote Partners",
default="https://sre.cl/api/company_info"
)
token_remote_partners = fields.Char(
string="Token Remote Partners",
default="token_publico",
)
sync_remote_partners = fields.Boolean(
string="Sync Remote Partners",
default=True,
)
@api.model
def get_values(self):
......@@ -31,10 +43,16 @@ class ResConfigSettings(models.TransientModel):
account_auto_send_dte = int(ICPSudo.get_param('account.auto_send_dte', default=12))
account_auto_send_email = ICPSudo.get_param('account.auto_send_email', default=True)
account_limit_dte_lines = ICPSudo.get_param('account.limit_dte_lines', default=False)
account_url_remote_partners = ICPSudo.get_param('account.url_remote_partners', default='https://sre.cl/api/company_info')
account_token_remote_partners = ICPSudo.get_param('account.token_remote_partners', default="token_publico")
account_sync_remote_partners = ICPSudo.get_param('account.sync_remote_partners', default=True)
res.update(
auto_send_email=account_auto_send_email,
auto_send_dte=account_auto_send_dte,
limit_dte_lines=account_limit_dte_lines,
url_remote_partners=account_url_remote_partners,
token_remote_partners=account_token_remote_partners,
sync_remote_partners=account_sync_remote_partners,
)
return res
......@@ -47,3 +65,6 @@ class ResConfigSettings(models.TransientModel):
ICPSudo.set_param('account.auto_send_dte', self.auto_send_dte)
ICPSudo.set_param('account.auto_send_email', self.auto_send_email)
ICPSudo.set_param('account.limit_dte_lines', self.limit_dte_lines)
ICPSudo.set_param('account.url_remote_partners', self.url_remote_partners)
ICPSudo.set_param('account.token_remote_partners', self.token_remote_partners)
ICPSudo.set_param('account.sync_remote_partners', self.sync_remote_partners)
......@@ -3,9 +3,15 @@ from odoo import models, fields, api
from odoo.exceptions import UserError
from odoo.tools.translate import _
import re
import json
import logging
_logger = logging.getLogger(__name__)
try:
import urllib3
urllib3.disable_warnings()
pool = urllib3.PoolManager()
except:
_logger.warning("no se ha cargado urllib3")
class ResPartner(models.Model):
_inherit = 'res.partner'
......@@ -89,9 +95,25 @@ class ResPartner(models.Model):
default=True,
)
acteco_ids = fields.Many2many(
'partner.activities',
string='Activities Names',
)
'partner.activities',
string='Activities Names',
)
sync = fields.Boolean(
string="syncred",
default=False,
)
def write(self, vals):
result = super(ResPartner, self).write(vals)
if not vals.get('sync', False) and self.sync:
for k in vals.keys():
if k in ('name', 'dte_email', 'street', 'email', 'acteco_ids', 'website'):
try:
self.put_remote_user_data()
except Exception as e:
_logger.warning("Error en subida información %s" % str(e))
break
return result
@api.onchange('dte_email')
def set_temporal_email_cambiar_a_related(self):
......@@ -213,6 +235,7 @@ class ResPartner(models.Model):
self.document_number = ''
else:
self.vat = ''
self.fill_partner()
@api.onchange('city_id')
def _onchange_city_id(self):
......@@ -253,3 +276,79 @@ class ResPartner(models.Model):
return False
except IndexError:
return False
def _process_data(self, data={}):
if data.get('razon_social'):
self.name = data['razon_social']
if data.get('dte_email'):
self.dte_email = data['dte_email']
if data.get('email'):
self.name = data['email']
if data.get('telefono'):
self.name = data['phone']
if data.get('direccion'):
self.street = data['direccion']
if data.get('actecos'):
for a in data['actecos']:
ac = self.env['sii.document_class'].search([('code', '=', a)])
self.acteco_ids += ac
if data.get('url'):
self.website = data['url']
def put_remote_user_data(self):
sync = self.env['ir.config_parameter'].sudo().get_param('account.sync_remote_partners')
url = self.env['ir.config_parameter'].sudo().get_param('account.url_remote_partners')
token = self.env['ir.config_parameter'].sudo().get_param('account.token_remote_partners')
if not url or not token or not sync:
return
resp = pool.request('PUT',
url,
body=json.dumps(
{
'rut': self.document_number,
'token': token,
'razon_social': self.name,
'dte_email': self.dte_email,
'email': self.email,
'direccion': self.street,
#'comuna': self.
'telefono': self.phone,
'actectos': [ac.code for ac in self.acteco_ids],
'url': self.website,
'origen': self.env['ir.config_parameter'].sudo().get_param('web.base.url')
}
).encode('utf-8'),
headers={'Content-Type': 'application/json'})
data = json.loads(resp.data.decode('ISO-8859-1'))
def get_remote_user_data(self, to_check):
ICPSudo = self.env['ir.config_parameter'].sudo()
url = ICPSudo.get_param('account.url_remote_partners')
token = ICPSudo.get_param('account.token_remote_partners')
if not url or not token:
return
resp = pool.request('POST',
url,
body=json.dumps(
{
'rut': to_check,
'token': token,
}
).encode('utf-8'),
headers={'Content-Type': 'application/json'})
data = json.loads(resp.data.decode('iso-8859-1'))
if not data:
self.sync = False
return
self._process_data(data)
self.sync = True
@api.onchange('name')
def fill_partner(self):
if self.sync:
return
if self.document_number and self.check_vat_cl(self.document_number.replace('.','').replace('-', '')):
self.get_remote_user_data(self.document_number)
elif self.name and self.check_vat_cl(self.name.replace('.','').replace('-', '')):
self.get_remote_user_data(self.name)
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan oe_mb32">Facturaci&oacute;n Electr&oacute;nica para Chile</h3>
<div class="oe_span6">
<!--<img class="oe_picture" src="png" />-->
</div>
<div class="oe_span12 text-justify">
<p class="oe_mt32">
Facturaci&oacute;n Electr&oacute;nica Chilena Directa con el SII.
</p>
<p class="oe_mt12">
<ul>
<li> El uso de este m&oacute;dulo requiere de aprobar una certificaci&oacute;n de facturador propio de mercado en el SII (O contar ya con ella) <a href="https://odoocoop.cl/slides/canal-publico-1">Para Mayor Informaci&oacute;n Click Aqu&iacute;</a></li>
<li> Otener m&oacute;dulo de exportaci&oacute;n xlsx "Base report xlsx" desde <a href="https://github.com/OCA/reporting-engine">https://github.com/OCA/reporting-engine</a></li>
<li> Se integra la consulta de datos de empresas al repositorio <a href="https://sre.cl">https://sre.cl</a>, para permitir obtener datos digitando el rut"></a></li>
<li> Al instalar este m&oacute;dulo acepta que por defecto estar&aacute; activa la sincronizaci&oacute;n de datos de partners al repositorio <a href="https://sre.cl">https://sre.cl</a>, sin embargo puede desactivarlo en todo momento desde el panel de configuraci&oacute;n general</li>
</ul>
</p>
<p class="oe_mt12">
Estado:
<ul>
<li> Factura Electr&oacute;nica (FAC 33, FNA 34): Ok env&iacute;o, Ok muestra impresa, Ok Certificaci&oacute;n</li>
<li> Nota de Cr&eacute;dito Electr&oacute;nica: Ok env&iacute;o, Ok muestra impresa, Ok Certificaci&oacute;n</li>
<li> Nota de D&eacute;bito Electr&oacute;nica: Ok env&iacute;o, Ok muestra impresa, Ok Certificaci&oacute;n</li>
<li> Recepci&oacute;n XML Intercambio: Ok recepci&oacute;n, Ok respuesta mercader&iacute;as, Ok respuesta Validaci&oacute;n Comercial, Ok Env&iacute;o Recepci&oacute;n al SII, Ok Certificaci&oacute;n</li>
<li> Libro de Compra Venta: Ok env&iacute;o al SII, Ok Certificaci&oacute;n (B&aacute;sico y Exentos)</li>
<li> Consumo de Folios: Validaci&oacute;n OK, Env&iacute;o OK, Certificaci&oacute;n OK</li>
<li> Boleta Electr&oacute;nica por BO ( 39, 41 ): Validaci&oacute;n Ok, Muestra impresa No probado a&uacute;n, Informaci&oacute;n P&uacute;blica no adaptada a&uacute;n
<li> Libro Boletas Electr&oacute;nica: Validaci&oacute;n Ok, Creaci&oacute;n XML OK</li>
<li> Boleta Electr&oacute;nica por POS ( 39, 41): Validaci&oacute;n Ok, Muestras Impresas Ticket OK, Generaci&oacute;n XML Ok, Visaulizaci&oacute;n P&uacute;blica Ok, Certificaci&oacute;n OK v&iacute;a <a href="https://gitlab.com/dansanti/l10n_cl_dte_point_of_sale">https://gitlab.com/dansanti/l10n_cl_dte_point_of_sale</a></li>
<li> Nota de Cr&eacute;dito Electr&oacute;nica para Boletas ( Solo por BO POS): Validaci&oacute;n Ok, Generaci&oacute;n XML Ok, Muestras Impresas Ticket OK, Certificaci&oacute;n OK v&iacute;a <a href="https://gitlab.com/dansanti/l10n_cl_dte_point_of_sale">https://gitlab.com/dansanti/l10n_cl_dte_point_of_sale</a></li>
<li> Gu&iacute;a de Despacho Electr&oacute;nica: Ok env&iacute;o, Ok muestra impresa, Ok Certificaci&oacute;n, v&iacute;a <a href="https://gitlab.com/dansanti/l10n_cl_stock_picking">https://gitlab.com/dansanti/l10n_cl_stock_picking</a></li>
<li> Libro Gu&iacute;a Despacho: Ok env&iacute;o, Ok Muestras impresas, Ok Certificaci&oacute;n, v&iacute;a <a href="https://gitlab.com/dansanti/l10n_cl_stock_picking">https://gitlab.com/dansanti/l10n_cl_stock_picking</a></li>
<li> Factoring (Cesi&oacute;n de Cr&eacute;ditos): Ok Env&iacute;o, Ok Certificaci&oacute;n, v&iacute;a <a href="https://gitlab.com/dansanti/l10n_cl_dte_factoring">https://gitlab.com/dansanti/l10n_cl_dte_factoring</a></li>
<li> Factura de Exportaci&oacute;n Electr&oacute;nica ( 110 con sus NC 111 y ND 112): No Portado, No Probado v&iacute;a <a href="https://gitlab.com/dansanti/l10n_cl_dte_exportacion">https://gitlab.com/dansanti/l10n_cl_dte_exportacion</a></li>
<li> Liquidaci&oacute;n de Facturas: No desarrollada</li>
<li> Factura de Compra Electr&oacute;nica ( 46 ): No desarrollada (NO confundir con el concepto de ingresar facturas de proveedor, que la mayor&iacute;a le dice de compras, este es un documento de retenci&oacute;n de impuestos, la recepci&oacute;n de documentos proveedor, est&aacute; soportada, con los 4 tipos de respuesta que se deben generar seg&uacute;n normativa del sii)</li>
</ul>
</p>
<p class="oe_mt12">
Agradecimientos y colaboradores:
<ul>
<li> Daniel Santib&aacute;&ntilde;ez Polanco</li>
<li> Daniel Blanco</li>
<li> Nelson Ramirez</li>
<li> Carlos Toledo</li>
<li> Carlos Lopez</li>
</ul>
</p>
<p class="oe_mt12">
El m&oacute;dulo es totalmente gratuito, de libre uso e instalaci&oacute;n (Desarrollado bajo la licencia AGPLV3+), sin embargo, puede pagar nuestra asesor&iacute;a para aprender a usarlo y pasar las certificaciones necesarias que solicita el SII. <a href="https://odoocoop.cl/contactus">Solicite una evaluaci&oacute;n</a>
</p>
</div>
</div>
</section>
......@@ -69,17 +69,6 @@
<button name="%(l10n_cl_fe.action_caf_files)d" icon="fa-arrow-right" type="action" string="Archivos CAF" class="btn-link"/>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" id="envio_email">
<div class="o_setting_left_pane">
<field name="auto_send_email" />
</div>
<div class="o_setting_right_pane" name="envios_right_pane">
<label string="Auto Enviar Email" for="auto_send_email"/>
<div class="text-muted">
Auto Enviar Email al enviar DTE al Cliente
</div>
</div>
</div>
</div>
<h2>Otras Opciones</h2>
<div class="row mt16 o_settings_container">
......@@ -94,6 +83,37 @@
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" id="url_remote_partners">
<div class="o_setting_left_pane" />
<div class="o_setting_right_pane" name="partners_right_pane">
<label string="Url Remote Partners" for="url_remote_partners"/>
<field name="url_remote_partners" />
<div class="text-muted">
Url de consulta de partners (autollenado)
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" id="token_remote_partners">
<div class="o_setting_left_pane" />
<div class="o_setting_right_pane" name="token_partners_right_pane">
<label string="Token Remote Partners" for="token_remote_partners"/>
<field name="token_remote_partners" />
<div class="text-muted">
Token de consulta de partners (autollenado)
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" id="sync_remote_partners">
<div class="o_setting_left_pane">
<field name="sync_remote_partners" />
</div>
<div class="o_setting_right_pane" name="sync_partners_right_pane">
<label string="Sincronizar Partners Con Maestro" for="sync_remote_partners"/>
<div class="text-muted">
Sincronizar datos de clientes/proveedores con la base de datos maestra
</div>
</div>
</div>
</div>
</div>
</div>
......
......@@ -6,6 +6,7 @@
<field name="model">res.partner</field>
<field name="arch" type="xml">
<field name="parent_id" position="before">
<field name="sync" invisible="1"/>
<field name="activity_description" placeholder="Glosa Descriptiva (Giro)" attrs="{'invisible': ('parent_id', '!=', False)}"/>
<field name="acteco_ids" placeholder="Actividades del partner" attrs="{'invisible': ('parent_id', '!=', False)}" widget="many2many_tags" options="{'no_create': True}"/>
</field>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment