def updateEditModels( self ): # Rellenar el combobox de los proveedores self.providersModel.setQuery( """ SELECT idpersona , nombre AS proveedor FROM personas WHERE tipopersona = 2 """ ) if not self.providersModel.rowCount( QModelIndex() ) > 0: raise UserWarning( "No existen proveedores en la base de datos" ) self.cbProvider.setModel( self.providersModel ) self.cbProvider.setModelColumn( 1 ) completer = QCompleter() completer.setCaseSensitivity( Qt.CaseInsensitive ) completer.setModel( self.providersModel ) completer.setCompletionColumn( 1 ) self.editmodel.providerId = self.providersModel.record( self.cbProvider.currentIndex() ).value( "idpersona" ).toInt()[0] query = QSqlQuery( """ SELECT idarticulo, Descripcion as descripcion FROM vw_articulosdescritos """ ) if not query.size() > 0: raise UserWarning( "No existen productos en la base de datos" ) prods = SingleSelectionModel() query.exec_() while query.next(): prods.items.append( [ query.value( 0 ).toInt()[0], query.value( 1 ).toString() ] ) prods.headers = ["idarticulo", "Articulo"] self.delegate.prods = prods
def __init__( self, query, showTable = False ): ''' @var query: La consulta a partir de la cual se obtienen las cuentas contables para el modelo @type query: string @var showTable: ''' super( AccountsSelectorDelegate, self ).__init__() self.showTable = showTable query.exec_() if not query.size() > 0: raise UserWarning( "No hay cuentas contables con saldo disponible para realizar esta operacion" ) self.accounts = SingleSelectionModel() self.accounts.headers = ["idcuenta", "codigo", "descripcion"] while query.next(): self.accounts.items.append( [ query.value( 0 ).toInt()[0], query.value( 1 ).toString(), query.value( 2 ).toString() ] ) self.proxymodel.setFilterKeyColumn( IDCUENTA )
def newDocument( self ): """ cargar todos los modelos para la edición """ query = QSqlQuery() try: if not self.database.isOpen(): if not self.database.open(): raise UserWarning( u"No se pudo establecer la conexión con la base de datos" ) for window in self.parentWindow.findChild( QMdiArea ).subWindowList(): if window.widget(): raise UserWarning( u"Por favor cierre las otras pestañas" + u" de la aplicación antes de continuar" + " con el arqueo" ) self.editmodel = ArqueoModel( self.sesion ) self.editmodel.datetime.setDate( self.sesion.fecha ) self.editmodel.datetime.setTime( QTime.currentTime() ) self.__dolar_proxy.setSourceModel( self.editmodel ) self.__dolar_proxy.setFilterKeyColumn( MONEDA ) self.__dolar_proxy.setFilterRegExp( r"^%d$" % constantes.IDDOLARES ) self.__dolar_proxy.setDynamicSortFilter( True ) self.__cordoba_proxy.setSourceModel( self.editmodel ) self.__cordoba_proxy.setFilterKeyColumn( MONEDA ) self.__cordoba_proxy.setFilterRegExp( r"^%d$" % constantes.IDCORDOBAS ) self.__cordoba_proxy.setDynamicSortFilter( True ) self.tabledetailsC.setModel( self.__cordoba_proxy ) self.tabledetailsD.setModel( self.__dolar_proxy ) if not self.database.isOpen(): if not self.database.open(): raise UserWarning( "No se pudo conectar con la base de datos" ) #verificar si hay documentos pendientes de aprobación q = """ SELECT CONCAT_WS(' ', td.descripcion, d.ndocimpreso) FROM documentos sesion JOIN docpadrehijos dpd ON dpd.idpadre = sesion.iddocumento JOIN documentos d ON dpd.idhijo = d.iddocumento JOIN tiposdoc td ON td.idtipodoc = d.idtipodoc WHERE d.idestado NOT IN ( %d,%d) """ % ( constantes.CONFIRMADO, constantes.ANULADO ) if not query.exec_( q ): raise Exception( u"No se pudo ejecutar la consulta para "\ + "determinar si existen documentos " + "pendientes de aprobación" ) if not query.size() == 0: raise UserWarning( u"Existen documentos pendientes de "\ + "aprobación en la sesión" ) #Obtener los datos de la sesión q = """ CALL spConsecutivo( %d, NULL ) """ % constantes.IDARQUEO #query.prepare( q ) if not query.exec_( q ): raise Exception( u"No se pudo ejecutar la consulta para "\ + "obtener el numero del arqueo" ) if not query.size() > 0: raise Exception( u"La consulta para obtener el numero del "\ + "arqueo no devolvio ningún valor" ) query.first() self.editmodel.printedDocumentNumber = query.value( 0 ).toString() self.editmodel.exchangeRateId = self.sesion.tipoCambioId self.editmodel.exchangeRate = self.sesion.tipoCambioOficial self.editmodel.datetime.setDate( self.sesion.fecha ) q = """ CALL spTotalesSesion(%d); """ % self.sesion.sesionId if not query.exec_( q ): raise UserWarning( u"No se pudieron calcular los totales"\ + " de la sesión" ) while query.next(): if query.value( 0 ).toInt()[0] == constantes.IDPAGOEFECTIVO and query.value( 2 ).toInt()[0] == constantes.IDDOLARES: self.editmodel.expectedCashD = Decimal( query.value( 5 ).toString() ) elif query.value( 0 ).toInt()[0] == constantes.IDPAGOEFECTIVO and query.value( 2 ).toInt()[0] == constantes.IDCORDOBAS: self.editmodel.expectedCashC = Decimal( query.value( 5 ).toString() ) elif query.value( 0 ).toInt()[0] == constantes.IDPAGOCHEQUE and query.value( 2 ).toInt()[0] == constantes.IDDOLARES: self.editmodel.expectedCkD = Decimal( query.value( 5 ).toString() ) elif query.value( 0 ).toInt()[0] == constantes.IDPAGOCHEQUE and query.value( 2 ).toInt()[0] == constantes.IDCORDOBAS: self.editmodel.expectedCkC = Decimal( query.value( 5 ).toString() ) elif query.value( 0 ).toInt()[0] == constantes.IDPAGODEPOSITO and query.value( 2 ).toInt()[0] == constantes.IDDOLARES: self.editmodel.expectedDepositD = Decimal( query.value( 5 ).toString() ) elif query.value( 0 ).toInt()[0] == constantes.IDPAGODEPOSITO and query.value( 2 ).toInt()[0] == constantes.IDCORDOBAS: self.editmodel.expectedDepositC = Decimal( query.value( 5 ).toString() ) elif query.value( 0 ).toInt()[0] == constantes.IDPAGOTRANSFERENCIA and query.value( 2 ).toInt()[0] == constantes.IDDOLARES: self.editmodel.expectedTransferD = Decimal( query.value( 5 ).toString() ) elif query.value( 0 ).toInt()[0] == constantes.IDPAGOTRANSFERENCIA and query.value( 2 ).toInt()[0] == constantes.IDCORDOBAS: self.editmodel.expectedTransferC = Decimal( query.value( 5 ).toString() ) elif query.value( 0 ).toInt()[0] == constantes.IDPAGOTARJETA and query.value( 2 ).toInt()[0] == constantes.IDDOLARES: self.editmodel.expectedCardD = Decimal( query.value( 5 ).toString() ) elif query.value( 0 ).toInt()[0] == constantes.IDPAGOTARJETA and query.value( 2 ).toInt()[0] == constantes.IDCORDOBAS: self.editmodel.expectedCardC = Decimal( query.value( 5 ).toString() ) q = """ SELECT d.iddenominacion, CONCAT_WS( ' ',d.valor, m.moneda), d.valor, d.idtipomoneda, m.simbolo FROM denominaciones d JOIN tiposmoneda m ON d.idtipomoneda = m.idtipomoneda WHERE d.activo = 1 ORDER BY d.idtipomoneda, d.valor """ if not query.exec_( q ): raise UserWarning( "No se pudo recuperar la lista de " + "denominaciones" ) denominationsmodelC = SingleSelectionModel() denominationsmodelC.headers = ["Id", u"Denominación", "Valor", "Id Moneda", "Simbolo"] denominationsmodelD = SingleSelectionModel() denominationsmodelD.headers = denominationsmodelC.headers while query.next(): if query.value( 3 ).toInt()[0] == constantes.IDDOLARES: denominationsmodelD.items.append( [ query.value( 0 ).toInt()[0], #el id del tipo de denominacion query.value( 1 ).toString(), #La descripción de la denominación query.value( 2 ).toString(), # el valor de la denominación query.value( 3 ).toInt()[0], #El id del tipo de moneda query.value( 4 ).toString() #El simbolo de la moneda ] ) else: denominationsmodelC.items.append( [ query.value( 0 ).toInt()[0], #el id del tipo de denominacion query.value( 1 ).toString(), #La descripción de la denominación query.value( 2 ).toString() , # el valor de la denominación query.value( 3 ).toInt()[0], #El id del tipo de moneda query.value( 4 ).toString() #El simbolo de la moneda ] ) delegateC = ArqueoDelegate( denominationsmodelC ) self.tabledetailsC.setItemDelegate( delegateC ) delegateD = ArqueoDelegate( denominationsmodelD ) self.tabledetailsD.setItemDelegate( delegateD ) self.addLine() self.addLine() self.editmodel.setData( self.editmodel.index( 0, MONEDA ), constantes.IDDOLARES ) self.editmodel.setData( self.editmodel.index( 1, MONEDA ), constantes.IDCORDOBAS ) self.dtPicker.setDateTime( self.editmodel.datetime ) self.lblUserName.setText( self.user.fullname ) self.editmodel.dataChanged[QModelIndex, QModelIndex].connect( self.updateLabels ) self.tabledetailsC.setColumnWidth( DENOMINACION, 200 ) self.tabledetailsD.setColumnWidth( DENOMINACION, 200 ) self.updateLabels() self.status = False except UserWarning as inst: logging.error( unicode( inst ) ) logging.error( query.lastError().text() ) QMessageBox.critical( self, qApp.organizationName(), unicode( inst ) ) self.status = True except Exception as inst: logging.critical( unicode( inst ) ) logging.critical( query.lastError().text() ) QMessageBox.critical( self, qApp.organizationName(), "El sistema no pudo iniciar un nuevo arqueo" ) self.status = True finally: if self.database.isOpen(): self.database.close()
class AccountsSelectorDelegate( SingleSelectionSearchPanelDelegate ): def __init__( self, query, showTable = False ): ''' @var query: La consulta a partir de la cual se obtienen las cuentas contables para el modelo @type query: string @var showTable: ''' super( AccountsSelectorDelegate, self ).__init__() self.showTable = showTable query.exec_() if not query.size() > 0: raise UserWarning( "No hay cuentas contables con saldo disponible para realizar esta operacion" ) self.accounts = SingleSelectionModel() self.accounts.headers = ["idcuenta", "codigo", "descripcion"] while query.next(): self.accounts.items.append( [ query.value( 0 ).toInt()[0], query.value( 1 ).toString(), query.value( 2 ).toString() ] ) self.proxymodel.setFilterKeyColumn( IDCUENTA ) def createEditor( self, parent, option, index ): if index.column() in ( CODCUENTA, NCUENTA ): model = index.model() self.proxymodel.setSourceModel( self.accounts ) current = model.data( model.index( index.row(), IDCUENTA ) ) self.proxymodel.setFilterRegExp( self.filter( model, current ) ) sp = super( AccountsSelectorDelegate, self ).createEditor( parent, option, index ) sp.setColumnHidden( IDCUENTA ) return sp elif index.column() == MONTO: doublespinbox = QDoubleSpinBox( parent ) doublespinbox.setMinimum( -100000000000 ) doublespinbox.setMaximum( 100000000000 ) doublespinbox.setDecimals( 4 ) return doublespinbox def setEditorData( self, editor, index ): if index.column() in ( CODCUENTA, NCUENTA ): model = index.model() current = model.data( model.index( index.row(), IDCUENTA ) ) self.proxymodel.setFilterRegExp( self.filter( model, current ) ) text = index.data( Qt.DisplayRole ).toString() i = editor.findText( text ) if i == -1: i = 0 editor.setCurrentIndex( i ) editor.lineEdit().selectAll() elif index.column() == MONTO: editor.setValue( index.model().data( index, Qt.EditRole ) if index.model().data( index, Qt.EditRole ) != "" else 0 ) else: QStyledItemDelegate.setEditorData( self, editor, index ) def setModelData( self, editor, model, index ): if index.column() in ( NCUENTA, CODCUENTA ): if editor.currentIndex() != -1: proxyindex = self.proxymodel.index( editor.currentIndex() , 0 ) sourceindex = self.proxymodel.mapToSource( proxyindex ) model.setData( index, [ self.accounts.index( sourceindex.row(), 0 ).data().toInt()[0], self.accounts.index( sourceindex.row(), 1 ).data(), self.accounts.index( sourceindex.row(), 2 ).data() ] ) else: QStyledItemDelegate.setModelData( self, editor, model, index ) def sizeHint( self, option, index ): u""" El tamaño sugerido de los datos en el modelo """ fm = option.fontMetrics if index.column() == CODCUENTA: return QSize( 130, fm.height() ) if index.column() == NCUENTA: return QSize( 250, fm.height() ) if index.column() == MONTO: return QSize( 80, fm.height() ) return QStyledItemDelegate.sizeHint( self, option, index )