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
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']) + '/' +
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)
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())
""" """ 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())
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