<?php
namespace App\Controller;
use App\Entity\General;
use App\Entity\Sidebar;
use App\Entity\Sponsors;
use App\Entity\Usuari;
use App\Util\Util;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Security\Core\SecurityContext;
use App\Entity\Meteo;
use DoctrineExtensions\Query\Mysql;
use DoctrineExtensions\Query\Mysql\Day;
use Doctrine\ORM\Query;
use Symfony\Component\Validator\Constraints\DateTime;
use Symfony\Contracts\Translation\TranslatorInterface;
class MeteoTosaController extends AbstractController
{
protected $enSidebar;
protected $enGeneral;
protected $enSponsors;
private $em;
private $objUtil;
private $requestStack;
private $session;
private $translator;
private $params;
private $correuController;
private $mailer;
private $sPathUploads;
public function __construct(EntityManagerInterface $em,RequestStack $requestStack,TranslatorInterface $translator, ContainerBagInterface $params, CorreuController $correuController,MailerInterface $mailer)
{
$this->em = $em;
$this->objUtil = new Util($this->em);
$this->requestStack = $requestStack;
$this->session = $this->requestStack->getSession();
$this->translator = $translator;
$this->params = $params;
$this->correuController = $correuController;
$this->mailer = $mailer;
$this->sPathUploads = dirname(__FILE__) . "/../../public/uploads/";
$this->enSidebar = $this->em->getRepository(Sidebar::class)->findBy(
array( 'general' => 1)
);
/////////////////////////
// Recoger dades generals
/////////////////////////
$this->enGeneral = $this->em->getRepository(General::class)->findAll();
///////////
// Sponsors
///////////
$this->enSponsors = $this->em->getRepository(Sponsors::class)->findBy(
array( 'visible' => 1),
array('ordre' => 'ASC')
);
}
public function indexAction(Request $peticion)
{
$aRequest = $peticion->request;
$enMeteo = $this->em->getRepository(Meteo::class)->findAll();
foreach ($enMeteo as $aMeteoPartial)
{
$aMeteo[$aMeteoPartial->getCodi()] = $aMeteoPartial;
$sHora = ($aMeteoPartial->getDataExtrem() != ''?' ' . $this->translator->trans("a les") . ' ' . $aMeteoPartial->getDataExtrem()->format('H:i') . ' h ':'');
$aMeteo[$aMeteoPartial->getCodi()] = number_format( $aMeteoPartial->getValor(), $aMeteoPartial->getDecimals(), ",", ".") . ' ' . $aMeteoPartial->getUnitats() . $sHora;
}
return $this->render('meteo_tosa.html.twig', array(
'enSidebar' => $this->enSidebar[0],
'aMeteo' => $aMeteo,
'enGeneral' => $this->enGeneral,
'enSponsors'=> $this->enSponsors
));
}
public function importarXmlAction(Request $peticion)
{
$aRequest = $peticion->request;
$enMeteoUpdate = new Meteo();
$emConfig = $this->em->getConfiguration();
$emConfig->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Mysql\Year');
$emConfig->addCustomDatetimeFunction('MONTH', 'DoctrineExtensions\Query\Mysql\Month');
$emConfig->addCustomDatetimeFunction('DAY', 'DoctrineExtensions\Query\Mysql\Day');
//phpinfo();
$bTest = false;
// Default parameters
$ftp_server = "ftp.meteo.cat";
$ftp_user_name = "masella";
$ftp_user_pass = "8utraTrU";
//$sDir = '/var/www/html/web/meteoXML/';
switch ($_SERVER['SERVER_NAME'])
{
case 'www.masella.com':
case 'beta.masella.com':
$sDir = '/var/www/vhosts/masella.com/httpdocs/public/meteoXML/';
break;
case 'dev22.masella.com':
case 'dev23.masella.com':
$sDir = '/var/www/vhosts/' . $_SERVER['SERVER_NAME'] . '/httpdocs/web/meteoXML/';
break;
case 'sf6.masella.com':
case 'new.masella.com':
$sDir = '/var/www/vhosts/' . $_SERVER['SERVER_NAME'] . '/httpdocs/public/meteoXML/';
break;
case 'masella015.developer.entorno.es':
$sDir = '/home/jramon/projects/masella2015/web/meteoXML/';
break;
}
$sDirTarget = '/Dades/XML/';
//echo __FILE__.'<br>';
// definir algunas variables
$local_file = 'local.zip';
if (!$bTest)
{
// Conexión FTP para obtener el ultimo fichero
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
$aDirectori = ftp_nlist($conn_id, $sDirTarget);
rsort($aDirectori);
$server_file = $aDirectori[0];
// intenta descargar $server_file y guardarlo en $local_file
if (ftp_get($conn_id, $sDir.$local_file, $server_file, FTP_BINARY))
{
//echo "Se ha guardado satisfactoriamente en $local_file\n";
} else {
echo "Ha habido un problema\n";
die();
}
// Borramos todos los ficheros del ftp excepto el que acabamos de coger
foreach ($aDirectori as $iKey=>$sFileDelete)
{
if ($iKey==0) continue;
ftp_delete($conn_id, $sFileDelete);
}
ftp_close($conn_id);
$sShell = "unzip " . $sDir . $local_file . " -d " . $sDir;
//echo '<br>'.$sShell.'<br>';
shell_exec($sShell);
//$aXML = simplexml_load_file($sXmlFile);
$server_file = basename($server_file);
$local_fileXML = str_replace(".zip", "", $server_file);
//echo $sDir.$local_fileXML."<br>";
} else {
$sDir = '/home/jramon/projects/masella2015/meteoXML/';
//$sDir = '/meteoXML/';
$local_fileXML = "SMC_MES_11023_1823_20141215151100_0.xml";
}
$aXML = simplexml_load_file($sDir.$local_fileXML);
if (!$bTest)
{
unlink($sDir.$local_fileXML);
unlink($sDir.$local_file);
}
/*
echo '<pre>';
print_r($aXML->estacio);
echo '</pre>';
*/
$query = $this->em->createQuery('DELETE FROM App:Meteo p WHERE p.data_extrem IS NULL');
$enMeteo = $query->getResult();
$dateTime = new DateTime();
foreach ($aXML->estacio->variable as $aXMLData)
{
/*
echo '<pre>';
print_r($aXMLData);
echo '</pre>';
*/
echo 'codi: '.$aXMLData["codi"].'<br>';
/*
echo '<pre>';
print_r($aXMLData);
echo '</pre>';
*/
// Agafem l'ultima lectura
foreach ($aXMLData->lectura as $aXMLLectura)
{
// Agafem l'ultima lectura
// només ens interen les últimes dades de l'estructura de Lectura
}
if ($aXMLLectura["data_extrem"] != '')
{
$enMeteo = $this->em->getRepository(Meteo::class)->findBy(
array(
'acronim' => $aXMLData["acronim"]
)
);
foreach ($enMeteo as $aMeteo)
{
////////////////////////////////////////////////////////////////
// Només updatejem si es diferent dia O el valor nou es superior
////////////////////////////////////////////////////////////////
$bUpdate = false;
if ($aXMLData["acronim"] == 'HRx'
|| $aXMLData["acronim"] == 'Tx'
|| $aXMLData["acronim"] == 'VVx10')
{
// . " AND (DAY(p.data_extrem) != :day"
// . " OR p.valor< :valor)"
//echo $aMeteo->getDataExtrem()->format('d') . '!= ' . substr($aXMLLectura["data_extrem"],0,2) . '<br>';
if ($aMeteo->getDataExtrem()->format('d') != substr($aXMLLectura["data_extrem"],0,2)
|| floatval($aMeteo->getValor()) < floatval($aXMLLectura["valor"]))
{
//echo '<br> Valor < <br>' . floatval($aMeteo->getValor()) . '<' . floatval($aXMLLectura["valor"]) . '<br>';
$bUpdate = true;
}
} else {
// . " AND (DAY(p.data_extrem) != :day"
// . " OR p.valor > :valor)"
if ($aMeteo->getDataExtrem()->format('d') != substr($aXMLLectura["data_extrem"],0,2)
|| floatval($aMeteo->getValor()) > floatval($aXMLLectura["valor"]))
{
//echo '<br> Valor > <br>' . floatval($aMeteo->getValor()) . '>' . floatval($aXMLLectura["valor"]) . '<br>';
$bUpdate = true;
}
}
if ($bUpdate)
{
echo '<br> Update<br>';
$enMeteoUpdate = $this->em->getRepository(Meteo::class)->find($aMeteo->getId());
$enMeteoUpdate->setDataExtrem(\DateTime::createFromFormat('d/m/Y H:i', $aXMLLectura["data_extrem"]));
$enMeteoUpdate->setValor($aXMLLectura["valor"]);
$this->em->persist($enMeteoUpdate);
$this->em->flush();
// $sQuery = "UPDATE App:Meteo p SET "
// . " p.data_extrem = :data_extrem"
// . ", p.valor= :valor"
// . " WHERE p.acronim = :acronim";
//
// $query = $this->em->createQuery($sQuery)
// ->setParameter('data_extrem', \DateTime::createFromFormat('d/m/Y H:i', $aXMLLectura["data_extrem"]))
// ->setParameter('valor', $aXMLLectura["valor"])
// ->setParameter('acronim', $aXMLData["acronim"])
// ;
// $enMeteo = $query->getResult();
}
}
} else {
$enMeteoInsert = new Meteo();
$enMeteoInsert->setCodi($aXMLData["codi"]);
$enMeteoInsert->setAcronim($aXMLData["acronim"]);
$enMeteoInsert->setNom($aXMLData['nom']);
$enMeteoInsert->setTipus($aXMLData['tipus']);
$enMeteoInsert->setUnitats($aXMLData['unitats']);
$enMeteoInsert->setDecimals($aXMLData['decimals']);
//$enMeteoInsert->setData($dateTime->setTimestamp(strtotime(str_replace('/','-',$aXMLLectura["data"]))));
$enMeteoInsert->setData(\DateTime::createFromFormat('d/m/Y H:i', $aXMLLectura["data"]));
$enMeteoInsert->setValor($aXMLLectura["valor"]);
echo '<br>data_extrem2<br>' . $aXMLLectura["data_extrem"] . '<br>';
if (isset($aXMLLectura["data_extrem"]))
{
$enMeteoInsert->setDataExtrem(\DateTime::createFromFormat('d/m/Y H:i', $aXMLLectura["data_extrem"]));
}
$enMeteoInsert->setEstat($aXMLLectura["estat"]);
$enMeteoInsert->setBase($aXMLLectura["base"]);
$this->em->persist($enMeteoInsert);
$this->em->flush();
}
}
return new Response('ok');
}
}