<?php
/**************************************************************************\
* eGroupWare                                                               *
* http://www.egroupware.org                                                *
* --------------------------------------------                             *
*  This program is free software; you can redistribute it and/or modify it *
*  under the terms of the GNU General Public License as published by the   *
*  Free Software Foundation; either version 2 of the License, or (at your  *
*  option) any later version.                                              *
\**************************************************************************/

require_once 'class.bo_ajaxinterface.inc.php';

/**
 * Camada Business para administrar Jobs
 * @package Workflow
 * @author Sidnei Augusto Drovetto Jr. - drovetto@gmail.com
 * @license http://www.gnu.org/copyleft/gpl.html GPL
 */
class bo_adminjobs extends bo_ajaxinterface
{
	/**
	 * @var object $so Acesso à camada model.
	 * @access private
	 */
	private $so;

	/**
	 * Construtor da classe bo_adminjobs
	 * @return object
	 * @access public
	 */
	function bo_adminjobs()
	{
		parent::bo_ajaxinterface();
		$this->so = &Factory::getInstance('so_adminjobs');
	}

	/**
	 * Carrega a lista de todos os jobs de um determinado processo.
	 * @param array $params Uma array contendo os parâmetros advindos da chamada Ajax
	 * @return array Lista dos jobs (ordenada por nome)
	 * @access public
	 */
	function loadJobs($params)
	{
		$output = $this->so->loadJobs($params['processID']);
		if (isset($output['error']))
			return $output;

		usort($output, create_function('$a,$b', 'return strcasecmp($a[\'name\'],$b[\'name\']);'));
		return $output;
	}

	/**
	 * Atualiza um job ou cria um novo job (dependendo dos parâmetros passados)
	 * @param array $params Uma array contendo os parâmetros advindos da chamada Ajax
	 * @return array Lista dos jobs (ordenada por nome)
	 * @access public
	 */
	function saveJob($params)
	{
		$output = array();
		if (!empty($params['jobID']))
			$output = $this->so->updateJob($params['jobID'], $params['processID'], $params['name'], $params['description'], $params['timeStart'], $params['intervalValue'], $params['intervalUnity'], $params['dateType'], $params['weekDays'], $params['monthOffset'], $params['active']);
		else
			$output = $this->so->createJob($params['processID'], $params['name'], $params['description'], $params['timeStart'], $params['intervalValue'], $params['intervalUnity'], $params['dateType'], $params['weekDays'], $params['monthOffset'], $params['active']);

		if (count($output['error']) === 0)
			return $this->loadJobs(array('processID' => $params['processID']));
		else
			return $output;
	}

	/**
	 * Remove um job (e seus logs)
	 * @param array $params Uma array contendo os parâmetros advindos da chamada Ajax
	 * @return void
	 * @access public
	 */
	function removeJob($params)
	{
		return $this->so->removeJob($params['jobID']);
	}

	/**
	 * Carrega a lista dos logs de um Job
	 * @param array $params Uma array contendo os parâmetros advindos da chamada Ajax
	 * @return array Lista dos logs
	 * @access public
	 */
	function loadLogs($params)
	{
		$logs = $this->so->loadLogs($params['jobID']);
		if (isset($logs['error']))
			return $logs;

		/* paginate the result */
		$logEntriesPerPage = 30;
		$paging =& Factory::newInstance('Paging', $logEntriesPerPage, $params);
		$logs = $paging->restrictItems($logs);

		/* use a more human readable time notation (today, yesterday) */
		$date = new DateTime();
		$writtenDates = array();
		$writtenDates[$date->format('d/m/Y')] = 'Hoje';
		$date->modify('-1 day');
		$writtenDates[$date->format('d/m/Y')] = 'Ontem';
		foreach ($logs as $key => $value)
		{
			$logs[$key]['date_time'] = ereg_replace("([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2}) ([[:digit:]]{2}):([[:digit:]]{2}):00", '\3/\2/\1 \4h\5', $value['date_time']);
			$currentDate = $value['date_time'];
			if (isset($writtenDates[substr($logs[$key]['date_time'], 0, 10)]))
				$logs[$key]['human_date_time'] = $writtenDates[substr($logs[$key]['date_time'], 0, 10)] . substr($logs[$key]['date_time'], 10);
		}

		/* prepare the output */
		$output = array();
		$output['logs'] = $logs;
		$output['pagingLinks'] = $paging->commonLinks();
		return $output;
	}

	/**
	 * Alterna o status do Job entre ativado e desativado
	 * @param array $params Uma array contendo os parâmetros advindos da chamada Ajax
	 * @return array Lista dos jobs (ordenada por nome)
	 * @access public
	 */
	function toggleActive($params)
	{
		$jobID = (int) $params['jobID'];
		$output = $this->so->toggleActive($jobID);
		if (count($output['error']) === 0)
			return $this->loadJobs(array('processID' => (int) $params['processID']));
		else
			return $output;
	}

	/**
	 * Executa um determinado Job
	 * @param array $params Uma array contendo os parâmetros advindos da chamada Ajax
	 * @return array Uma array contendo a saída da execução do Job (saída padrão e saída de erro) e outras mensagens
	 * @access public
	 */
	function runJob($params)
	{
		$jobID = (int) $params['jobID'];
		return $this->so->runJob($jobID);
	}
}
?>