def agregarProducto(self): itemActual=self.tableProductos.currentItem() if itemActual==None: self.showMsjEstado("No se ha seleccionado ningun producto para agregar") else: cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5) if not ok: self.showMsjEstado("No se ha seleccionado cantidad del producto") else: if cantidad>int(self.tableProductos.item(itemActual.row(),4).text()): self.showMsjEstado("La cantidad seleccionada es mayor a la actual") else: rowItemActual=itemActual.row() rows=self.tableRemito.rowCount() if self.productosAgregados==0: self.remito=RemitoModel(RemitoModel.obtenerNumero(self.sesion),int(self.lineDni.text())) self.remito.guardar(self.sesion) self.productosAgregados+=1 self.tableRemito.insertRow(rows) self.tableRemito.setItem(rows, 0, QtGui.QTableWidgetItem(str(self.tableProductos.item(rowItemActual,0).text()))) self.tableRemito.setItem(rows, 1, QtGui.QTableWidgetItem(str(cantidad))) self.tableRemito.setItem(rows, 2, QtGui.QTableWidgetItem(str(cantidad*float(self.tableProductos.item(rowItemActual,5).text())))) self.detalle=DetalleRemitoModel(self.remito.numero,self.productosAgregados, int(self.tableProductos.item(rowItemActual,0).text()),cantidad) self.descontarCantidad(self.detalle,int(self.tableProductos.item(rowItemActual,0).text()),cantidad) self.detalle.guardar(self.sesion) self.limpiarTabla(self.tableProductos) self.cargar_productos()
def buscarRemito(self): if self.lineNumero.isEnabled(): numeroRemito=self.lineNumero.text() if len(numeroRemito)==0: self.showMsjEstado("No se ha ingresado numero de remito") else: self.remitoActual=RemitoModel.existeRemito(int(numeroRemito),self.sesion) if self.remitoActual== None: QtGui.QMessageBox.warning(self,"Advertencia","El remito ingresado no existe") else: if self.remitoActual.estoyCobrado()!=None: QtGui.QMessageBox.information(self,"Aviso","El remito ingresado ya sido cobrado") else: detallesRemitos=RemitoModel.buscarDetalles(int(numeroRemito),self.sesion) self.limpiarTabla(self.tableRemitos) self.cargarObjetos(self.tableRemitos, detallesRemitos,("producto","cantidad") ) importes=[] for a in detallesRemitos: for b in self.sesion.query(ProductoModel).filter(ProductoModel.codigo_barra==a.producto): importes.append(b.importe * a.cantidad) for row in range(0,self.tableRemitos.rowCount()): self.tableRemitos.setItem(row, 2, QtGui.QTableWidgetItem(str(importes[row]))) self.lineNumero.setEnabled(False) else: self.lineNumero.clear() self.lineNumero.setEnabled(True) self.limpiarTabla(self.tableRemitos)
def agregarProducto(self): itemActual = self.tableProductos.currentItem() if itemActual == None: self.showMsjEstado( "No se ha seleccionado ningun producto para agregar") else: cantidad, ok = QtGui.QInputDialog.getInt( self, "Cantidad", "Ingrese cantidad del producto", 1, 1, 2000, 5) if not ok: self.showMsjEstado( "No se ha seleccionado cantidad del producto") else: if cantidad > int( self.tableProductos.item(itemActual.row(), 4).text()): self.showMsjEstado( "La cantidad seleccionada es mayor a la actual") else: rowItemActual = itemActual.row() rows = self.tableRemito.rowCount() if self.productosAgregados == 0: self.remito = RemitoModel( RemitoModel.obtenerNumero(self.sesion), int(self.lineDni.text())) self.remito.guardar(self.sesion) self.productosAgregados += 1 self.tableRemito.insertRow(rows) self.tableRemito.setItem( rows, 0, QtGui.QTableWidgetItem( str( self.tableProductos.item(rowItemActual, 0).text()))) self.tableRemito.setItem( rows, 1, QtGui.QTableWidgetItem(str(cantidad))) self.tableRemito.setItem( rows, 2, QtGui.QTableWidgetItem( str(cantidad * float( self.tableProductos.item(rowItemActual, 5).text())))) self.detalle = DetalleRemitoModel( self.remito.numero, self.productosAgregados, int(self.tableProductos.item(rowItemActual, 0).text()), cantidad) self.descontarCantidad( self.detalle, int(self.tableProductos.item(rowItemActual, 0).text()), cantidad) self.detalle.guardar(self.sesion) self.limpiarTabla(self.tableProductos) self.cargar_productos()
def cargar_remitos(self): """ Carga los remitos que se encuentran en el sistema en la tabla correspondiente :return: """ self.limpiarTabla(self.tableRemito) self.cargarObjetos(self.tableRemito, RemitoModel.obtenerTodosRemitos(self.sesion).all(), ("numero", "cliente", "fecha_emision") )
def eliminarDetalle(self): itemActual = self.tableDetalles.currentItem() ok = QtGui.QMessageBox.information(self, "Confirmacion", "¿Desea eliminar este item?") if ok: linea = int(self.tableDetalles.item(itemActual.row(), 0).text()) producto = int(self.tableDetalles.item(itemActual.row(), 1).text()) cantidadRemito = int( self.tableDetalles.item(itemActual.row(), 2).text()) finalizeActualizacion = False while not finalizeActualizacion: cantidad, ok = QtGui.QInputDialog.getInt( self, "Cantidad", "Ingrese cantidad del producto", 1, 1, 2000, 5) if not ok: QtGui.QMessageBox.information(self, "Aviso", "No se ingreso cantidad") else: if cantidad > cantidadRemito: QtGui.QMessageBox.information( self, "Aviso", "La cantidad ingresada supera la esperada") else: lote, ok = QtGui.QInputDialog.getText( self, "Lote", "Ingrese lote") if not ok: QtGui.QMessageBox.information( self, "Aviso", "No se ingreso lote") else: loteP = LoteProductoModel.buscarLoteProducto( self.sesion, producto, str(lote)).first() if loteP == None: QtGui.QMessageBox.information( self, "Aviso", "El lote ingresado no se corresponde con el producto" ) else: loteP.aumentarCantidad(cantidad) loteP.modificar(self.sesion) cantidadRemito -= cantidad self.tableDetalles.item( itemActual.row(), 2).setText(str(cantidadRemito)) if cantidadRemito == 0: finalizeActualizacion = True detalle = RemitoModel.getDetalle(int(self.lineNumero.text()), int(linea), self.sesion).first() detalle.borrar(self.sesion) self.tableDetalles.removeRow(itemActual.row()) else: return
def eliminar(self): itemActual=self.tableRemito.currentItem() if itemActual==None: self.showMsjEstado("No se ha seleccionado remito para eliminar") else: numeroRemito=int(self.tableRemito.item(itemActual.row(),0).text()) remitoSeleccionado=RemitoModel.buscar(RemitoModel.numero,self.sesion,numeroRemito).first() if self.tableDetalles.rowCount()==0: remitoSeleccionado.borrar(self.sesion) self.tableRemito.removeRow(itemActual.row()) self.objectDeleted.emit() self.limpiarVentana() else: QtGui.QMessageBox.information(self,"Aviso","Debe dar de baja cada detalle")
def eliminarDetalle(self): """ Elimina un detalle especifico del remito seleccionado por el usuario :return: """ rowActual=self.tableDetalles.currentItem().row() signal = QtGui.QMessageBox.information(self,"Confirmacion","¿Desea eliminar este item?",\ QtGui.QMessageBox.Close | QtGui.QMessageBox.Ok) if signal == QtGui.QMessageBox.Ok: cantidad_detalle = int(self.tableDetalles.item(rowActual,2).text()) linea = int(self.tableDetalles.item(rowActual,0).text()) nro_remito = int(self.lineNumero.text()) detalle = RemitoModel.getDetalle(nro_remito,linea,self.sesion) lotes_detalle = detalle.devolverLotes(self.sesion) temp = lotes_detalle finalize_actualizacion = False cantidad_restante = cantidad_detalle while not finalize_actualizacion: cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5) if ok == False: finalize_actualizacion = True self.tableDetalles.item(rowActual,2).setText(str(cantidad_detalle)) break lote, ok=QtGui.QInputDialog.getText(self,"Lote","Ingrese lote") if ok == False: finalize_actualizacion = True self.tableDetalles.item(rowActual,2).setText(str(cantidad_detalle)) break if not lote in lotes_detalle.keys(): QtGui.QMessageBox.information(self,"Aviso","El lote ingresado no es valido para este detalle") elif lotes_detalle[str(lote)] == 0: QtGui.QMessageBox.information(self,"Aviso","Los productos de este lote ya han sido devueltos") elif cantidad > lotes_detalle[str(lote)]: QtGui.QMessageBox.information(self,"Aviso","La cantidad ingresada es mayor a la esperada para este lote") else: temp[str(lote)] -= cantidad cantidad_restante -= cantidad self.tableDetalles.item(rowActual,2).setText(str(cantidad_restante)) if sum(map(lambda x: temp[x],temp)) == 0: detalle.devolver(self.sesion) self.tableDetalles.removeRow(rowActual) self.objectModified.emit() QtGui.QMessageBox.information(self,"Aviso","Detalle Eliminado Exitosamente") finalize_actualizacion = True
def buscarRemito(self): """ Busca el remito ingresado por el usuario. Si existe carga los detalles del mismo. Si existe pero ya fue cobrado o si no existe, se le notifica al usuario. :return: """ if self.lineNumero.isEnabled(): numeroRemito=self.lineNumero.text() if len(numeroRemito)==0: QtGui.QMessageBox.information(self,"Aviso","No se ha ingresado numero de remito") else: self.remitoActual = RemitoModel.existeRemito(int(numeroRemito),self.sesion) if self.remitoActual== None: QtGui.QMessageBox.warning(self,"Aviso","El remito ingresado no existe") elif self.remitoActual.getCobrado() == True: QtGui.QMessageBox.information(self,"Aviso","El remito ya ha sido cobrado") elif self.remitoActual in self.remitosCobrados: QtGui.QMessageBox.information(self,"Aviso","El remito ya ha sido agregado a la factura") else: detallesRemitos=RemitoModel.buscarDetalles(int(numeroRemito),self.sesion) self.limpiarTabla(self.tableRemitos) self.cargarObjetos(self.tableRemitos, detallesRemitos,("producto","cantidad") ) importes=[] for a in detallesRemitos: for b in self.sesion.query(ProductoModel).filter(ProductoModel.codigo_barra==a.producto): importes.append(b.importe * a.cantidad) for row in range(0,self.tableRemitos.rowCount()): self.tableRemitos.setItem(row, 2, QtGui.QTableWidgetItem(str(importes[row]))) self.lineNumero.setEnabled(False) else: self.lineNumero.clear() self.lineNumero.setEnabled(True) self.limpiarTabla(self.tableRemitos)
def agregarProducto(self): """ Agrega un producto seleccionado al Remito creado :return: """ itemActual=self.tableProductos.currentItem() if itemActual==None: QtGui.QMessageBox.information(self,"Aviso", "No se ha seleccionado ningun producto para agregar") else: cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5) if not ok: self.showMsjEstado("No se ha seleccionado cantidad del producto") else: if cantidad>int(self.tableProductos.item(itemActual.row(),4).text()): self.showMsjEstado("La cantidad seleccionada es mayor a la actual") else: rowItemActual=itemActual.row() rows=self.tableRemito.rowCount() if self.productosAgregados==0 and self.remito == None: self.remito=RemitoModel(RemitoModel.obtenerNumero(self.sesion),int(self.lineDni.text())) self.remito.guardar(self.sesion) self.productosAgregados+=1 codigo = int(self.tableProductos.item(rowItemActual,0).text()) self.tableRemito.insertRow(rows) self.tableRemito.setItem(rows, 0, QtGui.QTableWidgetItem(str(codigo))) self.tableRemito.setItem(rows, 1, QtGui.QTableWidgetItem(str(cantidad))) detalle = DetalleRemitoModel(self.remito.numero,self.productosAgregados, int(self.tableProductos.item(rowItemActual,0).text()),cantidad) self.descontarCantidad(detalle,int(self.tableProductos.item(rowItemActual,0).text()),cantidad) detalle.guardar(self.sesion) self.detallesTabla[rows] = detalle self.cargar_productos() self.objectModified.emit()
def buscarRemito(self): if self.lineNumero.isEnabled(): numeroRemito = self.lineNumero.text() if len(numeroRemito) == 0: self.showMsjEstado("No se ha ingresado numero de remito") else: self.remitoActual = RemitoModel.existeRemito( int(numeroRemito), self.sesion) if self.remitoActual == None: QtGui.QMessageBox.warning(self, "Advertencia", "El remito ingresado no existe") else: if self.remitoActual.estoyCobrado() != None: QtGui.QMessageBox.information( self, "Aviso", "El remito ingresado ya sido cobrado") else: detallesRemitos = RemitoModel.buscarDetalles( int(numeroRemito), self.sesion) self.limpiarTabla(self.tableRemitos) self.cargarObjetos(self.tableRemitos, detallesRemitos, ("producto", "cantidad")) importes = [] for a in detallesRemitos: for b in self.sesion.query(ProductoModel).filter( ProductoModel.codigo_barra == a.producto): importes.append(b.importe * a.cantidad) for row in range(0, self.tableRemitos.rowCount()): self.tableRemitos.setItem( row, 2, QtGui.QTableWidgetItem(str(importes[row]))) self.lineNumero.setEnabled(False) else: self.lineNumero.clear() self.lineNumero.setEnabled(True) self.limpiarTabla(self.tableRemitos)
def eliminar(self): itemActual = self.tableRemito.currentItem() if itemActual == None: self.showMsjEstado("No se ha seleccionado remito para eliminar") else: numeroRemito = int( self.tableRemito.item(itemActual.row(), 0).text()) remitoSeleccionado = RemitoModel.buscar(RemitoModel.numero, self.sesion, numeroRemito).first() if self.tableDetalles.rowCount() == 0: remitoSeleccionado.borrar(self.sesion) self.tableRemito.removeRow(itemActual.row()) self.objectDeleted.emit() self.limpiarVentana() else: QtGui.QMessageBox.information(self, "Aviso", "Debe dar de baja cada detalle")
def eliminar(self): """ Elimina un remito seleccionado, una vez que fueron dado de baja todos sus detalles :return: """ itemActual=self.tableRemito.currentItem() if itemActual==None: QtGui.QMessageBox.information(self,"Aviso","No se ha seleccionado remito para eliminar") else: numeroRemito=int(self.tableRemito.item(itemActual.row(),0).text()) remitoSeleccionado=RemitoModel.buscar(RemitoModel.numero,self.sesion,numeroRemito).first() if self.tableDetalles.rowCount()==0: remitoSeleccionado.borrar(self.sesion) self.tableRemito.removeRow(itemActual.row()) self.objectDeleted.emit() QtGui.QMessageBox.information(self,"Aviso","Remito Eliminado Exitosamente") else: QtGui.QMessageBox.information(self,"Aviso","Debe dar de baja cada detalle")
def cargarDetalles(self): self.limpiarTabla(self.tableDetalles) self.tableDetalles.setVisible(True) self.lblDetalles.setVisible(True) self.lineNumero.setEnabled(False) itemActual=self.tableRemito.currentItem() valor=int(self.tableRemito.item(itemActual.row(),0).text()) self.lineNumero.setText(str(valor)) self.cargarObjetos(self.tableDetalles, RemitoModel.buscarDetalles(valor,self.sesion), ("nro_linea","producto","cantidad") ) ##Para el calculo de subtotal. Como el subtotal es una dato calculado, no se puede hacer explicita la carga ##como sucede en el cargarObjetos importes=[] for a in self.sesion.query(DetalleRemitoModel).filter(DetalleRemitoModel.id_remito==valor): for b in self.sesion.query(ProductoModel).filter(ProductoModel.codigo_barra==a.producto): importes.append(b.importe * a.cantidad) for row in range(0,self.tableDetalles.rowCount()): self.tableDetalles.setItem(row, 3, QtGui.QTableWidgetItem(str(importes[row])))
def cargarDetalles(self): self.limpiarTabla(self.tableDetalles) self.tableDetalles.setVisible(True) self.lblDetalles.setVisible(True) self.lineNumero.setEnabled(False) itemActual = self.tableRemito.currentItem() valor = int(self.tableRemito.item(itemActual.row(), 0).text()) self.lineNumero.setText(str(valor)) self.cargarObjetos(self.tableDetalles, RemitoModel.buscarDetalles(valor, self.sesion), ("nro_linea", "producto", "cantidad")) ##Para el calculo de subtotal. Como el subtotal es una dato calculado, no se puede hacer explicita la carga ##como sucede en el cargarObjetos importes = [] for a in self.sesion.query(DetalleRemitoModel).filter( DetalleRemitoModel.id_remito == valor): for b in self.sesion.query(ProductoModel).filter( ProductoModel.codigo_barra == a.producto): importes.append(b.importe * a.cantidad) for row in range(0, self.tableDetalles.rowCount()): self.tableDetalles.setItem( row, 3, QtGui.QTableWidgetItem(str(importes[row])))
def eliminarDetalle(self): itemActual=self.tableDetalles.currentItem() ok=QtGui.QMessageBox.information(self,"Confirmacion","¿Desea eliminar este item?") if ok: linea=int(self.tableDetalles.item(itemActual.row(),0).text()) producto=int(self.tableDetalles.item(itemActual.row(),1).text()) cantidadRemito=int(self.tableDetalles.item(itemActual.row(),2).text()) finalizeActualizacion=False while not finalizeActualizacion: cantidad, ok=QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5) if not ok: QtGui.QMessageBox.information(self,"Aviso","No se ingreso cantidad") else: if cantidad > cantidadRemito: QtGui.QMessageBox.information(self,"Aviso","La cantidad ingresada supera la esperada") else: lote, ok=QtGui.QInputDialog.getText(self,"Lote","Ingrese lote") if not ok: QtGui.QMessageBox.information(self,"Aviso","No se ingreso lote") else: loteP=LoteProductoModel.buscarLoteProducto(self.sesion,producto,str(lote)).first() if loteP==None: QtGui.QMessageBox.information(self,"Aviso","El lote ingresado no se corresponde con el producto") else: loteP.aumentarCantidad(cantidad) loteP.modificar(self.sesion) cantidadRemito-=cantidad self.tableDetalles.item(itemActual.row(),2).setText(str(cantidadRemito)) if cantidadRemito==0: finalizeActualizacion=True detalle=RemitoModel.getDetalle(int(self.lineNumero.text()),int(linea),self.sesion).first() detalle.borrar(self.sesion) self.tableDetalles.removeRow(itemActual.row()) else: return
def cargar_remitos(self): self.cargarObjetos(self.tableRemito, RemitoModel.obtenerTodosRemitos(self.sesion).all(), ("numero", "cliente", "fecha_emision") )
class VentaConRemito(CRUDWidget, Ui_vtnVentaConRemito): """ Clase que modela la logica de la operacion de Venta con Remito """ def __init__(self, mdi): """ Setea las propiedades de la ventana y variables :param mdi Ventana Contenedora: :return: """ MdiWidget.__init__(self, mdi) self.sesion = self.mdi().window().getSesionBD() self.validadores() self.btnBuscarCliente.pressed.connect(self.buscarCliente) self.lineDni.returnPressed.connect(self.buscarClt) self.lineApellido.returnPressed.connect(self.buscarClt) self.lineNombre.returnPressed.connect(self.buscarClt) self.lineMedicamento.returnPressed.connect(self.buscarProd) self.lineMonodroga.returnPressed.connect(self.buscarProd) self.tableClientes.itemDoubleClicked.connect(self.cargarLines) self.tableProductos.itemDoubleClicked.connect(self.agregarProducto) self.btnEliminar.pressed.connect(self.eliminarDetalle) self.btnAceptar.pressed.connect(self.aceptar) self.btnCancelar.pressed.connect(self.cancelar) self.cargar_clientes() self.cargar_productos() self.gbProducto.setEnabled(False) self.gbRemito.setEnabled(False) self.remito=None self.productosAgregados=0 self.lotesVentas = {} self.dniCliente = None self.detallesTabla = {} #Diccionario que vincula el row de la tabla con el obj DetalleRemito Correspondiente def cancelarVentana(self): if self.remito!=None: self.remito.anular() for detalle in self.lotesVentas: for loteVenta in self.lotesVentas[detalle]: loteVenta[0].aumentarCantidad(loteVenta[1]) loteVenta[0].modificar(self.sesion) detalle.eliminarLotesAsociados(self.sesion) detalle.borrar(self.sesion) self.limpiarVentana() self.objectModified.emit() def cargar_productos(self): """ Carga los productos que se encuentran en el sistema en la Tabla de Productos :return: """ self.limpiarTabla(self.tableProductos) for n, obj in enumerate(ProductoModel.buscarTodos("codigo_barra",self.sesion).all()): self.tableProductos.insertRow(n) self.tableProductos.setItem(n, 0, QtGui.QTableWidgetItem(str(obj.codigo_barra))) self.tableProductos.setItem(n, 1, QtGui.QTableWidgetItem(str(obj.id_medicamento))) self.tableProductos.setItem(n, 2, QtGui.QTableWidgetItem(str(obj.id_presentacion))) self.tableProductos.setItem(n, 3, QtGui.QTableWidgetItem(obj.getNombreMonodroga(self.sesion))) self.tableProductos.setItem(n, 4, QtGui.QTableWidgetItem(str(obj.getCantidad(self.sesion)))) def cargar_clientes(self): """ Carga los clientes cargados en el sistema en la Tabla de Clientes :return: """ self.limpiarTabla(self.tableClientes) self.cargarObjetos(self.tableClientes, ClienteModel.buscarTodos("dni", self.sesion).all(), ("dni", "nombre", "apellido") ) def validadores(self): """ Setea los validadores correspondientes para los campos de la ventana :return: """ ##Esta parte analiza los campos requeridos para el cliente requeridos = ["nombre", "apellido", "dni"] camposRequeridos = [ getattr(self, "line%s" % campo.title()) for campo in requeridos ] ValidarDatos.setValidador(camposRequeridos) camposRequeridos = [getattr(self,"lineMonodroga")] ValidarDatos.setValidador(camposRequeridos) camposRequeridos = [getattr(self,"lineMedicamento")] ValidarDatos.setValidador(camposRequeridos) def buscarCliente(self): """ Busca los clientes de acuerdo al criterio de busqueda establecido por el usuario :return: """ if self.lineDni.isEnabled(): self.buscarClt() elif self.productosAgregados != 0: QtGui.QMessageBox.information(self,"Aviso","No se puede cambiar Cliente. Ya hay productos agregados") else: self.lineDni.setEnabled(True) self.lineApellido.setEnabled(True) self.lineNombre.setEnabled(True) self.lineNombre.clear() self.lineDni.clear() self.lineApellido.clear() self.limpiarTabla(self.tableClientes) self.tableClientes.setVisible(True) self.cargar_clientes() self.gbProducto.setEnabled(False) self.gbRemito.setEnabled(False) def buscarClt(self): """ Filtra la tabla de Clientes de acuerdo a los criterios de busqueda impuestos :return: """ dni = str(self.lineDni.text()) nombre = str(self.lineNombre.text()) apellido = str(self.lineApellido.text()) data = self.getAllTabla(self.tableClientes) if dni != "": dataDni = filter(lambda x: x[0].upper() == dni.upper(), data.values()) else: dataDni = data.values() if nombre != "": dataNomb = filter(lambda x: x[1].upper() == nombre.upper(), dataDni) else: dataNomb = dataDni if apellido != "": dataApell = filter(lambda x: x[2].upper() == apellido.upper(), dataNomb) else: dataApell = dataNomb for dato in data: self.tableClientes.setRowHidden(dato,False) for dato in data: if not data[dato] in dataApell: self.tableClientes.setRowHidden(dato,True) def buscarProd(self): """ Filtra la tabla de Productos de acuerdo a los criterios de busqueda impuestos :return: """ medicamento = str(self.lineMedicamento.text()) monodroga = str(self.lineMonodroga.text()) data = self.getAllTabla(self.tableProductos) if medicamento != "": dataMedic = filter(lambda x: x[1].upper() == medicamento.upper(), data.values()) else: dataMedic = data.values() if monodroga != "": dataMono = filter(lambda x: x[3].upper() == monodroga.upper(), dataMedic) else: dataMono = dataMedic for dato in data: self.tableProductos.setRowHidden(dato,False) for dato in data: if not data[dato] in dataMono: self.tableProductos.setRowHidden(dato,True) def cargarLines(self): """ Carga los lines correspondientes con la informacion del cliente seleccionado :return: """ self.lineDni.setEnabled(False) self.lineNombre.setEnabled(False) self.lineApellido.setEnabled(False) #Recuperar la informacion de un item row=self.tableClientes.currentItem().row() infoItem=[] for col in range(0,self.tableClientes.columnCount()): infoItem.append(self.tableClientes.item(row,col).text()) self.dniCliente = int(infoItem[0]) #Cargar la info del item en los lines self.lineDni.setText(infoItem[0]) self.lineNombre.setText(infoItem[1]) self.lineApellido.setText(infoItem[2]) self.tableClientes.hide() self.gbProducto.setEnabled(True) self.gbRemito.setEnabled(True) def descontarCantidad(self,detalle,producto,cantidad): """ Descuenta la cantidad especificada de un determinado producto :param detalle Detalle Remito: :param producto Codigo de Barra del producto: :param cantidad Cantidad del Producto: :return: """ query=LoteModel.obtenerLoteProducto(producto,self.sesion) valores=[] for a in query: loteProducto=LoteProductoModel.buscarLoteProducto(self.sesion,producto,a.codigo).first() if cantidad<=loteProducto.cantidad: loteProducto.descontarCantidad(cantidad) loteProducto.modificar(self.sesion) valores.append([loteProducto,cantidad]) break else: cantidad-=loteProducto.cantidad valores.append([loteProducto,loteProducto.cantidad]) loteProducto.descontarCantidad(loteProducto.cantidad) loteProducto.modificar(self.sesion) self.lotesVentas[detalle]=valores detalle.agregarLotes(self.sesion,self.lotesVentas[detalle]) def agregarProducto(self): """ Agrega un producto seleccionado al Remito creado :return: """ itemActual=self.tableProductos.currentItem() if itemActual==None: QtGui.QMessageBox.information(self,"Aviso", "No se ha seleccionado ningun producto para agregar") else: cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5) if not ok: self.showMsjEstado("No se ha seleccionado cantidad del producto") else: if cantidad>int(self.tableProductos.item(itemActual.row(),4).text()): self.showMsjEstado("La cantidad seleccionada es mayor a la actual") else: rowItemActual=itemActual.row() rows=self.tableRemito.rowCount() if self.productosAgregados==0 and self.remito == None: self.remito=RemitoModel(RemitoModel.obtenerNumero(self.sesion),int(self.lineDni.text())) self.remito.guardar(self.sesion) self.productosAgregados+=1 codigo = int(self.tableProductos.item(rowItemActual,0).text()) self.tableRemito.insertRow(rows) self.tableRemito.setItem(rows, 0, QtGui.QTableWidgetItem(str(codigo))) self.tableRemito.setItem(rows, 1, QtGui.QTableWidgetItem(str(cantidad))) detalle = DetalleRemitoModel(self.remito.numero,self.productosAgregados, int(self.tableProductos.item(rowItemActual,0).text()),cantidad) self.descontarCantidad(detalle,int(self.tableProductos.item(rowItemActual,0).text()),cantidad) detalle.guardar(self.sesion) self.detallesTabla[rows] = detalle self.cargar_productos() self.objectModified.emit() def eliminarDetalle(self): """ Elimina el detalle seleccionado por el usuario y actualiza el stock del producto en particular. :return: """ itemActual = self.tableRemito.currentItem() if itemActual == None: self.showMsjEstado("Debe seleccionar un item para dar de baja") else: detalle = self.detallesTabla[itemActual.row()] for loteVenta in self.lotesVentas[detalle]: loteVenta[0].aumentarCantidad(loteVenta[1]) loteVenta[0].modificar(self.sesion) detalle.eliminarLotesAsociados(self.sesion) detalle.bajaFisica(self.sesion) del self.lotesVentas[detalle] del self.detallesTabla[itemActual.row()] self.tableRemito.hideRow(itemActual.row()) self.cargar_productos() self.productosAgregados -=1 self.objectModified.emit() def limpiarVentana(self): """ Limpia la ventana actual :return: """ self.remito=None self.productosAgregados=0 self.dniCliente = None self.lotesVentas = {} self.detallesTabla = {} self.lineDni.setEnabled(True) self.lineDni.clear() self.lineNombre.setEnabled(True) self.lineNombre.clear() self.lineApellido.setEnabled(True) self.lineApellido.clear() self.lineMedicamento.clear() self.lineMonodroga.clear() self.limpiarTabla(self.tableClientes) self.limpiarTabla(self.tableProductos) self.limpiarTabla(self.tableRemito) self.tableClientes.setVisible(True) self.gbRemito.setEnabled(False) self.gbProducto.setEnabled(False) self.cargar_clientes() self.cargar_productos() def aceptar(self): """ Confirma la operacion en curso, y envia la informacion necesaria para imprimir el comprobante. Si no se ha efectuado ninguna venta, se notifica :return: """ if self.remito==None: QtGui.QMessageBox.information(self,"Aviso","No se ha efectuado ninguna venta") elif self.productosAgregados == 0: QtGui.QMessageBox.information(self,"Aviso","No se ha agregado ningun producto al remito") else: self.objectCreated.emit() QtGui.QMessageBox.information(None,"Venta","La venta se ha realizado con exito") ##Se envian los datos necesarios para generar el comprobante data = {} data["numero"] = self.remito.numero data["fecha"] = self.remito.fecha_emision data["datosCliente"] = ClienteModel.getDatosCliente(self.sesion,self.dniCliente) data["detalles"] = self.getContenidoTabla(self.tableRemito).values() generarRremito(data) self.limpiarVentana() def cancelar(self): """ Cancela la operacion en curso, anulando el Remito creado y restaurando el stock de los productos a sus valores originales. :return: """ ok=QtGui.QMessageBox.warning(self,"Aviso","¿Desea cancelar la operacion?",\ QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Ok) if ok == QtGui.QMessageBox.Ok: if self.remito!=None: self.remito.anular() for detalle in self.lotesVentas: for loteVenta in self.lotesVentas[detalle]: loteVenta[0].aumentarCantidad(loteVenta[1]) loteVenta[0].modificar(self.sesion) detalle.eliminarLotesAsociados(self.sesion) detalle.borrar(self.sesion) self.limpiarVentana() self.objectModified.emit() def addHandlerSignal(self): self.sender = PoolOfWindows.getVentana("AltaCliente") self.sender.objectCreated.connect(self.cargar_clientes) self.sender1 = PoolOfWindows.getVentana("BajaCliente") self.sender1.objectDeleted.connect(self.cargar_clientes) self.sender2 = PoolOfWindows.getVentana("ModificarCliente") self.sender2.objectModified.connect(self.cargar_clientes) self.sender3 = PoolOfWindows.getVentana("VentaContado") self.sender3.objectModified.connect(self.cargar_productos) self.sender4 = PoolOfWindows.getVentana("AltaProducto") self.sender4.objectCreated.connect(self.cargar_productos) self.sender5 = PoolOfWindows.getVentana("BajaProducto") self.sender5.objectDeleted.connect(self.cargar_productos) self.sender6 = PoolOfWindows.getVentana("ModificarProducto") self.sender6.objectModified.connect(self.cargar_productos) self.sender7 = PoolOfWindows.getVentana("DevolucionDeCliente") self.sender7.objectModified.connect(self.cargar_productos) self.sender8 = PoolOfWindows.getVentana("ModificarRemito") self.sender8.objectModified.connect(self.cargar_productos) self.sender9 = PoolOfWindows.getVentana("BajaRemito") self.sender9.objectModified.connect(self.cargar_productos) self.sender10 = PoolOfWindows.getVentana("FraccionarProducto") self.sender10.objectModified.connect(self.cargar_productos) self.sender11 = PoolOfWindows.getVentana("AltaLote") self.sender11.objectCreated.connect(self.cargar_productos) self.sender12 = PoolOfWindows.getVentana("ModificarLote") self.sender12.objectModified.connect(self.cargar_productos)
class VentaConRemito(MdiWidget, Ui_vtnVentaConRemito): def __init__(self, mdi): MdiWidget.__init__(self, mdi) self.sesion = self.mdi().window().getSesionBD() self.validadores() self.btnBuscarCliente.pressed.connect(self.buscarCliente) self.tableClientes.itemDoubleClicked.connect(self.cargarLines) self.btnBuscarProducto.pressed.connect(self.buscarProducto) self.tableProductos.itemDoubleClicked.connect(self.agregarProducto) self.tableRemito.itemDoubleClicked.connect(self.cambiarCantidad) self.btnEliminar.pressed.connect(self.eliminarDetalle) self.btnAceptar.pressed.connect(self.aceptar) self.btnCancelar.pressed.connect(self.cancelar) self.cargar_clientes() self.cargar_productos() self.gbProducto.hide() self.gbRemito.hide() self.remito = None self.productosAgregados = 0 self.lotesVentas = {} def cargar_productos(self): for n, obj in enumerate( ProductoModel.buscarTodos("codigo_barra", self.sesion).all()): self.tableProductos.insertRow(n) self.tableProductos.setItem( n, 0, QtGui.QTableWidgetItem(str(obj.codigo_barra))) self.tableProductos.setItem( n, 1, QtGui.QTableWidgetItem(str(obj.id_medicamento))) self.tableProductos.setItem( n, 2, QtGui.QTableWidgetItem(str(obj.id_presentacion))) self.tableProductos.setItem( n, 3, QtGui.QTableWidgetItem(obj.getNombreMonodroga(self.sesion))) self.tableProductos.setItem( n, 4, QtGui.QTableWidgetItem(str(obj.getCantidad(self.sesion)))) self.tableProductos.setItem( n, 5, QtGui.QTableWidgetItem(str(obj.importe))) def cargar_clientes(self): self.cargarObjetos(self.tableClientes, ClienteModel.buscarTodos("dni", self.sesion).all(), ("dni", "nombre", "apellido")) def validadores(self): pass #TODO HACER ESTO ##Esta parte analiza los campos requeridos para el cliente #self.camposRequeridos = [ getattr(self, "line%s" % campo.title()) for campo in ClienteModel.requeridos ] #self.validarDatos = ValidarDatos() #ValidarDatos.setValidador(self.camposRequeridos) def buscarCliente(self): if self.lineDni.isEnabled(): print("busqueda con filtrado") else: self.lineDni.setEnabled(True) self.lineApellido.setEnabled(True) self.lineNombre.setEnabled(True) self.lineNombre.clear() self.lineDni.clear() self.lineApellido.clear() self.limpiarTabla(self.tableClientes) self.tableClientes.setVisible(True) self.cargar_clientes() def cargarLines(self): self.lineDni.setEnabled(False) self.lineNombre.setEnabled(False) self.lineApellido.setEnabled(False) #Recuperar la informacion de un item row = self.tableClientes.currentItem().row() infoItem = [] for col in range(0, self.tableClientes.columnCount()): infoItem.append(self.tableClientes.item(row, col).text()) #Cargar la info del item en los lines self.lineDni.setText(infoItem[0]) self.lineNombre.setText(infoItem[1]) self.lineApellido.setText(infoItem[2]) self.tableClientes.hide() self.gbProducto.setVisible(True) self.gbRemito.setVisible(True) def buscarProducto(self): print("Buscando producto") def descontarCantidad(self, detalle, producto, cantidad): query = LoteModel.obtenerLoteProducto(producto, self.sesion) valores = [] for a in query: loteProducto = LoteProductoModel.buscarLoteProducto( self.sesion, producto, a.codigo).first() if cantidad <= loteProducto.cantidad: loteProducto.descontarCantidad(cantidad) loteProducto.modificar(self.sesion) valores.append([loteProducto, cantidad]) break else: cantidad -= loteProducto.cantidad valores.append([loteProducto, loteProducto.cantidad]) loteProducto.descontarCantidad(loteProducto.cantidad) loteProducto.modificar(self.sesion) self.lotesVentas[detalle] = valores def agregarProducto(self): itemActual = self.tableProductos.currentItem() if itemActual == None: self.showMsjEstado( "No se ha seleccionado ningun producto para agregar") else: cantidad, ok = QtGui.QInputDialog.getInt( self, "Cantidad", "Ingrese cantidad del producto", 1, 1, 2000, 5) if not ok: self.showMsjEstado( "No se ha seleccionado cantidad del producto") else: if cantidad > int( self.tableProductos.item(itemActual.row(), 4).text()): self.showMsjEstado( "La cantidad seleccionada es mayor a la actual") else: rowItemActual = itemActual.row() rows = self.tableRemito.rowCount() if self.productosAgregados == 0: self.remito = RemitoModel( RemitoModel.obtenerNumero(self.sesion), int(self.lineDni.text())) self.remito.guardar(self.sesion) self.productosAgregados += 1 self.tableRemito.insertRow(rows) self.tableRemito.setItem( rows, 0, QtGui.QTableWidgetItem( str( self.tableProductos.item(rowItemActual, 0).text()))) self.tableRemito.setItem( rows, 1, QtGui.QTableWidgetItem(str(cantidad))) self.tableRemito.setItem( rows, 2, QtGui.QTableWidgetItem( str(cantidad * float( self.tableProductos.item(rowItemActual, 5).text())))) self.detalle = DetalleRemitoModel( self.remito.numero, self.productosAgregados, int(self.tableProductos.item(rowItemActual, 0).text()), cantidad) self.descontarCantidad( self.detalle, int(self.tableProductos.item(rowItemActual, 0).text()), cantidad) self.detalle.guardar(self.sesion) self.limpiarTabla(self.tableProductos) self.cargar_productos() def cambiarCantidad(self): itemActual = self.tableRemito.currentItem() cantidad, ok = QtGui.QInputDialog.getInt( self, "Cantidad", "Ingrese cantidad del producto", 1, 1, 2000, 5) #TODO Checkear que la cantidad no sea mayor a la que esta en la base #TODO ACTUALIZAR LA CANTIDAD if ok: importeUnitario = float( self.tableRemito.item(itemActual.row(), 2).text()) / int( self.tableRemito.item(itemActual.row(), 1).text()) itemCantidad = self.tableRemito.item(itemActual.row(), 1) itemCantidad.setText(str(cantidad)) itemImporte = self.tableRemito.item(itemActual.row(), 2) itemImporte.setText(str(int(cantidad) * importeUnitario)) def eliminarDetalle(self): print("Eliminando Detalle") def limpiarVentana(self): self.lineDni.setEnabled(True) self.lineDni.clear() self.lineNombre.setEnabled(True) self.lineNombre.clear() self.lineApellido.setEnabled(True) self.lineApellido.clear() self.lineEdit_3.clear() self.lineEdit_4.clear() self.lineEdit_3.setEnabled(True) self.lineEdit_4.setEnabled(True) self.limpiarTabla(self.tableClientes) self.limpiarTabla(self.tableProductos) self.limpiarTabla(self.tableRemito) self.tableClientes.setVisible(True) self.cargar_clientes() self.cargar_productos() def aceptar(self): if self.remito == None: QtGui.QMessageBox.information(self, "Venta con Remito", "No se ha efectuado ninguna venta") else: QtGui.QMessageBox.information( None, "Venta", "La venta se ha realizado con exito") self.limpiarTabla(self.tableRemito) self.remito = None self.productosAgregados = 0 self.limpiarVentana() def cancelar(self): if self.remito != None: ok = QtGui.QMessageBox.warning(self, "Aviso", "¿Desea anular el remito creado?") if ok: self.remito.anular() QtGui.QMessageBox.information(self, "Aviso", "Remito Anulado") for detalle in self.lotesVentas: for loteVenta in self.lotesVentas[detalle]: loteVenta[0].aumentarCantidad(loteVenta[1]) loteVenta[0].modificar(self.sesion) self.lotesVentas = {} self.cargar_productos() self.remito = None self.productosAgregados = 0 self.limpiarVentana()
def cargar_remitos(self): self.cargarObjetos(self.tableRemito, RemitoModel.obtenerTodosRemitos(self.sesion).all(), ("numero", "cliente", "fecha_emision"))
class VentaConRemito(MdiWidget, Ui_vtnVentaConRemito): def __init__(self, mdi): MdiWidget.__init__(self, mdi) self.sesion = self.mdi().window().getSesionBD() self.validadores() self.btnBuscarCliente.pressed.connect(self.buscarCliente) self.tableClientes.itemDoubleClicked.connect(self.cargarLines) self.btnBuscarProducto.pressed.connect(self.buscarProducto) self.tableProductos.itemDoubleClicked.connect(self.agregarProducto) self.tableRemito.itemDoubleClicked.connect(self.cambiarCantidad) self.btnEliminar.pressed.connect(self.eliminarDetalle) self.btnAceptar.pressed.connect(self.aceptar) self.btnCancelar.pressed.connect(self.cancelar) self.cargar_clientes() self.cargar_productos() self.gbProducto.hide() self.gbRemito.hide() self.remito=None self.productosAgregados=0 self.lotesVentas={} def cargar_productos(self): for n, obj in enumerate(ProductoModel.buscarTodos("codigo_barra",self.sesion).all()): self.tableProductos.insertRow(n) self.tableProductos.setItem(n, 0, QtGui.QTableWidgetItem(str(obj.codigo_barra))) self.tableProductos.setItem(n, 1, QtGui.QTableWidgetItem(str(obj.id_medicamento))) self.tableProductos.setItem(n, 2, QtGui.QTableWidgetItem(str(obj.id_presentacion))) self.tableProductos.setItem(n, 3, QtGui.QTableWidgetItem(obj.getNombreMonodroga(self.sesion))) self.tableProductos.setItem(n, 4, QtGui.QTableWidgetItem(str(obj.getCantidad(self.sesion)))) self.tableProductos.setItem(n, 5, QtGui.QTableWidgetItem(str(obj.importe))) def cargar_clientes(self): self.cargarObjetos(self.tableClientes, ClienteModel.buscarTodos("dni", self.sesion).all(), ("dni", "nombre", "apellido") ) def validadores(self): pass #TODO HACER ESTO ##Esta parte analiza los campos requeridos para el cliente #self.camposRequeridos = [ getattr(self, "line%s" % campo.title()) for campo in ClienteModel.requeridos ] #self.validarDatos = ValidarDatos() #ValidarDatos.setValidador(self.camposRequeridos) def buscarCliente(self): if self.lineDni.isEnabled(): print("busqueda con filtrado") else: self.lineDni.setEnabled(True) self.lineApellido.setEnabled(True) self.lineNombre.setEnabled(True) self.lineNombre.clear() self.lineDni.clear() self.lineApellido.clear() self.limpiarTabla(self.tableClientes) self.tableClientes.setVisible(True) self.cargar_clientes() def cargarLines(self): self.lineDni.setEnabled(False) self.lineNombre.setEnabled(False) self.lineApellido.setEnabled(False) #Recuperar la informacion de un item row=self.tableClientes.currentItem().row() infoItem=[] for col in range(0,self.tableClientes.columnCount()): infoItem.append(self.tableClientes.item(row,col).text()) #Cargar la info del item en los lines self.lineDni.setText(infoItem[0]) self.lineNombre.setText(infoItem[1]) self.lineApellido.setText(infoItem[2]) self.tableClientes.hide() self.gbProducto.setVisible(True) self.gbRemito.setVisible(True) def buscarProducto(self): print("Buscando producto") def descontarCantidad(self,detalle,producto,cantidad): query=LoteModel.obtenerLoteProducto(producto,self.sesion) valores=[] for a in query: loteProducto=LoteProductoModel.buscarLoteProducto(self.sesion,producto,a.codigo).first() if cantidad<=loteProducto.cantidad: loteProducto.descontarCantidad(cantidad) loteProducto.modificar(self.sesion) valores.append([loteProducto,cantidad]) break else: cantidad-=loteProducto.cantidad valores.append([loteProducto,loteProducto.cantidad]) loteProducto.descontarCantidad(loteProducto.cantidad) loteProducto.modificar(self.sesion) self.lotesVentas[detalle]=valores def agregarProducto(self): itemActual=self.tableProductos.currentItem() if itemActual==None: self.showMsjEstado("No se ha seleccionado ningun producto para agregar") else: cantidad, ok = QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5) if not ok: self.showMsjEstado("No se ha seleccionado cantidad del producto") else: if cantidad>int(self.tableProductos.item(itemActual.row(),4).text()): self.showMsjEstado("La cantidad seleccionada es mayor a la actual") else: rowItemActual=itemActual.row() rows=self.tableRemito.rowCount() if self.productosAgregados==0: self.remito=RemitoModel(RemitoModel.obtenerNumero(self.sesion),int(self.lineDni.text())) self.remito.guardar(self.sesion) self.productosAgregados+=1 self.tableRemito.insertRow(rows) self.tableRemito.setItem(rows, 0, QtGui.QTableWidgetItem(str(self.tableProductos.item(rowItemActual,0).text()))) self.tableRemito.setItem(rows, 1, QtGui.QTableWidgetItem(str(cantidad))) self.tableRemito.setItem(rows, 2, QtGui.QTableWidgetItem(str(cantidad*float(self.tableProductos.item(rowItemActual,5).text())))) self.detalle=DetalleRemitoModel(self.remito.numero,self.productosAgregados, int(self.tableProductos.item(rowItemActual,0).text()),cantidad) self.descontarCantidad(self.detalle,int(self.tableProductos.item(rowItemActual,0).text()),cantidad) self.detalle.guardar(self.sesion) self.limpiarTabla(self.tableProductos) self.cargar_productos() def cambiarCantidad(self): itemActual=self.tableRemito.currentItem() cantidad, ok=QtGui.QInputDialog.getInt(self,"Cantidad","Ingrese cantidad del producto",1,1,2000,5) #TODO Checkear que la cantidad no sea mayor a la que esta en la base #TODO ACTUALIZAR LA CANTIDAD if ok: importeUnitario=float(self.tableRemito.item(itemActual.row(),2).text())/int(self.tableRemito.item(itemActual.row(),1).text()) itemCantidad=self.tableRemito.item(itemActual.row(),1) itemCantidad.setText(str(cantidad)) itemImporte=self.tableRemito.item(itemActual.row(),2) itemImporte.setText(str(int(cantidad)*importeUnitario)) def eliminarDetalle(self): print("Eliminando Detalle") def limpiarVentana(self): self.lineDni.setEnabled(True) self.lineDni.clear() self.lineNombre.setEnabled(True) self.lineNombre.clear() self.lineApellido.setEnabled(True) self.lineApellido.clear() self.lineEdit_3.clear() self.lineEdit_4.clear() self.lineEdit_3.setEnabled(True) self.lineEdit_4.setEnabled(True) self.limpiarTabla(self.tableClientes) self.limpiarTabla(self.tableProductos) self.limpiarTabla(self.tableRemito) self.tableClientes.setVisible(True) self.cargar_clientes() self.cargar_productos() def aceptar(self): if self.remito==None: QtGui.QMessageBox.information(self,"Venta con Remito","No se ha efectuado ninguna venta") else: QtGui.QMessageBox.information(None,"Venta","La venta se ha realizado con exito") self.limpiarTabla(self.tableRemito) self.remito=None self.productosAgregados=0 self.limpiarVentana() def cancelar(self): if self.remito!=None: ok=QtGui.QMessageBox.warning(self,"Aviso","¿Desea anular el remito creado?") if ok: self.remito.anular() QtGui.QMessageBox.information(self,"Aviso","Remito Anulado") for detalle in self.lotesVentas: for loteVenta in self.lotesVentas[detalle]: loteVenta[0].aumentarCantidad(loteVenta[1]) loteVenta[0].modificar(self.sesion) self.lotesVentas={} self.cargar_productos() self.remito=None self.productosAgregados=0 self.limpiarVentana()