<?php
/**
 * <--- Copyright 2005-2011 de Solis - Cooperativa de Soluções Livres Ltda. e
 * Univates - Centro Universitário.
 * 
 * Este arquivo é parte do programa Gnuteca.
 * 
 * O Gnuteca é um software livre; você pode redistribuí-lo e/ou modificá-lo
 * dentro dos termos da Licença Pública Geral GNU como publicada pela Fundação
 * do Software Livre (FSF); na versão 2 da Licença.
 * 
 * Este programa é distribuído na esperança que possa ser útil, mas SEM
 * NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO
 * ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/GPL em
 * português para maiores detalhes.
 * 
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o título
 * "LICENCA.txt", junto com este programa, se não, acesse o Portal do Software
 * Público Brasileiro no endereço www.softwarepublico.gov.br ou escreva para a
 * Fundação do Software Livre (FSF) Inc., 51 Franklin St, Fifth Floor, Boston,
 * MA 02110-1301, USA --->
 * 
 * Schedule task search form
 *
 * @author Jader Fiegenbaum [jader@solis.coop.br]
 *
 * @version $Id$
 *
 * \b Maintainers \n
 * Jader Fiegenbaum [jader@solis.coop.br]
 * Jamiel Spezia [jamiel@solis.coop.br]
 *
 * @since
 * Class created on 01/07/2010
 *
 **/
class FrmScheduleTaskSearch extends GForm
{
	private $busTask;
    public function __construct()
    {
    	$this->setAllFunctions('ScheduleTask', array('scheduleTaskId', 'taskId', 'scheduleCycleId', 'parameters'), array('scheduleTaskId', 'taskId', 'scheduleCycleId', 'parameters'), 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 )
        {
            clog('rolo='.$e->getMessage());
            //caso de erro registra no log e joga o erro na tela
            $obj->concludeLog(false, $e->getMessage() ); 
            throw $e;
        }
        
        if ( !$error  )
        {
            clog('sem erro');
            $obj->concludeLog($ok); //conclusão log
        }

        //mostra a mensagem
        if ($ok)
        {
            $this->information(_M('A tarefa foi executada com sucesso!', $this->module), $this->getGotoCurrentActionAndSearchEventUrl());
        }
        else
        {
            $this->error(_M('A tarefa não foi executa!', $this->module), null, null, null, true);
        }
    }
    
    /**
     * Método que mostra o log da tarefa
     */
    public function showLogOfTask()
    {
        $busLog = $this->MIOLO->getBusiness($this->module, 'BusScheduleTaskLog');
        $data = new stdClass();
        $data->scheduleTaskId = MIOLO::_REQUEST('scheduleTaskId');
        $busLog->setData($data);
        $logs = $busLog->searchScheduleTaskLog('date desc');
        
        if ( is_array($logs) )
        {
            $i = 0;
            
            foreach( $logs as $i=> $values )
            {
                clog($values);
                $novo = array();
                $novo[0] = new MText('text1_' . $i, $i);
                $novo[0]->setClass(' '); //para não entrar em outra classe css
                $novo[1] = new MText('text2_' . $i, $values[1]);
                $novo[1]->setClass(' '); //para não entrar em outra classe css
                $novo[2] = new MText('text3_' . $i, $values[2]);
                $novo[2]->setClass(' '); //para não entrar em outra classe css

                //grifa de vermelho o agendamento que falhou
                //FIXME foi solicitado melhorar o controle de erros nos logs no ticket #8333
                if ( stripos($values[1], 'Falha no agendamento da tarefa') === 0 )
                {
                    clog('rolo');
                    $novo[0]->addStyle('color', 'red');
                    $novo[1]->addStyle('color', 'red');
                    $novo[2]->addStyle('color', 'red');
                }

                $logs[$i] = $novo;
                $i++;
            }

            $tbColumns = array( _M('Índice', $this->module), _M('Histórico', $this->module), _M('Data', $this->module),);
            $tb = new MTableRaw('', $logs, $tbColumns);
            $tb->zebra = true;
        }
        else
        {
            $tb = new MLabel(_M('Nenhum registro encontrado.', $this->module));
        }
        
        $this->injectContent($tb, true, _M('Histórico do agendamento ', $this->module) . MIOLO::_REQUEST('scheduleTaskId') );
    }
}
?>
