示例#1
0
 def _create_compra(self, revendedor_cpf, codigo):
     """Create Compra for test"""
     compra = Compra()
     compra.codigo = codigo
     compra.valor = 1600
     compra.data = str_date_to_date('2020-02-10')
     compra.revendedor_cpf = revendedor_cpf
     compra.put(self.session)                
示例#2
0
    def update_purchase(self):
        # Get input from fields using get method
        id_purchase = self.select_byid.get()
        condition = self.game_condition.get()
        price = self.game_price.get()
        purchase_date = self.purchase_date.get()
        employee = self.employee_id.get()
        game_id = self.game_id.get()
        # Create videogame instance
        purchase = Compra(id_compra=id_purchase,
                          fecha_compra=purchase_date,
                          estado_compra=condition,
                          precio_compra=price,
                          codigo_videojuego=game_id,
                          codigo_empleado=employee)
        CompraDao.actualizar(purchase)
        confirm = messagebox.askyesno(
            parent=self.root,
            message='Compra actualizada correctamente, ¿Desea modificar otra?',
            icon='question',
            title='Videojuego actualizado')

        if (confirm == True):
            self.select_byid.delete(0, END)
            self.reset_form()
        else:
            self.cancel_to_main()
示例#3
0
 def test_delete(self):
     """Compra delete"""
     self._create_compra('456.213.789-88', 'AAA-4444')
     compras = Compra.get_all(self.session)
     self.session.commit()
     self.assertEqual(len(compras), 1)
     response = self.client().delete('/compra/{compra_codigo}'.format(
         compra_codigo='AAA-4444'))
     self.assertEqual(response.status, '204 NO CONTENT')
     compras = Compra.get_all(self.session)
     self.session.commit()
     self.assertEqual(len(compras), 0)
     response = self.client().delete('/compra/{compra_codigo}'.format(
         compra_codigo='AAA-0000'))
     self.assertEqual(response.status, '404 NOT FOUND')
     self._create_compra('153.509.460-56', 'FBS-1014')
     response = self.client().delete('/compra/{compra_codigo}'.format(
         compra_codigo='FBS-1014'))
     self.assertEqual(response.status, '423 LOCKED')
示例#4
0
 def add_purchase(self):
     # Get input fields .get
     condition = self.game_condition.get()
     date = self.purchase_date.get()
     total = self.game_price.get()
     id_game = self.game_id.get()
     id_employee = self.employee_id.get()
     # Create Purchase instance
     purchase = Compra(fecha_compra=date, estado_compra=condition,precio_compra=total, codigo_videojuego=id_game, codigo_empleado=id_employee)
     CompraDao.insertar(purchase)
示例#5
0
    def recuperar(cls, id_compra):
        with CursorDelPool() as cursor:
            logger.debug(cursor.mogrify(cls.__SELECT_ONE))
            values = (id_compra, )
            cursor.execute(cls.__SELECT_ONE, values)
            registro = cursor.fetchone()

            compra = Compra(registro[0], registro[1], registro[2], registro[3],
                            registro[4], registro[5])

            return compra
示例#6
0
 def onSave(self):
     empleado = self.ui.combo_empleado.currentData()[0]
     if self.unique() == False:
         QMessageBox.warning(self, 'Atencion',
                             'Libros repetidos dentro de la misma compra')
         return
     compra = Compra(empleado=empleado, fecha=date.today()).save()[0]
     for index, combo in enumerate(self.combos):
         LibroCompra(libro=combo.currentData()[0],
                     compra=compra['folio'],
                     cantidadlibros=self.spins[index].value()).save()
     self.done(0)
示例#7
0
    def get(self):
        """Get all Compras"""
        session = DBSessionManagement().get_db_session()
        try:
            compras = []
            for compra in Compra.get_all(session):
                compras.append(compra.to_json())
            session.commit()

            return compras
        except Exception as error:
            session.rollback()
            return str(error), 500
示例#8
0
 def seleccionar(cls):
     with CursorDelPool() as cursor:
         #logger.debug(cursor.mogrify(cls.__SELECT))
         logger.debug("Llega aqui")
         cursor.execute(cls.__SELECT)
         registros = cursor.fetchall()
         logger.debug("TAMBIEN AQUI")
         compras = []
         for registro in registros:
             compra = Compra(registro[0], registro[1], registro[2],
                             registro[3], registro[4], registro[5])
             compras.append(compra)
         return compras
示例#9
0
    def buscar(cls, id_empleado):
        with CursorDelPool() as cursor:
            logger.debug(cursor.mogrify(cls.__SEARCH))
            values = (id_empleado, )
            cursor.execute(cls.__SEARCH, values)
            registros = cursor.fetchall()

            compras = []
            for registro in registros:
                compra = Compra(registro[0], registro[1], registro[2],
                                registro[3], registro[4], registro[5])
                compras.append(compra)

            return compras
示例#10
0
 def test_post(self):
     """Create new Compra"""
     json_body = {
         "codigo": "FFF-1000",
         "valor": 1000,
         "data": '2020-02-20',
         "revendedor_cpf": "377.432.218-40"
     }
     response = self.client().post('/compras', json=json_body)
     self.assertEqual(response.status, '204 NO CONTENT')
     compras = Compra.get_all(self.session)
     self.assertGreater(len(compras), 0)
     self.assertEqual(compras[0].codigo, 'FFF-1000')
     self.session.commit()
示例#11
0
    def delete(self, compra_codigo):
        """Delete Compra"""
        session = DBSessionManagement().get_db_session()
        try:
            compra = Compra.get_by_codigo(session, compra_codigo)
            if not compra:
                session.rollback()
                return 'Compra not found', 404
            if compra.status != 'Em validação':
                session.rollback()
                return 'Compra locked to update', 423
            compra.delete(session)

            return '', 204
        except Exception as error:
            session.rollback()
            return str(error), 500
示例#12
0
    def post(self):
        """Create a new Compra"""
        session = DBSessionManagement().get_db_session()
        try:
            params = request.get_json()
            required_params = ['codigo', 'valor', 'data', 'revendedor_cpf']
            if not post_params_is_valid(params, required_params):
                return 'Bad request', 400
            compra = Compra()
            compra.codigo = params['codigo']
            compra.valor = params['valor']
            compra.data = str_date_to_date(params['data']).date()
            compra.revendedor_cpf = params['revendedor_cpf']
            compra.put(session)

            return '', 204
        except Exception as error:
            session.rollback()
            return str(error), 500
示例#13
0
    def put(self, compra_codigo):
        """Update Compra"""
        session = DBSessionManagement().get_db_session()
        try:
            params = request.get_json()
            compra = Compra.get_by_codigo(session, compra_codigo)
            if not compra:
                session.rollback()
                return 'Compra not found', 404
            if compra.status != 'Em validação':
                session.rollback()
                return 'Compra locked to update', 423
            set_value_if_exist(params, 'codigo', compra)
            set_value_if_exist(params, 'valor', compra)
            set_value_if_exist(params, 'revendedor_cpf', compra)
            if 'data' in params:
                compra.data = str_date_to_date(params['data'])
            compra.put(session)

            return '', 204
        except Exception as error:
            session.rollback()
            return str(error), 500
示例#14
0
 def onVentaEliminar(self):
     for item in self.ui.table_venta.selectedIndexes():
         compra = Compra()
         compra.folio = self.ventas[item.row()]['folio']
         compra.delete()
     self.onVentaMostrar()
示例#15
0
 def test_create(self):
     """Compra creation"""
     compra = Compra()
     compra.codigo = 'AAA-1000'
     compra.valor = 2000.00
     compra.data = date(2020, 2, 11)
     compra.revendedor_cpf = '377.432.218-40'
     compra.put(self.session)
     self.assertEqual(compra.cashback_percentual, float(20))
     self.assertEqual(compra.cashback_valor, 400)
     self.assertEqual(compra.status, 'Em validação')
     compra = Compra()
     compra.codigo = 'AAA-1001'
     compra.valor = float_to_decimal(1340.50)
     compra.data = date(2020, 2, 11)
     compra.revendedor_cpf = '153.509.460-56'
     compra.put(self.session)
     self.assertEqual(compra.cashback_percentual, float(15))
     self.assertEqual(compra.cashback_valor, float_to_decimal(201.07))
     self.assertEqual(compra.status, 'Aprovado')
示例#16
0
    def __init__(self):
        super(MainWindow, self).__init__()

        # modelos
        self.editorial = Editorial()
        self.genero = Genero()
        self.autor = Autor()
        self.libro = Libro()
        self.sucursal = Sucursal()
        self.supervisor = Supervisor()
        self.empleado = Empleado()
        self.venta = Compra()
        self.existencia = LibroSucursal()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.exit = False
        self.showMessageBox.connect(self.onNotify)
        self.exitThread.connect(self.customExit)
        self.canExit = False

        self.worker = Worker(self, 'existencias')
        self.thread = QThread()
        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker._listener)
        self.thread.start()

        # connections
        self.ui.push_editorial_nuevo.clicked.connect(self.onEditorialNuevo)
        self.ui.push_editorial_mostrar.clicked.connect(self.onEditorialMostrar)
        self.ui.push_editorial_eliminar.clicked.connect(
            self.onEditorialEliminar)
        self.ui.push_editorial_buscar.clicked.connect(self.onEditorialBuscar)

        self.ui.push_genero_mostrar.clicked.connect(self.onGeneroMostrar)
        self.ui.push_genero_guardar.clicked.connect(self.onGeneroGuardar)
        self.ui.push_genero_eliminar.clicked.connect(self.onGeneroEliminar)
        self.ui.push_genero_buscar.clicked.connect(self.onGeneroBuscar)

        self.ui.push_autor_mostrar.clicked.connect(self.onAutorMostrar)
        self.ui.push_autor_guardar.clicked.connect(self.onAutorGuardar)
        self.ui.push_autor_eliminar.clicked.connect(self.onAutorEliminar)
        self.ui.push_autor_buscar.clicked.connect(self.onAutorBuscar)

        self.ui.push_libro_nuevo.clicked.connect(self.onLibroNuevo)
        self.ui.push_libro_mostrar.clicked.connect(self.onLibroMostrar)
        self.ui.push_libro_eliminar.clicked.connect(self.onLibroEliminar)
        self.ui.push_libro_buscar.clicked.connect(self.onLibroBuscar)

        self.ui.push_sucursal_nuevo.clicked.connect(self.onSucursalNuevo)
        self.ui.push_sucursal_mostrar.clicked.connect(self.onSucursalMostrar)
        self.ui.push_sucursal_eliminar.clicked.connect(self.onSucursalEliminar)
        self.ui.push_sucursal_buscar.clicked.connect(self.onSucursalBuscar)
        self.ui.push_sucursal_inactiva.clicked.connect(self.onSucursalInactiva)

        self.ui.push_empleado_nuevo.clicked.connect(self.onEmpleadoNuevo)
        self.ui.push_empleado_mostrar.clicked.connect(self.onEmpleadoMostrar)
        self.ui.push_empleado_eliminar.clicked.connect(self.onEmpleadoEliminar)
        self.ui.push_empleado_buscar.clicked.connect(self.onEmpleadoBuscar)
        self.ui.push_supervisor_mostrar.clicked.connect(
            self.onSupervisorMostrar)
        self.ui.push_empleado_inactivos.clicked.connect(
            self.onEmpleadoInactivo)

        self.ui.push_venta_nuevo.clicked.connect(self.onVentaNuevo)
        self.ui.push_venta_mostrar.clicked.connect(self.onVentaMostrar)
        self.ui.push_venta_eliminar.clicked.connect(self.onVentaEliminar)
        self.ui.push_venta_buscar.clicked.connect(self.onVentaBuscar)

        self.ui.push_existencia_nuevo.clicked.connect(self.onExistenciaNuevo)
        self.ui.push_existencia_mostrar.clicked.connect(
            self.onExistenciaMostrar)
        self.ui.push_existencia_buscar.clicked.connect(self.onExistenciaBuscar)

        # double clicks
        self.ui.table_libro.doubleClicked.connect(self.onLibroEdit)
        self.ui.table_editorial.doubleClicked.connect(self.onEditorialEdit)
        self.ui.table_existencia.doubleClicked.connect(self.onExistenciaEdit)
        self.ui.table_empleado.doubleClicked.connect(self.onEmpleadoEdit)
        self.ui.table_sucursal.doubleClicked.connect(self.onSucursalEdit)
        self.ui.table_venta.doubleClicked.connect(self.onVentaEdit)

        # no edit
        self.ui.table_editorial.setEditTriggers(
            QAbstractItemView.NoEditTriggers)
        self.ui.table_libro.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.ui.table_existencia.setEditTriggers(
            QAbstractItemView.NoEditTriggers)
        self.ui.table_empleado.setEditTriggers(
            QAbstractItemView.NoEditTriggers)
        self.ui.table_venta.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.ui.table_sucursal.setEditTriggers(
            QAbstractItemView.NoEditTriggers)

        # edit
        self.ui.table_autor.itemChanged.connect(self.onAutorChange)
        self.ui.table_genero.itemChanged.connect(self.onGeneroChange)

        self.onEditorialMostrar()
        self.onLibroMostrar()
        self.onExistenciaMostrar()
        self.onAutorMostrar()
        self.onEmpleadoMostrar()
        self.onGeneroMostrar()
        self.onVentaMostrar()
        self.onSucursalMostrar()
示例#17
0
 def test_get_by_codigo(self):
     """Compra by codigo"""
     compra1 = Compra()
     compra1.codigo = 'AAA-1000'
     compra1.valor = 2000.00
     compra1.data = date(2020, 2, 11)
     compra1.revendedor_cpf = '377.432.218-40'
     compra1.put(self.session)
     compra2 = Compra()
     compra2.codigo = 'AAA-1001'
     compra2.valor = 2055.13
     compra2.data = date(2020, 3, 11)
     compra2.revendedor_cpf = '377.432.218-40'
     compra2.put(self.session)
     compra = Compra.get_by_codigo(self.session, 'AAA-1001')
     self.assertEqual(float(compra.valor), 2055.13)
示例#18
0
 def test_delete(self):
     """Delete Compra"""
     compra = Compra()
     compra.codigo = 'AAA-1000'
     compra.valor = 2000.00
     compra.data = date(2020, 2, 11)
     compra.revendedor_cpf = '377.432.218-40'
     compra.put(self.session)
     self.assertEqual(len(Compra.get_all(self.session)), 1)
     compra.delete(self.session)
     self.assertEqual(len(Compra.get_all(self.session)), 0)
示例#19
0
 def del_purchase_by_id(self, id_purchase):
     purchase = Compra(id_compra=id_purchase)
     CompraDao.eliminar(purchase)
示例#20
0
class MainWindow(QMainWindow):
    showMessageBox = Signal(str)
    exitThread = Signal()

    def __init__(self):
        super(MainWindow, self).__init__()

        # modelos
        self.editorial = Editorial()
        self.genero = Genero()
        self.autor = Autor()
        self.libro = Libro()
        self.sucursal = Sucursal()
        self.supervisor = Supervisor()
        self.empleado = Empleado()
        self.venta = Compra()
        self.existencia = LibroSucursal()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.exit = False
        self.showMessageBox.connect(self.onNotify)
        self.exitThread.connect(self.customExit)
        self.canExit = False

        self.worker = Worker(self, 'existencias')
        self.thread = QThread()
        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker._listener)
        self.thread.start()

        # connections
        self.ui.push_editorial_nuevo.clicked.connect(self.onEditorialNuevo)
        self.ui.push_editorial_mostrar.clicked.connect(self.onEditorialMostrar)
        self.ui.push_editorial_eliminar.clicked.connect(
            self.onEditorialEliminar)
        self.ui.push_editorial_buscar.clicked.connect(self.onEditorialBuscar)

        self.ui.push_genero_mostrar.clicked.connect(self.onGeneroMostrar)
        self.ui.push_genero_guardar.clicked.connect(self.onGeneroGuardar)
        self.ui.push_genero_eliminar.clicked.connect(self.onGeneroEliminar)
        self.ui.push_genero_buscar.clicked.connect(self.onGeneroBuscar)

        self.ui.push_autor_mostrar.clicked.connect(self.onAutorMostrar)
        self.ui.push_autor_guardar.clicked.connect(self.onAutorGuardar)
        self.ui.push_autor_eliminar.clicked.connect(self.onAutorEliminar)
        self.ui.push_autor_buscar.clicked.connect(self.onAutorBuscar)

        self.ui.push_libro_nuevo.clicked.connect(self.onLibroNuevo)
        self.ui.push_libro_mostrar.clicked.connect(self.onLibroMostrar)
        self.ui.push_libro_eliminar.clicked.connect(self.onLibroEliminar)
        self.ui.push_libro_buscar.clicked.connect(self.onLibroBuscar)

        self.ui.push_sucursal_nuevo.clicked.connect(self.onSucursalNuevo)
        self.ui.push_sucursal_mostrar.clicked.connect(self.onSucursalMostrar)
        self.ui.push_sucursal_eliminar.clicked.connect(self.onSucursalEliminar)
        self.ui.push_sucursal_buscar.clicked.connect(self.onSucursalBuscar)
        self.ui.push_sucursal_inactiva.clicked.connect(self.onSucursalInactiva)

        self.ui.push_empleado_nuevo.clicked.connect(self.onEmpleadoNuevo)
        self.ui.push_empleado_mostrar.clicked.connect(self.onEmpleadoMostrar)
        self.ui.push_empleado_eliminar.clicked.connect(self.onEmpleadoEliminar)
        self.ui.push_empleado_buscar.clicked.connect(self.onEmpleadoBuscar)
        self.ui.push_supervisor_mostrar.clicked.connect(
            self.onSupervisorMostrar)
        self.ui.push_empleado_inactivos.clicked.connect(
            self.onEmpleadoInactivo)

        self.ui.push_venta_nuevo.clicked.connect(self.onVentaNuevo)
        self.ui.push_venta_mostrar.clicked.connect(self.onVentaMostrar)
        self.ui.push_venta_eliminar.clicked.connect(self.onVentaEliminar)
        self.ui.push_venta_buscar.clicked.connect(self.onVentaBuscar)

        self.ui.push_existencia_nuevo.clicked.connect(self.onExistenciaNuevo)
        self.ui.push_existencia_mostrar.clicked.connect(
            self.onExistenciaMostrar)
        self.ui.push_existencia_buscar.clicked.connect(self.onExistenciaBuscar)

        # double clicks
        self.ui.table_libro.doubleClicked.connect(self.onLibroEdit)
        self.ui.table_editorial.doubleClicked.connect(self.onEditorialEdit)
        self.ui.table_existencia.doubleClicked.connect(self.onExistenciaEdit)
        self.ui.table_empleado.doubleClicked.connect(self.onEmpleadoEdit)
        self.ui.table_sucursal.doubleClicked.connect(self.onSucursalEdit)
        self.ui.table_venta.doubleClicked.connect(self.onVentaEdit)

        # no edit
        self.ui.table_editorial.setEditTriggers(
            QAbstractItemView.NoEditTriggers)
        self.ui.table_libro.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.ui.table_existencia.setEditTriggers(
            QAbstractItemView.NoEditTriggers)
        self.ui.table_empleado.setEditTriggers(
            QAbstractItemView.NoEditTriggers)
        self.ui.table_venta.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.ui.table_sucursal.setEditTriggers(
            QAbstractItemView.NoEditTriggers)

        # edit
        self.ui.table_autor.itemChanged.connect(self.onAutorChange)
        self.ui.table_genero.itemChanged.connect(self.onGeneroChange)

        self.onEditorialMostrar()
        self.onLibroMostrar()
        self.onExistenciaMostrar()
        self.onAutorMostrar()
        self.onEmpleadoMostrar()
        self.onGeneroMostrar()
        self.onVentaMostrar()
        self.onSucursalMostrar()

    # Nuevo
    @Slot()
    def onEditorialNuevo(self):
        editorial = EditorialWindow()
        editorial.exec_()
        self.onEditorialMostrar()

    @Slot()
    def onLibroNuevo(self):
        libro = LibroWindow()
        libro.exec_()
        self.onLibroMostrar()

    @Slot()
    def onSucursalNuevo(self):
        sucursal = SucursalWindow()
        sucursal.exec_()
        self.onSucursalMostrar()

    @Slot()
    def onSupervisorNuevo(self):
        supervisor = SupervisorWindow()
        supervisor.exec_()
        self.onSupervisorMostrar()

    @Slot()
    def onEmpleadoNuevo(self):
        empleado = EmpleadoWindow()
        empleado.exec_()
        self.onEmpleadoMostrar()

    @Slot()
    def onVentaNuevo(self):
        venta = VentaWindow()
        venta.exec_()
        self.onVentaMostrar()

    @Slot()
    def onExistenciaNuevo(self):
        venta = ExistenciaWindow()
        venta.exec_()
        self.onExistenciaMostrar()

    @Slot()
    def onGeneroGuardar(self):
        tipo = self.ui.edit_genero_nuevo.text()
        cat = Genero(tipo)
        cat.save()
        self.ui.edit_genero_nuevo.clear()
        self.onGeneroMostrar()

    @Slot()
    def onAutorGuardar(self):
        nombre = self.ui.edit_autor_guardar.text()
        autor = Autor(nombre)
        autor.save()
        self.ui.edit_autor_guardar.clear()
        self.onAutorMostrar()

    # mostrar
    @Slot()
    def onEditorialMostrar(self):
        self.editoriales = self.editorial.getAll()
        self.setEditoriales()

    def setEditoriales(self):
        headers = ['Nombre', 'Pais']
        self.ui.table_editorial.setRowCount(len(self.editoriales))
        self.ui.table_editorial.setColumnCount(len(headers))
        self.ui.table_editorial.setHorizontalHeaderLabels(headers)
        for row, editorial in enumerate(self.editoriales):
            self.ui.table_editorial.setItem(
                row, 0, QTableWidgetItem(editorial['nombre']))
            self.ui.table_editorial.setItem(
                row, 1, QTableWidgetItem(editorial['paisorigen']))

    @Slot()
    def onGeneroMostrar(self):
        allGenero = self.genero.getAll()
        self.generos = allGenero
        self.setGeneros()

    def setGeneros(self):
        headers = ['Tipo']
        self.ui.table_genero.setRowCount(len(self.generos))
        self.ui.table_genero.setColumnCount(len(headers))
        self.ui.table_genero.setHorizontalHeaderLabels(headers)
        for row, categoria in enumerate(self.generos):
            self.ui.table_genero.setItem(row, 0,
                                         QTableWidgetItem(categoria['tipo']))

    @Slot()
    def onAutorMostrar(self):
        all = self.autor.getAll()
        self.autores = all
        self.setAutores()

    def setAutores(self):
        headers = ['Nombre']
        self.ui.table_autor.setRowCount(len(self.autores))
        self.ui.table_autor.setColumnCount(len(headers))
        self.ui.table_autor.setHorizontalHeaderLabels(headers)
        for row, categoria in enumerate(self.autores):
            self.ui.table_autor.setItem(row, 0,
                                        QTableWidgetItem(categoria['nombre']))

    @Slot()
    def onLibroMostrar(self):
        self.libros = self.libro.getAll()
        self.setLibros()

    def setLibros(self):
        headers = [
            'Codigo', 'Titulo', 'Precio', 'ISBN', 'Idioma', 'Encuadernacion',
            'Publicación', 'Editorial', 'Autor', 'Genero'
        ]
        self.ui.table_libro.setRowCount(len(self.libros))
        self.ui.table_libro.setColumnCount(len(headers))
        self.ui.table_libro.setHorizontalHeaderLabels(headers)
        for row, libro in enumerate(self.libros):
            self.ui.table_libro.setItem(row, 0,
                                        QTableWidgetItem(str(libro['codigo'])))
            self.ui.table_libro.setItem(row, 1,
                                        QTableWidgetItem(libro['titulo']))
            self.ui.table_libro.setItem(row, 2,
                                        QTableWidgetItem(str(libro['precio'])))
            self.ui.table_libro.setItem(row, 3,
                                        QTableWidgetItem(libro['isbn']))
            self.ui.table_libro.setItem(row, 4,
                                        QTableWidgetItem(libro['idioma']))
            self.ui.table_libro.setItem(
                row, 5, QTableWidgetItem(libro['encuadernacion']))
            self.ui.table_libro.setItem(
                row, 6, QTableWidgetItem(str(libro['publicacion'])))
            self.ui.table_libro.setItem(row, 7,
                                        QTableWidgetItem(libro['editorial']))
            self.ui.table_libro.setItem(row, 8,
                                        QTableWidgetItem(libro['autor']))
            self.ui.table_libro.setItem(row, 9,
                                        QTableWidgetItem(libro['genero']))

    @Slot()
    def onSucursalMostrar(self):
        all = self.sucursal.getAll()
        self.sucursales = all
        self.setSucursales()

    @Slot()
    def onSucursalInactiva(self):
        all = self.sucursal.getInactivos()
        self.sucursales = all
        self.setSucursales()

    def setSucursales(self):
        headers = ['Nombre', 'Direccion', 'Telefono']
        self.ui.table_sucursal.setRowCount(len(self.sucursales))
        self.ui.table_sucursal.setColumnCount(len(headers))
        self.ui.table_sucursal.setHorizontalHeaderLabels(headers)
        for row, sucursal in enumerate(self.sucursales):
            self.ui.table_sucursal.setItem(
                row, 0, QTableWidgetItem(sucursal['nombre']))
            self.ui.table_sucursal.setItem(
                row, 1, QTableWidgetItem(sucursal['direccion']))
            self.ui.table_sucursal.setItem(
                row, 2, QTableWidgetItem(str(sucursal['telefono'])))

    @Slot()
    def onSupervisorMostrar(self):
        all = self.supervisor.getAll()
        self.empleados = all
        self.setEmpleados()

    @Slot()
    def onEmpleadoMostrar(self):
        all = self.empleado.getAll()
        self.empleados = all
        self.setEmpleados()

    @Slot()
    def onEmpleadoInactivo(self):
        all = self.empleado.getInactivos()
        self.empleados = all
        self.setEmpleados()

    def setEmpleados(self):
        headers = [
            'Código', 'Nombre', 'Telefono', 'Tipo', 'Supervisor', 'Direccion',
            'Sucursal', 'Activo'
        ]
        self.ui.table_empleado.setRowCount(len(self.empleados))
        self.ui.table_empleado.setColumnCount(len(headers))
        self.ui.table_empleado.setHorizontalHeaderLabels(headers)
        for row, empleado in enumerate(self.empleados):
            self.ui.table_empleado.setItem(
                row, 0, QTableWidgetItem(str(empleado['codigo'])))
            self.ui.table_empleado.setItem(
                row, 1, QTableWidgetItem(empleado['nombre']))
            self.ui.table_empleado.setItem(
                row, 2, QTableWidgetItem(empleado['telefono']))
            self.ui.table_empleado.setItem(row, 3,
                                           QTableWidgetItem(empleado['tipo']))
            self.ui.table_empleado.setItem(
                row, 4, QTableWidgetItem(empleado['supervisor']))
            self.ui.table_empleado.setItem(
                row, 5, QTableWidgetItem(empleado['direccion']))
            self.ui.table_empleado.setItem(
                row, 6, QTableWidgetItem(empleado['sucursal']))
            self.ui.table_empleado.setItem(
                row, 7, QTableWidgetItem(str(empleado['activo'])))

    @Slot()
    def onVentaMostrar(self):
        all = self.venta.getAll()
        self.ventas = all
        self.setVentas()

    def setVentas(self):
        headers = ['Folio', 'Empleado', 'Fecha', 'Total']
        self.ui.table_venta.setRowCount(len(self.ventas))
        self.ui.table_venta.setColumnCount(len(headers))
        self.ui.table_venta.setHorizontalHeaderLabels(headers)
        for row, venta in enumerate(self.ventas):
            self.ui.table_venta.setItem(row, 0,
                                        QTableWidgetItem(str(venta['folio'])))
            self.ui.table_venta.setItem(row, 1,
                                        QTableWidgetItem(venta['empleado']))
            self.ui.table_venta.setItem(
                row, 2, QTableWidgetItem(venta['fecha'].strftime('%d/%m/%Y')))
            self.ui.table_venta.setItem(row, 3,
                                        QTableWidgetItem(str(venta['total'])))

    @Slot()
    def onExistenciaMostrar(self):
        all = self.existencia.getAll()
        self.existencias = all
        self.setExistencias()

    def setExistencias(self):
        headers = ['Libro', 'Sucursal', 'Existencia']
        self.ui.table_existencia.setRowCount(len(self.existencias))
        self.ui.table_existencia.setColumnCount(len(headers))
        self.ui.table_existencia.setHorizontalHeaderLabels(headers)
        for row, existencia in enumerate(self.existencias):
            self.ui.table_existencia.setItem(
                row, 0, QTableWidgetItem(existencia['libro']))
            self.ui.table_existencia.setItem(
                row, 1, QTableWidgetItem(existencia['sucursal']))
            self.ui.table_existencia.setItem(
                row, 2, QTableWidgetItem(str(existencia['existencia'])))

    # Edit functions
    @Slot()
    def onLibroEdit(self, item):
        window = LibroWindow(self.libros[item.row()])
        window.exec_()
        self.onLibroMostrar()

    @Slot()
    def onVentaEdit(self, item):
        window = VentaDetallesWindow(self.ventas[item.row()])
        window.exec_()

    @Slot()
    def onEditorialEdit(self, item):
        window = EditorialWindow(self.editoriales[item.row()])
        window.exec_()
        self.onEditorialMostrar()

    @Slot()
    def onExistenciaEdit(self, item):
        window = ExistenciaWindow(self.existencias[item.row()])
        window.exec_()
        self.onExistenciaMostrar()

    @Slot()
    def onAutorChange(self, item):
        autor = Autor(nombre=self.autores[item.row()]['nombre'],
                      codigo=self.autores[item.row()]['codigo'])
        if autor.nombre != item.text():
            autor.nombre = item.text()
            autor.update()
            self.onAutorMostrar()

    @Slot()
    def onEmpleadoEdit(self, item):
        window = EmpleadoWindow(self.empleados[item.row()])
        window.exec_()
        self.onEmpleadoMostrar()

    @Slot()
    def onSucursalEdit(self, item):
        window = SucursalWindow(self.sucursales[item.row()])
        window.exec_()
        self.onSucursalMostrar()

    @Slot()
    def onGeneroChange(self, item):
        genero = Genero(self.generos[item.row()]['tipo'])
        if genero.tipo != item.text():
            genero.tipo = item.text()
            genero.update()
            self.onGeneroMostrar()

    # eliminar
    @Slot()
    def onSucursalEliminar(self):
        for item in self.ui.table_sucursal.selectedIndexes():
            nombre = self.sucursales[item.row()]['nombre']
            Sucursal(nombre=nombre).delete()
        self.onSucursalMostrar()

    @Slot()
    def onLibroEliminar(self):
        for item in self.ui.table_libro.selectedIndexes():
            try:
                codigo = self.libros[item.row()]['codigo']
                Libro(codigo=codigo).delete()
            except ForeignKeyViolation:
                QMessageBox.warning(
                    self, "Atención",
                    f'El libro con codigo "{codigo}" no puede eliminarse')
        self.onAutorMostrar()

    @Slot()
    def onAutorEliminar(self):
        for item in self.ui.table_autor.selectedIndexes():
            try:
                nombre = self.autores[item.row()]['nombre']
                Autor(codigo=self.autores[item.row()]['codigo']).delete()
            except ForeignKeyViolation:
                QMessageBox.warning(
                    self, "Atención",
                    f'El autor "{nombre}" no puede eliminarse')
        self.onAutorMostrar()

    @Slot()
    def onGeneroEliminar(self):
        for item in self.ui.table_genero.selectedIndexes():
            try:
                tipo = self.generos[item.row()]['tipo']
                Genero(tipo=tipo).delete()
            except ForeignKeyViolation:
                QMessageBox.warning(self, "Atención",
                                    f'El genero "{tipo}" no puede eliminarse')
        self.onGeneroMostrar()

    @Slot()
    def onEditorialEliminar(self):
        for item in self.ui.table_editorial.selectedIndexes():
            try:
                nombre = self.editoriales[item.row()]['nombre']
                Editorial(nombre=nombre).delete()
            except ForeignKeyViolation:
                QMessageBox.warning(
                    self, "Atención",
                    f'La editorial "{nombre}" no puede eliminarse')
        self.onEditorialMostrar()

    @Slot()
    def onVentaEliminar(self):
        for item in self.ui.table_venta.selectedIndexes():
            compra = Compra()
            compra.folio = self.ventas[item.row()]['folio']
            compra.delete()
        self.onVentaMostrar()

    @Slot()
    def onEmpleadoEliminar(self):
        for item in self.ui.table_empleado.selectedIndexes():
            empleado = Empleado()
            empleado._key = self.empleados[item.row()]['codigo']
            try:
                empleado.delete()
                self.onEmpleadoMostrar()
            except ForeignKeyViolation:
                QMessageBox.warning(
                    self, "Atención",
                    f'El empleado "{empleado._key}" no puede eliminarse')
        self.onEmpleadoMostrar()

    # Buscar
    @Slot()
    def onVentaBuscar(self):
        self.ventas = self.venta.search(
            self.ui.date_venta_buscar.date().toPython())
        self.setVentas()

    @Slot()
    def onExistenciaBuscar(self):
        self.existencias = self.existencia.search(
            self.ui.edit_existencia_buscar.text())
        self.setExistencias()

    @Slot()
    def onGeneroBuscar(self):
        self.generos = self.genero.search(self.ui.edit_genero_buscar.text())
        self.setGeneros()

    @Slot()
    def onAutorBuscar(self):
        self.autores = self.autor.search(self.ui.edit_autor_buscar.text())
        self.setAutores()

    @Slot()
    def onEditorialBuscar(self):
        self.editoriales = self.editorial.search(
            self.ui.edit_editorial_buscar.text())
        self.setEditoriales()

    @Slot()
    def onLibroBuscar(self):
        self.libros = self.libro.search(self.ui.edit_libro_buscar.text())
        self.setLibros()

    @Slot()
    def onSucursalBuscar(self):
        self.sucursales = self.sucursal.search(
            self.ui.edit_sucursal_buscar.text())
        self.setSucursales()

    @Slot()
    def onEmpleadoBuscar(self):
        self.empleados = self.empleado.search(
            self.ui.edit_empleado_buscar.text())
        self.setEmpleados()

    #notify
    @Slot(str)
    def onNotify(self, data):
        QMessageBox.warning(self, "Atención", data)

    @Slot()
    def customExit(self):
        self.canExit = True
        self.close()

    def closeEvent(self, event):
        self.exit = True
        if self.canExit == True:
            self.thread.terminate()
            event.accept()
        else:
            event.ignore()