def __init__(self, parent=None):
     QtGui.QMainWindow.__init__(self, parent)
     self.ui = Ui_MainWindow()
     self.ui.setupUi(self)
     self.load_productos()
     self.set_signals()
     self.show()
 def __init__(self, tipo=None, rut=None):
     'Constructor de la clase'
     QtGui.QMainWindow.__init__(self)
     self.ui = Ui_MainWindow()
     self.ui.setupUi(self)
     self.show()
     self.importarDatos()
     self.setSignals()
class MainWindow(QtGui.QMainWindow):

    def __init__(self, tipo=None, rut=None):
        'Constructor de la clase'
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.show()
        self.importarDatos()
        self.setSignals()

    def setSignals(self):
        'Enventos de los elementos de la ventana principal'
        self.ui.button_buscar.clicked.connect(self.buscarRegistro)
        self.ui.button_nuevo.clicked.connect(self.nuevoRegistro)
        self.ui.cbox_comuna.currentIndexChanged.connect(self.seleccionaComuna)
        self.ui.actionA_adir_Usuario.triggered.connect(self.reg_usuario)
        self.ui.actionEstablecimiento.triggered.connect(self.agregarEstablecimiento)
        self.ui.actionComuna.triggered.connect(self.agregarComuna)
        self.ui.actionInf_1er_Semestre.triggered.connect(self.nuevoInforme)
        self.ui.cbox_anho1.currentIndexChanged.connect(self.currentIndexChanged2)
        self.ui.button_buscar_registro.clicked.connect(self.cargarRegistro)
        self.ui.actionSalir.triggered.connect(self.salir)
        self.ui.actionModificar_Comuna.triggered.connect(self.mod_Comuna)
        self.ui.actionModificar_Establecimiento.triggered.connect(self.mod_Establecimiento)

    def salir(self):
        self.close()
    
    def errorMessage(self, message):
        """Función que despliega un mensaje de error.
        @param message"""
        QtGui.QMessageBox.warning(
            self,
            u"ERROR!",
            message)

    def nuevoRegistro(self):
        self.main = nuevoRegistroWindow(self.ui.cbox_establecimiento.currentText(), 
                                        self.ui.cbox_mes2.currentText(),
                                        self.ui.cbox_anho2.currentText())
        self.main.show()

    def buscarRegistro(self):
        'Método para buscar los registros de la comuna y establecimiento seleccionado'
        if(self.ui.cbox_comuna.currentIndex() is not 0):
            self.ui.groupBox_5.setEnabled(True)
            self.ui.groupBox_6.setEnabled(True)
            self.ui.groupBox_2.setEnabled(True)
            self.ui.texto_comuna_label.setText(self.ui.cbox_comuna.currentText())
            self.ui.texto_establecimiento_label.setText(self.ui.cbox_establecimiento.currentText())
            self.cargaRegistros()
            self.datosMesAnho()
        else:
            self.errorMessage(u"Comuna no seleccionada")

    def cargarRegistro(self):
        if(self.ui.cbox_anho1.currentIndex() is not 0):
            self.main = registroCargadoWindow(self.ui.cbox_establecimiento.currentText(),
                                              self.ui.cbox_mes1.currentText(),
                                              self.ui.cbox_anho1.currentText())
            self.main.show()
        else:
            self.errorMessage(u"Año no seleccionado")

    def cargaRegistros(self):
        lista_anios = list()
        idEstablecimiento = controller.obtenerIdEstablecimiento(self.ui.cbox_establecimiento.currentText())
        registros = controller.obtenerAnhos(idEstablecimiento)
        for i in range(len(registros)):
            lista_anios.append(registros[0].anho)
        lista_anios_unicos = list(set(lista_anios))
        if not registros:
            self.ui.cbox_anho1.clear()
            self.ui.cbox_anho1.addItem("--------")
        else:
            self.ui.cbox_anho1.clear()
            self.ui.cbox_anho1.addItem("--------")
            for i, registro in enumerate(lista_anios_unicos):
                self.ui.cbox_anho1.addItem(str(registro), i)

    def datosMesAnho(self):
        self.ui.cbox_mes2.clear()
        self.ui.cbox_anho2.clear()
        meses = ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]
        for i in meses:
            self.ui.cbox_mes2.addItem(i)
        for i in range(1990, datetime.date.today().year+1):
            self.ui.cbox_anho2.addItem(str(i))

    def seleccionaComuna(self, index):
        if(index is not 0):
            idComuna = controller.obtenerIdComuna(self.ui.cbox_comuna.currentText())
            establecimientos = controller.obtenerEstablecimientos(idComuna)
            self.ui.cbox_establecimiento.clear()
            for i, establecimiento in enumerate(establecimientos):
                self.ui.cbox_establecimiento.addItem(establecimiento.nombre, i)
        else:
            self.ui.cbox_establecimiento.clear()
            self.ui.cbox_establecimiento.addItem("--------")

    def currentIndexChanged2(self, index):
        if(index != 0 and index != -1):
            idEstablecimiento = controller.obtenerIdEstablecimiento(self.ui.cbox_establecimiento.currentText())
            registros = controller.obtenerMeses(idEstablecimiento, self.ui.cbox_anho1.currentText())
            self.ui.cbox_mes1.clear()
            for i, registro in enumerate(registros):
                self.ui.cbox_mes1.addItem(registro.mes, i)
        else:
            self.ui.cbox_mes1.clear()
            self.ui.cbox_mes1.addItem("--------")      

    def reg_usuario(self):
        self.regUsuario = Form_usuario()
        self.regUsuario.exec_()

    def agregarEstablecimiento(self):
        self.regEstablecimiento = Form_establecimiento()
        self.regEstablecimiento.exec_()

    def agregarComuna(self):
        self.regComuna = Form_comuna()
        self.regComuna.exec_()

    def mod_Comuna(self):
        self.modComuna = Modificar_comuna()
        self.modComuna.exec_()

    def mod_Establecimiento(self):
        self.modEstablecimiento = Modificar_establecimiento()
        self.modEstablecimiento.exec_()

    def importarDatos(self):
        comunas = controller.obtenerComunas()
        self.ui.cbox_comuna.addItem("--------")
        for i, comuna in enumerate(comunas):
            self.ui.cbox_comuna.addItem(comuna.nombre, i)
        self.ui.cbox_establecimiento.addItem("--------")


    def nuevoInforme(self):
        self.generarInforme = FormInformeSemestral()
        self.generarInforme.show()
class VentanaPrincipal(QtGui.QMainWindow):
    table_columns = (
        (u"Codigo", 200),
        (u"Nombre", 100),
        (u"Descripción", 200),
        (u"Marca", 100),
        (u"Color", 75),
        (u"Cant. prod. vendidos", 150),
        (u"Total prod. vendidos", 150))

    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.load_productos()
        self.set_signals()
        self.show()

    def set_signals(self):
        #en esta funcion se definen todos los tratamientos de señales.
        self.ui.btn_editar.clicked.connect(self.editar)
        self.ui.btn_agregar.clicked.connect(self.agregar)
        self.ui.btn_eliminar.clicked.connect(self.eliminar)
        self.ui.btn_nuevacompra.clicked.connect(self.nueva_compra)
        self.ui.btn_compras.clicked.connect(self.compras)

    def buscar(self):
        if self.ui.lineEdit.text() == "" or not bool(
            self.ui.lineEdit.text().strip()):
            self.load_productos()
        else:
            productos = Producto().buscador_pro(str(self.ui.lineEdit.text()))
            rows = len(productos)
            model = QtGui.QStandardItemModel(
                rows, len(self.table_columns))
            self.ui.table_productos.setModel(model)
            self.ui.table_productos.horizontalHeader().setResizeMode(
                0, self.ui.table_productos.horizontalHeader().Stretch)

            for col, h in enumerate(self.table_columns):
                model.setHeaderData(col, QtCore.Qt.Horizontal, h[0])
                self.ui.table_productos.setColumnWidth(col, h[1])

            for i, data in enumerate(productos):
                data7 = None
                for xca in Producto().load_cant_total(data[0])[0]:
                    data6 = xca
                for xto in Producto().load_cant_total(data[0])[1]:
                    data7 = xto
                    if (data7 == None):
                        data7 = 0
                row = [data[1], data[2], data[3], data[4], data[5], data6, data7]
                for j, field in enumerate(row):
                    index = model.index(i, j, QtCore.QModelIndex())
                    model.setData(index, field)
                #Parametros ocultos
                model.item(i).prod = data
                model.item(i).pk = data[0]
                
    def compras(self):
        form = view_compras.Form()
        form.rejected.connect(self.load_productos)
        form.exec_()

    def nueva_compra(self):
        form = view_nueva_compra.Form()
        form.rejected.connect(self.load_productos)
        form.exec_()


    def load_productos(self):
        # Método que carga la tabla productos en la Ventana.
        productos = Producto.all()
        rows = len(productos)
        model = QtGui.QStandardItemModel(
            rows, len(self.table_columns))
        self.ui.table_productos.setModel(model)
        self.ui.table_productos.horizontalHeader().setResizeMode(
            0, self.ui.table_productos.horizontalHeader().Stretch)

        for col, h in enumerate(self.table_columns):
            model.setHeaderData(col, QtCore.Qt.Horizontal, h[0])
            self.ui.table_productos.setColumnWidth(col, h[1])

        for i, data in enumerate(productos):
            data7 = None
            for xca in Producto().load_cant_total(data[0])[0]:
                data6 = xca
            for xto in Producto().load_cant_total(data[0])[1]:
                data7 = xto
                if (data7 == None):
                    data7 = 0
            row = [data[1], data[2], data[3], data[4], data[5], data6, data7]
            for j, field in enumerate(row):
                index = model.index(i, j, QtCore.QModelIndex())
                model.setData(index, field)
            #Parametros ocultos
            model.item(i).prod = data
            model.item(i).pk = data[0]
        
    def editar(self):
        model = self.ui.table_productos.model()
        index = self.ui.table_productos.currentIndex()
        if index.row() == -1:  # No se ha seleccionado una fila
            self.errorMessageDialog = QtGui.QErrorMessage(self)
            self.errorMessageDialog.showMessage("Debe seleccionar una fila")
            return False
        else:
            id_producto = model.item(index.row()).pk
            cod = model.item(index.row()).prod[1]
            nom = model.item(index.row()).prod[2]
            des = model.item(index.row()).prod[3]
            mar = model.item(index.row()).prod[4]
            col = model.item(index.row()).prod[5]
            form = view_edit_producto.Form(self, id_producto, cod, nom, des, mar, col)
            form.rejected.connect(self.load_productos)
            form.exec_()
            self.load_productos()






    def eliminar(self):
        model = self.ui.table_productos.model()
        index = self.ui.table_productos.currentIndex()
        if index.row() == -1:  # No se ha seleccionado una fila
            self.errorMessageDialog = QtGui.QErrorMessage(self)
            self.errorMessageDialog.showMessage("Debe seleccionar una fila")
            return False
        else:
            id_producto = model.item(index.row()).pk

            p = Producto()
            p.id_producto = id_producto
            p.delete()
            self.load_productos()


    def agregar(self):
        form = view_vent_ingreso_producto.Form()
        form.rejected.connect(self.load_productos)
        form.exec_()