<?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.
 * 
 * 
 * Schedule task search form
 *
 *
 *
 *
 *
 **/
class FrmScheduleTaskSearch extends GForm
{
    private $busTask;
    
    public function __construct()
    {
    	$this->setAllFunctions('ScheduleTask', array('scheduleTaskId', 'taskId', 'scheduleCycleId', 'parametersS'), array('scheduleTaskId', 'taskId', 'scheduleCycleId'), array('scheduleTaskId', 'taskId', 'scheduleCycleId', 'parameters'));
        parent::__construct();
    }

    
    public function mainFields()
    {
    	$fields[] = new MTextField('scheduleTaskIdS', $this->scheduleTaskIdS->value, _M('Agendar tarefa',$this->module), FIELD_ID_SIZE);
        $this->busTask = $this->MIOLO->getBusiness($this->module, 'BusTask');
        $fields[] = new GSelection('taskIdS', '', _M('Tarefa',$this->module), $this->busTask->listTask());
        $fields[] = new GSelection('scheduleCycleIdS', '', _M('Ciclo do agendamento',$this->module), $this->business->listScheduleCycles());
        $fields[] = new MTextField('descriptionS', '', _M('Descrição', $this->module), FIELD_DESCRIPTION_SIZE);
        $fields[] = new MTextField('cycleValueS', '', _M('Valor', $this->module), FIELD_DESCRIPTION_SIZE);
        $fields[] = new GSelection('enableS', null, _M('Está ativo',$this->module), GUtil::listYesNo(0));
        $fields[] = new MTextField('parametersS', '', _M('Parâmetro', $this->module), FIELD_DESCRIPTION_SIZE);
        
        $this->setFields($fields);
    }
    
    
    /**
     * This method execute an task
     */
    public function executeScript()
    {
        if(!MIOLO::_REQUEST('executeConfirm')) //pede confirmação da execução
        {
            $opts['executeConfirm'] = 'ok';
            $opts['event'] = 'executeScript';
            $opts['function'] = 'execute';
            $opts['scheduleTaskId'] = MIOLO::_REQUEST('scheduleTaskId');
            $gotoYes = $this->MIOLO->getActionURL( $this->module, $this->_action, null, $opts );
            $msg     = _M('Tem certeza que deseja executar a tarefa', $this->module);
            $this->question($msg, $gotoYes);

            return;
        }

        $scheduleTaskId = MIOLO::_REQUEST('scheduleTaskId'); //pega o id  tarefa agendada
        $scheduleTask = $this->business->getScheduleTask($scheduleTaskId); //pega a tarefa agendada
        $busTask = $this->MIOLO->getBusiness($this->module, 'BusTask'); //instancia o business da tarefa
        $task = $busTask->getTask($scheduleTask->taskId); //pega a tarefa

        $localFile = $this->MIOLO->getConf('home.modules') . '/' . $this->module . '/misc/scripts'; //pega o path dos scripts
        $this->business->setScriptPath($localFile); //seta o path dos scripts
        $task = (object) array_merge((array) $task, (array) $scheduleTask); //mescla os dados da tarefa e tarefa agendada

        $obj = $this->business->instanceObjectTask($task); //intancia objeto da tarefa
        
        if ( !$obj )
        {
            throw new Exception( _M("Não foi possível criar a tarefa!", $this->module)  ) ;
        }
        
        $obj->setParameters($task->parameters); //seta os parâmetros

        $obj->setStartTime(); //registra a data/hora de início
        $obj->startLog(); //grava log de start
        
        $error = null;
       
        try
        {
            $ok = $obj->execute(); //executa
        }
        catch ( Exception $e )
        {
            //caso de erro registra no log e joga o erro na tela
            $obj->concludeLog(false, $e->getMessage() ); 
            throw $e;
        }
        
        //mostra a mensagem
        if( $ok instanceof Exception ) //Para tarefas que tenham lancado uma excessao.
        {
            $this->error(_M('A tarefa não foi executada!', $this->module), null, null, null, true);
            $obj->concludeLog(false, $ok->getMessage());
        }
        else if($ok) //Para qualquer tarefa que retorne true, sera mostrada mensagem de sucesso.
        {
            $obj->concludeLog($ok); //conclusão log
            $this->information(_M('A tarefa foi executada com sucesso!', $this->module), $this->getGotoCurrentActionAndSearchEventUrl());
        }
        else //Para qualquer tarefa que retorne por algum motivo false em sua execucao, ira acusar erro desconhecido.
        {
            $this->error(_M('A tarefa não foi executada!', $this->module), null, null, null, true);
            $obj->concludeLog(false, 'Erro desconhecido.');            
        }
    }
    
    /**
     * Método que mostra o log da tarefa
     */
    public function showLogOfTask()
    {
        $tb = new MDiv('divTable', $this->mountTable(10));
        
        $this->injectContent($tb, true, _M('Histórico do agendamento ', $this->module) . MIOLO::_REQUEST('scheduleTaskId') );
    }
    
    /**
     * Método que monsta a tabela de logs
     * @param integer $limit
     * @param integer id do agendamento
     * @return tabela com logs 
     */
    private function mountTable($limit=null, $scheduleTaskId=null)
    {
        $busLog = $this->MIOLO->getBusiness($this->module, 'BusScheduleTaskLog');
        $data = new stdClass();
        $data->scheduleTaskId = $scheduleTaskId ? $scheduleTaskId : MIOLO::_REQUEST('scheduleTaskId');
        $busLog->setData($data);
        $logs = $busLog->searchScheduleTaskLog('date desc, ord desc', $limit);
        
        if ( is_array($logs) )
        {
            $tbColumns = array( _M('Índice', $this->module), _M('Histórico', $this->module), _M('Data', $this->module),);
            $tb = new MTableRaw('', null, $tbColumns);
                        
            foreach ( $logs as $i => $log )
            {
                $logs[$i][0] = $i;
                //quando for erro, mostra mensagem em vermelho
                if ( $log[3] == 'END_ERROR' )
                {
                    $tb->setRowAttribute($i, 'style', 'color:#FF0000');
                }
                
                //esconde a última  e penúltima coluna
                $tb->setCellAttribute($i, 3, 'style', 'display:none');
                $tb->setCellAttribute($i, 4, 'style', 'display:none');
            }
            
            //modifica a última linha para ficar com somente uma coluna
            if ( ($limit == 10) && ( $busLog->countLogForScheduleTask() > 10) )
            {
                $link = new MLink('linkMoreRegisters', _M('Mostrar mais registros'), 'javascript:' . GUtil::getAjax('moreLogRegisters', $data->scheduleTaskId));
                $logs = array_merge($logs, array($link->generate()));
                $tb->setCellAttribute($i+1, 0, 'colspan', '3');
                $tb->setCellAttribute($i+1, 0, 'align', 'center');
            }
            
            $tb->setData($logs);
            $tb->zebra = true;
        }
        else
        {
            $tb = new MLabel(_M('Nenhum registro encontrado.', $this->module));
        }
        
        return $tb;
    }
    
    
    /**
     * Método ajax para atualizar a tabela de log com mais registros
     */
    public function moreLogRegisters($args)
    {
        $tb = $this->mountTable(5000, $args);
        
        $this->setResponse($tb, 'divTable');
    }
    
}
?>
