示例#1
0
    def __init__( self, datos_sesion, parent, edit = False ):
        u'''
        @param datos_sesion: La información de la sesion de caja
        '''
        super( FrmArqueo, self ).__init__( parent, True )
        self.sesion = datos_sesion
        self.setWindowModality( Qt.WindowModal )
        self.setWindowFlags( Qt.Dialog )
#        self.status = False 

        self.__dolar_proxy = ArqueoProxyModel()
        self.__cordoba_proxy = ArqueoProxyModel()
                    
        
        self.editmodel = None

#        El modelo principal
        self.navmodel = QSqlQueryModel( self )
    #        El modelo que filtra a self.navmodel
        self.navproxymodel = QSortFilterProxyModel( self )
        self.__details_proxymodel_d = QSortFilterProxyModel( self )
        self.__details_proxymodel_c = QSortFilterProxyModel( self )
        
        
        self.navproxymodel.setSourceModel( self.navmodel )
#        Este es el modelo con los datos de la tabla con los detalles
        self.detailsModel = QSqlQueryModel( self )
#        Este es el filtro del modelo anterior
        self.detailsproxymodel = QSortFilterProxyModel( self )
        self.detailsproxymodel.setSourceModel( self.detailsModel )

        #filtrar en dolares y en cordobas
        
        self.__details_proxymodel_d.setSourceModel( self.detailsproxymodel )
        self.__details_proxymodel_d.setFilterKeyColumn( MONEDA )
        self.__details_proxymodel_d.setFilterRegExp( "^%d$" % constantes.IDDOLARES )

    
        self.__details_proxymodel_c.setSourceModel( self.detailsproxymodel )
        self.__details_proxymodel_c.setFilterKeyColumn( MONEDA )
        self.__details_proxymodel_c.setFilterRegExp( "^%d$" % constantes.IDCORDOBAS )
           
        
        
        if edit:
            self.status = False
            self.newDocument()
            self.actionCancel.setVisible(False)
            self.tabWidget.setTabEnabled(1,False)
        else:
            self.status = True
            QTimer.singleShot( 0, self.loadModels )
示例#2
0
class FrmArqueo( Ui_frmArqueo, Base ):
    '''
    Esta clase implementa el formulario arqueo
    '''
    web = "arqueos.php?doc="
    def __init__( self, datos_sesion, parent, edit = False ):
        u'''
        @param datos_sesion: La información de la sesion de caja
        '''
        super( FrmArqueo, self ).__init__( parent, True )
        self.sesion = datos_sesion
        self.setWindowModality( Qt.WindowModal )
        self.setWindowFlags( Qt.Dialog )
#        self.status = False 

        self.__dolar_proxy = ArqueoProxyModel()
        self.__cordoba_proxy = ArqueoProxyModel()
                    
        
        self.editmodel = None

#        El modelo principal
        self.navmodel = QSqlQueryModel( self )
    #        El modelo que filtra a self.navmodel
        self.navproxymodel = QSortFilterProxyModel( self )
        self.__details_proxymodel_d = QSortFilterProxyModel( self )
        self.__details_proxymodel_c = QSortFilterProxyModel( self )
        
        
        self.navproxymodel.setSourceModel( self.navmodel )
#        Este es el modelo con los datos de la tabla con los detalles
        self.detailsModel = QSqlQueryModel( self )
#        Este es el filtro del modelo anterior
        self.detailsproxymodel = QSortFilterProxyModel( self )
        self.detailsproxymodel.setSourceModel( self.detailsModel )

        #filtrar en dolares y en cordobas
        
        self.__details_proxymodel_d.setSourceModel( self.detailsproxymodel )
        self.__details_proxymodel_d.setFilterKeyColumn( MONEDA )
        self.__details_proxymodel_d.setFilterRegExp( "^%d$" % constantes.IDDOLARES )

    
        self.__details_proxymodel_c.setSourceModel( self.detailsproxymodel )
        self.__details_proxymodel_c.setFilterKeyColumn( MONEDA )
        self.__details_proxymodel_c.setFilterRegExp( "^%d$" % constantes.IDCORDOBAS )
           
        
        
        if edit:
            self.status = False
            self.newDocument()
            self.actionCancel.setVisible(False)
            self.tabWidget.setTabEnabled(1,False)
        else:
            self.status = True
            QTimer.singleShot( 0, self.loadModels )

    def updateModels( self ):
        try:
            if not self.database.isOpen():
                if not self.database.open():
                    raise UserWarning( "No se pudo abrir la base de datos" )

            #TODO: Esta consulta tiene que mejorar para definir realmente quien es el que realiza el arqueo
            query = u"""
            SELECT
                d.iddocumento,
                d.fechacreacion ,
                p.nombre AS 'Arqueador',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGOEFECTIVO ) + """ AND mc.idtipomoneda = """ + str( constantes.IDCORDOBAS ) + """, mc.monto, 0)),4) AS 'efectivoc',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGOEFECTIVO ) + """ AND mc.idtipomoneda = """ + str( constantes.IDDOLARES ) + """, mc.monto, 0)),4) AS 'efectivod',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGOCHEQUE ) + """ AND mc.idtipomoneda = """ + str( constantes.IDCORDOBAS ) + """, mc.monto, 0)),4) AS 'chequec',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGOCHEQUE ) + """ AND mc.idtipomoneda = """ + str( constantes.IDDOLARES ) + """, mc.monto, 0)),4) AS 'chequed',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGODEPOSITO ) + """ AND mc.idtipomoneda = """ + str( constantes.IDCORDOBAS ) + """, mc.monto, 0)),4) AS 'depositoc',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGODEPOSITO ) + """ AND mc.idtipomoneda = """ + str( constantes.IDDOLARES ) + """, mc.monto, 0)),4) AS 'depositod',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGOTRANSFERENCIA ) + """ AND mc.idtipomoneda = """ + str( constantes.IDCORDOBAS ) + """, mc.monto, 0)),4) AS 'transferenciac',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGOTRANSFERENCIA ) + """ AND mc.idtipomoneda = """ + str( constantes.IDDOLARES ) + """, mc.monto, 0)),4) AS 'transferenciad',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGOTARJETA ) + """ AND mc.idtipomoneda = """ + str( constantes.IDCORDOBAS ) + """, mc.monto, 0)),4) AS 'tarjetac',
                FORMAT(SUM(IF(mc.idtipomovimiento = """ + str( constantes.IDPAGOTARJETA ) + """ AND mc.idtipomoneda = """ + str( constantes.IDDOLARES ) + """, mc.monto, 0)),4) AS 'tarjetad'
            FROM documentos d
            JOIN movimientoscaja mc ON mc.iddocumento = d.iddocumento
            JOIN tiposmoneda tm ON mc.idtipomoneda = tm.idtipomoneda
            JOIN personasxdocumento pxd ON pxd.iddocumento = d.iddocumento
            JOIN personas p ON p.idpersona = pxd.idpersona
            WHERE d.idtipodoc =  %d
            GROUP BY d.iddocumento
            """ % ( constantes.IDARQUEO )
            self.navmodel.setQuery( query )

            self.detailsModel.setQuery( u"""
            SELECT
                l.cantidad AS 'Cantidad',
                CONCAT_WS(' ',tm.simbolo, CAST(de.valor AS CHAR)) as 'Denominación',
                FORMAT(l.cantidad * de.valor, 4) as 'Total',
                de.idtipomoneda,
                l.iddocumento
            FROM lineasarqueo l
            JOIN denominaciones de ON de.iddenominacion = l.iddenominacion
            JOIN tiposmoneda tm ON de.idtipomoneda = tm.idtipomoneda
            JOIN documentos d ON d.iddocumento = l.iddocumento
            JOIN tiposcambio tc ON d.idtipocambio = tc.idtc
            """ )

            self.mapper.setSubmitPolicy( QDataWidgetMapper.ManualSubmit )
            self.mapper.setModel( self.navproxymodel )
            self.mapper.addMapping( self.dtPicker, FECHA )
            self.mapper.addMapping( self.lblUserName, NOMBRE, "value" )
            self.mapper.addMapping( self.sbCkC, CHEQUEC, "value" )
            self.mapper.addMapping( self.sbCkD, CHEQUED, "value" )
            self.mapper.addMapping( self.sbCardC, TARJETAC, "value" )
            self.mapper.addMapping( self.sbCardD, TARJETAD, "value" )
            self.mapper.addMapping( self.sbDepositC, DEPOSITOC, "value" )
            self.mapper.addMapping( self.sbDepositD, DEPOSITOD, "value" )
            self.mapper.addMapping( self.sbTransferC  , TRANSFERENCIAC, "value" )
            self.mapper.addMapping( self.sbTransferD  , TRANSFERENCIAD, "value" )



        except UserWarning as inst:
            logging.error( unicode( inst ) )
            QMessageBox.critical( self, qApp.organizationName(), unicode( inst ) )
        except Exception as inst:
            logging.critical( unicode( inst ) )
        finally:
            if self.database.isOpen():
                self.database.close()

    def updateDetailFilter( self, index ):
        self.detailsproxymodel.setFilterKeyColumn( IDDOCUMMENTOT )
        self.detailsproxymodel.setFilterRegExp( self.navmodel.record( index ).value( IDDOCUMMENTO ).toString() )
        self.tablenavigation.selectRow( self.mapper.currentIndex() )

    def setControls( self, status ):
        """
        @param status: false = editando true = navegando 
        """
        self.actionPrint.setVisible( status )
        self.tablenavigation.setEnabled( status )
        self.tabnavigation.setEnabled( status )

        self.actionNew.setVisible( status )
        self.actionPreview.setVisible( status )

        self.actionCancel.setVisible( not status )
        self.actionSave.setVisible( not status )
        self.actionGoFirst.setVisible(  status )
        self.actionGoLast.setVisible(  status )
        self.actionGoNext.setVisible(  status )
        self.actionGoPrevious.setVisible(  status )

        self.sbCkD.setReadOnly( status )
        self.sbCkC.setReadOnly( status )
        self.sbCardD.setReadOnly( status )
        self.sbCardC.setReadOnly( status )
        self.sbDepositD.setReadOnly( status )
        self.sbDepositC.setReadOnly( status )
        self.sbTransferD.setReadOnly( status )
        self.sbTransferC.setReadOnly( status )

        self.txtObservations.setReadOnly( status )

        self.tablenavigation.setColumnHidden( IDDOCUMMENTO, True )


        if not self.status:
            self.tabledetailsC.setEditTriggers( QTableView.AllEditTriggers )
            self.tabledetailsC.setColumnHidden( IDDOCUMMENTOT, False )
            self.tabledetailsD.setEditTriggers( QTableView.AllEditTriggers )
            self.tabledetailsD.setColumnHidden( IDDOCUMMENTOT, False )
            self.tabWidget.setCurrentIndex( 0 )

            self.tabledetailsC.setColumnHidden( IDDOCUMMENTOT, True )
            self.tabledetailsC.setColumnHidden( IDDENOMINACION, True )

            self.tabledetailsD.setColumnHidden( IDDOCUMMENTOT, True )
            self.tabledetailsD.setColumnHidden( IDDENOMINACION, True )


#            doublevalidator = QDoubleValidator(0, 99999999, 4, self)

        else:
            self.tabledetailsC.setModel( self.__details_proxymodel_c )
            self.tabledetailsD.setModel( self.__details_proxymodel_d )


            self.tablenavigation.setModel( self.navproxymodel )
            self.tablenavigation.setColumnHidden( IDDOCUMMENTO, True )



            self.tabledetailsC.setColumnHidden( IDDOCUMMENTOT, True )
            self.tabledetailsC.setColumnHidden( IDDENOMINACION, True )

            self.tabledetailsD.setColumnHidden( IDDOCUMMENTOT, True )
            self.tabledetailsD.setColumnHidden( IDDENOMINACION, True )




        self.tabledetailsC.setColumnHidden( MONEDA, True )
        self.tabledetailsD.setColumnHidden( MONEDA, True )

    def updateLabels( self ):
        self.lblCashC.setText( "%s / %s" % ( 
                        moneyfmt( self.editmodel.totalCashC, 4, "C$" ),
                        moneyfmt( self.editmodel.expectedCashC, 4, "C$" ) )
        )
        self.lblCashD.setText( "%s / %s" % ( 
                        moneyfmt( self.editmodel.totalCashD, 4, "US$" ),
                        moneyfmt( self.editmodel.expectedCashD, 4, "US$" ) )
        )

        self.lblCkC.setText( moneyfmt( self.editmodel.expectedCkC, 4, "C$" ) )
        self.lblCkD.setText( moneyfmt( self.editmodel.expectedCkD, 4, "US$" ) )

        self.lblCardC.setText( 
                        moneyfmt( self.editmodel.expectedCardC, 4, "C$" ) )
        self.lblCardD.setText( 
                        moneyfmt( self.editmodel.expectedCardD, 4, "US$" ) )

        self.lblDepositC.setText( 
                         moneyfmt( self.editmodel.expectedDepositC, 4, "C$" ) )
        self.lblDepositD.setText( 
                         moneyfmt( self.editmodel.expectedDepositD, 4, "US$" ) )

        self.lblTransferC.setText( 
                          moneyfmt( self.editmodel.expectedDepositC, 4, "C$" ) )
        self.lblTransferD.setText( 
                          moneyfmt( self.editmodel.expectedDepositD, 4, "US$" ) )

    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()

    @pyqtSlot( QDateTime )
    def on_dtPicker_dateTimeChanged( self, datetime ):
        pass

    def cancel( self ):
        self.editmodel = None

        self.status = True
        self.navigate( 'last' )

    def save( self ):
        """
        Redefiniendo el metodo save de Base para mostrar 
        advertencias si el arqueo no concuerda
        """
        try:
            errors = []

            if not self.editmodel.totalCashC == self.editmodel.expectedCashC:
                errors.append( u"El total de efectivo en cordobas del arqueo no coincide con el de la sesión" )
            if not self.editmodel.totalCashD == self.editmodel.expectedCashD:
                errors.append( u"El total de efectivo en dolares del arqueo no coincide con el de la sesión" )
            if not self.editmodel.totalCkD == self.editmodel.expectedCkD:
                errors.append( u"El total de cheques en dolares del arqueo no coincide con el de la sesión" )
            if not self.editmodel.totalCkC == self.editmodel.expectedCkC:
                errors.append( u"El total de cheques en cordobas del arqueo no coincide con el de la sesión" )
            if not self.editmodel.totalTransferD == self.editmodel.expectedTransferD:
                errors.append( u"El total de transferencias en dolares del arqueo no coincide con el de la sesión" )
            if not self.editmodel.totalTransferC == self.editmodel.expectedTransferC:
                errors.append( u"El total de transferencias en cordobas del arqueo no coincide con el de la sesión" )
            if not self.editmodel.totalDepositD == self.editmodel.expectedDepositD:
                errors.append( u"El total de depositos en dolares del arqueo no coincide con el de la sesión" )
            if not self.editmodel.totalDepositC == self.editmodel.expectedDepositC:
                errors.append( u"El total de depositos en cordobas del arqueo no coincide con el de la sesión" )
            if not self.editmodel.totalCardD == self.editmodel.expectedDepositD:
                errors.append( u"El total de pagos en tarjetas en dolares del arqueo no coincide con el de la sesión" )
            if not self.editmodel.totalCardD == self.editmodel.expectedDepositC:
                errors.append( u"El total de pagos en tarjetas en cordobas del arqueo no coincide con el de la sesión" )

            if len( errors ) > 0:
                raise UserWarning( "\n".join( errors ) )
            dlgUser = dlgSmallUserLogin()
            if dlgUser.exec_() == QDialog.Accepted:
                if dlgUser.user.valid and dlgUser.user.hasRole( 'gerencia' ):
                    self.editmodel.authorizationId = dlgUser.user.uid
                    super( FrmArqueo, self ).save( False )
                    self.parentWindow.init()
                    self.close()
                else:
                    QMessageBox.warning( self, qApp.organizationName(), "No se pudo autorizar el arqueo" )
        except UserWarning as inst:
            if not self.editmodel.observations == "":
                if QMessageBox.question( self, qApp.organizationName(), unicode( inst ) + u"\n¿Desea Continuar?", QMessageBox.Yes | QMessageBox.No ) == QMessageBox.Yes:
                    dlgUser = dlgSmallUserLogin()
                    if dlgUser.exec_() == QDialog.Accepted:
                        if dlgUser.user.valid and dlgUser.user.hasRole( 'gerencia' ):
                            self.editmodel.authorizationId = dlgUser.user.uid
                            super( FrmArqueo, self ).save( False )
                            self.parentWindow.init()
                            self.close()
                        else:
                            QMessageBox.warning( self,
                                                 qApp.organizationName(),
                                                 "No se pudo autorizar "
                                                 + "el arqueo" )
            else:
                QMessageBox.warning( self,
                                     qApp.organizationName(),
                                     unicode( inst )\
                                     + u"\n Por favor especifique el motivo"
                                     + " de la diferencia" )

    @property
    def printIdentifier( self ):
        return self.navmodel.record( self.mapper.currentIndex() ).value( "iddocumento" ).toString()

    def navigate( self, to ):
        """
        Esta funcion se encarga de navegar entro los distintos documentos
        @param to: es una string que puede tomar los valores 'next' 'previous' 'first' 'last'
        """
        if self.mapper.currentIndex != -1:
            row = self.mapper.currentIndex()
            if to == "next":
                row += 1
                if row >= self.navproxymodel.rowCount():
                    row = self.navproxymodel.rowCount() - 1
                self.mapper.setCurrentIndex( row )
            elif to == "previous":
                if row <= 1: row = 0
                else: row = row - 1
                self.mapper.setCurrentIndex( row )
            elif to == "first":
                self.mapper.toFirst()
            elif to == "last":
                self.mapper.toLast()
        else:
            self.mapper.toLast()()

        self.tabledetailsC.resizeColumnsToContents()
        self.tabledetailsC.horizontalHeader().setStretchLastSection( True )
        self.tabledetailsD.resizeColumnsToContents()
        self.tabledetailsD.horizontalHeader().setStretchLastSection( True )
        self.tablenavigation.selectRow( self.mapper.currentIndex() )




    @pyqtSlot( float )
    @if_edit_model
    def on_sbCkD_valueChanged( self, value ):
        self.editmodel.totalCkD = Decimal( str( value ) )

    @pyqtSlot( float )
    @if_edit_model
    def on_sbCkC_valueChanged( self, value ):
        self.editmodel.totalCkC = Decimal( str( value ) )

    @pyqtSlot( float )
    @if_edit_model
    def on_sbCardD_valueChanged( self, value ):
        self.editmodel.totalCardD = Decimal( str( value ) )

    @pyqtSlot( float )
    @if_edit_model
    def on_sbCardC_valueChanged( self, value ):
        self.editmodel.totalCardC = Decimal( str( value ) )

    @pyqtSlot( float )
    @if_edit_model
    def on_sbDepositD_valueChanged( self, value ):
        self.editmodel.totalDepositD = Decimal( str( value ) )

    @pyqtSlot( float )
    @if_edit_model
    def on_sbDepositC_valueChanged( self, value ):
        self.editmodel.totalDepositC = Decimal( str( value ) )

    @pyqtSlot( float )
    @if_edit_model
    def on_sbTransferD_valueChanged( self, value ):
        self.editmodel.totalTransferD = Decimal( str( value ) )

    @pyqtSlot( float )
    @if_edit_model
    def on_sbTransferC_valueChanged( self, value ):
        self.editmodel.totalTransferC = Decimal( str( value ) )