Пример #1
0
    def ConstatarComprobantes(self, *args, **kwargs):
        cbte_modo = kwargs['cbte_modo']  # modalidad de emision: CAI, CAE, CAEA
        cuit_emisor = LeerIni(clave='cuit', key='WSFEv1')  # proveedor
        pto_vta = kwargs['pto_vta']  # punto de venta habilitado en AFIP
        cbte_tipo = kwargs[
            'cbte_tipo']  # 1: factura A (ver tabla de parametros)
        cbte_nro = kwargs['cbte_nro']  # numero de factura
        cbte_fch = kwargs['cbte_fch']  # fecha en formato aaaammdd
        imp_total = kwargs['imp_total']  # importe total
        cod_autorizacion = kwargs[
            'cod_autorizacion']  # numero de CAI, CAE o CAEA
        doc_tipo_receptor = kwargs[
            'doc_tipo_receptor']  # CUIT (obligatorio Facturas A o M)
        doc_nro_receptor = kwargs[
            'doc_nro_receptor']  # numero de CUIT del cliente
        wscdc = WSCDC()
        ta = self.Autenticar()
        wscdc.SetTicketAcceso(ta_string=ta)
        wscdc.SetParametros(cuit=LeerIni(clave='cuit', key='WSFEv1'),
                            token=self.Token,
                            sign=self.Sign)
        ok = wscdc.ConstatarComprobante(cbte_modo, cuit_emisor, pto_vta,
                                        cbte_tipo, cbte_nro, cbte_fch,
                                        imp_total, cod_autorizacion,
                                        doc_tipo_receptor, doc_nro_receptor)
        if not ok:
            Ventanas.showAlert(LeerIni('nombre_sistema'),
                               "ERROR: {}".format(wscdc.ErrMsg))

        return ok
Пример #2
0
    def onClickConsulta(self):

        padron = PadronAfip()
        ok = padron.ConsultarPersona(
            cuit=str(self.view.textCUIT.text()).replace("-", ""))
        self.view.gridDatos.setRowCount(0)
        if padron.errores:
            error = padron.LeerError()
            item = ["Error", error]
            self.view.gridDatos.AgregaItem(item)
            Ventanas.showAlert(LeerIni("nombre_sistema"),
                               "Error al leer informacion en la AFIP")
        else:
            item = ["Denominacion", padron.denominacion]
            self.view.gridDatos.AgregaItem(item)
            item = [
                "Tipo", "{} {} {}".format(padron.tipo_persona, padron.tipo_doc,
                                          padron.dni)
            ]
            self.view.gridDatos.AgregaItem(item)
            item = ["Estado", padron.estado]
            self.view.gridDatos.AgregaItem(item)
            item = ["Direccion", padron.direccion]
            self.view.gridDatos.AgregaItem(item)
            item = ["Localidad", padron.localidad]
            self.view.gridDatos.AgregaItem(item)
            item = ["Provincia", padron.provincia]
            self.view.gridDatos.AgregaItem(item)
            item = ["Codigo Postal", padron.cod_postal]
            self.view.gridDatos.AgregaItem(item)
 def btnAceptarClicked(self, *args, **kwargs):
     if self.tipo == 'M':
         cliente = Cliente.get_by_id(
             self.controles[Cliente.idcliente.column_name].text())
         cliente.idcliente = self.controles['idcliente'].text()
     else:
         if self.controles['dni'].text() != '0':
             doc = Cliente.select().where(
                 Cliente.dni == self.controles['dni'].text())
         else:
             doc = Cliente.select().where(
                 Cliente.cuit == self.controles['cuit'].text() or '0')
         if doc.count() > 0:
             Ventanas.showAlert(
                 "Sistema",
                 "Cliente con el numero documento de documento cargado, ya dado de alta"
             )
             return
         cliente = Cliente()
     cliente.nombre = self.controles['nombre'].text()
     cliente.telefono = self.controles['telefono'].text()
     cliente.localidad = self.controles['localidad'].text() or 1
     cliente.domicilio = self.controles['domicilio'].text()
     cliente.tipodocu = self.controles['tipodocu'].text() or 0
     cliente.dni = self.controles['dni'].text(
     ) if self.controles['dni'].text() else '0'
     cliente.cuit = self.controles['cuit'].text() if str(
         self.controles['cuit'].text()).replace('-', '') else '0'
     cliente.tiporesp = self.controles['tiporesp'].text() or 3
     cliente.formapago = '1'
     cliente.percepcion = self.controles['percepcion'].text() or 1
     #if self.tipo == 'M': #actualizacion
     cliente.save()
     ABM.btnAceptarClicked(self)
Пример #4
0
    def PrecioBase(self, nPrecio = 0.00, lReparto = False, clave = '', cLista = '1'):
        if isinstance(nPrecio, (float,)):
            nPrecio = decimal.Decimal.from_float(nPrecio)
        nRetorno = decimal.Decimal.from_float(0.0)
        stock = Stock.get_by_id(clave)
        flete = decimal.Decimal.from_float(0.)
        if stock:
            if nPrecio == 0.0:
                nPrecio = stock.preciopro
            if eval('stock.incre' + cLista) <= 0:
                Ventanas.showAlert("Sistema", "El articulo {} no tiene establecido un margen y no podemos continuar".
                                   format(clave))
            else:
                if stock.clave[7:].strip() != '':
                    nPrecio = eval(str(nPrecio) + stock.formu.strip())
                    if isinstance(nPrecio, (float,)):
                        nPrecio = decimal.Decimal.from_float(nPrecio)
                    flete = self.PrecioFlete(stock, cLista, nPrecio)
                    cfijo = self.CostoFijo(stock, nPrecio)
                else:
                    flete = self.PrecioFlete(stock, cLista, nPrecio)
                    cfijo = self.CostoFijo(stock, nPrecio)
                nRetorno = flete + cfijo
                nRetorno += nPrecio + nPrecio * eval('stock.incre' + cLista) / 100
                nRetorno += nRetorno * self.DevImp(stock.tipoimp) / 100

        return nRetorno
Пример #5
0
    def ArmaTabla(self):
        self.tableView.setRowCount(0)
        if not self.model:  #si no esta establecido el modelo no hago nada
            return

        data = self.model.select().dicts()
        if self.condicion:
            for c in self.condicion:
                data = data.where(c)

        if self.lineEditBusqueda.text():
            if self.ordenBusqueda:
                data = data.where(
                    self.ordenBusqueda.contains(self.lineEditBusqueda.text()))
            else:
                Ventanas.showAlert(
                    "Sistema",
                    "Orden no establecido y no se puede realizar la busqueda")

        data = data.limit(self.limite)
        for d in data:
            if self.camposAMostrar:
                item = [d[x.column_name] for x in self.camposAMostrar]
            else:
                item = [d[x] for x in d]
            self.tableView.AgregaItem(item)
    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")
Пример #7
0
 def onClickAgregaCliente(self):
     padron = PadronAfip()
     ok = padron.ConsultarPersona(
         cuit=str(self.view.textCUIT.text()).replace("-", ""))
     if padron.errores:
         Ventanas.showAlert(LeerIni("nombre_sistema"),
                            "Error al leer informacion en la AFIP")
     else:
         cliente = Cliente()
         cliente.nombre = padron.denominacion[:30]
         cliente.domicilio = padron.direccion[:30]
         try:
             localidad = Localidad().select().where(
                 Localidad.nombre.contains(padron.localidad)).get()
         except Localidad.DoesNotExist:
             localidad = Localidad().get_by_id(1)
         cliente.localidad = localidad
         cliente.cuit = padron.cuit
         cliente.dni = padron.dni
         cliente.tipodocu = 80 if padron.tipo_doc == 80 else 0
         cliente.tiporesp = 2 if padron.tipo_doc == 80 else 0
         cliente.formapago = 1
         cliente.percepcion = 1
         cliente.save()
         Ventanas.showAlert(
             LeerIni("nombre_sistema"),
             "Verifique si los datos cargados son los correctos")
    def onClickBtnEnviar(self):
        ok, err_msg = envia_correo(from_address=self.usuario,
                                   to_address=self.view.textPara.text(),
                                   message=self.view.textMensaje.toHtml(),
                                   subject=self.view.textAsunto.text(),
                                   password_email=self.clave,
                                   to_cc=self.view.textCC.text(),
                                   smtp_server=self.servidor,
                                   smtp_port=self.puerto,
                                   files=self.adjuntos,
                                   to_cco=self.view.textCCO.text())
        if not ok:
            Ventanas.showAlert("Sistema",
                               f"Se ha producido un error {err_msg}")
        else:
            correo = CorreoEnviado()
            correo.de = self.usuario
            correo.para = self.view.textPara.text()
            correo.cc = self.view.textCC.text()
            correo.cco = self.view.textCCO.text()
            correo.asunto = self.view.textAsunto.text()
            correo.adjuntos = self.view.textAdjunto.text()
            correo.mensaje = self.view.textMensaje.toHtml()
            correo.save()
            Ventanas.showAlert("Sistema", "Correo enviado satisfactoriamente")

            self.view.Cerrar()
Пример #9
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)
Пример #10
0
    def EstadoServidores(self):

        ta = self.Autenticar()
        self.Dummy()
        Ventanas.showAlert(LeerIni('nombre_sistema'),
                           "appserver status {} dbserver status {} authserver status {}".format(
                               self.AppServerStatus, self.DbServerStatus, self.AuthServerStatus
                           ))
Пример #11
0
    def ProcesaCodBarra(self, key):

        if key in [Qt.Key_Return, Qt.Key_Enter]:
            if str(self.view.textCodBarra.text()).startswith('+'):
                if self.ProcesaTotales():
                    pass
                else:
                    Ventanas.showAlert(
                        "Sistema", "El monto es menor al total de la compra")
Пример #12
0
 def SeleccionaConcepto(self):
     if self.view.controles['concepto'].text() not in [
             str(FEv1.SERVICIOS),
             str(FEv1.PRODUCTOYSERVICIOS),
             str(FEv1.PRODUCTOS)
     ]:
         Ventanas.showAlert(
             LeerIni('nombre_sistema'),
             'Concepto no valido. Unicamente 1 (Productos), 2 (Servicios)')
Пример #13
0
    def onClickBtnConstata(self):

        WSCDC = WSConstComp()

        self.cbte_modo = self.view.cboModoCpte.valor()

        if self.cbte_modo in ['CF']:
            Ventanas.showAlert(
                LeerIni('nombre_sistema'),
                "No se puede constatar facturas emitidas con controlador fiscal"
            )
        proveedor = Proveedor.get_by_id(self.view.textProveedor.text())
        self.cuit_emisor = proveedor.cuit.replace("-", "")  # proveedor
        self.pto_vta = str(self.view.textFactura.lineEditPtoVta.text()
                           )  # punto de venta habilitado en AFIP
        self.cbte_tipo = int(self.view.textTipoComp.text()
                             )  # 1: factura A (ver tabla de parametros)
        self.cbte_nro = str(
            self.view.textFactura.lineEditNumero.text())  # numero de factura
        self.cbte_fch = FechaMysql(self.view.fechaEmision.date().toPyDate()
                                   )  # fecha en formato aaaammdd
        self.cod_autorizacion = str(
            self.view.textCAE.text())  # numero de CAI, CAE o CAEA
        # if self.cbte_modo == 'CAI':
        #     self.imp_total = "0"  # importe total
        #     self.doc_tipo_receptor = ""  # CUIT (obligatorio Facturas A o M)
        #     self.doc_nro_receptor = ""  # numero de CUIT del cliente
        # else:
        self.imp_total = str(self.view.textTotal.text())  # importe total
        self.doc_tipo_receptor = "80"  # CUIT (obligatorio Facturas A o M)
        self.doc_nro_receptor = LeerIni(
            clave='cuit', key='WSFEv1')  # numero de CUIT del cliente

        ok = WSCDC.Comprobar(cbte_modo=self.cbte_modo,
                             cuit_emisor=self.cuit_emisor,
                             pto_vta=self.pto_vta,
                             cbte_tipo=self.cbte_tipo,
                             cbte_nro=self.cbte_nro,
                             cbte_fch=self.cbte_fch,
                             imp_total=self.imp_total,
                             cod_autorizacion=self.cod_autorizacion,
                             doc_tipo_receptor=self.doc_tipo_receptor,
                             doc_nro_receptor=self.doc_nro_receptor)

        if WSCDC.Resultado == "R":
            detalle = "Rechazado"
        elif WSCDC.Resultado == "A":
            detalle = "Aprobado"
        else:
            detalle = "Observado"
        self.estado = detalle
        self.obs = WSCDC.Obs.encode('utf-8')

        detalle += WSCDC.Obs
        if WSCDC.Resultado == "R":
            detalle = WSCDC.ErrMsg
        self.Imprimir()
Пример #14
0
    def Borrar(self, *args, **kwargs):
        if not self.tableView.currentRow() != -1:
            return

        if not self.campoClave:
            Ventanas.showAlert("Sistema", "No tenes establecido el campo clave y no podemos continuar")

        id = self.tableView.ObtenerItem(fila=self.tableView.currentRow(), col=self.campoClave.column_name.capitalize())
        data = self.model.get_by_id(id)
        data.delete_instance()
        self.ArmaTabla()
Пример #15
0
    def CargaDatos(self):
        if not self.modelo:
            Ventanas.showAlert(
                LeerIni('nombre_sistema'),
                "No se ha establecido el modelo para la busqueda")
            return

        textoBusqueda = self.lineEdit.text()

        rows = self.modelo.select().dicts()

        if self.condiciones:
            for c in self.condiciones:
                rows = rows.where(c)

        if textoBusqueda:
            rows = rows.where(self.campoBusqueda.contains(textoBusqueda))

        self.tableView.setColumnCount(len(self.campos))
        self.tableView.setRowCount(len(rows))

        logging.info("SQL de condiciones de busqueda {}".format(
            self.condiciones))
        #self.tableView.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)

        for col in range(0, len(self.campos)):
            if self.campos[col] == self.campoRetorno.column_name:
                self.colRetorno = col
            if self.campos[col] == self.campoBusqueda.column_name:
                self.colBusqueda = col

            self.tableView.setHorizontalHeaderItem(
                col, QTableWidgetItem(self.campos[col].capitalize()))

        fila = 0
        for row in rows:
            for col in range(0, len(self.campos)):
                if isinstance(row[self.campos[col]], (
                        int,
                        decimal.Decimal,
                )):
                    item = QTableWidgetItem(str(row[self.campos[col]]))
                else:
                    item = QTableWidgetItem(
                        QTableWidgetItem(row[self.campos[col]]))

                item.setFlags(QtCore.Qt.ItemIsSelectable
                              | QtCore.Qt.ItemIsEnabled)
                self.tableView.setItem(fila, col, item)

            fila += 1
        self.tableView.resizeRowsToContents()
        self.tableView.resizeColumnsToContents()
Пример #16
0
    def Cerrar(self, abre=True):
        try:
            if not WIN32:
                for v in self.cabeceras.values():
                    self.set_column_autowidth(v)
            self.libro.close()
            if WIN32:
                xlautofit(self.archivo)

        except IOError:
            Ventanas.showAlert("Sistema", "No se puede escribir el archivo {} esta abierto. Intente cerrarlo".format(
                self.archivo
            ))
        if abre:
            AbrirArchivo(self.archivo)
Пример #17
0
    def capturar_errores_wrapper(self, *args, **kwargs):
        try:
            # inicializo (limpio variables)
            self.Traceback = self.Excepcion = ""
            return func(self, *args, **kwargs)
        except Exception as e:
            ex = traceback.format_exception(sys.exc_info()[0],
                                            sys.exc_info()[1],
                                            sys.exc_info()[2])
            self.Traceback = ''.join(ex)
            self.Excepcion = traceback.format_exception_only(
                sys.exc_info()[0],
                sys.exc_info()[1])[0]
            logging.debug(self.Traceback)
            if LeerIni('debug') == 'N':
                Ventanas.showAlert(
                    "Error",
                    "Se ha producido un error \n{}".format(self.Excepcion))
                pyemail = PyEmail()
                remitente = '*****@*****.**'
                destinatario = '*****@*****.**'
                mensaje = "{} {} Enviado desde mi Software de Gestion desarrollado por http://www.servinlgsm.com.ar".format(
                    self.Traceback, self.Excepcion)
                motivo = "Se envia informe de errores 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=Constantes.SERVER_SMTP,
                                 usuario=Constantes.USUARIO_SMTP,
                                 clave=Constantes.CLAVE_SMTP,
                                 puerto=Constantes.PUERTO_SMTP)

                ok = pyemail.Enviar(remitente, motivo, destinatario, mensaje)
                if not ok:
                    Ventanas.showAlert(
                        "Error", "{} {}".format(pyemail.Excepcion,
                                                pyemail.Traceback))
                # envia_correo(from_address=remitente, to_address=destinatario,
                #              message=mensaje, subject=motivo)
            else:
                print(self.Traceback, self.Excepcion)
            if self.LanzarExcepciones:
                raise
        finally:
            pass
Пример #18
0
 def ConsultarMontoObligado(self, cuit_consultada, cuit_emisor):
     if isinstance(cuit_emisor, bytes):
         self.Cuit = cuit_emisor.decode()
     else:
         self.Cuit = cuit_emisor
     cuit_consultada = cuit_consultada.replace('-', '')
     if LeerIni(clave='h**o') == 'S':
         self.Conectar("")
     else:
         self.Conectar("", wsdl=self.WSDL)
     tafce = self.Autenticar()
     self.SetTicketAcceso(tafce)
     minimo = self.ConsultarMontoObligadoRecepcion(cuit_consultada)
     if self.ErrMsg:
         Ventanas.showAlert("Sistema", self.ErrMsg)
     return self.Resultado == 'S', minimo
Пример #19
0
    def Modifica(self):

        self.tipo = 'M'
        if not self.tableView.currentRow() != -1:
            return

        if not self.campoClave:
            Ventanas.showAlert("Sistema", "No tenes establecido el campo clave y no podemos continuar")

        id = self.tableView.ObtenerItem(fila=self.tableView.currentRow(), col=self.campoClave.column_name.capitalize())
        print(self.tableView.currentRow(), id)
        data = self.model.select().where(self.campoClave == int(id)).dicts()
        self.tabDetalle.setEnabled(True)
        self.tabWidget.setCurrentIndex(1)
        self.CargaDatos(data)
        if self.campoFoco:
            self.campoFoco.setFocus()
Пример #20
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")
Пример #21
0
    def ValidaFactura(self):
        try:
            data = CabFactProv.select().where(
                CabFactProv.idproveedor == self.view.textProveedor.value(),
                CabFactProv.tipocomp == self.view.textTipoComp.value(),
                CabFactProv.numero == self.view.textFactura.numero).get()
            if data:
                Ventanas.showAlert(LeerIni("nombre_sistema"),
                                   "Error factura ya cargada al sistema")
                self.view.btnGrabar.setEnabled(False)
                retorno = False
            else:
                self.view.btnGrabar.setEnabled(True)
                retorno = True
        except CabFactProv.DoesNotExist:
            retorno = True

        return retorno
    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")
Пример #23
0
    def onClickBtnAceptar(self, *args, **kwargs):
        if not self.model:
            Ventanas.showAlert("Sistema",
                               "Debes establecer un modelo a actualizar")
            return
        if self.campoclave is None:
            Ventanas.showAlert("Sistema",
                               "Debes establecer un campo clave a actualizar")
            return

        if self.view.tipo == 'M':
            dato = self.model.get_by_id(
                self.view.controles[self.campoclave].text())
        else:
            dato = self.model()

        for control in self.view.controles:
            dato.__data__[control] = self.view.controles[control].text()
        dato.save(force_insert=self.view.tipo == 'A')
        self.view.btnAceptarClicked()
Пример #24
0
    def CreaTablas(self, *args, **kwargs):
        if LeerIni(
                "base"
        ) == "mysql":  #en caso de que sea mysql y no este creada la base la crea
            basedatos = LeerIni("basedatos")
            user = LeerIni("usuario")
            password = desencriptar(
                LeerIni('password').encode(),
                LeerIni('key').encode())
            host = LeerIni("host")
            conn = pymysql.connect(host=host, user=user, password=password)
            conn.cursor().execute(f'CREATE DATABASE IF NOT EXISTS {basedatos}')
            conn.close()

        try:
            ParamSist.create_table(safe=True)
        except peewee.InternalError:
            Ventanas.showAlert(
                "Sistema",
                "Verifique que la base de datos este creada en {}".format(
                    LeerIni("host")))
Пример #25
0
 def capturar_errores_wrapper(self, *args, **kwargs):
     try:
         # inicializo (limpio variables)
         self.Traceback = self.Excepcion = ""
         return func(self, *args, **kwargs)
     except Exception as e:
         ex = traceback.format_exception(sys.exc_info()[0],
                                         sys.exc_info()[1],
                                         sys.exc_info()[2])
         self.Traceback = ''.join(ex)
         self.Excepcion = traceback.format_exception_only(
             sys.exc_info()[0],
             sys.exc_info()[1])[0]
         logging.debug(self.Traceback)
         Ventanas.showAlert(
             "Error",
             "Se ha producido un error \n{}".format(self.Excepcion))
         if self.LanzarExcepciones:
             raise
     finally:
         pass
Пример #26
0
    def Validacion(self):
        retorno = True
        if not self.view.validaCliente.text():
            Ventanas.showAlert(
                LeerIni('nombre_sistema'),
                "ERROR: No se ha especificado un cliente valido")
            retorno = False

        for x in range(self.view.gridFactura.rowCount()):
            iva = float(self.view.gridFactura.ObtenerItem(fila=x, col='IVA'))
            if str(iva) not in FEv1().TASA_IVA:
                Ventanas.showAlert(
                    LeerIni('nombre_sistema'),
                    "Error el item {} no tiene un IVA valido".format(x + 1))
                retorno = False
            codigo = self.view.gridFactura.ObtenerItem(fila=x, col='Codigo')
            try:
                articulo = Articulo.get_by_id(codigo)
            except Articulo.DoesNotExist:
                Ventanas.showAlert(
                    LeerIni('nombre_sistema'),
                    "Error el item {} tiene un articulo no valido".format(x +
                                                                          1))
                retorno = False

        return retorno
Пример #27
0
 def ConsultaCAE(self):
     fe = FEv1()
     # tipocbte = [k for (k, v) in self.view.cboTipoComp.valores.iteritems() if v == self.view.cboTipoComp.text()][0]
     tipocbte = self.view.cboTipoComp.text()
     fe.ConsultarCAE(tipocbte=tipocbte,
                     puntoventa=self.view.layoutFactura.lineEditPtoVta.text(),
                     numero=self.view.layoutFactura.lineEditNumero.text())
     if fe:
         self.view.textCAE.setText(fe.CAE)
         self.view.textTotal.setText(str(fe.ImpTotal))
         self.view.textNeto.setText(str(fe.ImpNeto))
         self.view.textIVA.setText(str(fe.ImpIVA))
         self.view.textDGR.setText(str(fe.ImpTrib))
         self.view.textTipoDoc.setText(str(fe.factura["tipo_doc"]))
         self.view.textDocCli.setText(str(fe.factura["nro_doc"]))
         self.view.textFecha.setText(fe.FechaCbte)
         self.view.gridIVA.setRowCount(0)
         for iva in fe.factura['iva']:
             item = [
                 iva['iva_id'], iva['base_imp'], iva['importe']
             ]
             self.view.gridIVA.AgregaItem(items=item)
     else:
         Ventanas.showAlert("Sistema", "Comprobante consultado no valido")
Пример #28
0
 def focusOutEvent(self, QFocusEvent):
     EntradaTexto().focusOutEvent(QFocusEvent)
     if not validar_cuit(self.text()):
         Ventanas.showAlert("Sistema",
                            "ERROR: CUIT/CUIL no valido. Verfique!!!")
    def Procesar(self):
        if not os.path.isdir("cpras-vtas"):
            os.mkdir("cpras-vtas")

        arch = open(
            GuardarArchivo(caption="Guardar archivo",
                           directory="cpras-vtas",
                           filter="*.TXT",
                           filename="REGINFO_CV_COMPRAS_CBTE_{}".format(
                               self.view.periodo.cPeriodo)), "w")
        archDet = open(
            GuardarArchivo(caption="Guardar archivo",
                           directory="cpras-vtas",
                           filter="*.TXT",
                           filename="REGINFO_CV_COMPRAS_ALICUOTAS_{}".format(
                               self.view.periodo.cPeriodo)), "w")
        if not arch or not archDet:
            return

        anchos = [
            8, 3, 5, 20, 16, 2, 20, 30, 15, 15, 15, 15, 15, 15, 15, 15, 3, 10,
            1, 1, 15, 15, 11, 30, 15
        ]
        anchosDet = [3, 5, 20, 2, 20, 15, 4, 15]

        data = CabFactProv.select().where(
            CabFactProv.periodo == self.view.periodo.cPeriodo)

        for d in data:
            if LeerIni(
                    clave='base'
            ) == 'sqlite':  #esto es porque sqlite no soporta boolean
                exporta = d.tipocomp.codigo in Constantes.COMPEXPORTA
            else:
                exporta = d.tipocomp.exporta
            if exporta:
                detalle = DetFactProv.select(
                    DetFactProv.iva,
                    fn.SUM(DetFactProv.neto).alias("neto")).group_by(
                        DetFactProv.iva).where(
                            DetFactProv.idpcabecera == d.idpcabfact)
                fecha = FechaMysql(d.fechaem)
                tipocomp = str(d.tipocomp.codigo).zfill(3)
                ptovta = d.numero[:4].zfill(5)
                if ptovta == "00000":
                    ptovta = "00001"  #citi compras no permite pto vta en 0
                numero = d.numero[4:].zfill(20)
                despacho = ''
                if d.idproveedor.tiporesp.idtiporesp == 3:  #consumidor final
                    tipodoc = '96'
                else:
                    tipodoc = '80'
                nrodoc = d.idproveedor.cuit.replace('-', '').zfill(20)
                nombre = d.idproveedor.nombre[:30]
                total = '{:.{prec}f}'.format(d.neto + d.iva + d.percepciondgr +
                                             d.impuestos + d.exentos +
                                             d.percepcioniva + d.nogravados,
                                             prec=2).replace('.', '').zfill(15)
                nogravado = '{:.{prec}f}'.format(d.nogravados,
                                                 prec=2).replace('.',
                                                                 '').zfill(15)
                exento = '{:.{prec}f}'.format(d.exentos,
                                              prec=2).replace('.',
                                                              '').zfill(15)
                percepcioniva = '{:.{prec}f}'.format(
                    d.percepcioniva, prec=2).replace('.', '').zfill(15)
                interno = '{:.{prec}f}'.format(d.impuestos,
                                               prec=2).replace('.',
                                                               '').zfill(15)
                percepdgr = '{:.{prec}f}'.format(d.percepciondgr,
                                                 prec=2).replace('.',
                                                                 '').zfill(15)
                impmun = str(0).zfill(15)
                impuesto = str(0).zfill(15)
                moneda = 'PES'
                cambio = '{:.{prec}f}'.format(1, prec=6).replace('.',
                                                                 '').zfill(10)
                cantalic = str(detalle.count()).zfill(1)
                codop = '0'
                creditofiscal = '{:.{prec}f}'.format(d.iva, prec=2).replace(
                    '.', '').zfill(15)
                otros = '{:.{prec}f}'.format(0, prec=6).replace('.',
                                                                '').zfill(15)
                cuitemisor = '{:.{prec}f}'.format(0,
                                                  prec=6).replace('.',
                                                                  '').zfill(11)
                denoemisor = ''
                ivacomision = '{:.{prec}f}'.format(0, prec=6).replace(
                    '.', '').zfill(15)

                for det in detalle:
                    if d.tipocomp.letra == 'C':
                        codop = 'A'
                        cantalic = '0'
                    elif d.iva == 0:
                        codop = '0'

                    neto = '{:.{prec}f}'.format(det.neto,
                                                prec=2).replace('.',
                                                                '').zfill(15)
                    alicuota = Constantes.ALICUOTA_AFIP[int(
                        '{:.{prec}f}'.format(det.iva, prec=0))]
                    impuestodetalle = '{:.{prec}f}'.format(
                        det.neto * det.iva / 100, prec=2).replace('.',
                                                                  '').zfill(15)
                    if d.tipocomp.codigo not in [11, 32, 13]:
                        itemsdet = [
                            tipocomp, ptovta, numero, tipodoc, nrodoc, neto,
                            alicuota, impuestodetalle
                        ]
                        archDet.write("".join(
                            "%*s" % i for i in zip(anchosDet, itemsdet)))
                        archDet.write("\n")

                items = [
                    fecha, tipocomp, ptovta, numero, despacho, tipodoc, nrodoc,
                    nombre, total, nogravado, exento, percepcioniva, impuesto,
                    percepdgr, impmun, interno, moneda, cambio, cantalic,
                    codop, creditofiscal, otros, cuitemisor, denoemisor,
                    ivacomision
                ]
                arch.write("".join("%*s" % i for i in zip(anchos, items)))
                arch.write("\n")

        arch.close()
        archDet.close()
        Ventanas.showAlert("Sistema", "Proceso finalizado")
        self.view.close()
Пример #30
0
    def Procesar(self):
        #arch = open(Constantes.ARCHIVO_CITI_VTAS + "ventas" + self.periodo.cPeriodo + ".txt", "w")
        #archDet = open(Constantes.ARCHIVO_CITI_VTAS + "alicuotas-ventas" + self.periodo.cPeriodo + ".txt", "w")
        if not os.path.isdir("cpras-vtas"):
            os.mkdir("cpras-vtas")

        data = Cabfact.select().where(
            Cabfact.fecha.between(lo=self.view.periodo.dInicio,
                                  hi=self.view.periodo.dFin))
        arch = open(
            GuardarArchivo(caption="Guardar archivo",
                           directory="cpras-vtas",
                           filter="*.TXT",
                           filename="REGINFO_CV_VENTAS_CBTE_{}".format(
                               self.view.periodo.cPeriodo)), "w")
        archDet = open(
            GuardarArchivo(caption="Guardar archivo",
                           directory="cpras-vtas",
                           filter="*.TXT",
                           filename="REGINFO_CV_VENTAS_ALICUOTAS_{}".format(
                               self.view.periodo.cPeriodo)), "w")
        if not arch or not archDet:
            return

        anchos = [
            8, 3, 5, 20, 20, 2, 20, 30, 15, 15, 15, 15, 15, 15, 15, 15, 3, 10,
            1, 1, 15, 8
        ]
        anchosDet = [3, 5, 20, 15, 4, 15]

        totalData = len(data)
        cant = 0.0
        for d in data:
            QApplication.processEvents()
            cant += 1.
            self.view.avance.actualizar(cant / totalData * 100.)
            if d.tipocomp.exporta:
                fecha = FechaMysql(d.fecha)
                tipocomp = str(d.tipocomp.codigo).zfill(3)
                ptovta = d.numero[:4].zfill(5)
                numero = d.numero[4:].zfill(20)
                if d.cliente.tiporesp.idtiporesp == 3:  #consumidor final
                    if d.total > 1000:
                        tipodoc = '96'
                        ndoc = str(d.cliente.dni).zfill(
                            20) if d.cliente.dni != 0 else '11111111'.zfill(20)
                    else:
                        tipodoc = '99' if d.cliente.dni == 0 or d.cliente.dni == '11111111' else '96'
                        ndoc = ''.zfill(
                            20) if d.cliente.dni == '11111111' else str(
                                d.cliente.dni).zfill(20)
                else:
                    tipodoc = '80'
                    ndoc = d.cliente.cuit.replace('-', '').zfill(20)
                nombre = Normaliza(d.nombre[:30])
                total = '{:.{prec}f}'.format(d.total,
                                             prec=2).replace('.', '').zfill(15)
                nogravado, nocategorizado, exentas, percepcion, municipal, impinterno, otros = \
                    ''.zfill(15), ''.zfill(15), ''.zfill(15), ''.zfill(15), ''.zfill(15),''.zfill(15),''.zfill(15)
                percepciondgr = '{:.{prec}f}'.format(
                    d.percepciondgr, prec=2).replace('.', '').zfill(15)
                moneda = 'PES'
                cambio = '1000000'.zfill(10)
                if d.netoa != 0 and d.netob != 0:
                    cantalic = '2'
                elif d.netoa != 0 and d.netob == 0:
                    cantalic = '1'
                elif d.netoa == 0 and d.netob != 0:
                    cantalic = '1'
                else:
                    cantalic = '1'

                if d.netoa == 0 and d.netob == 0:
                    codop = 'A'
                else:
                    codop = '0'
                vencepago = ''.zfill(8)
                items = [
                    fecha, tipocomp, ptovta, numero, numero, tipodoc, ndoc,
                    nombre, total, nogravado, nocategorizado, exentas,
                    percepcion, percepciondgr, municipal, impinterno, moneda,
                    cambio, cantalic, codop, otros, vencepago
                ]
                arch.write("".join("%*s" % i for i in zip(anchos, items)))
                arch.write("\n")

                if d.netoa != 0:
                    alicuota = Constantes.ALICUOTA_AFIP[21]
                    impuesto = '{:.{prec}f}'.format(round(float(d.netoa) * 21. / 100,2), prec=2)\
                        .replace(".","").zfill(15)
                    items = [
                        tipocomp, ptovta, numero,
                        str(d.netoa).replace(".", "").zfill(15), alicuota,
                        impuesto
                    ]
                    archDet.write("".join("%*s" % i
                                          for i in zip(anchosDet, items)))
                    archDet.write("\n")

                if d.netob != 0:
                    alicuota = Constantes.ALICUOTA_AFIP[10.5]
                    impuesto = '{:.{prec}f}'.format(round(float(d.netob) * 10.5 / 100,2), prec=2)\
                        .replace(".","").zfill(15)
                    items = [
                        tipocomp, ptovta, numero,
                        str(d.netob).replace(".", "").zfill(15), alicuota,
                        impuesto
                    ]
                    archDet.write("".join("%*s" % i
                                          for i in zip(anchosDet, items)))
                    archDet.write("\n")

                if d.netoa == 0 and d.netob == 0:
                    alicuota = Constantes.ALICUOTA_AFIP[0]
                    impuesto = '0'.zfill(15)
                    items = [
                        tipocomp, ptovta, numero,
                        str(d.netob).replace(".", "").zfill(15), alicuota,
                        impuesto
                    ]
                    archDet.write("".join("%*s" % i
                                          for i in zip(anchosDet, items)))
                    archDet.write("\n")

        arch.close()
        archDet.close()
        Ventanas.showAlert("Sistema", "Proceso finalizado")
        self.view.close()