def agregarRemito(self): if self.tableRemitos.rowCount() == 0: self.showMsjEstado("No se ha seleccionado remito para agregar") else: if self.remitosAgregados == 0: self.factura = FacturaModel( FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.remitosAgregados += 1 if self.obraSocialSeleccionada == None: obraSocial = None else: obraSocial = ObraSocialModel.getObraSocial( self.obraSocialSeleccionada, self.sesion) for row, item in enumerate( self.obtenerValoresTabla(self.tableRemitos)): self.tableFactura.insertRow(row) self.detallesAgregados += 1 for col, value in enumerate( self.armarItemFactura(item, obraSocial, self.factura.numero, self.detallesAgregados)): self.tableFactura.setItem( row, col, QtGui.QTableWidgetItem(str(value))) self.remitoActual.setCobrado(self.factura.numero) self.remitoActual.modificar(self.sesion) self.remitosCobrados.append(self.remitoActual) self.mostrarTotal() self.limpiarTabla(self.tableRemitos) self.lineNumero.setEnabled(True) self.lineNumero.clear()
def agregarRemito(self): """ Agrega el remito seleccionado por el usuario a un arreglo de Remitos por cobrar. :return: """ if self.tableRemitos.rowCount()==0: QtGui.QMessageBox.information(self,"Aviso","No se ha seleccionado remito para agregar") else: if self.remitosAgregados==0: self.factura=FacturaModel(FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.remitosAgregados+=1 if self.obraSocialSeleccionada == None: obraSocial = None else: obraSocial=ObraSocialModel.getObraSocial(self.obraSocialSeleccionada,self.sesion) for row,item in enumerate(self.obtenerValoresTabla(self.tableRemitos)): self.tableFactura.insertRow(row) self.detallesAgregados+=1 for col,value in enumerate(self.armarItemFactura(item,obraSocial,self.factura.numero,self.detallesAgregados)): self.tableFactura.setItem(row,col,QtGui.QTableWidgetItem(str(value))) self.remitosCobrados.append(self.remitoActual) self.mostrarTotal() self.limpiarTabla(self.tableRemitos) self.lineNumero.setEnabled(True) self.lineNumero.clear()
def agregarProducto(self): itemActual = self.tableProductos.currentItem() 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: cantidadProducto = int( self.tableProductos.item(itemActual.row(), 6).text()) if cantidad > cantidadProducto: QtGui.QMessageBox.information( self, "Aviso", "La cantidad ingresada es mayor que la del stock") else: if self.productosAgregados == 0: self.factura = FacturaModel( FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.productosAgregados += 1 rowItemActual = itemActual.row() rows = self.tableFactura.rowCount() self.tableFactura.insertRow(rows) #TODO HAY QUE CARGAR LOS DEMAS DATOS DE LA FACTURA #--Carga de items en la tabla--* importeActual = float( self.tableProductos.item(rowItemActual, 5).text()) descuentoActual = float( self.tableProductos.item(rowItemActual, 4).text()) subtotal = importeActual * (1 - descuentoActual) ####-------------------------##### detalleFactura = DetalleFacturaModel( self.factura.numero, int(self.tableProductos.item(rowItemActual, 0).text()), cantidad, subtotal * cantidad, descuentoActual, self.productosAgregados) self.descontarCantidad( detalleFactura, int(self.tableProductos.item(rowItemActual, 0).text()), cantidad) self.tableFactura.setItem( rows, 0, QtGui.QTableWidgetItem(str(detalleFactura.producto))) self.tableFactura.setItem( rows, 1, QtGui.QTableWidgetItem(str(detalleFactura.cantidad))) self.tableFactura.setItem( rows, 2, QtGui.QTableWidgetItem(str("%.2f" % (subtotal * cantidad)))) detalleFactura.guardar(self.sesion) if self.obraSocialSeleccionada != None: self.cargar_productos(str(self.lineObra.text())) else: self.cargarProductosSinObra()
def buscarFactura(self): """ Busca y carga los detalles correspondientes al Nro de Factura ingresado. :return: """ if not self.lineNumero.isEnabled() and self.facturaSeleccionada != None: QtGui.QMessageBox.information(self,"Aviso","Ya se ha seleccionado una factura") elif not self.lineNumero.isEnabled(): self.lineNumero.setEnabled(True) self.lineNumero.clear() self.limpiarTabla(self.tableFactura) else: self.numeroFacturaActual=str(self.lineNumero.text()) if len(self.numeroFacturaActual)==0: QtGui.QMessageBox.information(self,"Aviso",QtCore.QString.fromUtf8("No se ha ingresado número de factura")) else: self.facturaSeleccionada=FacturaModel.existeFactura(int(self.numeroFacturaActual),self.sesion) if self.facturaSeleccionada==None: QtGui.QMessageBox.warning(self,"Aviso","La factura seleccionada no existe") elif self.facturaSeleccionada.getNC()!=None: QtGui.QMessageBox.information(self,"Aviso",QtCore.QString.fromUtf8("La factura ya ha posee una Nota de Crédito")) self.facturaSeleccionada = None elif self.facturaSeleccionada.getFechaEmision()+timedelta(days=int(self.plazo))<date.today(): QtGui.QMessageBox.information(self,"Aviso",QtCore.QString.fromUtf8("El tiempo permitido para la devolución ha expirado")) elif self.facturaSeleccionada.estaLiquidada(self.sesion): print self.facturaSeleccionada.estaLiquidada(self.sesion) QtGui.QMessageBox.information(self,"Aviso","La factura se encuentra liquidada a la Obra Social") else: self.lineNumero.setEnabled(False) self.cargarObjetos(self.tableFactura,self.facturaSeleccionada.getDetalles(self.sesion), ["nro_linea","producto","cantidad","importe"])
def buscarFactura(self): if not self.lineNumero.isEnabled(): self.lineNumero.setEnabled(True) self.lineNumero.clear() self.limpiarTabla(self.tableFactura) else: self.numeroFacturaActual = str(self.lineNumero.text()) if len(self.numeroFacturaActual) == 0: self.showMsjEstado("No se ha ingresado numero de factura") else: self.facturaSeleccionada = FacturaModel.existeFactura( int(self.numeroFacturaActual), self.sesion) if self.facturaSeleccionada == None: QtGui.QMessageBox.information( self, "Aviso", "La factura seleccionada no existe") else: #TODO CARGAR SOLO LOS DETALLES DE FACTURA QUE NO ESTAN UNA NOTA DE CREDITO if self.facturaSeleccionada.getNC() != None: QtGui.QMessageBox.information( self, "Aviso", "La factura ya ha sido devuelta") else: self.lineNumero.setEnabled(False) self.cargarObjetos( self.tableFactura, self.facturaSeleccionada.getDetalles(self.sesion), ["producto", "cantidad", "importe"])
def agregarProducto(self): """ Agrega un producto seleccionada a la Factura :return: """ itemActual=self.tableProductos.currentItem() 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: cantidadProducto=int(self.tableProductos.item(itemActual.row(),6).text()) if cantidad>cantidadProducto: QtGui.QMessageBox.information(self,"Aviso","La cantidad ingresada es mayor que la del stock") else: if self.productosAgregados == 0 and self.factura == None: self.factura=FacturaModel(FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.productosAgregados+=1 rowItemActual=itemActual.row() rows=self.tableFactura.rowCount() self.tableFactura.insertRow(rows) #--Carga de items en la tabla--* producto = int(self.tableProductos.item(rowItemActual,0).text()) importeActual=float(self.tableProductos.item(rowItemActual,5).text()) descuentoActual=float(self.tableProductos.item(rowItemActual,4).text()) subtotal=importeActual*(1-descuentoActual) ####-------------------------##### detalleFactura=DetalleFacturaModel(self.factura.numero,producto,cantidad, subtotal*cantidad,descuentoActual,self.productosAgregados ) self.descontarCantidad(detalleFactura,producto,cantidad) self.tableFactura.setItem(rows,0,QtGui.QTableWidgetItem(str(detalleFactura.producto))) self.tableFactura.setItem(rows,1,QtGui.QTableWidgetItem(str(detalleFactura.cantidad))) self.tableFactura.setItem(rows, 2, QtGui.QTableWidgetItem(str("%.2f"%(subtotal*cantidad)))) detalleFactura.guardar(self.sesion) self.detallesTabla[rows] = detalleFactura self.data[rows] = [ producto, cantidad, subtotal*cantidad, descuentoActual ] self.actualizar() self.objectModified.emit()
def devolverDetalle(self): """ Incorpora el Detalle de Factura seleccionado por el usuario a la Nota de Credito :return: """ rowActual=self.tableFactura.currentItem().row() signal = QtGui.QMessageBox.information(self,"Confirmación","¿Desea devolver este item?",\ QtGui.QMessageBox.Close | QtGui.QMessageBox.Ok) if signal == QtGui.QMessageBox.Ok: producto = int(self.tableFactura.item(rowActual,1).text()) cantidad_detalle = int(self.tableFactura.item(rowActual,2).text()) linea = int(self.tableFactura.item(rowActual,0).text()) nro_factura = int(self.lineNumero.text()) detalle = FacturaModel.getDetalle(nro_factura,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.tableFactura.item(rowActual,2).setText(str(cantidad_detalle)) break lote, ok=QtGui.QInputDialog.getText(self,"Lote","Ingrese lote") if ok == False: finalize_actualizacion = True self.tableFactura.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.tableFactura.item(rowActual,2).setText(str(cantidad_restante)) if sum(map(lambda x: temp[x],temp)) == 0: self.productosSeleccionados +=1 key = int(self.tableFactura.item(rowActual,0).text()) self.detallesDevueltos[key] = detalle self.armarItem(self.obtenerValoresItem(rowActual),cantidad_detalle,key) self.tableFactura.removeRow(rowActual) finalize_actualizacion = True
def agregarProducto(self): itemActual=self.tableProductos.currentItem() 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: cantidadProducto=int(self.tableProductos.item(itemActual.row(),6).text()) if cantidad>cantidadProducto: QtGui.QMessageBox.information(self,"Aviso","La cantidad ingresada es mayor que la del stock") else: if self.productosAgregados==0: self.factura=FacturaModel(FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.productosAgregados+=1 rowItemActual=itemActual.row() rows=self.tableFactura.rowCount() self.tableFactura.insertRow(rows) #TODO HAY QUE CARGAR LOS DEMAS DATOS DE LA FACTURA #--Carga de items en la tabla--* importeActual=float(self.tableProductos.item(rowItemActual,5).text()) descuentoActual=float(self.tableProductos.item(rowItemActual,4).text()) subtotal=importeActual*(1-descuentoActual) ####-------------------------##### detalleFactura=DetalleFacturaModel(self.factura.numero,int(self.tableProductos.item(rowItemActual,0).text()),cantidad, subtotal*cantidad,descuentoActual,self.productosAgregados ) self.descontarCantidad(detalleFactura,int(self.tableProductos.item(rowItemActual,0).text()),cantidad) self.tableFactura.setItem(rows,0,QtGui.QTableWidgetItem(str(detalleFactura.producto))) self.tableFactura.setItem(rows,1,QtGui.QTableWidgetItem(str(detalleFactura.cantidad))) self.tableFactura.setItem(rows, 2, QtGui.QTableWidgetItem(str("%.2f"%(subtotal*cantidad)))) detalleFactura.guardar(self.sesion) if self.obraSocialSeleccionada!=None: self.cargar_productos(str(self.lineObra.text())) else: self.cargarProductosSinObra()
def agregarRemito(self): if self.tableRemitos.rowCount()==0: self.showMsjEstado("No se ha seleccionado remito para agregar") else: if self.remitosAgregados==0: self.factura=FacturaModel(FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.remitosAgregados+=1 if self.obraSocialSeleccionada==None: obraSocial=None else: obraSocial=ObraSocialModel.getObraSocial(self.obraSocialSeleccionada,self.sesion) for row,item in enumerate(self.obtenerValoresTabla(self.tableRemitos)): self.tableFactura.insertRow(row) self.detallesAgregados+=1 for col,value in enumerate(self.armarItemFactura(item,obraSocial,self.factura.numero,self.detallesAgregados)): self.tableFactura.setItem(row,col,QtGui.QTableWidgetItem(str(value))) self.remitoActual.setCobrado(self.factura.numero) self.remitoActual.modificar(self.sesion) self.remitosCobrados.append(self.remitoActual) self.mostrarTotal() self.limpiarTabla(self.tableRemitos) self.lineNumero.setEnabled(True) self.lineNumero.clear()
def buscarFactura(self): if not self.lineNumeroFac.isEnabled(): self.lineNumeroFac.setEnabled(True) self.lineNumeroFac.clear() self.limpiarTabla(self.tableFactura) else: self.numeroFacturaActual=str(self.lineNumeroFac.text()) if len(self.numeroFacturaActual)==0: self.showMsjEstado("No se ha ingresado numero de factura") else: self.facturaSeleccionada=FacturaModel.existeFactura(int(self.numeroFacturaActual),self.sesion) if self.facturaSeleccionada==None: QtGui.QMessageBox.information(self,"Aviso","La factura seleccionada no existe") else: self.lineNumeroFac.setEnabled(False) self.cargarObjetos(self.tableFactura,self.facturaSeleccionada.getDetalles(self.sesion), ["producto","cantidad","importe"])
def buscarFactura(self): if not self.lineNumeroFac.isEnabled(): self.lineNumeroFac.setEnabled(True) self.lineNumeroFac.clear() self.limpiarTabla(self.tableFactura) else: self.numeroFacturaActual = str(self.lineNumeroFac.text()) if len(self.numeroFacturaActual) == 0: self.showMsjEstado("No se ha ingresado numero de factura") else: self.facturaSeleccionada = FacturaModel.existeFactura( int(self.numeroFacturaActual), self.sesion) if self.facturaSeleccionada == None: QtGui.QMessageBox.information( self, "Aviso", "La factura seleccionada no existe") else: self.lineNumeroFac.setEnabled(False) self.cargarObjetos( self.tableFactura, self.facturaSeleccionada.getDetalles(self.sesion), ["producto", "cantidad", "importe"])
def buscarFactura(self): if not self.lineNumero.isEnabled(): self.lineNumero.setEnabled(True) self.lineNumero.clear() self.limpiarTabla(self.tableFactura) else: self.numeroFacturaActual=str(self.lineNumero.text()) if len(self.numeroFacturaActual)==0: self.showMsjEstado("No se ha ingresado numero de factura") else: self.facturaSeleccionada=FacturaModel.existeFactura(int(self.numeroFacturaActual),self.sesion) if self.facturaSeleccionada==None: QtGui.QMessageBox.information(self,"Aviso","La factura seleccionada no existe") else: #TODO CARGAR SOLO LOS DETALLES DE FACTURA QUE NO ESTAN UNA NOTA DE CREDITO if self.facturaSeleccionada.getNC()!=None: QtGui.QMessageBox.information(self,"Aviso","La factura ya ha sido devuelta") else: self.lineNumero.setEnabled(False) self.cargarObjetos(self.tableFactura,self.facturaSeleccionada.getDetalles(self.sesion), ["producto","cantidad","importe"])
def buscarFactura(self): """ Busca la factura indica por el usuario. En caso de no existir, notifica lo mismo :return: """ if not self.lineNumeroFac.isEnabled() and self.tableNC.rowCount() != 0: QtGui.QMessageBox.information(self,"Aviso","Ya se ha seleccionado una factura") elif not self.lineNumeroFac.isEnabled(): self.lineNumeroFac.setEnabled(True) self.lineNumeroFac.clear() self.limpiarTabla(self.tableFactura) else: self.numeroFacturaActual=str(self.lineNumeroFac.text()) if len(self.numeroFacturaActual)==0: self.showMsjEstado("No se ha ingresado numero de factura") else: self.facturaSeleccionada=FacturaModel.existeFactura(int(self.numeroFacturaActual),self.sesion) if self.facturaSeleccionada==None: QtGui.QMessageBox.information(self,"Aviso","La factura seleccionada no existe") elif self.facturaSeleccionada.getObra() != None and self.facturaSeleccionada.getObra() != self.obraSocial: QtGui.QMessageBox.information(self,"Aviso","La Obra Social seleccionada no corresponde con la factura") elif self.facturaSeleccionada.getFechaEmision()+timedelta(days=int(self.plazo))<date.today(): QtGui.QMessageBox.information(self,"Aviso","El tiempo permitido para el reintegro ha expirado") elif self.facturaSeleccionada.estaLiquidada(self.sesion): QtGui.QMessageBox.information(self,"Aviso","La factura se encuentra liquidada a la Obra Social") elif self.facturaSeleccionada.getNC()!=None: QtGui.QMessageBox.information(self,"Aviso","La factura ya posee una Nota de Crédito") else: self.lineNumeroFac.setEnabled(False) if self.facturaSeleccionada.getObra() == None: self.cargarObjetos(self.tableFactura,self.facturaSeleccionada.getDetalles(self.obraSocial, self.sesion), ["producto","cantidad","importe"]) else: self.cargarObjetos(self.tableFactura,self.facturaSeleccionada.getDetallesSinDescuento(self.sesion), ["producto","cantidad","importe"])
class RegistrarCobroRemito(MdiWidget, Ui_vtnRegistrarCobroRemito): def __init__(self, mdi): MdiWidget.__init__(self, mdi) self.sesion = self.mdi().window().getSesionBD() self.validadores() self.cargar_obras() self.tableObras.hide() self.lineRazonSocial.setEnabled(False) self.btnBuscarOs.setEnabled(False) self.tableRemitos.setEnabled(False) self.rbtnRazonSocial.pressed.connect(self.habilitarObras) self.tableObras.itemDoubleClicked.connect(self.cargarLineObra) self.btnBuscarOs.pressed.connect(self.buscarObra) self.btnBuscarRemito.pressed.connect(self.buscarRemito) self.btnAgregar.pressed.connect(self.agregarRemito) self.lineNumero.returnPressed.connect(self.buscarRemito) self.btnAceptar.pressed.connect(self.confirmarOperacion) self.btnCancelar.pressed.connect(self.cancelarOperacion) self.obraSocialSeleccionada=None self.factura=None self.remitosAgregados=0 self.detallesAgregados=0 self.remitoActual=None self.remitosCobrados=[] self.importeTotal=0 def buscarObra(self): if self.lineRazonSocial.isEnabled(): print ("buscar con filtrado") else: self.lineRazonSocial.setEnabled(True) def cargarLineObra(self): if self.lineRazonSocial.isEnabled(): itemActual=self.tableObras.currentItem() razonSocial=str(self.tableObras.item(itemActual.row(),0).text()) self.obraSocialSeleccionada=razonSocial self.lineRazonSocial.setText(razonSocial) self.lineRazonSocial.setEnabled(False) else: QtGui.QMessageBox.warning(self,"Advertencia","Ya se ha seleccionado una obra social") def habilitarObras(self): if self.factura!=None: QtGui.QMessageBox.information(self,"Aviso","Ya existe una factura. " "No se puede modificar la obra social") else: if not self.rbtnRazonSocial.isChecked(): self.btnBuscarOs.setEnabled(True) self.lineRazonSocial.setEnabled(True) self.tableObras.setVisible(True) else: self.lineRazonSocial.clear() self.btnBuscarOs.setEnabled(False) self.lineRazonSocial.setEnabled(False) self.tableObras.setVisible(False) self.obraSocialSeleccionada=None def validadores(self): pass def cargar_obras(self): self.cargarObjetos(self.tableObras, ObraSocialModel.buscarTodos("razon_social", self.sesion).all(), ("razon_social", "cuit", "direccion") ) 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 obtenerValoresTabla(self,tabla): values=[] for row in range(0,tabla.rowCount()): valuesItem=[] for col in range(0,tabla.columnCount()): valuesItem.append(tabla.item(row,col).text()) values.append(valuesItem) return values def armarItemFactura(self,itemRemito,obraSocial,nroFactura,nroLinea): producto=str(itemRemito[0]) cantidad=str(itemRemito[1]) importe=str(itemRemito[2]) if obraSocial==None: descuento=0 else: descuento=obraSocial.getDescuento(producto,self.sesion) subtotal=(float(importe)*(1-descuento)) detalleFactura=DetalleFacturaModel(nroFactura,producto,cantidad,subtotal,descuento,nroLinea) detalleFactura.guardar(self.sesion) #TODO AVERIGUAR PARA OBTENER UN REDONDEO A DOS DECIMALES itemFactura=[str(producto),str(cantidad),("%.2f" % subtotal),str(descuento)] return itemFactura def mostrarTotal(self): subtotales=[] for row in range(0,self.tableFactura.rowCount()): subtotales.append(float(self.tableFactura.item(row,2).text())) self.lblImporteTotal.setText("Importe Total: $%.2f" % sum(subtotales)) self.importeTotal=sum(subtotales) def agregarRemito(self): if self.tableRemitos.rowCount()==0: self.showMsjEstado("No se ha seleccionado remito para agregar") else: if self.remitosAgregados==0: self.factura=FacturaModel(FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.remitosAgregados+=1 if self.obraSocialSeleccionada==None: obraSocial=None else: obraSocial=ObraSocialModel.getObraSocial(self.obraSocialSeleccionada,self.sesion) for row,item in enumerate(self.obtenerValoresTabla(self.tableRemitos)): self.tableFactura.insertRow(row) self.detallesAgregados+=1 for col,value in enumerate(self.armarItemFactura(item,obraSocial,self.factura.numero,self.detallesAgregados)): self.tableFactura.setItem(row,col,QtGui.QTableWidgetItem(str(value))) self.remitoActual.setCobrado(self.factura.numero) self.remitoActual.modificar(self.sesion) self.remitosCobrados.append(self.remitoActual) self.mostrarTotal() self.limpiarTabla(self.tableRemitos) self.lineNumero.setEnabled(True) self.lineNumero.clear() def limpiarForm(self): self.remitosAgregados=0 self.detallesAgregados=0 self.factura=None self.remitoActual=None self.importeTotal=0 self.limpiarTabla(self.tableFactura) self.limpiarTabla(self.tableRemitos) self.lineRazonSocial.clear() self.lineNumero.clear() self.lineNumero.setEnabled(True) self.rbtnRazonSocial.setChecked(False) self.tableObras.hide() self.lblImporteTotal.setText("Importe Total: $0.00") def confirmarOperacion(self): if self.factura==None: QtGui.QMessageBox.information(self,"Aviso","No se ha realizado ningun cobro") else: efectivo,ok=QtGui.QInputDialog.getText(self,"Importe a pagar",("El importe a pagar es: $%.2f" % self.importeTotal)) if float(efectivo) > self.importeTotal: QtGui.QMessageBox.information(self,"Cambio","Su vuelto es: $%.2f" % (float(efectivo)-self.importeTotal)) else: QtGui.QMessageBox.information(self,"Cambio","Su vuelto es: $0.00") cobroCliente=CobroClienteModel(CobroClienteModel.obtenerNumero(self.sesion),self.factura.numero,"Efectivo",self.importeTotal) cobroCliente.guardar(self.sesion) QtGui.QMessageBox.information(self,"Venta","El cobro ha sido exitoso") self.limpiarForm() def cancelarOperacion(self): if self.factura!=None: ok=QtGui.QMessageBox.warning(self,"Aviso","Existe una factura creada") if ok: self.limpiarForm() for remito in self.remitosCobrados: remito.setCobrado(None) remito.modificar(self.sesion)
class RegistrarCobroRemito(CRUDWidget, Ui_vtnRegistrarCobroRemito): def __init__(self, mdi): """ Constructor de la clase RegistrarCobroRemito :param mdi: :return: """ MdiWidget.__init__(self, mdi) self.sesion = self.mdi().window().getSesionBD() self.validadores() self.cargar_obras() self.tableObras.hide() self.lineRazonSocial.setEnabled(False) self.btnBuscarOs.setEnabled(False) self.tableRemitos.setEnabled(False) self.rbtnRazonSocial.pressed.connect(self.habilitarObras) self.tableObras.itemDoubleClicked.connect(self.cargarLineObra) self.btnBuscarOs.pressed.connect(self.buscarObra) self.lineRazonSocial.returnPressed.connect(self.buscarObra) self.btnBuscarRemito.pressed.connect(self.buscarRemito) self.btnAgregar.pressed.connect(self.agregarRemito) self.lineNumero.returnPressed.connect(self.buscarRemito) self.btnAceptar.pressed.connect(self.confirmarOperacion) self.btnCancelar.pressed.connect(self.cancelarOperacion) self.obraSocialSeleccionada=None self.factura=None self.remitosAgregados=0 self.detallesAgregados=0 self.remitoActual=None self.remitosCobrados=[] self.importeTotal=0 self.itemsDeFactura = [] self.detallesFactura = [] def buscarObra(self): """ Busca las obras sociales solicitadas por el usuario :return: """ if self.lineRazonSocial.isEnabled(): obra_social = str(self.lineRazonSocial.text()) data = self.getAllTabla(self.tableObras) if obra_social != "": data_temp = filter(lambda x: x[0].upper() == obra_social.upper(), data.values()) else: data_temp = data.values() for dato in data: self.tableObras.setRowHidden(dato,False) for dato in data: if not data[dato] in data_temp: self.tableObras.setRowHidden(dato,True) elif self.remitosAgregados != 0 : QtGui.QMessageBox.information(self,"Aviso","Hay remitos agregados. Imposbile cambiar de Obra Social") else: self.lineRazonSocial.setEnabled(True) def cargarLineObra(self): """ Establece el valor del line de obra de acuerdo con lo seleccionado por el cliente. :return: """ if self.lineRazonSocial.isEnabled(): itemActual=self.tableObras.currentItem() razonSocial=str(self.tableObras.item(itemActual.row(),0).text()) self.obraSocialSeleccionada=razonSocial self.lineRazonSocial.setText(razonSocial) self.lineRazonSocial.setEnabled(False) else: QtGui.QMessageBox.warning(self,"Advertencia","Ya se ha seleccionado una obra social") def habilitarObras(self): """ Muestra todas las Obras Sociales habilitadas, de acuerdo a si existe factura o no. :return: """ if self.factura!=None: QtGui.QMessageBox.information(self,"Aviso","Ya existe una factura. " "No se puede modificar la obra social") else: if not self.rbtnRazonSocial.isChecked(): self.btnBuscarOs.setEnabled(True) self.lineRazonSocial.setEnabled(True) self.tableObras.setVisible(True) else: self.lineRazonSocial.clear() self.btnBuscarOs.setEnabled(False) self.lineRazonSocial.setEnabled(False) self.tableObras.setVisible(False) self.obraSocialSeleccionada=None def validadores(self): """ Setea los validadores correspondientes para los campos de la ventana :return: """ ##Esta parte analiza los campos requeridos para el cliente camposRequeridos = [ getattr(self, "lineRazonSocial") ] ValidarDatos.setValidador(camposRequeridos) camposRequeridos = [ getattr(self, "lineNumero") ] ValidarDatos.setValidador(camposRequeridos) def cargar_obras(self): """ Carga todas las Obras Sociales disponibles :return: """ self.cargarObjetos(self.tableObras, ObraSocialModel.buscarTodos("razon_social", self.sesion).all(), ("razon_social", "cuit", "direccion") ) 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 obtenerValoresTabla(self,tabla): """ Obtiene un arreglo que contiene arreglos que representan los valores de cada row :param tabla : :return: """ values=[] for row in range(0,tabla.rowCount()): valuesItem=[] for col in range(0,tabla.columnCount()): valuesItem.append(tabla.item(row,col).text()) values.append(valuesItem) return values def armarItemFactura(self,itemRemito,obraSocial,nroFactura,nroLinea): """ Arma el Item de la Factura correspondiente a un Item del Remito seleccionado por el usuario :param itemRemito Arreglo con los valores de un item del Remito actual: :param obraSocial Obra Social seleccionada por el usuario: :param nroFactura Numero de Factura Actual: :param nroLinea Numero de Linea de la Factura Actual: :return: """ producto=str(itemRemito[0]) cantidad=str(itemRemito[1]) importe=str(itemRemito[2]) if obraSocial==None: descuento=0 else: descuento=obraSocial.getDescuento(producto,self.sesion) subtotal=(float(importe)*(1-descuento)) detalleFactura=DetalleFacturaModel(nroFactura,producto,cantidad,subtotal,descuento,nroLinea) detalleFactura.guardar(self.sesion) self.detallesFactura.append(detalleFactura) itemFactura=[str(producto),str(cantidad),("%.2f" % subtotal),str(descuento)] self.itemsDeFactura.append(itemFactura) return itemFactura def mostrarTotal(self): """ Actualiza el label de Importe total, mostrando lo que se debe cobrar :return: """ subtotales=[] for row in range(0,self.tableFactura.rowCount()): subtotales.append(float(self.tableFactura.item(row,2).text())) self.lblImporteTotal.setText("Importe Total: $%.2f" % sum(subtotales)) self.importeTotal=sum(subtotales) def agregarRemito(self): """ Agrega el remito seleccionado por el usuario a un arreglo de Remitos por cobrar. :return: """ if self.tableRemitos.rowCount()==0: QtGui.QMessageBox.information(self,"Aviso","No se ha seleccionado remito para agregar") else: if self.remitosAgregados==0: self.factura=FacturaModel(FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.remitosAgregados+=1 if self.obraSocialSeleccionada == None: obraSocial = None else: obraSocial=ObraSocialModel.getObraSocial(self.obraSocialSeleccionada,self.sesion) for row,item in enumerate(self.obtenerValoresTabla(self.tableRemitos)): self.tableFactura.insertRow(row) self.detallesAgregados+=1 for col,value in enumerate(self.armarItemFactura(item,obraSocial,self.factura.numero,self.detallesAgregados)): self.tableFactura.setItem(row,col,QtGui.QTableWidgetItem(str(value))) self.remitosCobrados.append(self.remitoActual) self.mostrarTotal() self.limpiarTabla(self.tableRemitos) self.lineNumero.setEnabled(True) self.lineNumero.clear() def limpiarForm(self): """ Limpia la ventana una vez que se finalizó la operación. :return: """ self.detallesFactura = [] self.remitosCobrados = [] self.itemsDeFactura = [] self.remitosAgregados=0 self.detallesAgregados=0 self.factura=None self.remitoActual=None self.importeTotal=0 self.limpiarTabla(self.tableFactura) self.limpiarTabla(self.tableRemitos) self.lineRazonSocial.clear() self.lineNumero.clear() self.lineNumero.setEnabled(True) self.rbtnRazonSocial.setChecked(False) self.tableObras.hide() self.lblImporteTotal.setText("Importe Total: $0.00") def confirmarOperacion(self): """ Verifica si el cliente acepta la operación realizada. Si acepta genera la factura correspondiente, si no deshace lo realizado. :return: """ if self.remitosAgregados == 0: QtGui.QMessageBox.information(self,"Aviso","No se ha realizado ningun cobro") else: efectivo,ok=QtGui.QInputDialog.getDouble(self,"Importe a pagar",("El importe a pagar es: $%.2f" % self.importeTotal),0,0,2000,2) if ok: if float(efectivo) < self.importeTotal: QtGui.QMessageBox.information(self,"Aviso","El importe ingresado es menor al total") else: QtGui.QMessageBox.information(self,"Cambio","Su vuelto es: $%.2f" % (float(efectivo)-self.importeTotal)) for remito in self.remitosCobrados: remito.setCobrado(self.factura.numero) remito.modificar(self.sesion) cobroCliente=CobroClienteModel(CobroClienteModel.obtenerNumero(self.sesion),self.factura.numero,"Efectivo",self.importeTotal) cobroCliente.guardar(self.sesion) self.factura.setObra(self.obraSocialSeleccionada) self.factura.modificar(self.sesion) QtGui.QMessageBox.information(self,"Venta","El cobro ha sido exitoso") self.objectModified.emit() data = {} data["numero"] = self.factura.numero data["fecha"] = self.factura.fecha_emision data["detalles"] = self.itemsDeFactura data["formaPago"] = "Efectivo" generarFactura(data) self.limpiarForm() def cancelarOperacion(self): """ Marca a todos los remitos afectados como No Cobrados cuando el usuario indica que quiere cancelar la operacion :return: """ ok = QtGui.QMessageBox.warning(self,"Aviso",QtCore.QString.fromUtf8("¿Desea cancelar la operacion?"),\ QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Ok) if ok == QtGui.QMessageBox.Ok: if self.factura != None: self.factura.anular() self.factura.modificar(self.sesion) for detalle in self.detallesFactura: detalle.borrar(self.sesion) self.limpiarForm() def cancelarVentana(self): if self.factura != None: self.factura.anular() self.factura.modificar(self.sesion) for detalle in self.detallesFactura: detalle.borrar(self.sesion) self.limpiarForm()
class RegistrarCobroRemito(MdiWidget, Ui_vtnRegistrarCobroRemito): def __init__(self, mdi): MdiWidget.__init__(self, mdi) self.sesion = self.mdi().window().getSesionBD() self.validadores() self.cargar_obras() self.tableObras.hide() self.lineRazonSocial.setEnabled(False) self.btnBuscarOs.setEnabled(False) self.tableRemitos.setEnabled(False) self.rbtnRazonSocial.pressed.connect(self.habilitarObras) self.tableObras.itemDoubleClicked.connect(self.cargarLineObra) self.btnBuscarOs.pressed.connect(self.buscarObra) self.btnBuscarRemito.pressed.connect(self.buscarRemito) self.btnAgregar.pressed.connect(self.agregarRemito) self.lineNumero.returnPressed.connect(self.buscarRemito) self.btnAceptar.pressed.connect(self.confirmarOperacion) self.btnCancelar.pressed.connect(self.cancelarOperacion) self.obraSocialSeleccionada = None self.factura = None self.remitosAgregados = 0 self.detallesAgregados = 0 self.remitoActual = None self.remitosCobrados = [] self.importeTotal = 0 def buscarObra(self): if self.lineRazonSocial.isEnabled(): print("buscar con filtrado") else: self.lineRazonSocial.setEnabled(True) def cargarLineObra(self): if self.lineRazonSocial.isEnabled(): itemActual = self.tableObras.currentItem() razonSocial = str(self.tableObras.item(itemActual.row(), 0).text()) self.obraSocialSeleccionada = razonSocial self.lineRazonSocial.setText(razonSocial) self.lineRazonSocial.setEnabled(False) else: QtGui.QMessageBox.warning(self, "Advertencia", "Ya se ha seleccionado una obra social") def habilitarObras(self): if self.factura != None: QtGui.QMessageBox.information( self, "Aviso", "Ya existe una factura. " "No se puede modificar la obra social") else: if not self.rbtnRazonSocial.isChecked(): self.btnBuscarOs.setEnabled(True) self.lineRazonSocial.setEnabled(True) self.tableObras.setVisible(True) else: self.lineRazonSocial.clear() self.btnBuscarOs.setEnabled(False) self.lineRazonSocial.setEnabled(False) self.tableObras.setVisible(False) self.obraSocialSeleccionada = None def validadores(self): pass def cargar_obras(self): self.cargarObjetos( self.tableObras, ObraSocialModel.buscarTodos("razon_social", self.sesion).all(), ("razon_social", "cuit", "direccion")) 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 obtenerValoresTabla(self, tabla): values = [] for row in range(0, tabla.rowCount()): valuesItem = [] for col in range(0, tabla.columnCount()): valuesItem.append(tabla.item(row, col).text()) values.append(valuesItem) return values def armarItemFactura(self, itemRemito, obraSocial, nroFactura, nroLinea): producto = str(itemRemito[0]) cantidad = str(itemRemito[1]) importe = str(itemRemito[2]) if obraSocial == None: descuento = 0 else: descuento = obraSocial.getDescuento(producto, self.sesion) subtotal = (float(importe) * (1 - descuento)) detalleFactura = DetalleFacturaModel(nroFactura, producto, cantidad, subtotal, descuento, nroLinea) detalleFactura.guardar(self.sesion) #TODO AVERIGUAR PARA OBTENER UN REDONDEO A DOS DECIMALES itemFactura = [ str(producto), str(cantidad), ("%.2f" % subtotal), str(descuento) ] return itemFactura def mostrarTotal(self): subtotales = [] for row in range(0, self.tableFactura.rowCount()): subtotales.append(float(self.tableFactura.item(row, 2).text())) self.lblImporteTotal.setText("Importe Total: $%.2f" % sum(subtotales)) self.importeTotal = sum(subtotales) def agregarRemito(self): if self.tableRemitos.rowCount() == 0: self.showMsjEstado("No se ha seleccionado remito para agregar") else: if self.remitosAgregados == 0: self.factura = FacturaModel( FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.remitosAgregados += 1 if self.obraSocialSeleccionada == None: obraSocial = None else: obraSocial = ObraSocialModel.getObraSocial( self.obraSocialSeleccionada, self.sesion) for row, item in enumerate( self.obtenerValoresTabla(self.tableRemitos)): self.tableFactura.insertRow(row) self.detallesAgregados += 1 for col, value in enumerate( self.armarItemFactura(item, obraSocial, self.factura.numero, self.detallesAgregados)): self.tableFactura.setItem( row, col, QtGui.QTableWidgetItem(str(value))) self.remitoActual.setCobrado(self.factura.numero) self.remitoActual.modificar(self.sesion) self.remitosCobrados.append(self.remitoActual) self.mostrarTotal() self.limpiarTabla(self.tableRemitos) self.lineNumero.setEnabled(True) self.lineNumero.clear() def limpiarForm(self): self.remitosAgregados = 0 self.detallesAgregados = 0 self.factura = None self.remitoActual = None self.importeTotal = 0 self.limpiarTabla(self.tableFactura) self.limpiarTabla(self.tableRemitos) self.lineRazonSocial.clear() self.lineNumero.clear() self.lineNumero.setEnabled(True) self.rbtnRazonSocial.setChecked(False) self.tableObras.hide() self.lblImporteTotal.setText("Importe Total: $0.00") def confirmarOperacion(self): if self.factura == None: QtGui.QMessageBox.information(self, "Aviso", "No se ha realizado ningun cobro") else: efectivo, ok = QtGui.QInputDialog.getText( self, "Importe a pagar", ("El importe a pagar es: $%.2f" % self.importeTotal)) if float(efectivo) > self.importeTotal: QtGui.QMessageBox.information( self, "Cambio", "Su vuelto es: $%.2f" % (float(efectivo) - self.importeTotal)) else: QtGui.QMessageBox.information(self, "Cambio", "Su vuelto es: $0.00") cobroCliente = CobroClienteModel( CobroClienteModel.obtenerNumero(self.sesion), self.factura.numero, "Efectivo", self.importeTotal) cobroCliente.guardar(self.sesion) QtGui.QMessageBox.information(self, "Venta", "El cobro ha sido exitoso") self.limpiarForm() def cancelarOperacion(self): if self.factura != None: ok = QtGui.QMessageBox.warning(self, "Aviso", "Existe una factura creada") if ok: self.limpiarForm() for remito in self.remitosCobrados: remito.setCobrado(None) remito.modificar(self.sesion)
class VentaContado(CRUDWidget, Ui_vtnVentaContado): """ Clase encargada de modelar el comportamiento de Venta al Contado """ def __init__(self,mdi): """ Constructor de la clase VentaContado :param mdi: :return: """ MdiWidget.__init__(self, mdi) self.sesion = self.mdi().window().getSesionBD() self.validadores() self.cargar_obras() self.lineMedicamento.returnPressed.connect(self.buscarProd) self.lineMonodroga.returnPressed.connect(self.buscarProd) self.lineCuit.returnPressed.connect(self.buscarObra) self.lineObra.returnPressed.connect(self.buscarObra) self.tableObra.itemDoubleClicked.connect(self.cargarObra) self.tableProductos.itemDoubleClicked.connect(self.agregarProducto) self.btnBuscar.pressed.connect(self.limpiarObra) self.btnAceptar.pressed.connect(self.confirmarOperacion) self.btnCancelar.pressed.connect(self.cancelarOperacion) self.btnEliminar.pressed.connect(self.eliminarDetalle) self.rbtnObra.pressed.connect(self.habilitarObras) self.btnBuscar.setEnabled(False) self.tableObra.setVisible(False) self.lineCuit.setEnabled(False) self.lineObra.setEnabled(False) self.cargarProductosSinObra() self.productosAgregados=0 self.lotesVentas={} self.facturaCobrada=False self.obraSocialSeleccionada=None self.formapago = None self.factura = None self.data = {} self.detallesTabla = {} 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 buscarObra(self): """ Filtra la tabla de Obras Sociales de acuerdo a los criterios de busqueda impuestos :return: """ razon_social = str(self.lineObra.text()) cuit = str(self.lineCuit.text()) data = self.getAllTabla(self.tableObra) if razon_social != "": dataRazon = filter(lambda x: x[0].upper() == razon_social.upper(), data.values()) else: dataRazon = data.values() if cuit != "": dataCuit = filter(lambda x: x[1].upper() == cuit.upper(), dataRazon) else: dataCuit = dataRazon for dato in data: self.tableObra.setRowHidden(dato,False) for dato in data: if not data[dato] in dataCuit: self.tableObra.setRowHidden(dato,True) def actualizar(self): """ Actualiza la informacion de la tabla de Productos :return: """ if self.obraSocialSeleccionada!=None: self.cargar_productos(self.obraSocialSeleccionada) else: self.cargarProductosSinObra() def habilitarObras(self): """ Muestra las Obras Sociales si no hay una factura creada. Si la factura ya se encuentra creada, notifica que no es posible cambiar la Obra Social actual. :return: """ if self.productosAgregados != 0: QtGui.QMessageBox.information(self,"Aviso","Ya se han agregado productos a la factura") else: if not self.rbtnObra.isChecked(): self.btnBuscar.setEnabled(True) self.lineObra.setEnabled(True) self.lineCuit.setEnabled(True) self.tableObra.setVisible(True) else: self.lineObra.clear() self.lineCuit.clear() self.btnBuscar.setEnabled(False) self.lineObra.setEnabled(False) self.lineCuit.setEnabled(False) self.tableObra.setVisible(False) self.obraSocialSeleccionada=None self.cargarProductosSinObra() def cargarProductosSinObra(self): """ Carga en la tabla de Productos todos los productos sin descuento de Obra Social :return: """ self.limpiarTabla(self.tableProductos) ##Cnsulta para obtener todos los productos del sistema, con su correspondiente ##codigo de barra, monodroga, descuento, importe query=self.sesion.query(ProductoModel.codigo_barra,ProductoModel.id_medicamento,ProductoModel.id_presentacion,MonodrogaModel.nombre,ProductoModel.importe).\ join(MedicamentoModel).filter(ProductoModel.id_medicamento==MedicamentoModel.nombre_comercial).\ join(MonodrogaModel).filter(MedicamentoModel.id_monodroga==MonodrogaModel.nombre).\ filter(ProductoModel.baja==False).order_by(ProductoModel.codigo_barra) ##Se cargan los datos obtenidos en la tabla de Producto for n, obj in enumerate(query): self.tableProductos.insertRow(n) self.tableProductos.setItem(n, 0, QtGui.QTableWidgetItem(str(obj[0]))) self.tableProductos.setItem(n, 1, QtGui.QTableWidgetItem(str(obj[1]))) self.tableProductos.setItem(n, 2, QtGui.QTableWidgetItem(str(obj[2]))) self.tableProductos.setItem(n, 3, QtGui.QTableWidgetItem(str(obj[3]))) self.tableProductos.setItem(n, 4, QtGui.QTableWidgetItem(str(0))) self.tableProductos.setItem(n, 5, QtGui.QTableWidgetItem(str(obj[4]))) ##Se carga la cantidad de cada producto en la tabla for row,producto in enumerate(ProductoModel.buscarTodos(ProductoModel.codigo_barra,self.sesion)): self.tableProductos.setItem(row,6,QtGui.QTableWidgetItem(str(producto.getCantidad(self.sesion)))) def cargar_productos(self, obraSocial): """ Carga en la tabla de Productos todos los productos del sistema con los correspondientes descuentos de la Obra Social seleccionada :param obraSocial: :return: """ self.limpiarTabla(self.tableProductos) query=self.sesion.query(ProductoModel.codigo_barra,ProductoModel.id_medicamento,ProductoModel.id_presentacion,MonodrogaModel.nombre,DescuentoModel.descuento,ProductoModel.importe).\ join(MedicamentoModel).filter(ProductoModel.id_medicamento==MedicamentoModel.nombre_comercial).\ join(MonodrogaModel).filter(MedicamentoModel.id_monodroga==MonodrogaModel.nombre).\ join(DescuentoModel).filter(DescuentoModel.producto==ProductoModel.codigo_barra).\ filter(DescuentoModel.obra_social==obraSocial,ProductoModel.baja==False).order_by(ProductoModel.codigo_barra) for n, obj in enumerate(query): self.tableProductos.insertRow(n) for m, campo in enumerate(obj): self.tableProductos.setItem(n, m, QtGui.QTableWidgetItem(str(campo))) for row,producto in enumerate(ProductoModel.buscarTodos(ProductoModel.codigo_barra,self.sesion)): self.tableProductos.setItem(row,6,QtGui.QTableWidgetItem(str(producto.getCantidad(self.sesion)))) def cargarObra(self): """ Carga la informacion de la Obra Social seleccionada por el usuario :return: """ rowActual=self.tableObra.currentItem().row() self.lineObra.setText(str(self.tableObra.item(rowActual,0).text())) self.lineCuit.setText(str(self.tableObra.item(rowActual,1).text())) self.tableObra.hide() self.lineObra.setEnabled(False) self.lineCuit.setEnabled(False) self.obraSocialSeleccionada = str(self.lineObra.text()) self.cargar_productos(self.obraSocialSeleccionada) self.gbProducto.setVisible(True) def limpiarObra(self): """ Permite buscar las obras sociales si aun no hay ninguna seleccionada. Limpia los campos correspondientes a las Obras Sociales, si ya hay una cargada. :return: """ if self.lineObra.isEnabled(): self.buscarObra() else: self.lineCuit.clear() self.lineObra.clear() self.lineCuit.setEnabled(True) self.lineObra.setEnabled(True) self.tableObra.setVisible(True) def validadores(self): camposRequeridos = [getattr(self,"lineMonodroga")] ValidarDatos.setValidador(camposRequeridos) camposRequeridos = [getattr(self,"lineMedicamento")] ValidarDatos.setValidador(camposRequeridos) def cargar_obras(self): """ Carga todos las obras Sociales en el sistema en la tabla de Obras Sociales :return: """ self.cargarObjetos(self.tableObra, ObraSocialModel.buscarTodos("razon_social", self.sesion).all(), ("razon_social", "cuit", "direccion") ) def descontarCantidad(self,detalle,producto,cantidad): """ Actualiza el stock en una determinada cantidad, de un producto dado :param detalle Detalle de la Factura : :param producto Codigo de barra del producto: :param cantidad Cantidad a descontar: :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 seleccionada a la Factura :return: """ itemActual=self.tableProductos.currentItem() 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: cantidadProducto=int(self.tableProductos.item(itemActual.row(),6).text()) if cantidad>cantidadProducto: QtGui.QMessageBox.information(self,"Aviso","La cantidad ingresada es mayor que la del stock") else: if self.productosAgregados == 0 and self.factura == None: self.factura=FacturaModel(FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.productosAgregados+=1 rowItemActual=itemActual.row() rows=self.tableFactura.rowCount() self.tableFactura.insertRow(rows) #--Carga de items en la tabla--* producto = int(self.tableProductos.item(rowItemActual,0).text()) importeActual=float(self.tableProductos.item(rowItemActual,5).text()) descuentoActual=float(self.tableProductos.item(rowItemActual,4).text()) subtotal=importeActual*(1-descuentoActual) ####-------------------------##### detalleFactura=DetalleFacturaModel(self.factura.numero,producto,cantidad, subtotal*cantidad,descuentoActual,self.productosAgregados ) self.descontarCantidad(detalleFactura,producto,cantidad) self.tableFactura.setItem(rows,0,QtGui.QTableWidgetItem(str(detalleFactura.producto))) self.tableFactura.setItem(rows,1,QtGui.QTableWidgetItem(str(detalleFactura.cantidad))) self.tableFactura.setItem(rows, 2, QtGui.QTableWidgetItem(str("%.2f"%(subtotal*cantidad)))) detalleFactura.guardar(self.sesion) self.detallesTabla[rows] = detalleFactura self.data[rows] = [ producto, cantidad, subtotal*cantidad, descuentoActual ] self.actualizar() self.objectModified.emit() def eliminarDetalle(self): """ Elimina el detalle seleccionado por el usuario y actualiza el stock del producto en particular. :return: """ itemActual = self.tableFactura.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.data[itemActual.row()] self.tableFactura.hideRow(itemActual.row()) self.actualizar() self.productosAgregados -=1 self.objectModified.emit() def limpiarVentana(self): """ Limpia la ventana actual :return: """ self.productosAgregados=0 self.lotesVentas={} self.facturaCobrada=False self.obraSocialSeleccionada=None self.formapago = None self.factura = None self.data = {} self.detallesTabla = {} self.lineObra.clear() self.lineObra.setEnabled(True) self.lineCuit.clear() self.lineCuit.setEnabled(True) self.tableObra.setVisible(False) self.rbtnObra.setChecked(False) self.limpiarTabla(self.tableProductos) self.limpiarTabla(self.tableFactura) self.cargarProductosSinObra() def calcularTotal(self): """ Calcula el total a pagar :return Total a Pagar: """ subtotales=[] for row in range(0,self.tableFactura.rowCount()): subtotales.append(float(self.tableFactura.item(row,2).text())) importeTotal=sum(subtotales) return importeTotal def confirmarOperacion(self): """ Confirma la operacion si todo ha sido exitoso. De lo contrario notifica que la Factura todavia no ha sido cobrada o que no se efectuo ninguna venta :return: """ if self.productosAgregados == 0: QtGui.QMessageBox.information(self,"Aviso","No se ha agregado ningun producto") else: ventana = Cobrar(self,self.calcularTotal(),self.factura,self.sesion) ventana.exec_() if self.facturaCobrada: QtGui.QMessageBox.information(self,"Venta","La venta se ha realizado con exito") data = {} data["numero"] = self.factura.numero data["fecha"] = self.factura.fecha_emision data["detalles"] = self.data.values() data["formaPago"] = self.formapago generarFactura(data) self.factura.setObra(self.obraSocialSeleccionada) self.factura.modificar(self.sesion) self.limpiarVentana() else: QtGui.QMessageBox.information(self,"Aviso","La factura aun no ha sido cobrada") def cancelarOperacion(self): """ Cancela la operacion actual, y reestablece los stocks a sus valores originales :return: """ ok=QtGui.QMessageBox.warning(self,"Aviso","¿Desea cancelar la operación?",\ QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Ok) if ok == QtGui.QMessageBox.Ok: if self.factura != None: self.factura.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.objectModified.emit() self.limpiarVentana() def cancelarVentana(self): if self.factura != None: self.factura.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.objectModified.emit() self.limpiarVentana() def addHandlerSignal(self): self.sender = PoolOfWindows.getVentana("VentaConRemito") self.sender.objectModified.connect(self.actualizar) self.sender1 = PoolOfWindows.getVentana("AltaProducto") self.sender1.objectCreated.connect(self.actualizar) self.sender2 = PoolOfWindows.getVentana("BajaProducto") self.sender2.objectDeleted.connect(self.actualizar) self.sender3 = PoolOfWindows.getVentana("ModificarProducto") self.sender3.objectModified.connect(self.actualizar) self.sender4 = PoolOfWindows.getVentana("DevolucionDeCliente") self.sender4.objectModified.connect(self.actualizar) self.sender5 = PoolOfWindows.getVentana("ModificarRemito") self.sender5.objectModified.connect(self.actualizar) self.sender6 = PoolOfWindows.getVentana("BajaRemito") self.sender6.objectModified.connect(self.actualizar) self.sender7 = PoolOfWindows.getVentana("FraccionarProducto") self.sender7.objectModified.connect(self.actualizar) self.sender8 = PoolOfWindows.getVentana("AltaLote") self.sender8.objectCreated.connect(self.actualizar) self.sender9 = PoolOfWindows.getVentana("ModificarLote") self.sender9.objectModified.connect(self.actualizar)
class VentaContado(MdiWidget, Ui_vtnVentaContado): def __init__(self,mdi): MdiWidget.__init__(self, mdi) self.sesion = self.mdi().window().getSesionBD() self.validadores() self.cargar_obras() self.lineCuit.setEnabled(False) self.lineObra.setEnabled(False) self.btnBuscar.setEnabled(False) self.tableObra.setVisible(False) self.tableObra.itemDoubleClicked.connect(self.cargarObra) self.tableProductos.itemDoubleClicked.connect(self.agregarProducto) self.btnBuscar.pressed.connect(self.limpiarObra) self.productosAgregados=0 self.btnAceptar.pressed.connect(self.confirmarOperacion) self.btnCancelar.pressed.connect(self.cancelarOperacion) self.rbtnObra.pressed.connect(self.habilitarObras) self.btnActualizar.pressed.connect(self.actualizar) self.lotesVentas={} self.facturaCobrada=False self.obraSocialSeleccionada=None self.factura = None self.cargarProductosSinObra() def actualizar(self): if self.obraSocialSeleccionada != None: self.cargar_productos(self.obraSocialSeleccionada) else: self.cargarProductosSinObra() for row,producto in enumerate(ProductoModel.buscarTodos(ProductoModel.codigo_barra,self.sesion)): self.tableProductos.setItem(row,6,QtGui.QTableWidgetItem(str(producto.getCantidad(self.sesion)))) def habilitarObras(self): if self.factura!=None: QtGui.QMessageBox.information(self,"Aviso","Ya existe una factura. " "No se puede seleccionar otra obra social") else: if not self.rbtnObra.isChecked(): self.btnBuscar.setEnabled(True) self.lineObra.setEnabled(True) self.lineCuit.setEnabled(True) self.tableObra.setVisible(True) else: self.lineObra.clear() self.lineCuit.clear() self.btnBuscar.setEnabled(False) self.lineObra.setEnabled(False) self.lineCuit.setEnabled(False) self.tableObra.setVisible(False) self.obraSocialSeleccionada=None self.cargarProductosSinObra() def cargarProductosSinObra(self): self.limpiarTabla(self.tableProductos) query=self.sesion.query(ProductoModel.codigo_barra,ProductoModel.id_medicamento,ProductoModel.id_presentacion,MonodrogaModel.nombre,ProductoModel.importe).\ join(MedicamentoModel).filter(ProductoModel.id_medicamento==MedicamentoModel.nombre_comercial).\ join(MonodrogaModel).filter(MedicamentoModel.id_monodroga==MonodrogaModel.nombre).\ filter(ProductoModel.baja == False) for n, obj in enumerate(query): self.tableProductos.insertRow(n) self.tableProductos.setItem(n, 0, QtGui.QTableWidgetItem(str(obj[0]))) self.tableProductos.setItem(n, 1, QtGui.QTableWidgetItem(str(obj[1]))) self.tableProductos.setItem(n, 2, QtGui.QTableWidgetItem(str(obj[2]))) self.tableProductos.setItem(n, 3, QtGui.QTableWidgetItem(str(obj[3]))) self.tableProductos.setItem(n, 4, QtGui.QTableWidgetItem(str(0))) self.tableProductos.setItem(n, 5, QtGui.QTableWidgetItem(str(obj[4]))) for row,producto in enumerate(ProductoModel.buscarTodos(ProductoModel.codigo_barra,self.sesion)): self.tableProductos.setItem(row,6,QtGui.QTableWidgetItem(str(producto.getCantidad(self.sesion)))) def cargarObra(self): rowActual=self.tableObra.currentItem().row() self.lineObra.setText(str(self.tableObra.item(rowActual,0).text())) self.lineCuit.setText(str(self.tableObra.item(rowActual,1).text())) self.tableObra.hide() self.lineObra.setEnabled(False) self.lineCuit.setEnabled(False) self.cargar_productos(self.lineObra.text()) self.gbProducto.setVisible(True) def limpiarObra(self): if self.tableObra.isVisible(): #TODO Implementar la busqueda por criterio en la tabla pass else: self.lineObra.clear() self.lineObra.clear() self.lineCuit.clear() self.lineObra.setEnabled(True) self.lineCuit.setEnabled(True) self.tableObra.setVisible(True) self.limpiarTabla(self.tableProductos) self.gbProducto.hide() def validadores(self): pass def cargar_obras(self): self.cargarObjetos(self.tableObra, ObraSocialModel.buscarTodos("razon_social", self.sesion).all(), ("razon_social", "cuit", "direccion") ) def cargar_productos(self, obraSocial): self.limpiarTabla(self.tableProductos) query=self.sesion.query(ProductoModel.codigo_barra,ProductoModel.id_medicamento,ProductoModel.id_presentacion,MonodrogaModel.nombre,DescuentoModel.descuento,ProductoModel.importe).\ join(MedicamentoModel).filter(ProductoModel.id_medicamento==MedicamentoModel.nombre_comercial).\ join(MonodrogaModel).filter(MedicamentoModel.id_monodroga==MonodrogaModel.nombre).\ join(DescuentoModel).filter(DescuentoModel.producto==ProductoModel.codigo_barra).\ filter(DescuentoModel.obra_social==obraSocial, ProductoModel.baja == False) for n, obj in enumerate(query): self.tableProductos.insertRow(n) for m, campo in enumerate(obj): self.tableProductos.setItem(n, m, QtGui.QTableWidgetItem(str(campo))) for row,producto in enumerate(ProductoModel.buscarTodos(ProductoModel.codigo_barra,self.sesion)): self.tableProductos.setItem(row,6,QtGui.QTableWidgetItem(str(producto.getCantidad(self.sesion)))) 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() 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: cantidadProducto=int(self.tableProductos.item(itemActual.row(),6).text()) if cantidad>cantidadProducto: QtGui.QMessageBox.information(self,"Aviso","La cantidad ingresada es mayor que la del stock") else: if self.productosAgregados==0: self.factura=FacturaModel(FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.productosAgregados+=1 rowItemActual=itemActual.row() rows=self.tableFactura.rowCount() self.tableFactura.insertRow(rows) #TODO HAY QUE CARGAR LOS DEMAS DATOS DE LA FACTURA #--Carga de items en la tabla--* importeActual=float(self.tableProductos.item(rowItemActual,5).text()) descuentoActual=float(self.tableProductos.item(rowItemActual,4).text()) subtotal=importeActual*(1-descuentoActual) ####-------------------------##### detalleFactura=DetalleFacturaModel(self.factura.numero,int(self.tableProductos.item(rowItemActual,0).text()),cantidad, subtotal*cantidad,descuentoActual,self.productosAgregados ) self.descontarCantidad(detalleFactura,int(self.tableProductos.item(rowItemActual,0).text()),cantidad) self.tableFactura.setItem(rows,0,QtGui.QTableWidgetItem(str(detalleFactura.producto))) self.tableFactura.setItem(rows,1,QtGui.QTableWidgetItem(str(detalleFactura.cantidad))) self.tableFactura.setItem(rows, 2, QtGui.QTableWidgetItem(str("%.2f"%(subtotal*cantidad)))) detalleFactura.guardar(self.sesion) if self.obraSocialSeleccionada!=None: self.cargar_productos(str(self.lineObra.text())) else: self.cargarProductosSinObra() def limpiarVentana(self): self.lineObra.clear() self.lineObra.setEnabled(True) self.lineCuit.clear() self.lineCuit.setEnabled(True) self.tableObra.setVisible(False) self.limpiarTabla(self.tableProductos) self.limpiarTabla(self.tableFactura) self.cargarProductosSinObra() self.obraSocialSeleccionada=None def cancelarOperacion(self): if self.factura!=None: ok=QtGui.QMessageBox.warning(self,"Aviso","¿Desea anular la factura creada?") if ok: self.factura.anular() QtGui.QMessageBox.information(self,"Aviso","Factura Anulada") for detalle in self.lotesVentas: for loteVenta in self.lotesVentas[detalle]: loteVenta[0].aumentarCantidad(loteVenta[1]) loteVenta[0].modificar(self.sesion) self.lotesVentas={} self.factura=None self.productosAgregados=0 self.limpiarVentana() def calcularTotal(self): subtotales=[] for row in range(0,self.tableFactura.rowCount()): subtotales.append(float(self.tableFactura.item(row,2).text())) importeTotal=sum(subtotales) return importeTotal def cobrarEfectivo(self): efectivo,ok=QtGui.QInputDialog.getText(self,"Cobro Efectivo",("El importe total es: $%.2f. Por favor ingrese monto" % self.calcularTotal())) try: if float(efectivo)>self.calcularTotal(): QtGui.QMessageBox.information(self,"Cobro Efectivo","Su vuelto es:%.2f" % (float(efectivo)-self.calcularTotal())) cobroCliente=CobroClienteModel(CobroClienteModel.obtenerNumero(self.sesion),self.factura.numero,"Efectivo",self.calcularTotal()) cobroCliente.guardar(self.sesion) self.facturaCobrada=True except ValueError: pass def cobrarTarjDebito(self): efectivo,ok=QtGui.QInputDialog.getText(self,"Cobro Tarjeta Debito",("El importe total es: $%.2f. Por favor ingrese monto" % self.calcularTotal())) try: if float(efectivo)==self.calcularTotal(): cobroCliente=CobroClienteModel(CobroClienteModel.obtenerNumero(self.sesion),self.factura.numero,"Tarjeta Debito",self.calcularTotal()) cobroCliente.guardar(self.sesion) self.facturaCobrada=True else: QtGui.QMessageBox.information(self,"Aviso","El monto ingresado no coincide con el total de la factura") except ValueError: pass def cobrarNC(self): print ("Cobro con NC") def cobrarTarjCredito(self): print("Cobro con Tarj de Credito") def cobrar(self): opcionActual=str(self.cboPago.currentText()) if opcionActual=="Efectivo": self.cobrarEfectivo() elif opcionActual=="Nota de Crédito": self.cobrarNC() elif opcionActual=="Tarjeta de Débito": self.cobrarTarjDebito() else: self.cobrarTarjCredito() #TODO Hay que buscar todos los detalles asociados a la nota de credito y fijarse si esta completa o no def confirmarOperacion(self): if self.factura==None: QtGui.QMessageBox.information(self,"Aviso","No se ha efectuado ninguna venta") else: self.cobrar() if self.facturaCobrada: QtGui.QMessageBox.information(self,"Venta","La venta se ha realizado con exito") self.factura=None self.productosAgregados=0 self.limpiarVentana() else: QtGui.QMessageBox.information(self,"Aviso","La factura aun no ha sido cobrada")
class VentaContado(MdiWidget, Ui_vtnVentaContado): def __init__(self, mdi): MdiWidget.__init__(self, mdi) self.sesion = self.mdi().window().getSesionBD() self.validadores() self.cargar_obras() self.lineCuit.setEnabled(False) self.lineObra.setEnabled(False) self.btnBuscar.setEnabled(False) self.tableObra.setVisible(False) self.tableObra.itemDoubleClicked.connect(self.cargarObra) self.tableProductos.itemDoubleClicked.connect(self.agregarProducto) self.btnBuscar.pressed.connect(self.limpiarObra) self.productosAgregados = 0 self.btnAceptar.pressed.connect(self.confirmarOperacion) self.btnCancelar.pressed.connect(self.cancelarOperacion) self.rbtnObra.pressed.connect(self.habilitarObras) self.btnActualizar.pressed.connect(self.actualizar) self.lotesVentas = {} self.facturaCobrada = False self.obraSocialSeleccionada = None self.factura = None self.cargarProductosSinObra() def actualizar(self): if self.obraSocialSeleccionada != None: self.cargar_productos(self.obraSocialSeleccionada) else: self.cargarProductosSinObra() for row, producto in enumerate( ProductoModel.buscarTodos(ProductoModel.codigo_barra, self.sesion)): self.tableProductos.setItem( row, 6, QtGui.QTableWidgetItem(str(producto.getCantidad(self.sesion)))) def habilitarObras(self): if self.factura != None: QtGui.QMessageBox.information( self, "Aviso", "Ya existe una factura. " "No se puede seleccionar otra obra social") else: if not self.rbtnObra.isChecked(): self.btnBuscar.setEnabled(True) self.lineObra.setEnabled(True) self.lineCuit.setEnabled(True) self.tableObra.setVisible(True) else: self.lineObra.clear() self.lineCuit.clear() self.btnBuscar.setEnabled(False) self.lineObra.setEnabled(False) self.lineCuit.setEnabled(False) self.tableObra.setVisible(False) self.obraSocialSeleccionada = None self.cargarProductosSinObra() def cargarProductosSinObra(self): self.limpiarTabla(self.tableProductos) query=self.sesion.query(ProductoModel.codigo_barra,ProductoModel.id_medicamento,ProductoModel.id_presentacion,MonodrogaModel.nombre,ProductoModel.importe).\ join(MedicamentoModel).filter(ProductoModel.id_medicamento==MedicamentoModel.nombre_comercial).\ join(MonodrogaModel).filter(MedicamentoModel.id_monodroga==MonodrogaModel.nombre).\ filter(ProductoModel.baja == False) for n, obj in enumerate(query): self.tableProductos.insertRow(n) self.tableProductos.setItem(n, 0, QtGui.QTableWidgetItem(str(obj[0]))) self.tableProductos.setItem(n, 1, QtGui.QTableWidgetItem(str(obj[1]))) self.tableProductos.setItem(n, 2, QtGui.QTableWidgetItem(str(obj[2]))) self.tableProductos.setItem(n, 3, QtGui.QTableWidgetItem(str(obj[3]))) self.tableProductos.setItem(n, 4, QtGui.QTableWidgetItem(str(0))) self.tableProductos.setItem(n, 5, QtGui.QTableWidgetItem(str(obj[4]))) for row, producto in enumerate( ProductoModel.buscarTodos(ProductoModel.codigo_barra, self.sesion)): self.tableProductos.setItem( row, 6, QtGui.QTableWidgetItem(str(producto.getCantidad(self.sesion)))) def cargarObra(self): rowActual = self.tableObra.currentItem().row() self.lineObra.setText(str(self.tableObra.item(rowActual, 0).text())) self.lineCuit.setText(str(self.tableObra.item(rowActual, 1).text())) self.tableObra.hide() self.lineObra.setEnabled(False) self.lineCuit.setEnabled(False) self.cargar_productos(self.lineObra.text()) self.gbProducto.setVisible(True) def limpiarObra(self): if self.tableObra.isVisible(): #TODO Implementar la busqueda por criterio en la tabla pass else: self.lineObra.clear() self.lineObra.clear() self.lineCuit.clear() self.lineObra.setEnabled(True) self.lineCuit.setEnabled(True) self.tableObra.setVisible(True) self.limpiarTabla(self.tableProductos) self.gbProducto.hide() def validadores(self): pass def cargar_obras(self): self.cargarObjetos( self.tableObra, ObraSocialModel.buscarTodos("razon_social", self.sesion).all(), ("razon_social", "cuit", "direccion")) def cargar_productos(self, obraSocial): self.limpiarTabla(self.tableProductos) query=self.sesion.query(ProductoModel.codigo_barra,ProductoModel.id_medicamento,ProductoModel.id_presentacion,MonodrogaModel.nombre,DescuentoModel.descuento,ProductoModel.importe).\ join(MedicamentoModel).filter(ProductoModel.id_medicamento==MedicamentoModel.nombre_comercial).\ join(MonodrogaModel).filter(MedicamentoModel.id_monodroga==MonodrogaModel.nombre).\ join(DescuentoModel).filter(DescuentoModel.producto==ProductoModel.codigo_barra).\ filter(DescuentoModel.obra_social==obraSocial, ProductoModel.baja == False) for n, obj in enumerate(query): self.tableProductos.insertRow(n) for m, campo in enumerate(obj): self.tableProductos.setItem(n, m, QtGui.QTableWidgetItem(str(campo))) for row, producto in enumerate( ProductoModel.buscarTodos(ProductoModel.codigo_barra, self.sesion)): self.tableProductos.setItem( row, 6, QtGui.QTableWidgetItem(str(producto.getCantidad(self.sesion)))) 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() 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: cantidadProducto = int( self.tableProductos.item(itemActual.row(), 6).text()) if cantidad > cantidadProducto: QtGui.QMessageBox.information( self, "Aviso", "La cantidad ingresada es mayor que la del stock") else: if self.productosAgregados == 0: self.factura = FacturaModel( FacturaModel.generarNumero(self.sesion)) self.factura.guardar(self.sesion) self.productosAgregados += 1 rowItemActual = itemActual.row() rows = self.tableFactura.rowCount() self.tableFactura.insertRow(rows) #TODO HAY QUE CARGAR LOS DEMAS DATOS DE LA FACTURA #--Carga de items en la tabla--* importeActual = float( self.tableProductos.item(rowItemActual, 5).text()) descuentoActual = float( self.tableProductos.item(rowItemActual, 4).text()) subtotal = importeActual * (1 - descuentoActual) ####-------------------------##### detalleFactura = DetalleFacturaModel( self.factura.numero, int(self.tableProductos.item(rowItemActual, 0).text()), cantidad, subtotal * cantidad, descuentoActual, self.productosAgregados) self.descontarCantidad( detalleFactura, int(self.tableProductos.item(rowItemActual, 0).text()), cantidad) self.tableFactura.setItem( rows, 0, QtGui.QTableWidgetItem(str(detalleFactura.producto))) self.tableFactura.setItem( rows, 1, QtGui.QTableWidgetItem(str(detalleFactura.cantidad))) self.tableFactura.setItem( rows, 2, QtGui.QTableWidgetItem(str("%.2f" % (subtotal * cantidad)))) detalleFactura.guardar(self.sesion) if self.obraSocialSeleccionada != None: self.cargar_productos(str(self.lineObra.text())) else: self.cargarProductosSinObra() def limpiarVentana(self): self.lineObra.clear() self.lineObra.setEnabled(True) self.lineCuit.clear() self.lineCuit.setEnabled(True) self.tableObra.setVisible(False) self.limpiarTabla(self.tableProductos) self.limpiarTabla(self.tableFactura) self.cargarProductosSinObra() self.obraSocialSeleccionada = None def cancelarOperacion(self): if self.factura != None: ok = QtGui.QMessageBox.warning( self, "Aviso", "¿Desea anular la factura creada?") if ok: self.factura.anular() QtGui.QMessageBox.information(self, "Aviso", "Factura Anulada") for detalle in self.lotesVentas: for loteVenta in self.lotesVentas[detalle]: loteVenta[0].aumentarCantidad(loteVenta[1]) loteVenta[0].modificar(self.sesion) self.lotesVentas = {} self.factura = None self.productosAgregados = 0 self.limpiarVentana() def calcularTotal(self): subtotales = [] for row in range(0, self.tableFactura.rowCount()): subtotales.append(float(self.tableFactura.item(row, 2).text())) importeTotal = sum(subtotales) return importeTotal def cobrarEfectivo(self): efectivo, ok = QtGui.QInputDialog.getText( self, "Cobro Efectivo", ("El importe total es: $%.2f. Por favor ingrese monto" % self.calcularTotal())) try: if float(efectivo) > self.calcularTotal(): QtGui.QMessageBox.information( self, "Cobro Efectivo", "Su vuelto es:%.2f" % (float(efectivo) - self.calcularTotal())) cobroCliente = CobroClienteModel( CobroClienteModel.obtenerNumero(self.sesion), self.factura.numero, "Efectivo", self.calcularTotal()) cobroCliente.guardar(self.sesion) self.facturaCobrada = True except ValueError: pass def cobrarTarjDebito(self): efectivo, ok = QtGui.QInputDialog.getText( self, "Cobro Tarjeta Debito", ("El importe total es: $%.2f. Por favor ingrese monto" % self.calcularTotal())) try: if float(efectivo) == self.calcularTotal(): cobroCliente = CobroClienteModel( CobroClienteModel.obtenerNumero(self.sesion), self.factura.numero, "Tarjeta Debito", self.calcularTotal()) cobroCliente.guardar(self.sesion) self.facturaCobrada = True else: QtGui.QMessageBox.information( self, "Aviso", "El monto ingresado no coincide con el total de la factura" ) except ValueError: pass def cobrarNC(self): print("Cobro con NC") def cobrarTarjCredito(self): print("Cobro con Tarj de Credito") def cobrar(self): opcionActual = str(self.cboPago.currentText()) if opcionActual == "Efectivo": self.cobrarEfectivo() elif opcionActual == "Nota de Crédito": self.cobrarNC() elif opcionActual == "Tarjeta de Débito": self.cobrarTarjDebito() else: self.cobrarTarjCredito() #TODO Hay que buscar todos los detalles asociados a la nota de credito y fijarse si esta completa o no def confirmarOperacion(self): if self.factura == None: QtGui.QMessageBox.information(self, "Aviso", "No se ha efectuado ninguna venta") else: self.cobrar() if self.facturaCobrada: QtGui.QMessageBox.information( self, "Venta", "La venta se ha realizado con exito") self.factura = None self.productosAgregados = 0 self.limpiarVentana() else: QtGui.QMessageBox.information( self, "Aviso", "La factura aun no ha sido cobrada")