<?php
/**
 * <--- Copyright 2005-2013 de Solis - Cooperativa de Soluções Livres Ltda. e
 * Univates - Centro Universitário.
 *
 * Este arquivo é parte do programa Gnuteca.
 *
 * O Gnuteca é um software livre; você pode redistribuí-lo e/ou modificá-lo
 * dentro dos termos da Licença Pública Geral GNU como publicada pela Fundação
 * do Software Livre (FSF); na versão 2 da Licença.
 *
 * Este programa é distribuído na esperança que possa ser útil, mas SEM
 * NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO
 * ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/GPL em
 * português para maiores detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o título
 * "LICENCA.txt", junto com este programa, se não, acesse o Portal do Software
 * Público Brasileiro no endereço www.softwarepublico.gov.br ou escreva para a
 * Fundação do Software Livre (FSF) Inc., 51 Franklin St, Fifth Floor, Boston,
 * MA 02110-1301, USA --->
 *
 * Classe para administrar sessão
 *
 * @author Tcharles Silva [tcharles@solis.coop.br]
 *
 * @version $Id$
 *
 * \b Maintainers: \n
 * Tcharles Silva [tcharles@solis.coop.br]
 *
 * @since
 * Class created on 28/11/2013
 * 
 **/

include("GnutecaWebServices.class.php");
$MIOLO->getClass('gnuteca3', 'GSession');

class GSipCirculation extends GSession
{       
     /*
     * Esqueleto do Loan
     * Parametros:
     * 
     * $equipamentId :: identificador do equipamento sip, já cadastrado
     * $personId :: identificador da pessoa que esta utilizando o equipamento
     * 
     * Descrição: Método utilizado pelos webservices de empréstimo/devolução da automação
     * 
     * Criado por: Tcharles Silva
     * Em: 25/11/2013
     * Ultima Atualização por: 
     * Em: 
     * Motivo:
     */
    public static function doLoan($padraoLoan, $termId, $personId, $itemNumber, $loanTypeId, $pessoa = NULL, $fazRen)
    {
        
        /* PADRÕES DE EMPRÉSTIMOS *
        $padraoLoan = '1';
        /* - Utilizado em: addOperation
          1 | Empréstimo
          2 | Devolução
          3 | Renovação         */
        
        /* LoanTypeId - Modo de empréstimo *
        $loanTypeId = "4";
          1 | Padrão
          2 | Forçado
          3 | Momentâneo
          4 | Padrão auto-empréstimo
          5 | Offline         */
        
        $MIOLO = MIOLO::getInstance();
        $module = MIOLO::getCurrentModule();
        
        //Instancia os atributos com o objeto Bus$Nome respectivamente
        $busSipEquipament = $MIOLO->getBusiness($module, 'BusSipEquipament');
        $busOperationLoanSip = $MIOLO->getBusiness($module, 'BusOperationLoanSip');
        $busLoan = $MIOLO->getBusiness($module, 'BusLoan');
        $busRenew = $MIOLO->getBusiness($module, 'BusRenew');
        $busMaterial = $MIOLO->getBusiness($module, 'BusMaterial');
        
        try
        {
            //Recebe informações do equipamento
            $dadosSip = $busSipEquipament->getSipEquipament($termId);
            
            //Seta se o equipamento faz renovação
            $fazRen = $dadosSip->makeRenew;

            //Setar libraryUnitId
            $busOperationLoanSip->setLibraryUnit($dadosSip->libraryUnitId);

            //Setar Location
            //$busOperationLoanSip->location = $dadosSip->locationformaterialmovementid;
            $busOperationLoanSip->setLocation($dadosSip->locationformaterialmovementid);

            
            //Seta a pessoa e coloca o resultado na variável
            if($pessoa)
            {
                $person = $pessoa;
            }else
            {
                $person = $busOperationLoanSip->setPerson($personId);
            }
            
            //Verifica se foi selecionado uma pessoa válida para a operação
            if ($person)
            {
                $noProblem = $busOperationLoanSip->addItemNumber($itemNumber, $loanTypeId, $person);
                if($noProblem)
                {
                    //Se não tiver problema, executa o finalize
                    $teste = $busOperationLoanSip->finalize(NULL, $fazRen);
                    $busOperationLoanSip->clearItemsLoan();
                }
            }
            
            //Logo após, pega as mensagens de erro com o getMessages...
            $retorno['screenMsg'] = $busOperationLoanSip->getMessages();
            //Mutil::flog($retorno['screenMsg']);
        }
        catch (Exception $e)
        {
           $retorno['ok'] = 'N';
           $retorno['screenMsg'] = $e->getMessage();     
        }
        //MUtil::flog("Iniciando retorno");
        //Verifica se a String é um erro, caso for, retorna a mensagem de erro.
        $err = $retorno[screenMsg];
        $check = substr($err, 0, 6);
        if($check == "[ERRO]")
        {
            return $retorno;
        }
        
        //Se o finalize foi executado sem erros
        if($teste)
        {
            //Deixar a data YYYYMMDDHHMMSS
            $data = GDate::getYYYYMMDDHHMMSS($busOperationLoanSip->operationDate);

            
            //Verifica se é uma renovação            
            if($busOperationLoanSip->isRenew)
            {
                $titulo = $busMaterial->getMaterialTitleByItemNumber($itemNumber);
                $busRenew = $busRenew->getRenew($busOperationLoanSip->loanNum);
                $rfd = GDate::getYYYYMMDDHHMMSS($busRenew->returnForecastDate);
                $vf = GSession::addOperation($termId, $personId, 3, $busOperationLoanSip->loanNum);

                //Formatando retornos
                $retorno['ok'] = $vf ? "Y" : "N";
                $retorno["renewalOk"] = "Y";
                $retorno['dateTime'] = $data;
                $retorno['instID'] = $dadosSip->libraryUnitId;
                $retorno['patronID'] = $personId;
                $retorno['itemID'] = $itemNumber;
                if(empty($titulo))
                {
                    $titulo = 'null';
                }
                $retorno['titleID'] = $titulo;
                $retorno['dueDate'] = $rfd;
            }
            else
            {
                //Reconhecendo que o método é empréstimo
                //MUtil::flog("Sessão em empréstimo!");
                
                $titulo = $busMaterial->getMaterialTitleByItemNumber($itemNumber);
                //MUtil::flog("TITULO");
                //MUtil::flog($titulo);
                //Instancia um objeto busLoan para consumir seus atributos
                $busLoan = $busLoan->getLoan($busOperationLoanSip->loanNum);
                
                //Data de retorno já no padrao abaixo
                $rfd = GDate::getYYYYMMDDHHMMSS($busLoan->returnForecastDate);
                
                //Coloca na sessão o empréstimo
                $vf = GSession::addOperation($termId, $personId, 1, $busOperationLoanSip->loanNum); 
                
                //Formatando retornos
                $retorno['ok'] = $vf ? "Y" : "N";
                $retorno['renewalOk'] = "N";
                $retorno['dateTime'] = $data;
                $retorno['instID'] = $dadosSip->libraryUnitId;
                $retorno['patronID'] = $personId;
                $retorno['itemID'] = $itemNumber;
                if(empty($titulo))
                {
                    $titulo = 'null';
                }
                $retorno['titleID'] = $titulo;
                $retorno['dueDate'] = $rfd;
            }
            
            return $retorno;
        }
    }
    
    
    public static function doReturn($termId, $itemNumber )
    {
        /* PADRÕES DE EMPRÉSTIMOS *
        $padraoLoan = '1';
        /* - Utilizado em: addOperation
          1 | Empréstimo
          2 | Devolução
          3 | Renovação         */
        
        /* ReturnTypeId - Modo de devolução *
        $returnTypeId = "4";
        $returnTypeId = "3";
          1 | Apagados
          2 | Utilização Local
          3 | Padrão Auto-Atendimento
          4 | Prédio 11
          5 | Prédio 16         */
        
        //MUtil::flog("Iniciando a devolução...");
        
        $MIOLO = MIOLO::getInstance();
        $module = MIOLO::getCurrentModule();
        
        //Instancia os atributos com o objeto Bus$Nome respectivamente
        $busSipEquipament = $MIOLO->getBusiness($module, 'BusSipEquipament');
        $busOperationReturnSip = $MIOLO->getBusiness($module, 'BusOperationReturnSip');
        $busMaterial = $MIOLO->getBusiness($module, 'BusMaterial');
        $dadosBin = $MIOLO->getBusiness($module, 'BusSipEquipamentBinRules');
        
        //Seta tipo de retorno
        $busOperationReturnSip->setReturnType(ID_RETURNTYPE_DEFAULTSIPEQUIPAMENT);
        
        try
        {
            //Recebe informações do equipamento
            $dadosSip = $busSipEquipament->getSipEquipament($termId);
            
            //Setar libraryUnitId
            $busOperationReturnSip->setLibraryUnit($dadosSip->libraryUnitId);

            //Setar Location
            $busOperationReturnSip->setLocation($dadosSip->locationformaterialmovementid);

            //Verifica o exemplar e coloca o resultado na variável
            $exemplarOk = $busOperationReturnSip->checkItemNumber($itemNumber);
            
            $retorno['screenMsg'] = $busOperationReturnSip->msgs;
            
            if($exemplarOk && is_null($retorno[screenMsg]))
            {
                //Se estiver tudo certo com o exemplar, adiciona o item
                $addItemOk = $busOperationReturnSip->addItemNumber($itemNumber);

                //Atribui as mensagens a variavel retorno
                $retorno['screenMsg'] = $busOperationReturnSip->msgs;
                
                //Testa para ver se a operação anterior foi sem falhas e sem mensagens de erro
                if($addItemOk && is_null($retorno[screenMsg]))
                {
                    //Se estiver tudo certo, executa o finalize.
                    $finalOk = $busOperationReturnSip->finalize();
                }
                else
                {
                    //MUtil::flog("Problema no addItem");
                    //MUtil::flog($retorno[screenMsg]);
                }
            }
            else{
                //MUtil::flog("O exemplar possui algum problema...");
                //MUtil::flog($retorno[screenMsg]);
                //return $retorno;
            }
        }
        catch (Exception $e)
        {
           $retorno['ok'] = '0';
           $retorno['screenMsg'] = $e->getMessage();
           return $retorno;
        }
        
        $retorno['screenMsg'] = $busOperationReturnSip->msgs;

        //MUtil::flog("Iniciando retorno");
        
        //Verifica se a String é um erro, caso for, retorna a mensagem de erro.
        $err = $retorno[screenMsg];
        $check = substr($err, 0, 6);
        if($check == "[ERRO]")
        {
            //MUtil::flog("A ScreenMsg é uma mensagem de erro");
            
            $retorno['ok'] = '0';
            $retorno['resensitize'] = 'N';
            $retorno['alert'] = 'Y';
            $retorno['dateTime'] = $data;
            $retorno['instID'] =  $dadosSip->libraryUnitId;
            $retorno['itemID'] =  $itemNumber;
            $retorno['titleID'] = $titulo;
            $retorno['sortBin'] = 'null';
            $retorno['patronID'] = $busOperationReturnSip->personId;
            
            return $retorno;
        }
        
        if($finalOk)
        {
            $sessionOk = GSession::addOperation($termId, $busOperationReturnSip->personId, 2, $busOperationReturnSip->returnId);
            
            if($sessionOk)
            {
                $titulo = $busMaterial->getMaterialTitleByItemNumber($itemNumber);
                $data = GDate::getYYYYMMDDHHMMSS($busOperationReturnSip->operationDate);
                
                /*
                 * Preparando o sortBin
                 * Recebe informações de bin do equipamento
                 */
                
                $dadosBin->sipEquipamentId = $termId;
                $bin = $dadosBin->searchSipEquipamentBinRules(TRUE);

                if(empty($bin))
                {
                    $sortBin = $dadosSip->binDefault;
                }else
                {
                    foreach($bin as $b)
                    {
                        if($busOperationReturnSip->fStatus == $b->exemplaryStatusId)
                        {
                            $sortBin = $b->bin;
                        }
                    }
                    if(empty($sortBin))
                    {
                        $sortBin = $dadosSip->binDefault;
                    }
                }

                //Operação foi um sucesso, formatando retorno
               // MUtil::flog("Empréstimo realizado com sucesso! Formatando retorno...");

                $retorno['ok'] = '1';
                $retorno['resensitize'] = 'Y';
                $retorno['alert'] = 'N';
                $retorno['dateTime'] = $data;
                $retorno['instID'] =  $dadosSip->libraryUnitId;
                $retorno['itemID'] =  $itemNumber;
                $retorno['titleID'] = $titulo;
                $retorno['sortBin'] = $sortBin;
                $retorno['patronID'] = $busOperationReturnSip->personId;

                return $retorno;
            }
            else
            {
                $retorno['ok'] = '0';
                $retorno['resensitize'] = 'N';
                $retorno['alert'] = 'Y';
                $retorno['dateTime'] = $data;
                $retorno['instID'] =  $dadosSip->libraryUnitId;
                $retorno['itemID'] =  $itemNumber;
                $retorno['titleID'] = $titulo;
                $retorno['sortBin'] = 'null';
                $retorno['patronID'] = $busOperationReturnSip->personId;
                return $retorno;
            }

        }

    }
    
    /*
     * Esta classe irá verificar se uma pessoa tem penalidade em aberto e também multas em aberto.
     * 
     * Será utilizada nos webservices dos equipamentos SIP
     */
    public static function getRightWith($verif, $person, $linkid, $idOperation, $libraryUnitId )
    {
        $MIOLO = MIOLO::getInstance();
        $module = MIOLO::getCurrentModule();
        $busPenalty = $MIOLO->getBusiness($module, 'BusPenalty');
        $busFine = $MIOLO->getBusiness($module, 'BusFine');
        $busRight = $MIOLO->getBusiness($module, 'BusRight');

        $materialG = '1'; //LIVRO

        if($verif == 'p')
        {
            $busPenalty->personIdS = $person;
            $busPenalty->personId = $person;
            $busPenalty->onlyActive = true;
            $penalty = $busPenalty->searchPenalty();

            //Caso tenha penalidade
            if($penalty)
            {
            //verifica se tem direito de retirar com penalidade
                $busRight->linkId = $linkid;
                $busRight->materialGenderId = $materialG;
                $busRight->operationId = $idOperation;

                $comPenal = $busRight->verifyRightSip();

                if($comPenal == FALSE)
                {
                    return true;
                }
            }
            return false;
        }

        if($verif == 'f')
        {
            //verifica se tem multas em aberto
            $fines = $busFine->getFinesOpen($libraryUnitId, $person);

            if($fines)
            {
                //caso tiver, verifica se tem direito de retirar com multas
                $busRight->operationId = ID_OPERATION_LOAN_FINE;
                $comMult = $busRight->verifyRightSip();

                if($comMult == FALSE)
                {
                    return true;
                }
            }
            return false;
        }

        if($verif == 'l')
        {
            $busRight->linkId = $linkid;
            $busRight->materialGenderId = $materialG;
            $busRight->operationId = $idOperation;

            $rightLoan = $busRight->verifyRightSip();

            if($rightLoan == FALSE)
            {
                return FALSE;
            }
            return TRUE;
        }
    }
}
?>