<?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.
 * 
 * 
 *
 * This file handles the connection and actions for basConfig table
 *
 *
 *
 *
 *
 **/


/**
 * Class to manipulate the basConfig table
 **/
class BusinessGnuteca3BusRenew extends GBusiness
{
    public $pkeys;
    public $colsNoId;

    public $renewId;
    public $loanId;
    public $renewTypeId;
    public $renewDate;
    public $returnForecastDate;
    public $operator;
    public $personName;
    public $personNameS;
    public $renewIdS;
    public $loanIdS;
    public $renewTypeIdS;
    public $renewDateS;
    public $beginRenewDateS;
    public $endRenewDateS;
    public $beginReturnForecastDateS;
    public $endReturnForecastDateS;
    public $operatorS;
    public $libraryUnitIdS;
    public $itemNumberS;
    public $personIdS;
    public $personId;


    /**
     * Class constructor
     **/
    function __construct()
    {
        parent::__construct();
        $this->tables   = 'gtcRenew';
        $this->pkeys    = 'renewId';
        $this->colsNoId = 'loanId,
                           renewTypeId,
                           renewDate,
                           returnForecastDate,
                           operator';
        $this->columns  = $this->pkeys . ',' . $this->colsNoId;
    }


    /**
     * List all records from the table handled by the class
     *
     * @param None
     *
     * @returns (array): Return an array with the entire table
     *
     **/
    public function listRenew()
    {
        $this->clear();
        $this->setColumns($this->columns);
        $this->setTables($this->tables);
        $sql = $this->select();
        $rs  = $this->query($sql);
        return $rs;
    }


    /**
     * Return a specific record from the database
     *
     * @param $moduleConfig (integer): Primary key of the record to be retrieved
     * @param $parameter (integer): Primary key of the record to be retrieved
     *
     * @return (object): Return an object of the type handled by the class
     *
     **/
    public function getRenew($renewId)
    {
        $data[] = $renewId;

        $this->clear();
        $this->setColumns($this->columns);
        $this->setTables($this->tables);
        $this->setWhere('renewId = ?');
        $sql = $this->select($data);
        
        $rs  = $this->query($sql, TRUE);
        $this->setData($rs[0]);
        
        return $this;
    }


    /**
     * Do a search on the database table handled by the class
     *
     * @param $filters (object): Search filters
     *
     * @return (array): An array containing the search results
     **/
    public function searchRenew($toObject = false)
    {
        $this->clear();

        if ($v = $this->renewIdS)
        {
            $this->setWhere('A.renewId = ?');
            $data[] = $v;
        }
        if ( $this->personIdS )
        {
            $this->setWhere('P.personId = ?');
            $data[] = $this->personIdS;
        }
        if ($v = $this->loanIdS)
        {
            $this->setWhere('A.loanId = ?');
            $data[] = $v;
        }
        if ($v = $this->renewTypeIdS)
        {
            $this->setWhere('A.renewTypeId = ?');
            $data[] = $v;
        }
        if ($v = $this->renewDateS)
        {
            $this->setWhere('date(A.renewDate) = ?');
            $data[] = $v;
        }
        if ($v = $this->beginRenewDateS)
        {
            $this->setWhere('date(A.renewDate) >= ?');
            $data[] = $v;
        }
        if ($v = $this->endRenewDateS)
        {
            $this->setWhere('date(A.renewDate) <= ?');
            $data[] = $v;
        }
        if ($v = $this->beginReturnForecastDateS)
        {
            $this->setWhere('A.returnForecastDate >= ?');
            $data[] = $v;
        }
        if ($v = $this->endReturnForecastDateS)
        {
            $this->setWhere('A.returnForecastDate <= ?');
            $data[] = $v;
        }
        if ($v = $this->operatorS)
        {
            $this->setWhere('lower(A.operator) LIKE lower(?)');
            $data[] = '%' . $v . '%';
        }
        if ($this->libraryUnitIdS)
        {
            $this->setWhere('L.libraryUnitId in (' . $this->libraryUnitIdS . ')' );
        }
        if ($this->itemNumberS)
        {
        	$this->setWhere('L.itemNumber = ?');
        	$data[] = $this->itemNumberS;
        }

        $tables = '     gtcRenew        A
             LEFT JOIN  gtcRenewType    B
                    ON  (A.renewTypeId = B.renewTypeId)
             LEFT JOIN  gtcLoan         L
                    ON  (A.loanId = L.loanId)
        LEFT JOIN ONLY  basPerson       P
                    ON  (P.personId = L.personId)';
        $columns = 'A.renewId,
                    A.loanId,
                    P.personId,
                    P.name AS personName,
                    L.itemNumber,
                    NULL AS tomo,
                    NULL AS data,
                    B.description AS renewType,
                    A.renewDate,
                    A.returnForecastDate,
                    A.operator';

        $this->setTables($tables);
        $this->setColumns($columns);
        $this->setOrderBy('renewId');
        $sql = $this->select($data);
        $rs  = $this->query($sql, $toObject);
        return $rs;
    }
    
    


    /**
     * Insert a new record
     *
     * @param $data (object): An object of the type handled by the class
     *
     * @return True if succed, otherwise False
     *
     **/
    public function insertRenew()
    {
        $data = $this->associateData( $this->colsNoId );

        $this->clear();
        $this->setColumns($this->colsNoId);
        $this->setTables($this->tables);
        $sql = $this->insert($data) . ' RETURNING renewId';
        $rs  = $this->query($sql);
        
        $this->renewId = $rs[0][0];
        $this->renewIdS = $rs[0][0];

        return $rs;
    }


    /**
     * Update data from a specific record
     *
     * @param $data (object): Data which will replace the old record data
     *
     * @return (boolean): True if succeed, otherwise False
     *
     **/
    public function updateRenew()
    {
        $data = $this->associateData( $this->colsNoId . ',' . $this->pkeys );

        $this->clear();
        $this->setColumns($this->colsNoId);
        $this->setTables($this->tables);
        $this->setWhere('renewId = ?');
        $sql = $this->update($data);
        $rs  = $this->execute($sql);
        return $rs;
    }


    /**
     * Delete a record
     *
     * @param $moduleConfig (string): Primary key for deletion
     * @param $parameter (string): Primary key for deletion
     *
     * @return (boolean): True if succeed, otherwise False
     *
     **/
    public function deleteRenew($renewId)
    {
        $data[] = $renewId;

        $this->clear();
        $this->setTables($this->tables);
        $this->setWhere('renewId = ?');
        $sql = $this->delete($data);
        $rs  = $this->execute($sql);
        return $rs;
    }

    //Retorna quantidade de renovações de um empréstimo
    public function getCountRenew($loanId)
    {
    	if (!$loanId)
    	{
    		return false;
    	}
        $sql = "select count (loanid) from gtcrenew where loanid = '{$loanId}'";
        $rs  = $this->query($sql);
        return $rs[0][0];
    }
    
    /**
     * Obtém as renovações no empréstimo, com nova data futura de devolução
     * 
     * @param (integer) $loanId
     * @param (integer) $renewId
     * @return (object) 
     */
    public function getRenewsOfLoan($loanId, $renewId=null)
    {
        $this->clear();
        $this->setColumns("A.renewid, 
                           A.loanid, 
                           A.renewtypeid, 
                           C.description as renewType, 
                           A.returnforecastdate, 
                           A.renewdate,
                           (CASE WHEN (SELECT MIN(returnforecastdate) FROM gtcrenew I 
                                          WHERE A.loanid = I.loanid AND I.renewid > A.renewid) IS NOT NULL
                                 THEN
                                     (SELECT MIN(returnforecastdate) FROM gtcrenew I 
                                          WHERE A.loanid = I.loanid AND I.renewid > A.renewid)
                                 ELSE              
                                     (SELECT returnforecastdate 
                                          FROM gtcloan L WHERE L.loanid = A.loanid) 
                           END) as newreturnforecastdate, 
                           A.operator");
        
        $tables = "gtcrenew A 
                    INNER JOIN gtcloan B 
                        USING (loanid)
                    INNER JOIN gtcrenewtype C
                        USING(renewtypeid)
                        where loanid = {$loanId}";
        if ( $renewId )
        {
            $tables .= " AND A.renewId = {$renewId}";
        }
        
        $this->setTables($tables);
        $this->setOrderBy('A.renewId');

        $sql = $this->select();

        return  $this->query($sql, true);
    }
    
    /**
     * Obtém histórico de renovações por empréstimo
     * @param (integer) $loanId
     * @return (array) 
     */
    public function getHistoryOfLoan($loanId, $showOperator = true)
    {
        $renews = $this->getRenewsOfLoan($loanId);
        
        $newData = array();
        if ( is_array($renews) )
        {
            foreach( $renews as $i=>$value )
            {
                $returnForecastDate = new GDate($value->returnforecastdate);
                $newReturnForecastDate = new GDate($value->newreturnforecastdate);
                $newData[$i][] = $value->renewType;
                $newData[$i][] = $returnForecastDate->getDate(GDate::MASK_DATE_USER);
                $newData[$i][] = $value->renewdate;
                $newData[$i][] = $newReturnForecastDate->getDate(GDate::MASK_DATE_USER);
                
                if ( $showOperator )
                {
                    $newData[$i][] = $value->operator;
                }
            }
        }
        
        return $newData;
    }
    
}
?>
