def generar_documento_final(compania, etiqueta_SetDte, pass_certificado, instance): """ Incorpora todo el documento firmado al la presentacion final y elimina las tabulaciones. """ # Incorpora todo el documento firmado al la presentacion final y elimina # las tabulaciones. if instance.tipo_dte == 39: documento_final = render_to_string('snippets/boleta.xml', {'set_DTE': etiqueta_SetDte}) else: documento_final = render_to_string('snippets/dte.xml', {'set_DTE': etiqueta_SetDte}) try: sii_produccion = Parametro.objects.get(activo=True).sii_produccion except: sii_produccion = settings.SII_PRODUCTION # Se firmó el archivo xml sii_sdk = SII_SDK(sii_produccion) set_dte_sin_aplanar = sii_sdk.multipleSign(compania, documento_final, pass_certificado, 1) return '<?xml version="1.0" encoding="ISO-8859-1"?>\n' + set_dte_sin_aplanar
def get_invoice_status(self,factura,compania): """ Método para enviar la factura al sii @param factura recibe el objeto de la factura @param compania recibe el objeto compañia @return dict con la respuesta """ try: sii_sdk = SII_SDK() seed = sii_sdk.getSeed() try: sign = sii_sdk.signXml(seed, compania, compania.pass_certificado) token = sii_sdk.getAuthToken(sign) if(token): print(token) estado = sii_sdk.checkDTEstatus(compania.rut,factura.track_id,token) return {'estado':True,'status':estado['estado'],'glosa':estado['glosa']} else: return {'estado':False,'msg':'No se pudo obtener el token del sii'} except Exception as e: print(e) return {'estado':False,'msg':'Ocurrió un error al firmar el documento'} return {'estado':True} except Exception as e: print(e) return {'estado':False,'msg':'Ocurrió un error al comunicarse con el sii'}
def send_invoice_sii(self,compania,invoice, pass_certificado): """ Método para enviar la factura al sii @param compania recibe el objeto compañia @param invoice recibe el xml de la factura @param pass_certificado recibe la contraseña del certificado @return dict con la respuesta """ try: sii_sdk = SII_SDK(settings.SII_PRODUCTION) seed = sii_sdk.getSeed() try: sign = sii_sdk.signXml(seed, compania, pass_certificado) token = sii_sdk.getAuthToken(sign) if(token): print(token) try: invoice_reponse = sii_sdk.sendInvoice(token,invoice,compania.rut,'60803000-K') return {'estado':invoice_reponse['success'],'msg':invoice_reponse['message'], 'track_id':invoice_reponse['track_id']} except Exception as e: print(e) return {'estado':False,'msg':'No se pudo enviar la factura'} else: return {'estado':False,'msg':'No se pudo obtener el token del sii'} except Exception as e: print(e) return {'estado':False,'msg':'Ocurrió un error al firmar el documento'} return {'estado':True} except Exception as e: print(e) return {'estado':False,'msg':'Ocurrió un error al comunicarse con el sii'}
def generar_documento_final(compania, etiqueta_SetDte, pass_certificado): """ Incorpora todo el documento firmado al la presentacion final y elimina las tabulaciones. """ # Incorpora todo el documento firmado al la presentacion final y elimina # las tabulaciones. documento_final = render_to_string('invoice.xml', {'set_DTE': etiqueta_SetDte}) # Se firmó el archivo xml sii_sdk = SII_SDK() set_dte_sin_aplanar = sii_sdk.multipleSign(compania, documento_final, pass_certificado, 1) #set_dte_sin_aplanar = sii_sdk.generalSign(compania,set_dte_sin_aplanar,pass_certificado,1) #documento_final_sin_tabs = documento_final.replace('\t','').replace('\r','') #print(set_dte_sin_aplanar) return '<?xml version="1.0" encoding="ISO-8859-1"?>\n' + set_dte_sin_aplanar
def sign_base(self, tipo_operacion, tipo_libro, tipo_envio): """ Firma el xml de libro de compra y venta @param tipo_operacion (COMPRA y VENTA) @param tipo_libro (MENSUAL o ESPECIAL) @param tipo_envio (TOTAL o PARCIAL) """ compania = self.fk_compania timestamp = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S") envio = render_to_string('xml_lcv/envio_libro.xml', { 'libro_pk':self.pk, 'compania':compania, 'timestamp':timestamp, 'tipo_operacion':tipo_operacion, 'tipo_libro':tipo_libro, 'tipo_envio':tipo_envio, 'resumen_periodo':self.libro_xml }) base = render_to_string('xml_lcv/lcv_base.xml', { 'envio_libro':envio, }) sii_sdk = SII_SDK(settings.SII_PRODUCTION) signed_xml = sii_sdk.generalSign(compania,base,compania.pass_certificado) return '<?xml version="1.0" encoding="ISO-8859-1"?>\n'+signed_xml
def firmar_documento(etiqueta_DD, datos, folio, compania, instance, pass_certificado): """ Llena los campos de la etiqueta <Documento>, y la firma usando la plantilla signature.xml. Retorna la etiquta <Documento> con sus datos y la correspondiente firma con la clave privada cargada por el usuario en el certificado. """ #now = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S").split() # Crea timestamp en formato correspondiente #timestamp = "{}T{}".format(now[0],now[1]) timestamp = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S") # Llena los datos de la plantilla Documento_tag.xml con la informacion pertinente diccionario = defaultdict(dict) for x, y in ACTIVIDADES: diccionario[x] = y compania.giro = diccionario.get(str(compania.giro)) compania.giro = compania.giro[1:-1] compania.actividad_principal = compania.actividad_principal[1:-1] # productos=datos.get('productos') # primero=productos[0].get('item_name') # datos['primero']=primero # Ajustados los montos de productos para el xml for producto in datos['productos']: producto['qty'] = str(producto['qty']) producto['base_net_rate'] = str(producto['base_net_rate']) producto['amount'] = round(producto['amount']) # Ajustados valores para el xml if ('k' in folio.rut): folio.rut = folio.rut.replace('k', 'K') if ('k' in compania.rut): compania.rut = compania.rut.replace('k', 'K') if ('k' in datos['rut']): datos['rut'] = datos['rut'].replace('k', 'K') datos['numero_factura'] = datos['numero_factura'].replace('º', '') datos['neto'] = str(round(float(datos['neto']))) datos['total'] = str(round(float(datos['total']))) documento_sin_aplanar = render_to_string( 'snippets/Documento_tag.xml', { 'datos': datos, 'folio': folio, 'compania': compania, 'timestamp': timestamp, 'DD': etiqueta_DD, 'instance': instance }) sii_sdk = SII_SDK() set_dte_sin_aplanar = sii_sdk.generalSign(compania, documento_sin_aplanar, pass_certificado) # Elimina tabulaciones y espacios para la generacion del digest # digest_string = documento_sin_aplanar.replace('\n','').replace('\t','').replace('\r','') # Crea firma electronica compuesta utilizando la plantillka signature.xml # firma_electronica = generar_firma_con_certificado(compania, digest_string) # Llena la plantilla signature.xml con los datos de la firma electronica # signature_tag = render_to_string('snippets/signature.xml', {'signature':firma_electronica}) # Agrega la plantilla signature.xml al final del documento # documento_sin_aplanar += "\n{}".format(signature_tag) return set_dte_sin_aplanar
def form_valid(self, form): """ """ context = super().get_context_data() instance = form.save(commit=False) compania = get_object_or_404(Compania, pk=self.kwargs.get('pk')) instance.compania = compania fecha_de_inicio = instance.fecha_de_inicio fecha_de_culminacion = instance.fecha_de_culminacion tipo_de_operacion = instance.tipo_de_operacion if (instance.tipo_de_envio != 'TOTAL'): instance.periodo_tributario = fecha_de_inicio.strftime("%Y-%m") else: from calendar import monthrange date = instance.periodo_tributario.split('-') last_day = monthrange(int(date[0]), int(date[1]))[1] fecha_de_inicio = datetime.datetime(int(date[0]), int(date[1]), 1) instance.fecha_de_inicio = fecha_de_inicio fecha_de_culminacion = datetime.datetime(int(date[0]), int(date[1]), last_day) instance.fecha_de_culminacion = fecha_de_culminacion report_context = { 'compania': compania, 'reporte': instance, 'periodo_tributario': instance.periodo_tributario, 'resumen_periodos': [], 'detalles': [] } if tipo_de_operacion == "VENTA": facturas_queryset_ = [ factura for factura in Factura.objects.filter( compania=compania, created__gte=fecha_de_inicio, created__lte=fecha_de_culminacion) ] nota_credito_queryset = [ nota_credito for nota_credito in notaCredito.objects.filter( compania=compania, created__gte=fecha_de_inicio, created__lte=fecha_de_culminacion) ] nota_debito_queryset = [ nota_debito for nota_debito in notaDebito.objects.filter( compania=compania, created__gte=fecha_de_inicio, created__lte=fecha_de_culminacion) ] facturas_data = self.generar_resumen_periodos(facturas_queryset_) nota_credito_data = self.generar_resumen_periodos( nota_credito_queryset) nota_debito_data = self.generar_resumen_periodos( nota_debito_queryset) if facturas_data: report_context['resumen_periodos'].append(facturas_data) if nota_credito_data: report_context['resumen_periodos'].append(nota_credito_data) if (len(facturas_queryset_) > 0): report_context['detalles'].extend(facturas_queryset_) if (len(nota_credito_queryset) > 0): report_context['detalles'].extend(nota_credito_queryset) if (len(nota_debito_queryset) > 0): report_context['detalles'].extend(nota_debito_queryset) elif tipo_de_operacion == "COMPRA": messages.info(self.request, "No posee documentos de intercambio") return HttpResponseRedirect( reverse_lazy('reportes:crear', kwargs={'pk': compania.pk})) try: Reporte.check_reporte_len(report_context['detalles']) except Exception as e: messages.error(self.request, e) return super().form_invalid(form) for report in report_context['resumen_periodos']: report['tot_mnt_total'] = abs(report['tot_mnt_total']) report['tot_mnt_neto'] = round(abs(report['tot_mnt_neto'])) for report in report_context['detalles']: report.neto = round(abs(float(report.neto))) report.total = round(abs(float(report.total))) report.numero_factura = report.numero_factura.replace('º', '') if 'k' in report.rut: report.rut = report.rut.replace('k', 'K') report.rut = report.rut.replace('.', '') caratula = render_to_string('xml_templates/caratula_.xml', report_context) report_context['caratula'] = caratula report_context['timestamp'] = datetime.datetime.now().strftime( "%Y-%m-%dT%H:%M:%S") envio_libro = render_to_string('xml_templates/envioLibro_.xml', report_context) # Agregada la firma sii_sdk = SII_SDK(settings.SII_PRODUCTION) libro_firmado = sii_sdk.generalSign(compania, envio_libro, compania.pass_certificado) instance.xml_reporte = '<?xml version="1.0" encoding="ISO-8859-1"?>\n' + libro_firmado #instance.xml_reporte = '<?xml version="1.0" encoding="ISO-8859-1"?>\n'+envio_libro #print(libro_firmado) instance.save() messages.info(self.request, "Reporte creado exitosamente") return HttpResponseRedirect( reverse_lazy('reportes:crear', kwargs={'pk': compania.pk}))
def firmar_documento(etiqueta_DD, datos, folio, compania, instance, pass_certificado): """ Llena los campos de la etiqueta <Documento>, y la firma usando la plantilla signature.xml. Retorna la etiquta <Documento> con sus datos y la correspondiente firma con la clave privada cargada por el usuario en el certificado. """ timestamp = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S") # Llena los datos de la plantilla Documento_tag.xml con la informacion pertinente diccionario = defaultdict(dict) for x, y in ACTIVIDADES: diccionario[x] = y compania.giro = diccionario.get(str(compania.giro)) compania.giro = compania.giro[1:-1] compania.actividad_principal = compania.actividad_principal[1:-1] # Ajustados los montos de productos para el xml for producto in datos['productos']: if producto.get('discount', None) or producto.get( 'discount_amount', None): producto['discount'] = round(abs(producto['discount'])) discount_amount = producto['base_net_rate'] * ( producto['discount'] / 100) producto['discount_amount'] = round(abs(discount_amount)) producto['qty'] = str(abs(producto['qty'])) producto['base_net_rate'] = str(producto['base_net_rate']) producto['amount'] = round(abs(producto['amount'])) # Ajustados valores para el xml if ('k' in folio.rut): folio.rut = folio.rut.replace('k', 'K') if ('k' in compania.rut): compania.rut = compania.rut.replace('k', 'K') if ('k' in datos['rut']): datos['rut'] = datos['rut'].replace('k', 'K') datos['numero_factura'] = datos['numero_factura'].replace('º', '') datos['neto'] = str(round(abs(float(datos['neto'])))) datos['total'] = str(round(abs(float(datos['total'])))) if datos.get('exento'): datos['monto_exento'] = str(round(abs(float(datos['exento'])))) if datos.get('iva'): datos['iva'] = str(round(abs(int(datos['iva'])))) else: datos['iva'] = str( round(float(datos['neto']) * (compania.tasa_de_iva / 100))) ref = '' if (instance.tipo_dte == 56 or instance.tipo_dte == 61): documento_tag = 'snippets/documento_tag_ncd.xml' ref = instance.ref_factura else: documento_tag = 'snippets/documento_tag.xml' # Llena los datos de la plantilla Documento_tag.xml con la informacion pertinente documento_sin_aplanar = render_to_string( documento_tag, { 'datos': datos, 'folio': folio, 'compania': compania, 'timestamp': timestamp, 'DD': etiqueta_DD, 'instance': instance, 'ref': ref }) try: sii_produccion = Parametro.objects.get(activo=True).sii_produccion except: sii_produccion = settings.SII_PRODUCTION sii_sdk = SII_SDK(sii_produccion) set_dte_sin_aplanar = sii_sdk.generalSign(compania, documento_sin_aplanar, pass_certificado) return set_dte_sin_aplanar