Reading prices from api.esios.ree.es
This commit is contained in:
		@ -10,3 +10,7 @@
 | 
			
		||||
Created src\entity\prices.php
 | 
			
		||||
> php bin/console doctrine:schema:update --dump-sql
 | 
			
		||||
> php bin/console doctrine:schema:update --force
 | 
			
		||||
 | 
			
		||||
Modified src\entity\prices.php
 | 
			
		||||
> php bin/console make:migration
 | 
			
		||||
> php bin/console doctrine:migrations:migrate
 | 
			
		||||
							
								
								
									
										175
									
								
								backend/symfony/src/DataProvider/PriceNowProvider.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								backend/symfony/src/DataProvider/PriceNowProvider.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,175 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\DataProvider;
 | 
			
		||||
 | 
			
		||||
use Doctrine\Persistence\ManagerRegistry;
 | 
			
		||||
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
 | 
			
		||||
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
 | 
			
		||||
use App\Entity\PriceNow;
 | 
			
		||||
use App\Entity\Prices;
 | 
			
		||||
 | 
			
		||||
class PriceNowProvider implements CollectionDataProviderInterface, RestrictedDataProviderInterface
 | 
			
		||||
{
 | 
			
		||||
    private $doctrine;
 | 
			
		||||
 | 
			
		||||
    public function __construct(ManagerRegistry $doctrine)
 | 
			
		||||
    {
 | 
			
		||||
        $this->doctrine = $doctrine;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getPriceToday(): Prices {
 | 
			
		||||
        $em = $this->doctrine->getManager();
 | 
			
		||||
        return $em->getRepository(Prices::class)->findOneBy(array(
 | 
			
		||||
            'day' => new \DateTime('now')
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
    private function setPriceToday(Prices $price):bool  {
 | 
			
		||||
        $em = $this->doctrine->getManager();
 | 
			
		||||
        $em->persist($price);
 | 
			
		||||
        $em->flush();
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private function getPriceHour(string $hh, Prices $price):float 
 | 
			
		||||
    {
 | 
			
		||||
        switch($hh) {
 | 
			
		||||
            case '00': return $priceToday->h00;
 | 
			
		||||
            case '01': return $priceToday->h01;
 | 
			
		||||
            case '02': return $priceToday->h02;
 | 
			
		||||
            case '03': return $priceToday->h03;
 | 
			
		||||
            case '04': return $priceToday->h04;
 | 
			
		||||
            case '05': return $priceToday->h05;
 | 
			
		||||
            case '06': return $priceToday->h06;
 | 
			
		||||
            case '07': return $priceToday->h07;
 | 
			
		||||
            case '08': return $priceToday->h08;
 | 
			
		||||
            case '09': return $priceToday->h09;
 | 
			
		||||
            case '10': return $priceToday->h10;
 | 
			
		||||
            case '11': return $priceToday->h11;
 | 
			
		||||
            case '12': return $priceToday->h12;
 | 
			
		||||
            case '13': return $priceToday->h13;
 | 
			
		||||
            case '14': return $priceToday->h14;
 | 
			
		||||
            case '15': return $priceToday->h15;
 | 
			
		||||
            case '16': return $priceToday->h16;
 | 
			
		||||
            case '17': return $priceToday->h17;
 | 
			
		||||
            case '18': return $priceToday->h18;
 | 
			
		||||
            case '19': return $priceToday->h19;
 | 
			
		||||
            case '20': return $priceToday->h20;
 | 
			
		||||
            case '21': return $priceToday->h21;
 | 
			
		||||
            case '22': return $priceToday->h22;
 | 
			
		||||
            case '23': return $priceToday->h23;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private function setPriceHour(string $hh, Prices $price):void
 | 
			
		||||
    {
 | 
			
		||||
        switch($hh) {
 | 
			
		||||
            case '00': $priceToday->h00 = $p; break;
 | 
			
		||||
            case '01': $priceToday->h01 = $p; break;
 | 
			
		||||
            case '02': $priceToday->h02 = $p; break;
 | 
			
		||||
            case '03': $priceToday->h03 = $p; break;
 | 
			
		||||
            case '04': $priceToday->h04 = $p; break;
 | 
			
		||||
            case '05': $priceToday->h05 = $p; break;
 | 
			
		||||
            case '06': $priceToday->h06 = $p; break;
 | 
			
		||||
            case '07': $priceToday->h07 = $p; break;
 | 
			
		||||
            case '08': $priceToday->h08 = $p; break;
 | 
			
		||||
            case '09': $priceToday->h09 = $p; break;
 | 
			
		||||
            case '10': $priceToday->h10 = $p; break;
 | 
			
		||||
            case '11': $priceToday->h11 = $p; break;
 | 
			
		||||
            case '12': $priceToday->h12 = $p; break;
 | 
			
		||||
            case '13': $priceToday->h13 = $p; break;
 | 
			
		||||
            case '14': $priceToday->h14 = $p; break;
 | 
			
		||||
            case '15': $priceToday->h15 = $p; break;
 | 
			
		||||
            case '16': $priceToday->h16 = $p; break;
 | 
			
		||||
            case '17': $priceToday->h17 = $p; break;
 | 
			
		||||
            case '18': $priceToday->h18 = $p; break;
 | 
			
		||||
            case '19': $priceToday->h19 = $p; break;
 | 
			
		||||
            case '20': $priceToday->h20 = $p; break;
 | 
			
		||||
            case '21': $priceToday->h21 = $p; break;
 | 
			
		||||
            case '22': $priceToday->h22 = $p; break;
 | 
			
		||||
            case '23': $priceToday->h23 = $p; break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public function getCollection(string $resourceClass, string $operationName = null) : iterable
 | 
			
		||||
    {
 | 
			
		||||
        // Get the today's price (from cache)
 | 
			
		||||
        /*
 | 
			
		||||
        $em = $this->doctrine->getManager();
 | 
			
		||||
        $dql = "SELECT hour_start, hour_end, price FROM prices WHERE day = CURRENT_DATE()";
 | 
			
		||||
		$query = $em->getConnection()->prepare($dql);
 | 
			
		||||
        $prices = $query->executeQuery()->fetchAllAssociative();
 | 
			
		||||
        */
 | 
			
		||||
        $priceToday = $this->getPriceToday();
 | 
			
		||||
 | 
			
		||||
        echo print_r($priceToday,true);
 | 
			
		||||
        exit;
 | 
			
		||||
 | 
			
		||||
        if ( $priceToday->id<=0 ) {
 | 
			
		||||
            // Get the today's price (from internet)
 | 
			
		||||
            $url = 'https://api.esios.ree.es/archives/70/download_json?locale=es&date=2022-01-12'; 
 | 
			
		||||
            $data = file_get_contents($url);
 | 
			
		||||
            $json = json_decode($data, true);
 | 
			
		||||
 | 
			
		||||
            if ( !array_key_exists('PVPC', $json) ) 
 | 
			
		||||
                throw new Exception('Unable to get the prices for today');
 | 
			
		||||
 | 
			
		||||
            $ddMMyyy = explode('/',$pvpc['Dia'])[0];
 | 
			
		||||
            $priceToday->day = new \DateTime($ddMMyyy[2].'/'.$ddMMyyy[1].'/'.$ddMMyyy[0].' 00:00:00');
 | 
			
		||||
            foreach( $json['PVPC'] as $pvpc ) {
 | 
			
		||||
                $hh = explode('-',$pvpc['Hora'])[0];
 | 
			
		||||
                $p = str_replace(',','.',$pvpc['PCB']) / 1000;
 | 
			
		||||
 | 
			
		||||
                $this->setPriceHour($hh, $priceNow);
 | 
			
		||||
/*
 | 
			
		||||
                switch($hh) {
 | 
			
		||||
                    case '00': $priceToday->h00 = $p; break;
 | 
			
		||||
                    case '01': $priceToday->h01 = $p; break;
 | 
			
		||||
                    case '02': $priceToday->h02 = $p; break;
 | 
			
		||||
                    case '03': $priceToday->h03 = $p; break;
 | 
			
		||||
                    case '04': $priceToday->h04 = $p; break;
 | 
			
		||||
                    case '05': $priceToday->h05 = $p; break;
 | 
			
		||||
                    case '06': $priceToday->h06 = $p; break;
 | 
			
		||||
                    case '07': $priceToday->h07 = $p; break;
 | 
			
		||||
                    case '08': $priceToday->h08 = $p; break;
 | 
			
		||||
                    case '09': $priceToday->h09 = $p; break;
 | 
			
		||||
                    case '10': $priceToday->h10 = $p; break;
 | 
			
		||||
                    case '11': $priceToday->h11 = $p; break;
 | 
			
		||||
                    case '12': $priceToday->h12 = $p; break;
 | 
			
		||||
                    case '13': $priceToday->h13 = $p; break;
 | 
			
		||||
                    case '14': $priceToday->h14 = $p; break;
 | 
			
		||||
                    case '15': $priceToday->h15 = $p; break;
 | 
			
		||||
                    case '16': $priceToday->h16 = $p; break;
 | 
			
		||||
                    case '17': $priceToday->h17 = $p; break;
 | 
			
		||||
                    case '18': $priceToday->h18 = $p; break;
 | 
			
		||||
                    case '19': $priceToday->h19 = $p; break;
 | 
			
		||||
                    case '20': $priceToday->h20 = $p; break;
 | 
			
		||||
                    case '21': $priceToday->h21 = $p; break;
 | 
			
		||||
                    case '22': $priceToday->h22 = $p; break;
 | 
			
		||||
                    case '23': $priceToday->h23 = $p; break;
 | 
			
		||||
                }
 | 
			
		||||
                */
 | 
			
		||||
                //echo "\n $dd $hh = $p";
 | 
			
		||||
            }
 | 
			
		||||
            $this->setPriceToday($priceToday);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $priceNow = new PriceNow;
 | 
			
		||||
        $priceNow->id = $priceToday->id;
 | 
			
		||||
        $priceNow->min = min($priceToday->h00,$priceToday->h01,$priceToday->h02,$priceToday->h03,$priceToday->h04,$priceToday->h05,$priceToday->h06,$priceToday->h07,$priceToday->h08,$priceToday->h09,$priceToday->h10,$priceToday->h11,$priceToday->h12,$priceToday->h13,$priceToday->h14,$priceToday->h15,$priceToday->h16,$priceToday->h17,$priceToday->h18,$priceToday->h19,$priceToday->h20,$priceToday->h21,$priceToday->h22,$priceToday->h23);
 | 
			
		||||
        $priceNow->max = max($priceToday->h00,$priceToday->h01,$priceToday->h02,$priceToday->h03,$priceToday->h04,$priceToday->h05,$priceToday->h06,$priceToday->h07,$priceToday->h08,$priceToday->h09,$priceToday->h10,$priceToday->h11,$priceToday->h12,$priceToday->h13,$priceToday->h14,$priceToday->h15,$priceToday->h16,$priceToday->h17,$priceToday->h18,$priceToday->h19,$priceToday->h20,$priceToday->h21,$priceToday->h22,$priceToday->h23);
 | 
			
		||||
        $priceNow->avg = ($priceToday->h00+$priceToday->h01+$priceToday->h02+$priceToday->h03+$priceToday->h04+$priceToday->h05+$priceToday->h06+$priceToday->h07+$priceToday->h08+$priceToday->h09+$priceToday->h10+$priceToday->h11+$priceToday->h12+$priceToday->h13+$priceToday->h14+$priceToday->h15+$priceToday->h16+$priceToday->h17+$priceToday->h18+$priceToday->h19+$priceToday->h20+$priceToday->h21+$priceToday->h22+$priceToday->h23)/24;
 | 
			
		||||
        $priceNow->now = $this->getPriceHour( Date('H'), $priceNow);
 | 
			
		||||
 | 
			
		||||
        return [$priceNow];        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $resourceClass === PriceNow::class;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,45 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\DataProvider;
 | 
			
		||||
 | 
			
		||||
use Doctrine\Persistence\ManagerRegistry;
 | 
			
		||||
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
 | 
			
		||||
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
 | 
			
		||||
use App\Entity\PriceToday;
 | 
			
		||||
use App\Entity\Prices;
 | 
			
		||||
 | 
			
		||||
class PriceTodayProvider implements CollectionDataProviderInterface, RestrictedDataProviderInterface
 | 
			
		||||
{
 | 
			
		||||
    private $doctrine;
 | 
			
		||||
 | 
			
		||||
    public function __construct(ManagerRegistry $doctrine)
 | 
			
		||||
    {
 | 
			
		||||
        $this->doctrine = $doctrine;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getCollection(string $resourceClass, string $operationName = null) : iterable
 | 
			
		||||
    {
 | 
			
		||||
        // Get the today's price (from cache)
 | 
			
		||||
        $em = $this->doctrine->getManager();
 | 
			
		||||
        $dql = "SELECT hour_start, hour_end, price FROM prices WHERE day = CURRENT_DATE()";
 | 
			
		||||
		$query = $em->getConnection()->prepare($dql);
 | 
			
		||||
        $prices = $query->executeQuery()->fetchAllAssociative(); // \Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY
 | 
			
		||||
 | 
			
		||||
        if ( count($prices)<=0 ) {
 | 
			
		||||
            // Get the today's price (from internet)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $priceToday = new PriceToday();
 | 
			
		||||
        $priceToday->id = 1;
 | 
			
		||||
        $priceToday->min = 0.01;
 | 
			
		||||
        $priceToday->max = 0.10;
 | 
			
		||||
        $priceToday->avg = 0.05;
 | 
			
		||||
        $priceToday->now = 0.03;
 | 
			
		||||
        return [$priceToday];        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $resourceClass === PriceToday::class;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -22,7 +22,7 @@ use ApiPlatform\Core\Action\NotFoundAction;
 | 
			
		||||
 * )
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
class PriceToday
 | 
			
		||||
class PriceNow
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @ApiProperty(identifier=true)
 | 
			
		||||
@ -30,21 +30,35 @@ class Prices
 | 
			
		||||
     */
 | 
			
		||||
    public ?\DateTime $day = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="integer")
 | 
			
		||||
     */
 | 
			
		||||
    public ?int $hourStart = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="integer")
 | 
			
		||||
     */
 | 
			
		||||
    public ?int $hourEnd = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="decimal", precision="8", scale="6")
 | 
			
		||||
     * @Assert\NotBlank()
 | 
			
		||||
     */
 | 
			
		||||
    public float $price = 0.0;
 | 
			
		||||
    public ?float $h00 = null;
 | 
			
		||||
    public ?float $h01 = null;
 | 
			
		||||
    public ?float $h02 = null;
 | 
			
		||||
    public ?float $h03 = null;
 | 
			
		||||
    public ?float $h04 = null;
 | 
			
		||||
    public ?float $h05 = null;
 | 
			
		||||
    public ?float $h06 = null;
 | 
			
		||||
    public ?float $h07 = null;
 | 
			
		||||
    public ?float $h08 = null;
 | 
			
		||||
    public ?float $h09 = null;
 | 
			
		||||
    public ?float $h10 = null;
 | 
			
		||||
    public ?float $h11 = null;
 | 
			
		||||
    public ?float $h12 = null;
 | 
			
		||||
    public ?float $h13 = null;
 | 
			
		||||
    public ?float $h14 = null;
 | 
			
		||||
    public ?float $h15 = null;
 | 
			
		||||
    public ?float $h16 = null;
 | 
			
		||||
    public ?float $h17 = null;
 | 
			
		||||
    public ?float $h18 = null;
 | 
			
		||||
    public ?float $h19 = null;
 | 
			
		||||
    public ?float $h20 = null;
 | 
			
		||||
    public ?float $h21 = null;
 | 
			
		||||
    public ?float $h22 = null;
 | 
			
		||||
    public ?float $h23 = null;
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
    /******** METHODS ********/
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user