def _generar_bte(self, periodo): ok = True bte = BteEmitidas(self.empresa_rut, self.empresa_clave) # descargar detalle de boletas self._send_message('GET %(periodo)s bte documentos' % {'periodo': periodo}) filename = 'bte_%(periodo)s.csv' % {'periodo': str(periodo)} filepath = os.path.join(self.directorio_salida, 'bte', filename) if not os.path.exists( filepath) or periodo in self.periodos_forzar_descarga_csv: try: documentos = bte.documentos(self.empresa_rut, periodo) if 'csv' in self.respaldar['bte']: dict_save_to_csv(filepath, documentos, delimiter=self.csv_delimiter) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s bte documentos: %(error)s' % { 'periodo': periodo, 'error': str(e) }) documentos = [] ok = False else: documentos = dict_load_from_csv(filepath, delimiter=self.csv_delimiter) # descargar HTML de boletas if 'html' in self.respaldar['bte']: for documento in documentos: if documento['estado'] == 'ANUL': continue self._send_message('GET %(periodo)s bte html %(numero)s' % { 'periodo': periodo, 'numero': documento['numero'], }) filename = 'bte_%(periodo)s_%(codigo)s.html' % { 'periodo': str(periodo), 'codigo': documento['codigo'], } filepath = os.path.join(self.directorio_salida, 'bte', filename) if not os.path.exists(filepath): try: html = bte.html(documento['codigo']) with open(filepath, 'wb') as f: f.write(html) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s bte html %(numero)s: %(error)s' % { 'periodo': periodo, 'numero': documento['numero'], 'error': str(e) }) ok = False # entregar estado para saber si se debe volver a revisar este período return ok
def _generar_bhe(self, periodo): ok = True bhe = BheRecibidas(self.empresa_rut, self.empresa_clave) # descargar detalle de boletas self._send_message('GET %(periodo)s bhe documentos' % {'periodo': periodo}) filename = 'bhe_%(periodo)s.csv' % {'periodo': str(periodo)} filepath = os.path.join(self.directorio_salida, 'bhe', filename) if not os.path.exists( filepath) or periodo in self.periodos_forzar_descarga_csv: try: documentos = bhe.documentos(self.empresa_rut, periodo) if 'csv' in self.respaldar['bhe']: dict_save_to_csv(filepath, documentos, delimiter=self.csv_delimiter) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s bhe documentos: %(error)s' % { 'periodo': periodo, 'error': str(e) }) documentos = [] ok = False else: documentos = dict_load_from_csv(filepath, delimiter=self.csv_delimiter) # descargar PDF de boletas if 'pdf' in self.respaldar['bhe']: for documento in documentos: if documento['anulada'] != '': continue self._send_message( 'GET %(periodo)s bhe pdf %(rut)s-%(dv)s %(numero)s' % { 'periodo': periodo, 'rut': documento['rut'], 'dv': documento['dv'], 'numero': documento['numero'], }) filename = 'bhe_%(periodo)s_%(codigo)s.pdf' % { 'periodo': str(periodo), 'codigo': documento['codigo'], } filepath = os.path.join(self.directorio_salida, 'bhe', filename) if not os.path.exists(filepath): try: pdf = bhe.pdf(documento['codigo']) with open(filepath, 'wb') as f: f.write(pdf) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s bhe pdf %(rut)s-%(dv)s %(numero)s: %(error)s' % { 'periodo': periodo, 'rut': documento['rut'], 'dv': documento['dv'], 'numero': documento['numero'], 'error': str(e) }) ok = False # entregar estado para saber si se debe volver a revisar este período return ok
def _generar_mipyme(self, periodo): ok = True dte_emitidos = DteEmitidos(self.usuario_rut, self.usuario_clave) dte_recibidos = DteRecibidos(self.usuario_rut, self.usuario_clave) filtros = { 'FEC_DESDE': period_first_day(periodo), 'FEC_HASTA': period_last_day(periodo) } # documentos emitidos en el portal mipyme if 'csv' in self.respaldar['mipyme'] or 'xml' in self.respaldar[ 'mipyme'] or 'pdf' in self.respaldar['mipyme']: # obtener listado de documentos emitidos self._send_message('GET %(periodo)s mipyme dte_emitidos' % {'periodo': periodo}) filename = 'mipyme_%(periodo)s_dte_emitidos.csv' % { 'periodo': periodo } filepath = os.path.join(self.directorio_salida, 'mipyme', filename) if not os.path.exists( filepath) or periodo in self.periodos_forzar_descarga_csv: try: documentos = dte_emitidos.documentos( self.empresa_rut, filtros) if 'csv' in self.respaldar['mipyme']: dict_save_to_csv(filepath, documentos, delimiter=self.csv_delimiter) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s mipyme dte_emitidos: %(error)s' % { 'periodo': periodo, 'error': str(e) }) documentos = [] ok = False else: documentos = dict_load_from_csv(filepath, delimiter=self.csv_delimiter) # iterar documentos si se requiere XML o PDF if 'xml' in self.respaldar['mipyme'] or 'pdf' in self.respaldar[ 'mipyme']: for documento in documentos: # obtener XML de los documentos emitidos if 'xml' in self.respaldar['mipyme']: self._send_message( 'GET %(periodo)s mipyme dte_emitido xml T%(dte)sF%(folio)s' % { 'periodo': periodo, 'dte': documento['dte'], 'folio': documento['folio'], }) filename = 'mipyme_%(periodo)s_dte_emitido_T%(dte)sF%(folio)s.xml' % { 'periodo': str(periodo), 'dte': documento['dte'], 'folio': documento['folio'], } filepath = os.path.join(self.directorio_salida, 'mipyme', filename) if not os.path.exists(filepath): try: xml = dte_emitidos.xml(self.empresa_rut, documento['dte'], documento['folio']) with open(filepath, 'w') as f: f.write(xml) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s mipyme dte_emitido xml T%(dte)sF%(folio)s: %(error)s' % { 'periodo': periodo, 'dte': documento['dte'], 'folio': documento['folio'], 'error': str(e) }) ok = False # obtener PDF de los documentos emitidos if 'pdf' in self.respaldar['mipyme']: self._send_message( 'GET %(periodo)s mipyme dte_emitido pdf T%(dte)sF%(folio)s' % { 'periodo': periodo, 'dte': documento['dte'], 'folio': documento['folio'], }) filename = 'mipyme_%(periodo)s_dte_emitido_T%(dte)sF%(folio)s.pdf' % { 'periodo': str(periodo), 'dte': documento['dte'], 'folio': documento['folio'], } filepath = os.path.join(self.directorio_salida, 'mipyme', filename) if not os.path.exists(filepath): try: pdf = dte_emitidos.pdf(self.empresa_rut, documento['codigo']) with open(filepath, 'wb') as f: f.write(pdf) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s mipyme dte_emitido pdf T%(dte)sF%(folio)s: %(error)s' % { 'periodo': periodo, 'dte': documento['dte'], 'folio': documento['folio'], 'error': str(e) }) ok = False # documentos recibidos en el portal mipyme if 'csv' in self.respaldar['mipyme'] or 'xml' in self.respaldar[ 'mipyme'] or 'pdf' in self.respaldar['mipyme']: # obtener listado de documentos recibidos self._send_message('GET %(periodo)s mipyme dte_recibidos' % {'periodo': periodo}) filename = 'mipyme_%(periodo)s_dte_recibidos.csv' % { 'periodo': periodo } filepath = os.path.join(self.directorio_salida, 'mipyme', filename) if not os.path.exists( filepath) or periodo in self.periodos_forzar_descarga_csv: try: documentos = dte_recibidos.documentos( self.empresa_rut, filtros) if 'csv' in self.respaldar['mipyme']: dict_save_to_csv(filepath, documentos, delimiter=self.csv_delimiter) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s mipyme dte_recibidos: %(error)s' % { 'periodo': periodo, 'error': str(e) }) documentos = [] ok = False else: documentos = dict_load_from_csv(filepath, delimiter=self.csv_delimiter) # iterar documentos si se requiere XML o PDF if 'xml' in self.respaldar['mipyme'] or 'pdf' in self.respaldar[ 'mipyme']: for documento in documentos: # obtener XML de los documentos recibidos if 'xml' in self.respaldar['mipyme']: self._send_message( 'GET %(periodo)s mipyme dte_recibido xml %(rut)s-%(dv)s T%(dte)sF%(folio)s' % { 'periodo': periodo, 'rut': documento['rut'], 'dv': documento['dv'], 'dte': documento['dte'], 'folio': documento['folio'], }) filename = 'mipyme_%(periodo)s_dte_recibido_%(rut)s-%(dv)s_T%(dte)sF%(folio)s.xml' % { 'periodo': str(periodo), 'rut': documento['rut'], 'dv': documento['dv'], 'dte': documento['dte'], 'folio': documento['folio'], } filepath = os.path.join(self.directorio_salida, 'mipyme', filename) if not os.path.exists(filepath): try: xml = dte_recibidos.xml( self.empresa_rut, documento['rut'] + '-' + documento['dv'], documento['dte'], documento['folio']) with open(filepath, 'w') as f: f.write(xml) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s mipyme dte_recibido xml %(rut)s-%(dv)s T%(dte)sF%(folio)s: %(error)s' % { 'periodo': periodo, 'rut': documento['rut'], 'dv': documento['dv'], 'dte': documento['dte'], 'folio': documento['folio'], 'error': str(e) }) ok = False # obtener PDF de los documentos recibidos if 'pdf' in self.respaldar['mipyme']: self._send_message( 'GET %(periodo)s mipyme dte_recibido pdf %(rut)s-%(dv)s T%(dte)sF%(folio)s' % { 'periodo': periodo, 'rut': documento['rut'], 'dv': documento['dv'], 'dte': documento['dte'], 'folio': documento['folio'], }) filename = 'mipyme_%(periodo)s_dte_recibido_%(rut)s-%(dv)s_T%(dte)sF%(folio)s.pdf' % { 'periodo': str(periodo), 'rut': documento['rut'], 'dv': documento['dv'], 'dte': documento['dte'], 'folio': documento['folio'], } filepath = os.path.join(self.directorio_salida, 'mipyme', filename) if not os.path.exists(filepath): try: pdf = dte_recibidos.pdf( self.empresa_rut, documento['rut'] + '-' + documento['dv'], documento['codigo']) with open(filepath, 'wb') as f: f.write(pdf) except LibreDTEApiException as e: self._send_message( 'ERROR %(periodo)s mipyme dte_recibido pdf %(rut)s-%(dv)s T%(dte)sF%(folio)s: %(error)s' % { 'periodo': periodo, 'rut': documento['rut'], 'dv': documento['dv'], 'dte': documento['dte'], 'folio': documento['folio'], 'error': str(e) }) ok = False # entregar estado para saber si se debe volver a revisar este período return ok
def _generar_rcv(self, periodo): ok = True if self.empresa_clave is not None: rcv = Rcv(self.empresa_rut, self.empresa_clave) else: rcv = Rcv(self.usuario_rut, self.usuario_clave) # no es posible respaldar previo a agosto de 2017 (no existía el RCV) if periodo < 201708: return ok # generar respaldo compras if 'csv_compras_resumen' in self.respaldar[ 'rcv'] or 'csv_compras_detalle' in self.respaldar['rcv']: try: # obtener resumen de compras self._send_message('GET %(periodo)s rcv compras resumen' % {'periodo': periodo}) filename = 'rcv_%(periodo)s_compras_resumen.csv' % { 'periodo': periodo } filepath = os.path.join(self.directorio_salida, 'rcv', filename) if not os.path.exists( filepath ) or periodo in self.periodos_forzar_descarga_csv: resumen = rcv.compras_resumen(self.empresa_rut, periodo) if 'csv_compras_resumen' in self.respaldar['rcv']: dict_save_to_csv(filepath, resumen, delimiter=self.csv_delimiter) else: resumen = dict_load_from_csv(filepath, delimiter=self.csv_delimiter) # obtener detalle de compras if 'csv_compras_detalle' in self.respaldar['rcv']: self._send_message('GET %(periodo)s rcv compras detalle' % {'periodo': periodo}) filename = 'rcv_%(periodo)s_compras_detalle.csv' % { 'periodo': periodo } filepath = os.path.join(self.directorio_salida, 'rcv', filename) if not os.path.exists( filepath ) or periodo in self.periodos_forzar_descarga_csv: documentos = [] for r in resumen: if r['rsmnTotDoc'] > 0: documentos.append(r['rsmnTipoDocInteger']) detalle = rcv.compras_detalle( self.empresa_rut, periodo, ','.join(map(str, documentos))) dict_save_to_csv(filepath, detalle, delimiter=self.csv_delimiter) except LibreDTEApiException as e: self._send_message('ERROR %(periodo)s rcv compras: %(error)s' % { 'periodo': periodo, 'error': str(e) }) ok = False # generar respaldo ventas if 'csv_ventas_resumen' in self.respaldar[ 'rcv'] or 'csv_ventas_detalle' in self.respaldar['rcv']: try: # descargar resumen ventas self._send_message('GET %(periodo)s rcv ventas resumen' % {'periodo': periodo}) filename = 'rcv_%(periodo)s_ventas_resumen.csv' % { 'periodo': periodo } filepath = os.path.join(self.directorio_salida, 'rcv', filename) if not os.path.exists( filepath ) or periodo in self.periodos_forzar_descarga_csv: resumen = rcv.ventas_resumen(self.empresa_rut, periodo) if 'csv_ventas_resumen' in self.respaldar['rcv']: dict_save_to_csv(filepath, resumen, delimiter=self.csv_delimiter) else: resumen = dict_load_from_csv(filepath, delimiter=self.csv_delimiter) # descargar detalle ventas if 'csv_ventas_detalle' in self.respaldar['rcv']: self._send_message('GET %(periodo)s rcv ventas detalle' % {'periodo': periodo}) filename = 'rcv_%(periodo)s_ventas_detalle.csv' % { 'periodo': str(periodo) } filepath = os.path.join(self.directorio_salida, 'rcv', filename) if not os.path.exists( filepath ) or periodo in self.periodos_forzar_descarga_csv: documentos = [] for r in resumen: if r['rsmnTotDoc'] > 0: documentos.append(r['rsmnTipoDocInteger']) detalle = rcv.ventas_detalle( self.empresa_rut, periodo, ','.join(map(str, documentos))) dict_save_to_csv(filepath, detalle, delimiter=self.csv_delimiter) except LibreDTEApiException as e: self._send_message('ERROR %(periodo)s rcv ventas: %(error)s' % { 'periodo': periodo, 'error': str(e) }) ok = False # entregar estado para saber si se debe volver a revisar este período return ok
import os, sys app_dir = os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.insert(0, app_dir) from libredte.api_client.sii.actividades_economicas import ActividadesEconomicas from sasco_utils.dict import dict_save_to_json, dict_save_to_csv # crear cliente de la API ae = ActividadesEconomicas() # CASO 1: todas las actividades listado = ae.listado() dict_save_to_json('actividades_economicas_todas.json', listado) # guardar el CASO 1 en un csv actividades = [] for categoria in listado: for subcategoria in listado[categoria]: for actividad in listado[categoria][subcategoria]: actividades.append(actividad) dict_save_to_csv('actividades_economicas_todas.csv', actividades) # CASO 2: sólo actividades de primera categoría listado = ae.listado_primera_categoria() dict_save_to_json('actividades_economicas_1era.json', listado) # CASO 3: sólo actividades de segunda categoría listado = ae.listado_segunda_categoria() dict_save_to_json('actividades_economicas_2da.json', listado)