예제 #1
0
    def EnviaCorreo(self, *args, **kwargs):

        self.ExportaExcel(mostrar=False)

        if not self.cArchivoGenerado:
            return
        email_contador = LeerIni('email_contador')
        text, ok = QInputDialog.getText(
            self.view,
            'Sistema',
            'Ingrese el mail destinatario:',
            text=email_contador if email_contador else '')
        if ok:
            GrabarIni(clave='email_contador', key='param', valor=str(text))
            pyemail = PyEmail()
            remitente = '*****@*****.**'
            destinatario = str(text).strip()
            mensaje = "Enviado desde mi Software de Gestion desarrollado por http://www.servinlgsm.com.ar"
            archivo = self.cArchivoGenerado
            motivo = "Se envia informe de ventas de {}".format(
                LeerIni(clave='empresa', key='FACTURA'))
            servidor = ParamSist.ObtenerParametro("SERVER_SMTP")
            clave = ParamSist.ObtenerParametro("CLAVE_SMTP")
            usuario = ParamSist.ObtenerParametro("USUARIO_SMTP")
            puerto = ParamSist.ObtenerParametro("PUERTO_SMTP") or 587
            pyemail.Conectar(servidor=servidor,
                             usuario=usuario,
                             clave=clave,
                             puerto=puerto)

            ok = pyemail.Enviar(remitente, motivo, destinatario, mensaje,
                                archivo)
            if not ok:
                Ventanas.showAlert("Sistema", pyemail.Excepcion)
 def exec_(self):
     self.view.cboCategoriaMono.setText(
         ParamSist.ObtenerParametro("CATEGORIA_MONOTRIBUTO"))
     self.view.spnCantAdhOS.setText(
         ParamSist.ObtenerParametro("CANTIDAD_ADH_OS"))
     self.view.cboActividad.setIndex(
         ParamSist.ObtenerParametro("ACTIVIDAD_MONOTRIBUTO"))
     super().exec_()
 def cargaParametros(self):
     self.servidor = ParamSist.ObtenerParametro(
         "SERVER_SMTP")  #servidor email
     self.clave = ParamSist.ObtenerParametro("CLAVE_SMTP")  #clave email
     self.usuario = ParamSist.ObtenerParametro(
         "USUARIO_SMTP")  #usuario email
     self.puerto = ParamSist.ObtenerParametro("PUERTO_SMTP") or 587  #puerto
     self.responder = ParamSist.ObtenerParametro(
         "RESPONDER")  #correo al cual responder
 def __init__(self):
     super().__init__()
     self.__adjuntos = []  # lista con los archivos adjuntos a enviar
     self.view = EnvioEmailView()
     self.archivo_firma = ParamSist.ObtenerParametro("ARCHIVO_FIRMA_EMAIL")
     self.conectarWidgets()
     self.cargaParametros()
    def CargaDatosCliente(self, *args, **kwargs):
        if not self.view.validaCliente.text():
            return
        try:
            self.cliente = Cliente.select().where(Cliente.idcliente == self.view.validaCliente.text()).get()
            cliente = self.cliente
            self.view.lineEditDomicilio.setText(cliente.domicilio)
            if cliente.tiporesp.idtiporesp in [1, 2, 4]: #monotributo o resp inscripto
                self.view.lineEditDocumento.setText(cliente.cuit.replace('-',''))
                self.view.lineEditDocumento.setInputMask("99-99999999-9")
                if ParamSist.ObtenerParametro("EMITE_FCE") == "S":
                    wsfecred = WsFECred()
                    obligado, minimo = wsfecred.ConsultarMontoObligado(cliente.cuit.replace('-',''), LeerIni('cuit', key='WSFEv1'))
                    if obligado and not self.informo:
                        Ventanas.showAlert("Sistema", "Se debe emitir FCE al cliente desde un monto de {}".format(minimo))
                self.informo = True
            else:
                self.view.lineEditDocumento.setText(str(cliente.dni))
                self.view.lineEditDocumento.setInputMask("99999999")
            if int(LeerIni(clave='cat_iva', key='WSFEv1')) == 1: #si es Resp insc el contribuyente veo si teiene que emitira A o B
                if cliente.tiporesp.idtiporesp == 2: #resp inscripto
                    self.view.cboComprobante.setText('Factura A')
                else:
                    self.view.cboComprobante.setText('Factura B')
            else:
                self.view.cboComprobante.setText('Factura C')

            self.view.cboTipoIVA.setText(cliente.tiporesp.nombre)
            self.ObtieneNumeroFactura()
        except Cliente.DoesNotExist:
            Ventanas.showAlert("Sistema", "Cliente no encontrado en el sistema")
예제 #6
0
 def EnviarPorCorreo(self, *args, **kwargs):
     if self.view.gridDatos.currentRow() != -1:
         factura = FacturaController()
         factura.ImprimeFactura(self.view.gridDatos.ObtenerItem(
             fila=self.view.gridDatos.currentRow(), col='idcabecera'),
                                mostrar=False)
         emaicliente = EmailCliente.select().where(
             EmailCliente.idcliente ==
             self.view.controles['cliente'].text())
         items = []
         for e in emaicliente:
             items.append(e.email)
         if items:
             text, ok = QInputDialog.getItem(
                 self.view, 'Sistema', 'Ingrese el mail destinatario:',
                 items)
         else:
             text, ok = QInputDialog.getText(
                 self.view, 'Sistema', 'Ingrese el mail destinatario:')
         if ok:
             destinatario = str(text).strip()
             # destinatario = '*****@*****.**'
             mensaje = "Enviado desde mi Software de Gestion desarrollado por http://www.servinlgsm.com.ar \n" \
                       "No responder este email"
             archivo = factura.facturaGenerada
             motivo = "Se envia comprobante electronico de {}".format(
                 LeerIni(clave='empresa', key='FACTURA'))
             servidor = ParamSist.ObtenerParametro("SERVER_SMTP")
             clave = ParamSist.ObtenerParametro("CLAVE_SMTP")
             usuario = ParamSist.ObtenerParametro("USUARIO_SMTP")
             puerto = ParamSist.ObtenerParametro("PUERTO_SMTP") or 587
             responder = ParamSist.ObtenerParametro("RESPONDER")
             # envia_correo(from_address='', to_address='', message='', subject='', password_email='', to_cc='',
             #              smtp='', smtp_port=587, files=''):
             ok = envia_correo(from_address=responder,
                               to_address=destinatario,
                               message=mensaje,
                               subject=motivo,
                               password_email=clave,
                               smtp_port=puerto,
                               smtp_server=servidor,
                               files=archivo)
             if not ok:
                 Ventanas.showAlert(
                     "Sistema", "Ha ocurrido un error al enviar el correo")
예제 #7
0
 def EstablecerTema(self):
     try:
         tema = ParamSist.ObtenerParametro("TEMA")
         if os.path.isfile(tema):
             style = open(tema)
             style = style.read()
             self.setStyleSheet(style)
     except:
         pass
    def EnviaCorreo(self, *args, **kwargs):

        self.ExportaExcel(mostrar=False)

        if not self.cArchivoGenerado:
            return
        email_contador = LeerIni('email_contador')
        text, ok = QInputDialog.getText(
            self.view,
            'Sistema',
            'Ingrese el mail destinatario:',
            text=email_contador if email_contador else '')
        if ok:
            GrabarIni(clave='email_contador', key='param', valor=str(text))
            destinatario = str(text).strip()
            archivo = self.cArchivoGenerado

            mensaje = "Enviado desde mi Software de Gestion desarrollado por http://www.servinlgsm.com.ar \n\n" \
                      "No responder este email"
            motivo = "Se envia informe de ventas de {}".format(
                LeerIni(clave='empresa', key='FACTURA'))
            servidor = ParamSist.ObtenerParametro("SERVER_SMTP")
            clave = ParamSist.ObtenerParametro("CLAVE_SMTP")
            usuario = ParamSist.ObtenerParametro("USUARIO_SMTP")
            puerto = ParamSist.ObtenerParametro("PUERTO_SMTP") or 587
            responder = ParamSist.ObtenerParametro("RESPONDER")
            # envia_correo(from_address='', to_address='', message='', subject='', password_email='', to_cc='',
            #              smtp='', smtp_port=587, files=''):
            ok = envia_correo(from_address=responder,
                              to_address=destinatario,
                              message=mensaje,
                              subject=motivo,
                              password_email=clave,
                              smtp_port=puerto,
                              smtp_server=servidor,
                              files=archivo)
            if not ok:
                Ventanas.showAlert("Sistema",
                                   "Ha ocurrido un error al enviar el correo")
            else:
                Ventanas.showAlert("Sistema",
                                   "Archivo de ventas enviado correctamente")
예제 #9
0
    def Migrar(self, *args, **kwargs):
        database = db
        self.migraciones = []
        self.migrator = MySQLMigrator(database)

        if int(ParamSist.ObtenerParametro("VERSION_DB") or 0) < 1:
            self.MigrarVersion1()

        self.RealizaMigraciones()

        ParamSist.GuardarParametro("VERSION_DB", "1")
예제 #10
0
    def Migrar(self, *args, **kwargs):
        database = db
        self.migraciones = []
        self.migrator = MySQLMigrator(database)

        if int(ParamSist.ObtenerParametro("VERSION_DB") or 0) <= 0:
            self.MigrarVersion0()
            self.InsertaDatosBasicos()

        if int(ParamSist.ObtenerParametro("VERSION_DB") or 0) < 1:
            self.MigrarVersion1()

        if int(ParamSist.ObtenerParametro("VERSION_DB") or 0) < 2:
            self.MigrarVersion2()

        if int(ParamSist.ObtenerParametro("VERSION_DB") or 0) < 3:
            self.MigrarVersion3()

        if int(ParamSist.ObtenerParametro("VERSION_DB") or 0) < 4:
            self.MigrarVersion4()

        if int(ParamSist.ObtenerParametro("VERSION_DB") or 0) < 5:
            self.MigrarVersion5()

        self.RealizaMigraciones()

        ParamSist.GuardarParametro("VERSION_DB", "5")
예제 #11
0
    def CargaDatos(self, *args, **kwargs):
        self.view.controles['empresa'].setText(
            LeerIni(clave='empresa', key='FACTURA'))
        self.view.controles['membrete1'].setText(
            LeerIni(clave='membrete1', key='FACTURA'))
        self.view.controles['membrete2'].setText(
            LeerIni(clave='membrete2', key='FACTURA'))
        self.view.controles['cuit'].setText(
            LeerIni(clave='cuit', key='FACTURA'))
        self.view.controles['iibb'].setText(
            LeerIni(clave='iibb', key='FACTURA'))

        self.view.controles['nombre_sistema'].setText(
            LeerIni(clave='nombre_sistema', key='param'))
        self.view.controles['BaseDatos'].setText(
            LeerIni(clave='basedatos', key='param'))
        self.view.controles['Usuario'].setText(
            LeerIni(clave='usuario', key='param'))
        self.view.controles['Host'].setText(LeerIni(clave='host', key='param'))
        self.view.controles['H**O'].setIndex(LeerIni(clave='h**o',
                                                     key='param'))
        self.view.controles['Base'].setText(LeerIni(clave='base', key='param'))
        #unicamente levanto la contraseña cuando tiene algo
        if LeerIni(clave='password', key='param'):
            self.view.controles['password'].setText(
                desencriptar(LeerIni(clave='password', key='param'),
                             LeerIni(clave='key', key='param')))
        self.view.controles['num_copias'].setText(
            LeerIni(clave='num_copias', key='FACTURA'))
        self.view.controles['cat_iva'].setIndex(
            LeerIni(clave='cat_iva', key='WSFEv1'))
        self.view.controles['cbufce'].setText(
            LeerIni(clave='cbufce', key='FACTURA'))
        self.view.controles['aliasfce'].setText(
            LeerIni(clave='aliasfce', key='FACTURA'))
        if LeerIni('h**o') == 'N':
            self.view.controles['crt'].setText(
                LeerIni(clave='cert_prod', key='WSAA'))
            self.view.controles['key'].setText(
                LeerIni(clave='privatekey_prod', key='WSAA'))
        else:
            self.view.controles['crt'].setText(
                LeerIni(clave='cert_homo', key='WSAA'))
            self.view.controles['key'].setText(
                LeerIni(clave='privatekey_homo', key='WSAA'))

        self.view.controles['tema'].setIndex(
            ParamSist.ObtenerParametro("TEMA"))
예제 #12
0
    def ImprimeFactura(self, idcabecera=None, mostrar=True, *args, **kwargs):
        if not idcabecera:
            return
        cabfact = Cabfact().get_by_id(idcabecera)
        print("imprimir factura {}".format(cabfact.numero))
        pyfpdf = FEPDF()
        #cuit del emisor
        pyfpdf.CUIT = LeerIni(clave='cuit', key='WSFEv1')
        #establezco formatos (cantidad de decimales):
        pyfpdf.FmtCantidad = "0.4"
        pyfpdf.FmtPrecio = "0.2"
        #Datos del encabezado de la factura:
        tipo_cbte = cabfact.tipocomp.codigo
        punto_vta = cabfact.numero[:4]
        cbte_nro = cabfact.numero[-8:]
        fecha = FechaMysql(cabfact.fecha)
        concepto = cabfact.concepto
        #datos del cliente:
        tipo_doc = "80" if cabfact.cliente.tiporesp_id != 3 else "96"
        nro_doc = cabfact.cliente.cuit if cabfact.cliente.tiporesp_id != 3 else str(
            cabfact.cliente.dni)
        nombre_cliente = cabfact.nombre if cabfact.nombre != '' else cabfact.cliente.nombre
        domicilio_cliente = cabfact.domicilio

        #totales del comprobante:
        imp_total = cabfact.total
        imp_tot_conc = "0.00"
        imp_neto = cabfact.neto
        imp_iva = cabfact.iva
        imp_trib = cabfact.percepciondgr
        imp_op_ex = "0.00"
        imp_subtotal = cabfact.neto
        fecha_cbte = fecha
        fecha_venc_pago = fecha
        #Fechas del período del servicio facturado
        if int(cabfact.concepto) in [
                FEv1().SERVICIOS, FEv1().PRODUCTOYSERVICIOS
        ]:
            fecha_serv_desde = FechaMysql(cabfact.desde)
            fecha_serv_hasta = FechaMysql(cabfact.hasta)
        else:
            fecha_serv_hasta = None
            fecha_serv_desde = None

        moneda_id = "PES"
        moneda_ctz = "1.000"
        obs_generales = ""
        obs_comerciales = ""
        moneda_id = ""
        moneda_ctz = 1
        cae = cabfact.cae
        fecha_vto_cae = FechaMysql(cabfact.venccae)

        #Creo la factura(internamente en la interfaz)
        ok = pyfpdf.CrearFactura(concepto, tipo_doc, nro_doc, tipo_cbte,
                                 punto_vta, cbte_nro, imp_total, imp_tot_conc,
                                 imp_neto, imp_iva, imp_trib, imp_op_ex,
                                 fecha_cbte, fecha_venc_pago, fecha_serv_desde,
                                 fecha_serv_hasta, moneda_id, moneda_ctz, cae,
                                 fecha_vto_cae, "", nombre_cliente,
                                 domicilio_cliente, 0)
        pyfpdf.EstablecerParametro("forma_pago", cabfact.formapago.detalle)
        pyfpdf.EstablecerParametro(
            "custom-nro-cli",
            "[{}]".format(str(cabfact.cliente.idcliente).zfill(5)))
        pyfpdf.EstablecerParametro("localidad_cli",
                                   cabfact.cliente.localidad.nombre)
        pyfpdf.EstablecerParametro("provincia_cli",
                                   cabfact.cliente.localidad.provincia)
        pyfpdf.EstablecerParametro("iva_cli", cabfact.cliente.tiporesp.nombre)

        #Agregar comprobantes asociados(si es una NC / ND):
        if cabfact.tipocomp.codigo in [3, 8, 13]:
            cpbterel = CpbteRel().select().where(
                CpbteRel.idcabfact == cabfact.idcabfact)
            for cp in cpbterel:
                tipo = cp.idtipocpbte.codigo
                pto_vta = cp.numero[:4]
                nro = cp.numero[-8:]
                pyfpdf.AgregarCmpAsoc(tipo, pto_vta, nro)
        # if str(self.view.cboComprobante.text()).find('credito'):
        #     tipo = 19
        #     pto_vta = 2
        #     nro = 1234
        #     pyfepdf.AgregarCmpAsoc(tipo, pto_vta, nro)

        #Agrego subtotales de IVA(uno por alicuota)
        if cabfact.netoa != 0:
            iva_id = 5  #c�digo para al�cuota del 21 %
            base_imp = cabfact.netoa  #importe neto sujeto a esta al�cuota
            importe = cabfact.netoa * 21 / 100  #importe liquidado de iva
            ok = pyfpdf.AgregarIva(iva_id, base_imp, importe)

        if cabfact.netob != 0:
            iva_id = 4  # c�digo para al�cuota del 10.5 %
            base_imp = cabfact.netob  # importe neto sujeto a esta al�cuota
            importe = cabfact.netob * 10.5 / 100  # importe liquidado de iva
            ok = pyfpdf.AgregarIva(iva_id, base_imp, importe)

        if cabfact.netoa == 0 and cabfact.netob == 0:
            iva_id = 3  # c�digo para al�cuota del 21 %
            base_imp = cabfact.netob  # importe neto sujeto a esta al�cuota
            importe = 0  # importe liquidado de iva
            ok = pyfpdf.AgregarIva(iva_id, base_imp, importe)

        if cabfact.percepciondgr != 0:
            #Agregar cada impuesto(por ej.IIBB, retenciones, percepciones, etc.):
            tributo_id = 99  #codigo para 99 - otros tributos
            Desc = cabfact.cliente.percepcion.detalle
            base_imp = cabfact.neto  #importe sujeto a estetributo
            alic = cabfact.cliente.percepcion.porcentaje  #alicuota(porcentaje) de estetributo
            importe = cabfact.percepciondgr  #importe liquidado de este tributo
            ok = pyfpdf.AgregarTributo(tributo_id, Desc, base_imp, alic,
                                       importe)

        det = Detfact().select().where(Detfact.idcabfact == cabfact.idcabfact)
        for d in det:
            #Agrego detalles de cada item de la factura:
            u_mtx = 0  #unidades
            cod_mtx = ""  #c�digo de barras
            codigo = d.idarticulo.idarticulo  #codigo interno a imprimir(ej. "articulo")
            ds = d.descad.strip()
            qty = d.cantidad  #cantidad
            umed = 7  #c�digo de unidad de medida(ej. 7 para"unidades")
            precio = d.precio  #precio neto(A) o iva incluido(B)
            bonif = 0  #importe de descuentos
            iva_id = FEv1().TASA_IVA[str(float(
                d.tipoiva.iva))]  #c�digopara al�cuota del 21 %
            imp_iva = d.montoiva  #importe liquidado deiva
            importe = d.precio * d.cantidad  #importe total del item
            despacho = ""  #numero de despacho de importaci�n
            dato_a = ""  #primer dato adicional del item
            dato_b = ""
            dato_c = ""
            dato_d = ""
            dato_e = ""  #ultimo dato adicionaldel item
            ok = pyfpdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty,
                                           umed, precio, bonif, iva_id,
                                           imp_iva, importe, despacho, dato_a,
                                           dato_b, dato_c, dato_d, dato_e)

        #Agrego datos adicionales fijos:
        ok = pyfpdf.AgregarDato("logo",
                                ubicacion_sistema() + "plantillas/logo.png")
        fondo = ParamSist.ObtenerParametro("FONDO_FACTURA")
        if fondo:
            x1 = ParamSist.ObtenerParametro("FONDO_FACTURA_X1") or 50
            y1 = ParamSist.ObtenerParametro("FONDO_FACTURA_Y1") or 117.1
            x2 = ParamSist.ObtenerParametro("FONDO_FACTURA_X2") or 150
            y2 = ParamSist.ObtenerParametro("FONDO_FACTURA_Y2") or 232.9
            pyfpdf.AgregarCampo("fondo_factura",
                                'I',
                                x1,
                                y1,
                                x2,
                                y2,
                                foreground=0x808080,
                                priority=-1,
                                text=imagen(fondo))
        ok = pyfpdf.AgregarDato(
            "EMPRESA", "Razon social: {}".format(
                DeCodifica(LeerIni(clave='empresa', key='FACTURA'))))
        ok = pyfpdf.AgregarDato(
            "MEMBRETE1", "Domicilio Comercial: {}".format(
                DeCodifica(LeerIni(clave='membrete1', key='FACTURA'))))
        ok = pyfpdf.AgregarDato(
            "MEMBRETE2", DeCodifica(LeerIni(clave='membrete2', key='FACTURA')))
        ok = pyfpdf.AgregarDato(
            "CUIT", 'CUIT: {}'.format(LeerIni(clave='cuit', key='WSFEv1')))
        ok = pyfpdf.AgregarDato("IIBB", LeerIni(clave='iibb', key='FACTURA'))
        ok = pyfpdf.AgregarDato(
            "IVA", "Condicion frente al IVA: {}".format(
                LeerIni(clave='iva', key='FACTURA')))
        ok = pyfpdf.AgregarDato(
            "INICIO", "Fecha inicio actividades: {}".format(
                LeerIni(clave='inicio', key='FACTURA')))

        if int(cabfact.tipocomp.codigo
               ) in Constantes.COMPROBANTES_FCE:  #si es una FCE
            pyfpdf.AgregarDato('CBUFCE', LeerIni('CBUFCE', key='FACTURA'))
            pyfpdf.AgregarDato('ALIASFCE', LeerIni('ALIASFCE', key='FACTURA'))
            pyfpdf.AgregarDato('nombre_condvta', Constantes.COND_VTA['T'])
            ok = pyfpdf.CargarFormato(ubicacion_sistema() +
                                      "/plantillas/factura-fce.csv")
        else:
            #Cargo el formato desde el archivo CSV(opcional)
            #(carga todos los campos a utilizar desde la planilla)
            ok = pyfpdf.CargarFormato(ubicacion_sistema() +
                                      "/plantillas/factura.csv")
        #Creo plantilla para esta factura(papel A4vertical):

        if LeerIni(clave='h**o') == 'S':
            pyfpdf.AgregarCampo("h**o",
                                'T',
                                150,
                                350,
                                0,
                                0,
                                size=70,
                                rotate=45,
                                foreground=0x808080,
                                priority=-1,
                                text="HOMOLOGACION")
        papel = "A4"  #o "letter" para carta, "legal" para oficio
        orientacion = "portrait"  #o landscape(apaisado)
        ok = pyfpdf.CrearPlantilla(papel, orientacion)
        num_copias = int(
            LeerIni(clave='num_copias',
                    key='FACTURA'))  #original, duplicado y triplicado
        lineas_max = 24  #cantidad de linas de items porp�gina
        qty_pos = "izq"  #(cantidad a la izquierda de la descripci�n del art�culo)
        #Proceso la plantilla
        ok = pyfpdf.ProcesarPlantilla(num_copias, lineas_max, qty_pos)

        if not os.path.isdir('facturas'):
            os.mkdir('facturas')
        #Genero el PDF de salida seg�n la plantilla procesada
        salida = join(
            'facturas', "{}-{}.pdf".format(cabfact.tipocomp.nombre,
                                           cabfact.numero))
        ok = pyfpdf.GenerarPDF(salida)
        #Abro el visor de PDF y muestro lo generado
        #(es necesario tener instalado Acrobat Reader o similar)
        imprimir = False  #cambiar a True para que lo envie directo a laimpresora
        if mostrar:
            pyfpdf.MostrarPDF(salida, imprimir)

        self.facturaGenerada = salida
예제 #13
0
 def onClickBtnCargar(self):
     archivo = openFileNameDialog(
         filename=ParamSist.ObtenerParametro("ARCHIVO_FIRMA_EMAIL"),
         files="HTML documents (*.html)")
     if archivo:
         self.view.editorFirma.file_open(archivo)
예제 #14
0
 def CargaDatos(self):
     archivo_firma = ParamSist.ObtenerParametro("ARCHIVO_FIRMA_EMAIL")
     if archivo_firma:
         self.view.editorFirma.file_open(archivo_firma)
    def onClickBtnExcel(self):
        excel = Excel()
        if not excel.ObtieneArchivo(
                archivo="informe recategorizacion de {} a {}".format(
                    self.view.spnAnio.value(),
                    self.view.cboPeriodo.GetDato().replace("/", ""))):
            return

        #ajuste por Gonzalo
        if (self.view.cboPeriodo.GetDato() == "Julio/Diciembre"):
            desde, hasta = self.view.cboPeriodo.RangoFecha(
                self.view.spnAnio.value() + 1)
        else:
            desde, hasta = self.view.cboPeriodo.RangoFecha(
                self.view.spnAnio.value())
        datos = Cabfact.DatosAgrupadosPeriodo(desde=desde, hasta=hasta)
        fila = 0
        excel.Titulo('Informe para recategorizacion',
                     desdecol='A',
                     hastacol='B',
                     fila=fila)
        fila += 1
        avance = 1
        total = len(datos)
        total_facturacion = 0
        for d in datos:
            QApplication.processEvents()
            self.view.avance.actualizar(avance / total * 100)
            avance += 1
            total_facturacion += float(d.total)

        fila += 2
        datos = ['Detalle', 'Montos']
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 1
        datos = [
            'Ingresos Brutos Devengados entre {} y {}'.format(
                FormatoFecha(desde, formato="dma"),
                FormatoFecha(hasta, formato="dma")), total_facturacion
        ]
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 1
        categoria_monotributo = ParamSist.ObtenerParametro(
            "CATEGORIA_MONOTRIBUTO")
        datos = ['Categoria Actual', categoria_monotributo]
        excel.EscribeFila(datos=datos, fila=fila)

        try:
            datos_categoria = CategoriaMono.get_by_id(categoria_monotributo)
            datos = [
                f'Categoria actual {datos_categoria.categoria}',
                datos_categoria.ing_brutos
            ]
        except:
            datos = ['Datos de categoria no encontrado', 0]
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 1
        categoria_monto = CategoriaMono.CategoriaMonto(total_facturacion)
        if categoria_monto:
            datos = [
                f'Recategorizacion {categoria_monto.categoria}',
                categoria_monto.ing_brutos
            ]
            ingresos = categoria_monto.ing_brutos
            if ParamSist.ObtenerParametro("ACTIVIDAD_MONOTRIBUTO") == "S":
                cuota = float(categoria_monto.imp_servicio)
            else:
                cuota = float(categoria_monto.imp_cosas_muebles)
            aporte_os = float(categoria_monto.obra_social) * (
                float(ParamSist.ObtenerParametro("CANTIDAD_ADH_OS") or 0) +
                1) + float(categoria_monto.sipa)
        else:
            datos = ['Datos para recategorizacion no encontrado']
            ingresos = 0
            cuota = 0
            aporte_os = 0
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 1
        datos = [
            'Hasta el {} todavia podes facturar'.format(FormatoFecha(hasta)),
            round(float(ingresos) - total_facturacion, 2)
        ]
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 1
        meses = diferencia_meses(hasta, datetime.now().date()) + 1
        datos = [
            f"Faltan {meses} meses para la proxima recategorizacion", meses
        ]
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 1
        datos = ["Por mes podes facturar", f"=+B{fila-1}/B{fila}"]
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 2
        datos = ["Montos para la nueva categoria", ""]
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 1
        datos = ['Cuota Mensual', cuota]
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 1
        datos = ['Aporte autonomo / Obra social', aporte_os]
        excel.EscribeFila(datos=datos, fila=fila)

        fila += 1
        datos = ['Total', aporte_os + cuota]
        excel.EscribeFila(datos=datos, fila=fila)

        excel.Cerrar()