<?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 gtcLibraryUnit table
*
*
*
*
*
**/
class BusinessGnuteca3BusWorkflowTransition extends GBusiness
{
    public $MIOLO;
    public $module;

    public $busWorkflowStatus;

    public $previousWorkflowStatusId;
    public $nextWorkflowStatusId;
    public $__function; //o function tem underline em função de function ser uma variável do form
    public $__name;

    public $name;
    public $function;

    public $previousWorkflowStatusIdS;
    public $nextWorkflowStatusIdS;
    public $__functionS; //o function tem underline em função de function ser uma variável do form
    public $__nameS;
    public $workflowIdS;

    function __construct()
    {
        parent::__construct();
        $this->MIOLO = MIOLO::getInstance();
        $this->module = MIOLO::getCurrentModule();
        $this->tables = 'gtcWorkflowTransition';
        $this->id = 'previousWorkflowStatusId,nextWorkflowStatusId';
        $this->columnsNoId = 'function,name';
        $this->columns = $this->id .','.$this->columnsNoId;

        $this->busWorkflowStatus = $this->MIOLO->getBusiness('gnuteca3','BusWorkflowStatus');
    }

    function insertWorkflowTransition()
    {
        return $this->autoInsert();
    }

    function updateWorkflowTransition()
    {
        return $this->autoUpdate();
    }

    function deleteWorkflowTransition($previousWorkflowStatusId,$nextWorkflowStatusId)
    {
        return $this->autoDelete($previousWorkflowStatusId,$nextWorkflowStatusId);
    }

    function searchWorkflowTransition( $toObject = false , $removeInitialTransation = false )
    {
        $this->clear();
        $this->function = $this->__functionS; //o function tem underline em função de function ser uma variável do form
        $this->name = $this->__nameS; //o name tem underline em função de function ser uma variável do form

        $this->setColumns('WT.previousWorkflowStatusId,WT.nextWorkflowStatusId,(SELECT distinct(label) from basDomain WHERE key = prevStatus.workflowid LIMIT 1) as workflow,prevStatus.name,nextStatus.name,WT.function,WT.name,nextStatus.transaction as nextTransaction');
        $this->setTables('gtcworkflowtransition WT LEFT JOIN  gtcworkflowstatus prevStatus ON  (prevStatus.workflowstatusid = WT.previousWorkflowStatusId) 
                                                   LEFT JOIN gtcworkflowstatus nextStatus ON (nextStatus.workflowstatusid = WT.nextWorkflowStatusId)');
        
        $filters = array ('previousWorkflowStatusId' => 'equals',
                          'nextWorkflowStatusId' => 'equals',
                          'function' => 'ilike'
                          );

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

        if ( $this->name )
        {
            $this->setWhere(' upper(WT.name) like upper(?) ');
            $args[] = '%'.$this->name.'%';
        }

        if ( $this->workflowIdS )
        {
            $this->setWhere( "nextStatus.workflowstatusid IN ( SELECT distinct (workflowstatusid) FROM gtcworkflowstatus where upper(workflowid) = upper(?) ) " );
            $args[] = $this->workflowIdS;
        }
        
        if ( $this->nextWorkflowStatusIdS )
        {
            $this->setWhere( "WT.nextWorkflowStatusId = ?" );
            $args[] = $this->nextWorkflowStatusIdS;
        }
        
        if ( $this->previousWorkflowStatusIdS )
        {
            $this->setWhere( "WT.previousWorkflowStatusId = ?" );
            $args[] = $this->previousWorkflowStatusIdS;
        }

        //para remover transições inicial para inicial
        if ( $removeInitialTransation )
        {
            //$this->setWhere( "( previousWorkflowStatusId != WT.nextWorkflowStatusId AND  nextStatus.initial = 'f')" );
            $this->setWhere( "(nextStatus.initial = 'f')" );
        }

        return $this->query($this->select($args),$toObject);
    }
    
    /**
     * Retorna stdClass da transição com o atributo workflowId junto.
     * 
     * @param integer $previousWorkflowStatusId
     * @param integer $nextWorkflowStatusId
     * @return stdClass
     */
    function getWorkflowTransition ($previousWorkflowStatusId , $nextWorkflowStatusId)
    {
        $result = $this->autoGet($previousWorkflowStatusId, $nextWorkflowStatusId);
        $workflowStatus = $this->busWorkflowStatus->getWorkflowStatus($previousWorkflowStatusId);
        $this->workflowId = $workflowStatus->workflowId;

        return $result;
    }

    /**
     * Obtem os estados futuros para estado passado
     * @param integer $workflowStatusId código do estado do workflow
     * @return array de stdClass
     */
    public function getFutureStatus( $workflowStatusId )
    {
        $this->previousWorkflowStatusId = $workflowStatusId;

        return $this->searchWorkflowTransition( true, true ); //removeInitialTransation
    }
}
?>