<?php
/**
 * Copyright 2005-2017 de Solis Soluções Livres Ltda.
 *
 * Este arquivo é parte do programa Gnuteca.
 *
 * O Gnuteca é um software de propriedade da SOLIS, sendo desenvolvido
 * e mantido exclusivamente por esta empresa.
 *
 * A licença de uso está disponível mediante aquisição exclusiva junto à
 * SOLIS. A licença é concedida sem caráter de exclusividade ao licenciado.
 * Os direitos de uso são perpétuos.
 *
 * Embora os códigos fontes sejam fornecidos, o software é de propriedade
 * da SOLIS, não sendo permitido ao adquirente da licença a sua revenda,
 * empréstimo ou cessão (onerosa ou não) à terceiros. Também não é permitido,
 * a qualquer título e tempo, promover no software qualquer tipo de alienação,
 * reprodução, distribuição, divulgação, registro, licenciamento, transferência
 * ou qualquer outro ato que prejudique ou comprometa os direitos de propriedade
 * de software, o nome e a imagem da sua proprietária e do próprio software,
 * além de configurar concorrência à SOLIS.
 *
 * O licenciado, com o acesso ao código fonte do software, terá o direito de
 * promover mudanças no respectivo código. No entanto, nas situações em que ele
 * contar com o suporte oficial prestado pela SOLIS, não poderá promover mudanças
 * no código fonte, sob pena de perda do referido suporte.
 *
 * Para conhecer em detalhes o Termo de Licenciamento do Software Gnuteca
 * leia o arquivo “LICENCA.txt” disponível junto ao código deste software.
 * 
 * 
 *
 *
 *
 *
 *
 **/
$MIOLO->getClass('gnuteca3', 'RFID');
class FrmLoanSearch extends GForm
{
    public function __construct()
    {
        $this->setAllFunctions('Loan', array('loanId'), 'loanId');
        parent::__construct();
    }

    public function mainFields()
    {
        $busLoanType = $this->MIOLO->getBusiness($this->module, 'BusLoanType');
        $businessLibraryUnit = $this->MIOLO->getBusiness($this->module, 'BusLibraryUnit');

        $fields[] = new MTextField('loanIdS', null, _M('Código', $this->module));
        $fields[] = new GSelection('loanTypeIdS', null, _M('Tipo de empréstimo',$this->module), $busLoanType->listLoanType());
        $fields[] = new GPersonLookup('personIdS', _M('Pessoa', $this->modules), 'person');
        $fields[] = new MTextField('itemNumberS', $this->itemNumberS->value, _M('Número do exemplar', $this->module));
        $fields[] = new MTextField('titleS', null, _M('Título do material', $this->module), 22);
        
        $businessLibraryUnit->filterOperator = TRUE;
        $businessLibraryUnit->labelAllLibrary = TRUE;
        $listLibraryUnit = $businessLibraryUnit->listLibraryUnit();

        $fields[]       = new GSelection('libraryUnitIdS',   $this->libraryUnitId->value, _M('Unidade de biblioteca', $this->module), $listLibraryUnit, null, null, null, TRUE);
        $lblDate        = new MLabel(_M('Data', $this->module) . ':');
        $beginLoanDateS = new MCalendarField('beginLoanDateS', $this->beginLoanDateS->value);
        $endLoanDateS   = new MCalendarField('endLoanDateS', $this->endLoanDateS->value);
        $fields[]       = new GContainer('hctDates', array($lblDate, $beginLoanDateS, $endLoanDateS));
        $fields[]       = new MTextField('loanOperatorS', null, _M('Operador', $this->module));

        $lblDate                    = new MLabel(_M('Data prevista da devolução', $this->module) . ':');
        $beginReturnForecastDateS   = new MCalendarField('beginReturnForecastDateS', $this->beginReturnDateS->value);
        $endReturnForecastDateS     = new MCalendarField('endReturnForecastDateS', $this->endReturnForecastDateS->value);
        $fields[]                   = new GContainer('hctDates', array($lblDate, $beginReturnForecastDateS, $endReturnForecastDateS));

        $lblDate            = new MLabel(_M('Data de devolução', $this->module) . ':');
        $beginReturnDateS   = new MCalendarField('beginReturnDateS', $this->beginReturnDateS->value);
        $endReturnDateS     = new MCalendarField('endReturnDateS', $this->endReturnDateS->value);
        $fields[]           = new GContainer('hctDates', array($lblDate, $beginReturnDateS, $endReturnDateS));

        $fields[]       = new MTextField('returnOperatorS', null, _M('Operador da devolução', $this->module));
        $fields[]       = new MIntegerField('renewalAmountS', null, _M('Quantidade de renovações', $this->module));
        $fields[]       = new MIntegerField('renewalWebAmountS', null, _M('Quantidade de renovações web', $this->module));
        $renewalWebBonusOpt = array(DB_TRUE=>_M('Sim', $this->module), DB_FALSE=>_M('Não', $this->module));
        $fields[]       = new GSelection('renewalWebBonusS', null, _M('Bônus de renovações web', $this->module), $renewalWebBonusOpt);
        $fields[]       = new GSelection('status', null, _M('Estado', $this->module), array( 1 => _M("Pendente", $this->module),2 => _M("Atrasado", $this->module) ) );
        
        $this->setFields( $fields );
        $this->_toolBar->addRelation(_M('Alterar data prevista de devolução em lote', 'gnuteca3'), GUtil::getImageTheme('newBook-16x16.png'), 'javascript:' . GUtil::getAjax('bulkReturnForecastDateChange'), 'gtcUnionPerson');
    }
    
    
    /*
     * Ativar bit anti-furto
     */
    public function ativaAntiFurto($args)
    {
        $resp = RFID::addBitAgainstTheft();
        if(is_array($resp))
        {
            GPrompt::error("Erro ao ativar anti-furto. <br> ". $resp[0]);
        }else
        {
            GPrompt::information("O anti-furto foi ativado");
        }
    }
    
    /*
     * Desativar bit anti-furto
     */
    public function desativaAntiFurto($args)
    {
        $busLoan = $this->MIOLO->getBusiness($this->module, 'BusLoan');
        $busExemplaryControl = $this->MIOLO->getBusiness($this->module, 'BusExemplaryControl');
        
        //Obtem o LoanId
        $getLoan = explode('|loanId|~|', $args);
        $loanId = $getLoan[1];
        
        //Obtem informações do Loan
        $loan = $busLoan->getLoan($loanId, TRUE);
        
        //Verifica se o Status do livro é Emprestado
        $statusExemplar = $busExemplaryControl->getExemplaryStatus($loan->itemNumber);
        
        if($statusExemplar == DEFAULT_EXEMPLARY_STATUS_EMPRESTADO)
        {
            $resp = RFID::removeBitAgainstTheft();
            if(is_array($resp))
            {
                GPrompt::error("Erro ao desativar anti-furto. <br> ". $resp[0]);
            }else
            {
                GPrompt::information("O anti-furto do material #" . $loan->itemNumber . " foi desativado");
            }
        }
        //Caso não for, não é possivel desativar o anti-furto
        else
        {
            GPrompt::error("Só é possível desativar o anti-furto, se o material estiver emprestado.<br>
                           Material #".$loan->itemNumber);
        }
        
    }


    /**
     * Mostra as renovações relativas ao empréstimo
     *
     */
    public function showRenew()
    {
        $busRenew = $this->MIOLO->getBusiness($this->module, 'BusRenew');
        
        $search = $busRenew->getHistoryOfLoan(MIOLO::_REQUEST('loanId'));

        if ( is_array($search) ) 
        {
            $tbColumns = array(
                _M('Tipo de renovação', $this->module),
                _M('Data prevista da devolução', $this->module),
                _M('Data de renovação', $this->module),
                _M('Nova data prevista da devolução', $this->module),
                _M('Operador', $this->module)
            );

            $tb = new MTableRaw('', $search, $tbColumns);
            $tb->zebra = TRUE;
        }
        else
        {
            $tb = new MLabel (_M('Não há renovações para este empréstimo', $this->module));
        }

        $this->injectContent( $tb , true, _M('Histórico de renovação para empréstimo', $this->module) . MIOLO::_REQUEST('loanId') );
    }
    
    public function searchFunction($args)
    {
    	$data = $this->getData();
        
        if ( $data )
        {
        	$filters = '';
        	foreach ($data as $key=>$value )
        	{
        	    if ( $key == 'arrayItemTemp' || ($key == 'status' && $value == '0') || $key == 'GRepetitiveField' )
        	    {
        	    	continue;
        	    }
        	    $filters .= $value;
        	}
        }
    	
        if ( strlen($filters) == 0 )
        {
            $this->information(_M('Entre pelo menos com um filtro', $this->module), 'gnuteca.closeAction()');
        }
        else 
        {
    	   parent::searchFunction($args);
        }
    }

    /**
     * Obtem os empréstimos selecionados na grid
     * @param type $args
     * @return Array $persons
     * @throws Exception 
     */
    public function getSelecteLoans($args)
    {
        $loans = array();

        if ( isset($args->allLoans) )
        {
            // Disparo do getGrid com definição de método para realizar novamente a pesquisa de todos os registros.
            $MIOLO = MIOLO::getInstance();
		    $_REQUEST[$MIOLO->page->getFormId() . '__EVENTTARGETVALUE'] = 'searchFunction';
            $grid = $this->getGrid($args);
            $dataGrid = $grid->getData();

            foreach ($dataGrid as $line => $loan)
            {
                $tmpLoan = explode('=', $loan);
                $loans[$line] = $loan[0];
            }
        }
        else
        {
            $selectedLoans = $args->selectGrdLoan;
            $loans = array_values($selectedLoans);

            if (count($loans) == 0)
            {
                throw new Exception(_M("É necessário selecionar ao menos um empréstimo.", 'gnuteca3'));
            }

            foreach ($loans as $line => $loan)
            {
                $tmpLoan = explode('=', $loan);
                $loans[$line] = $tmpLoan[1];
            }
        }

        return $loans;
    }

    /**
     * Constrói a poup-up para definir nova data prevista de devolução.
     * @param type $args 
     * @return void
     */
    public function bulkReturnForecastDateChange($args)
    {
        $MIOLO = MIOLO::getInstance();
        $fields = array();

        $fields[] = new MDiv('divDescription', 'Alteração de data prevista de devolução (em lote). <b>Atenção, este processo não realiza renovação, somente altera a data prevista de devolução.<br>Empréstimos devolvidos não são afetados por esta ação.</b>', 'reportDescription');

        if ( isset($args->chkAll) )
        {
            $fields[] = $container = new MHContainer( null, array( new MLabel(_M('Todas as páginas:', 'gnuteca3')), $check = new MCheckBox('allLoans', true, null, true )) );
            $container->addStyle('margin-bottom', '5px');
            $check->addStyle('margin-top', '5px');
            $check->addStyle('margin-left', '10px');
        }

        $fields[] = new GContainer('', array(new MCalendarField('bulkReturnForecastDate', null, _M('Data prevista da devolução:', $this->module))));

        $buttons[] = new MButton('btnYes', _M('Confirmar'), GUtil::getAjax('confirmBulkReturnForecastDateChange'), GUtil::getImageTheme('accept-16x16.png'));
        $buttons[] = $this->getCloseButton();

        $fields[] = new MDiv('buttons2', $buttons);

        $this->injectContent($fields);

        // Necessário para calendário funcionar (quando criado por Ajax).
        $MIOLO->page->onload( 'dojo.parser.parse();'); 
    }

    /**
     * Altera a data prevista de devolução após confirmação do usuário.
     * @param type $args
     * @return void
     */
    public function confirmBulkReturnForecastDateChange($args)
    {
        $loans = $this->getSelecteLoans($args);

        if ( !$args->bulkReturnForecastDate )
        {
            throw new Exception('É necessário selecionar uma data prevista de devolução.');
        }

        foreach ($loans as $loan )
        {
            $this->business->getLoan($loan);

            // Não altera a data prevista de empréstimos já devolvidos.
            if ( !$this->business->returnDate )
            {
                $this->business->returnForecastDate = $args->bulkReturnForecastDate;
                $this->business->updateLoan();
            }
        }

        $this->information('Data prevista de devolução alterada com sucesso!', Gutil::getAjax('searchFunction') . ' ' . GUtil::getCloseAction());
    }
}
?>