<?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 = MIOLO::getInstance();
$MIOLO->getBusiness('gnuteca3', 'BusAuthenticate');

class BusinessGnuteca3BusMaterialEvaluation extends GBusiness
{

    /**
     * Código da avaliação de material
     * @var integer
     */
    public $materialEvaluationId;

    /**
     * Número de controle
     * @var integer
     */
    public $controlNumber;

    /**
     * Código da pessoa
     * @var integer
     */
    public $personId;

    /**
     * Data
     * @var timestamp
     */
    public $date;

    /**
     * Hora
     * @var timestamp
     */
    public $time;

    /**
     * Comentário
     * @var string
     */
    public $comment;

    /**
     * Avaliação/nota
     * @var integer
     */
    public $evaluation;

    // campos de busca

    /**
     * Código da avaliação de material
     * @var integer
     */
    public $materialEvaluationIdS;

    /**
     * Número de controle
     * @var integer
     */
    public $controlNumberS;

    /**
     * Código da pessoa
     * @var integer
     */
    public $personIdS;

    /**
     * Data 
     * @var timestamp
     */
    public $beginDateS;
    public $endDateS;

    /**
     * Hora
     * @var timestamp
     */
    public $endTimeS;
    public $beginTimeS;

    /**
     * Comentário
     * @var string
     */
    public $commentS;

    /**
     * Avaliação/nota
     * @var integer
     */
    public $evaluationS;

    public function __construct()
    {
        $table = 'gtcMaterialEvaluation';
        $pkeys = 'materialEvaluationId ';
        $cols = 'controlNumber, personId, date, comment, evaluation';
        parent::__construct($table, $pkeys, $cols);
    }

    public function insertMaterialEvaluation()
    {
        if (!$this->validControlNumber($this->controlNumber))
        {
            throw new Exception(_M('Número de controle inválido.', 'gnuteca3'));
        }
        if ($this->date && $this->time)
        {
            $this->date .= " " . $this->time;
        }
        return $this->autoInsert();
    }

    public function updateMaterialEvaluation()
    {
        if (!$this->validControlNumber($this->controlNumber))
        {
            throw new Exception(_M('Número de controle inválido.', 'gnuteca3'));
        }
        if ($this->date && $this->time)
        {
            $this->date .= " " . $this->time;
        }

        return $this->autoUpdate();
    }

    public function getMaterialEvaluation($materialEvaluationId)
    {
        $this->clear();
        $materialEvaluation = $this->autoGet($materialEvaluationId);
        $time = new GDate($materialEvaluation->date);
        $this->time = $time->getHour() . ":" . $time->getMinute(); //Define manualmente a hora no campo time

        return $materialEvaluation;
    }

    public function deleteMaterialEvaluation($materialEvaluationId)
    {
        return $this->autoDelete($materialEvaluationId);
    }

    public function searchMaterialEvaluation($toObject = FALSE)
    {
        $this->materialEvaluationId = $this->controlNumber = $this->personId = null; //Limpa resquicios do update/insert

        $filters = array(
            'materialEvaluationId' => 'equals',
            'controlNumber' => 'equals',
            'comment' => 'ilike',
            'evaluation' => 'equals',
        );

        $args = $this->addFilters($filters);

        if ($this->beginDateS)
        {
            $this->setWhere('date >= ?');
            $args[] = "{$this->beginDateS} " . ($this->beginTimeS ? $this->beginTimeS : '00:00');
        }

        if ($this->endDateS)
        {
            $this->setWhere('date <= ?');
            $args[] = "{$this->endDateS} " . ($this->endTimeS ? $this->endTimeS : '00:00');
        }

        if ($this->beginTimeS)
        {
            $this->setWhere(' date::time >= ?::time ');
            $args[] = $this->beginTimeS;
        }

        if ($this->endTimeS)
        {

            $this->setWhere(' date::time <= ?::time ');
            $args[] = $this->endTimeS;
        }

        if ($this->personIdS)
        {
            $this->setWhere("e.personId = {$this->personIdS} ");
        }

        $this->setTables('gtcMaterialEvaluation e LEFT JOIN ONLY basPerson p ON ( e.personId = p.personId) ');
        $this->setColumns('materialEvaluationId, controlNumber, e.personId, p.name, date, comment, evaluation');
        return $this->query($this->select($args), $toObject);
    }

    /**
     * Lista avaliações com comentário
     *
     * @param integer $controlNumber
     * @param boolean $toObject
     * @return array
     */
    public function listEvalutionWithComment($controlNumber, $toObject = false)
    {
        //não retorna nada caso não passe o número de controle
        if (!$controlNumber)
        {
            return false;
        }

        $this->setWhere("comment <> '' ");
        $this->controlNumberS = $controlNumber;

        //SELECT materialEvaluationId,controlNumber,e.personId,p.name, date,comment,evaluation FROM gtcMaterialEvaluation e LEFT JOIN basPerson p ON ( p.personId = e.personId ) WHERE comment <> ''  and controlNumber = '54545';
        $this->columns = 'materialEvaluationId,controlNumber,e.personId,p.name, date,comment,evaluation';
        $this->tables = 'gtcMaterialEvaluation e LEFT JOIN ONLY basPerson p ON ( p.personId = e.personId )';

        $this->setOrderBy(' date desc ');
        return $this->searchMaterialEvaluation($toObject);
    }

    /**
     * Obtem a nota média do material
     *
     * @param integer $controlNumber
     * @return array [0] - registros que foram considerados na média, [1] média calculada
     */
    public function getAverage($controlNumber)
    {
        if (!$controlNumber)
        {
            return array(0, 0);
        }

        $sql = "SELECT   count(evaluation),
                        avg( evaluation )::int
                 FROM   gtcmaterialevaluation
                WHERE   controlnumber = {$controlNumber}
                  AND   ( evaluation > 0 or evaluation is not null ) ";

        return $this->query($sql);
    }

    public function validControlNumber($controlNumber)
    {
        $busMaterialControl = $this->MIOLO->getBusiness($this->module, 'BusMaterialControl');
        $rs = $busMaterialControl->getMaterialControl($controlNumber, true);
        if ($rs)
        {
            return true;
        }
        return false;
    }
    
    public function clean()
    {
        $this->materialEvaluationId = NULL;
        $this->controlNumber = NULL;
        $this->personId = NULL;
        $this->date = NULL;
        $this->time = NULL;
        $this->comment = NULL;
        $this->evaluation = NULL;
        $this->materialEvaluationIdS = NULL;
        $this->controlNumberS = NULL;
        $this->personIdS = NULL;
        $this->beginDateS = NULL;
        $this->endDateS = NULL;
        $this->endTimeS = NULL;
        $this->beginTimeS = NULL;
        $this->commentS = NULL;
        $this->evaluationS = NULL;
    }

}

?>