<?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.
 * 
 * 
 *
 * News business
 *
 *
 *
 *
 *
 * */
class BusinessGnuteca3BusExternalFinance extends GBusiness
{
    public $externalId;
    public $beginDate;
    public $open;
    public $endDate;
    public $email;
    public $fines;

    public $externalIdS;
    public $beginDateS;
    public $openS;
    public $endDateS;
    public $emailS;
    
    public $busExternalFinanceFine;
    public $busFine;

    public function __construct()
    {
        parent::__construct();
        $this->tables = 'gtcExternalFinance';
        $this->colsNoId = 'beginDate,
                           open,
                           endDate,
                           email';
        $this->columns = 'externalId, ' . $this->colsNoId;
        
        $this->busExternalFinanceFine = $this->MIOLO->getBusiness($this->module, 'BusExternalFinanceFine');
        $this->busFine = $this->MIOLO->getBusiness($this->module, 'BusFine');
    }
    
    /**
     * Obtém valor acumulado de multas em aberto,
     * 
     * @param int $personId Parâmetro opcional de código da pessoa.
     * @return array Array de objetos contendo o código da pessoa e valor da multa
     */
    public function getValueOfOpenFines($personId = NULL, $minimalValue = NULL,  $fineStatus=ID_FINESTATUS_OPEN)
    {
        $msql = new MSQL();
        $msql->setTables('gtcfine A 
                LEFT JOIN gtcloan B 
                       ON (A.loanid = B.loanid) 
                LEFT JOIN gtcreserve C 
                       ON (A.reserveid = C.reserveid)
                LEFT JOIN ONLY basperson D
                       ON (B.personid = D.personid OR C.personid = D.personid)
                ');
        $msql->setColumns('(CASE WHEN B.personid IS NOT NULL THEN B.personid ELSE C.personid END) as personid,
                           D.name,
                           D.email,
                           SUM(A.value) as value');
        $data = array();
        
        if ( $personId )
        {
            $msql->setWhere('(B.personid = ? OR C.personid = ?)');
            $data[] = $personId;
            $data[] = $personId;
        }
        
        if ( $minimalValue )
        {
            $msql->setHaving("SUM(A.value) >= $minimalValue");
            $msql->setGroupBy('1,2,3');
        }
        
        $msql->setWhere('A.finestatusid = ?');
        $data[] = $fineStatus;
        
        $msql->setWhere('A.fineId NOT IN (SELECT fineid FROM gtcexternalfinancefine)');
        
        $sql = $msql->select($data);
        
        return $this->query($sql);
    }
    
    /**
     * Obtém multas.
     *
     * @param int $personId Código da pessoa.
     * @param int $fineStatus Código do status da multa.
     * @return array Multas da pessoa.
     */
    public function getFines($personId = null, $fineStatus=ID_FINESTATUS_OPEN)
    {
        $this->clear();

        $msql = new MSQL();
        $msql->setTables('gtcfine A 
                LEFT JOIN gtcloan B 
                       ON (A.loanid = B.loanid) 
                LEFT JOIN gtcreserve C 
                       ON (A.reserveid = C.reserveid) ');
        $msql->setColumns('A.fineId as fineId, A.value as value');
        $data = array();
        
        if ( $personId )
        {
            $msql->setWhere('(B.personid = ? OR C.personid = ?)');
            $data[] = $personId;
            $data[] = $personId;
        }
        
        $msql->setWhere('A.finestatusid = ?');
        $data[] = $fineStatus;
        
        $msql->setWhere('A.fineId NOT IN (SELECT fineid FROM gtcexternalfinancefine)');
        
        $sql = $msql->select($data);
        
        $results = parent::query($sql);
        
        $return = array();
        
        if ( $results )
        {
            foreach ( $results as $result )
            {
                $dataReturn = new stdClass();
                $dataReturn->fineId = $result[0];
                $dataReturn->value = $result[1];
                $return[] = $dataReturn;
            }
        }
        
        return $return;
    }
    
    /**
     *  Insere registro de insertExternalFinance.
     * 
     * @return boolean True caso tenha conseguido inserir com sucesso.
     */
    public function insertExternalFinance()
    {
        $this->clear();
        $this->setColumns($this->columns);
        $this->setTables($this->tables);
        $data = array( $this->externalId,
            $this->beginDate,
            true,
            $this->endDate,
            $this->email);
        $sql = $this->insert($data);
        
        $rs = $this->execute($sql);

        if ( $this->fines && $rs )
        {
            foreach ( $this->fines as $fine )
            {
                $data = new stdClass();
                $data->externalId = $this->externalId;
                $data->fineId = $fine->fineId;
                
                $this->busExternalFinanceFine->setData($data);
                $this->busExternalFinanceFine->insertExternalFinanceFine();
            }
        }
        
        return $rs;
    }
    
    public function getOpenExternalFinance()
    {
        $this->clear();

        $msql = new MSQL();
        $msql->setTables('gtcExternalFinance A
               LEFT JOIN gtcExternalFinanceFine B
                      ON (A.externalId = B.externalId)
               LEFT JOIN gtcFine C 
                      ON (B.fineId = C.fineId)
               LEFT JOIN gtcLoan D
                      ON (C.loanid = D.loanid)
               LEFT JOIN gtcreserve E
                      ON (C.reserveid = E.reserveid)
              LEFT JOIN ONLY basperson F
                      ON (D.personid = F.personid OR E.personid = F.personid)
');
        $msql->setColumns('DISTINCT A.externalid, 
                                    A.beginDate,
                                    A.open,
                                    A.endDate,
                                    A.email,
                                    F.personid,
                                    F.name,
                                    F.email');
        
        $msql->setWhere('open = true');
        
        $sql = $msql->select();
        
        $results = parent::query($sql);
        
        $return = array();
        
        if ( is_array($results) )
        {
            foreach ( $results as $result )
            {
                $objectReturn = new stdClass();
                $objectReturn->externalId = $result[0];
                $objectReturn->beginDate = $result[1];
                $objectReturn->open = $result[2];
                $objectReturn->endDate = $result[3];
                $objectReturn->email = $result[4];
                $objectReturn->personId = $result[5];
                $objectReturn->personName = $result[6];
                $objectReturn->personEmail = $result[7];
                $return[] = $objectReturn;
            }
        }
        
        return $return;
    }
    
    /**
     * Fecha a ocorrência externa.
     * 
     * @return boolean True quando ocorrência externa paga com sucesso.
     */
    public function closeExternalFinance()
    {
        $this->beginTransaction();
        $fines = $this->busExternalFinanceFine->getFinesOfExternalId($this->externalId);
        $ok = array();
        $return = false;
        
        if ( is_array($fines) )
        {
            foreach ( $fines as $fine )
            {
                $ok[] = $this->busFine->setFinePay($fine->fineId);
            }
        }
        
        // Caso tenha trocado status de multas com sucesso.
        if ( !in_array(false, $ok) )
        {
            $this->clear();
            $this->setTables($this->tables);
            $this->setColumns('open, endDate');
            
            $data = array();
            $data[] = DB_FALSE;
            $date = GDate::now();
            $data[] = $date->getDate(GDate::MASK_TIMESTAMP_USER);
            
            $this->setWhere('externalId = ?');
            $data[] = $this->externalId;
            
            $sql = $this->update($data);
            $return = $this->execute($sql);
        }
        
        if ( $return )
        {
            $this->commitTransaction();
        }
        else
        {
            $this->rollbackTransaction();
        }
        
        return $return;
    }
    
}

?>
