Exemple #1
0
 def consultar_estado(self, cr, uid, ids, mc_dte_config_id, context=None):
     hash_dte = mc_dte_config_id.hash_tienda
     servidor = mc_dte_config_id.servidor_dte
     rut_emisor = self.rut_sin_dv(mc_dte_config_id.rutemisor)
     Cliente = LibreDTE(hash_dte, servidor)
     detalle = ''
     for dte in self.browse(cr, uid, ids, context=context):
         folio = dte.folio_dte_sii
         dte_cod = dte.codigo_sii
         estado = Cliente.get('/dte/dte_emitidos/estado/' + str(dte_cod) +
                              '/' + str(folio) + '/' + str(rut_emisor))
         if type(estado.json()) == type(dict()):
             detalle = estado.json()['ESTADO'] + ' // '
             if 'GLOSA_ESTADO' in estado.json():
                 detalle += estado.json()['GLOSA_ESTADO'] + ' // '
             else:
                 detalle += 'SIN GLOSA ESTADO // '
             if 'GLOSA_ERR' in estado.json():
                 detalle += estado.json()['GLOSA_ERR'] + ' // '
             else:
                 detalle += 'SIN GLOSA ERROR // '
             if 'NUM_ATENCION' in estado.json():
                 detalle += estado.json()['NUM_ATENCION'] + ' // '
             else:
                 detalle += 'SIN NUM ATENCION // '
             if 'ERR_CODE' in estado.json():
                 detalle += estado.json()['ERR_CODE']
             else:
                 detalle += 'SIN ERR CODE'
         else:
             detalle = estado.json()
         write_vals = {'detalle': detalle}
         self.write(cr, uid, [dte.id], write_vals)
     return detalle
Exemple #2
0
 def actualizar_estado(self, cr, uid, ids, mc_dte_config_id, context=None):
     logger = logging.getLogger('actualizar estado')
     hash_dte = mc_dte_config_id.hash_tienda
     servidor = mc_dte_config_id.servidor_dte
     metodo = mc_dte_config_id.metodo_actualizacion
     rut_emisor = self.rut_sin_dv(mc_dte_config_id.rutemisor)
     Cliente = LibreDTE(hash_dte, servidor)
     estado_txt = ''
     track_id = ''
     for dte in self.browse(cr, uid, ids, context=context):
         folio = dte.folio_dte_sii
         dte_cod = dte.codigo_sii
         estado = Cliente.get('/dte/dte_emitidos/actualizar_estado/' +
                              str(dte_cod) + '/' + str(folio) + '/' +
                              str(rut_emisor) + '?usarWebservice=' +
                              str(metodo))
         logger.warn(estado)
         if type(estado.json()) == type(dict()):
             logger.warn(estado.json())
             estado_txt = str(
                 estado.json()['revision_detalle']) + ' / ' + str(
                     estado.json()['revision_estado'])
             track_id = str(estado.json()['track_id'])
             write_vals = {'estado_dte': estado_txt}
             write_vals['track_id'] = track_id
             if 'revision_detalle' in estado.json() and estado.json(
             )['revision_detalle']:
                 logger.warn(estado.json()['revision_detalle'])
                 if 'ACEPTADO' in estado.json()['revision_detalle'].upper():
                     write_vals['imprimir'] = True
             if 'revision_estado' in estado.json() and estado.json(
             )['revision_estado']:
                 if 'RECHAZADO' in estado.json()['revision_estado'].upper():
                     if not '_RCH' in dte.name:
                         write_vals['name'] = dte.name + '_RCH'
                     write_vals['se_puede_cancelar'] = True
                     write_vals['imprimir'] = False
             self.write(cr, uid, [dte.id], write_vals)
         else:
             estado_txt = estado.json()
             track_id = 0
             write_vals = {'estado_dte': estado_txt}
             write_vals['track_id'] = track_id
             self.write(cr, uid, [dte.id], write_vals)
     return estado_txt, track_id
hash = ''
rut = 76192083
dte = 33
folio = 394
papelContinuo = 0
# =75 ó =80 para papel contínuo
copias_tributarias = 1
copias_cedibles = 1
cedible = int(bool(copias_cedibles))  # =1 genera cedible, =0 no genera cedible

# módulos que se usarán
from os import sys
from libredte.sdk import LibreDTE

# crear cliente
Cliente = LibreDTE(hash, url)

# obtener el PDF del DTE
opciones = '?papelContinuo=' + str(
    papelContinuo) + '&copias_tributarias=' + str(
        copias_tributarias) + '&copias_cedibles=' + str(
            copias_cedibles) + '&cedible=' + str(cedible)
pdf = Cliente.get('/dte/dte_emitidos/pdf/' + str(dte) + '/' + str(folio) +
                  '/' + str(rut) + opciones)
if pdf.status_code != 200:
    sys.exit('Error al generar PDF del DTE: ' + pdf.json())

# guardar PDF en el disco
with open('005-dte_emitido_pdf.pdf', 'wb') as f:
    f.write(pdf.content)
    },
    'Detalle': [
        {
            'NmbItem': 'Producto 1',
            'QtyItem': 2,
            'PrcItem': 1000,
        },
    ],
}

# módulos que se usarán
from os import sys
from libredte.sdk import LibreDTE

# crear cliente
Cliente = LibreDTE(hash, url)

# crear DTE temporal
emitir = Cliente.post('/dte/documentos/emitir', dte)
if emitir.status_code!=200 :
    sys.exit('Error al emitir DTE temporal: '+emitir.json())

# crear DTE real
generar = Cliente.post('/dte/documentos/generar', emitir.json());
if generar.status_code!=200 :
    sys.exit('Error al generar DTE real: '+generar.json())

# obtener el PDF del DTE
generar_pdf_request = {'xml':generar.json()['xml'], 'compress': False}
generar_pdf = Cliente.post('/dte/documentos/generar_pdf', generar_pdf_request);
if generar_pdf.status_code!=200 :
    },
    'Detalle': [
        {
            'NmbItem': 'Producto 1',
            'QtyItem': 2,
            'PrcItem': 1000,
        },
    ],
}

# módulos que se usarán
from os import sys
from libredte.sdk import LibreDTE

# crear cliente
Cliente = LibreDTE(hash, url)

# crear DTE temporal
emitir = Cliente.post('/dte/documentos/emitir', dte)
if emitir.status_code != 200:
    sys.exit('Error al emitir DTE temporal: ' + emitir.json())

# crear DTE real
generar = Cliente.post('/dte/documentos/generar', emitir.json())
if generar.status_code != 200:
    sys.exit('Error al generar DTE real: ' + generar.json())

# obtener el PDF del DTE
generar_pdf = Cliente.get('/dte/dte_emitidos/pdf/' +
                          str(generar.json()['dte']) + '/' +
                          str(generar.json()['folio']) + '/' +
Exemple #6
0
Ejemplo que muestra los pasos para:
 - Obtener el timbre en formato PNG de un DTE emitido
@author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
@version 2017-04-11
"""

# datos a utilizar
url = 'https://libredte.cl'
hash = ''
rut = 76192083
dte = 33
folio = 42

# módulos que se usarán
from os import sys
from libredte.sdk import LibreDTE

# crear cliente
Cliente = LibreDTE(hash, url)

# descargar timbre de dte emitido
timbre_png = Cliente.get('/dte/dte_emitidos/ted/' + str(dte) + '/' +
                         str(folio) + '/' + str(rut))
if timbre_png.status_code != 200:
    sys.exit('Error al obtener el timbre del DTE emitido: ' +
             timbre_png.json())

# guardar PMG en el disco
with open('001-dte_emitido_timbre.png', 'wb') as f:
    f.write(timbre_png.content)
Exemple #7
0
else:
    config = {}

# definir opciones por defecto
if len(options):
    options += ':'
options += 'h'
long_options += ['help', 'url=', 'hash=']

# obtener parámetros del comando
try:
    opts, args = getopt.getopt(sys.argv[2:], options, long_options)
except getopt.GetoptError:
    usage('Ocurrió un error al obtener los parámetros del comando', 5)

# asignar url y hash si se indicaron
for var, val in opts:
    if var == '--hash':
        hash = val
    elif var == '--url':
        url = val
    elif var in ('-h', '--help'):
        usage()
        sys.exit(0)

# crear cliente
Cliente = LibreDTE(hash, url)

# lanzar comando con sus opciones
sys.exit(main(Cliente, opts, config))
# datos a utilizar
url = 'https://libredte.cl'
hash = ''
rut = 76192083
dte = 33
folio = 370
fecha = '2017-04-01'
total = 11900
getXML = False

# módulos que se usarán
from os import sys
from libredte.sdk import LibreDTE

# crear cliente
Cliente = LibreDTE(hash, url)

# consultar datos del dte emitido
datos = {
    "emisor": rut,
    "dte": dte,
    "folio": folio,
    "fecha": fecha,
    "total": total
}
consultar = Cliente.post('/dte/dte_emitidos/consultar?getXML='+str(int(getXML)), datos)
if consultar.status_code!=200 :
    sys.exit('Error al realizar la consulta del DTE emitido: '+consultar.json())
print(consultar.json())
Exemple #9
0
"""
"""
Ejemplo que muestra los pasos para:
 - Actualizar el estado de un DTE enviado al SII
@author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
@version 2016-06-22
"""

# datos a utilizar
url = 'https://libredte.cl'
hash = ''
rut = 76192083
dte = 33
folio = 42
metodo = 1  # =1 servicio web, =0 correo

# módulos que se usarán
from os import sys
from libredte.sdk import LibreDTE

# crear cliente
Cliente = LibreDTE(hash, url)

# consultar estado de dte emitido
estado = Cliente.get('/dte/dte_emitidos/actualizar_estado/' + str(dte) + '/' +
                     str(folio) + '/' + str(rut) + '?usarWebservice=' +
                     str(metodo))
if estado.status_code != 200:
    sys.exit('Error al obtener el estado del DTE emitido: ' + estado.json())
print(estado.json())
    },
    'Detalle': [
        {
            'NmbItem': 'Producto 1',
            'QtyItem': 2,
            'PrcItem': 1000,
        },
    ],
}

# módulos que se usarán
from os import sys
from libredte.sdk import LibreDTE

# crear cliente
Cliente = LibreDTE(hash, url)

# crear DTE temporal
emitir = Cliente.post('/dte/documentos/emitir', dte)
if emitir.status_code != 200:
    sys.exit('Error al emitir DTE temporal: ' + emitir.json())

# crear DTE real
generar = Cliente.post('/dte/documentos/generar', emitir.json())
if generar.status_code != 200:
    sys.exit('Error al generar DTE real: ' + generar.json())

# obtener el PDF del DTE
generar_pdf_request = {'xml': generar.json()['xml'], 'compress': False}
generar_pdf = Cliente.post('/dte/documentos/generar_pdf', generar_pdf_request)
if generar_pdf.status_code != 200:
<http://www.gnu.org/licenses/lgpl.html>.
"""

"""
Ejemplo que muestra los pasos para:
 - Actualizar el estado de un DTE enviado al SII
@author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
@version 2016-06-22
"""

# datos a utilizar
url = 'https://libredte.cl'
hash = ''
rut = 76192083
dte = 33
folio = 42
metodo = 1 # =1 servicio web, =0 correo

# módulos que se usarán
from os import sys
from libredte.sdk import LibreDTE

# crear cliente
Cliente = LibreDTE(hash, url)

# consultar estado de dte emitido
estado = Cliente.get('/dte/dte_emitidos/actualizar_estado/'+str(dte)+'/'+str(folio)+'/'+str(rut)+'/'+str(metodo))
if estado.status_code!=200 :
    sys.exit('Error al obtener el estado del DTE emitido: '+estado.json())
print(estado.json())
Exemple #12
0
    def dte_sii(self, cr, uid, dicc_dte={}, dicc_usuario={}, context=None):
        logger = logging.getLogger('dte sii')
        # el dicc_dte es un diccionario de python que debe cumplir con las
        # especificaciones de https://github.com/LibreDTE/libredte-lib/tree/master/examples/json
        # hay un ejemplo contenido en este modulo en examples/ejemplo.json

        # dicc_usuario es un diccionario que debe contener lo siguiente:
        # servidor de LibreDTE
        # hash de usuario en el servidor de LibreDTE
        # tipo_dte esta clave se usa para identificar el objeto del cual
        # proviene y determinara su tipo (picking, invoice, pos order)
        # ruta_archivos, pruebas y otra informacion que este establecida
        # en el objeto mc.dte.config
        mc_dte_id = False
        if dicc_dte and dicc_usuario:

            servidor = dicc_usuario['servidor']
            hash_dte = dicc_usuario['hash_dte']
            tipo_dte = dicc_usuario[
                'tipo_dte']  #picking_id, invoice_id, posorder_id // Nombre del campo
            id_externo = int(
                dicc_usuario['id_externo']
            )  #picking_id, invoice_id, posorder_id // ID objeto externo
            ruta_archivos = dicc_usuario['ruta_archivos'] or False
            pruebas = dicc_usuario['dte_pruebas']
            enviar_num_folio = dicc_usuario['enviar_num_folio']
            dte_permitidos = dicc_usuario['dte_permitidos']
            dte_act = dicc_dte['Encabezado']['IdDoc']['TipoDTE']

            if not dte_permitidos or dte_act not in dte_permitidos:
                raise osv.except_osv(
                    "Error", "No puede generar este tipo de documento.")
                return False

            if not ruta_archivos:
                raise osv.except_osv("Error",
                                     "No hay ruta donde guardar los archivos")
                return False

            Cliente = LibreDTE(hash_dte, servidor)

            if not enviar_num_folio:
                # quitar numero de folio del dicionario dte
                dicc_dte = self.quitar_folio(dicc_dte)
                existe_dte = False
            else:
                existe_dte, mensaje_existe, dicc_cheq = self.chequear_existencia(
                    Cliente, dicc_dte)

            if existe_dte:
                dte = dicc_cheq.get('dte', False)
                folio = dicc_cheq.get('folio', False)
                emisor = dicc_cheq.get('emisor', False)
                cliente_dte = dicc_cheq.get('cliente', False)
                fecha_dte = dicc_cheq.get('fecha_dte', False)
                monto_total = dicc_cheq.get('emisor', False)
                error_dte = '\nFolio: ' + str(folio) + '\n'
                error_dte += 'DTE: ' + str(dte) + '\n'
                error_dte += 'Emisor: ' + str(emisor) + '\n'
                error_dte += 'Cliente: ' + str(cliente_dte) + '\n'
                error_dte += 'Monto Total: ' + str(monto_total) + '\n'
                error_dte += 'Fecha: ' + str(fecha_dte) + '\n'
                raise osv.except_osv(
                    'Error!',
                    "El DTE ya existe con los siguientes datos. Error: %s" %
                    error_dte)
                return False

                #if pruebas:
                #    return True
            else:
                # crear DTE temporal
                emitir = self.emitir_dte(Cliente, dicc_dte)
                logger.warn(emitir.json())

                # se ejecuta hasta aca si esta en modo de pruebas
                if pruebas:
                    return 0

                # crear DTE real
                dte, folio, emisor = self.generar_dte(Cliente, emitir)

            # crear un mc.dte con los datos obtenidos, pero primero
            # buscar para ver si ya existe
            filtro = [(tipo_dte, '=', id_externo)]
            mc_dte_ids = self.search(cr, uid, filtro)

            if not mc_dte_ids:
                logger.warn('if not mc_dte_ids')
                create_vals = dict()
                create_vals[tipo_dte] = id_externo
                create_vals['estado_dte'] = 'Borrador'
                md_id = self.create(cr, uid, create_vals)
                mc_dte_ids += [md_id]

            if dte and folio and emisor:
                nombre_archivo = emisor + '_' + dte + '_' + folio
                ruta_completa = ruta_archivos + nombre_archivo
            else:
                ruta_completa = False
                raise osv.except_osv("Error", "No se pudo generar el DTE.")
                return False

            # obtener el XML del DTE
            xml = self.xml_dte(Cliente, dte, folio, emisor)

            #obtener el TED del DTE
            ted = self.ted_dte(Cliente, dte, folio, emisor)

            # guardar archivos XML y TED
            self.guardar_archivos(xml, ted, ruta_completa)

            if mc_dte_ids and len(mc_dte_ids) == 1:
                logger.warn('if mc_dte_ids and len(mc_dte_ids) == 1')
                consulta = self.consultar_dte(Cliente, dicc_dte, xml)
                # escribir / actualizar
                write_vals = dict()
                write_vals['name'] = nombre_archivo
                write_vals['ruta'] = ruta_archivos
                write_vals['codigo_sii'] = dte
                write_vals['folio_dte_sii'] = folio
                write_vals['estado_dte'] = consulta['revision_estado']
                write_vals['track_id'] = consulta['track_id']
                self.write(cr, uid, mc_dte_ids, write_vals)
                mc_dte_id = mc_dte_ids[0]
            else:
                raise osv.except_osv(
                    "Error", "Hay mas de un registro (mc.dte) para este DTE.")
                return False
        # devuelve el id del mc.dte creado.
        return mc_dte_id