예제 #1
0
    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
예제 #2
0
 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'}
예제 #3
0
 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'}
예제 #4
0
    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
예제 #5
0
 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
예제 #6
0
    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
예제 #7
0
    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}))
예제 #8
0
    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