示例#1
0
 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()
示例#2
0
 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()
示例#3
0
    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()
示例#4
0
    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"])
示例#5
0
 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"])
示例#6
0
    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()
示例#7
0
    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
示例#8
0
    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()
示例#9
0
 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()
示例#10
0
 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"])
示例#11
0
 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"])
示例#12
0
 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"])
示例#13
0
 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"])
示例#14
0
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)
示例#15
0
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()
示例#16
0
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)
示例#17
0
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)
示例#18
0
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")
示例#19
0
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")