Guardar UF en DB
This commit is contained in:
19
app/src/Model/UF.php
Normal file
19
app/src/Model/UF.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
namespace Incoviba\Model;
|
||||||
|
|
||||||
|
use DateTimeInterface;
|
||||||
|
use Incoviba\Common\Ideal;
|
||||||
|
|
||||||
|
class UF extends Ideal\Model
|
||||||
|
{
|
||||||
|
public DateTimeInterface $fecha;
|
||||||
|
public ?float $valor;
|
||||||
|
|
||||||
|
public function jsonSerialize(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'fecha' => $this->fecha,
|
||||||
|
'valor' => $this->valor
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
49
app/src/Repository/UF.php
Normal file
49
app/src/Repository/UF.php
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
namespace Incoviba\Repository;
|
||||||
|
|
||||||
|
use DateTimeInterface;
|
||||||
|
use Incoviba\Common\Define;
|
||||||
|
use Incoviba\Common\Ideal;
|
||||||
|
use Incoviba\Common\Implement;
|
||||||
|
use Incoviba\Model;
|
||||||
|
|
||||||
|
class UF extends Ideal\Repository
|
||||||
|
{
|
||||||
|
public function getTable(): string
|
||||||
|
{
|
||||||
|
return 'uf';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create(?array $data = null): Model\UF
|
||||||
|
{
|
||||||
|
$map = (new Implement\Repository\MapperParser(['valor']))
|
||||||
|
->register('fecha', new Implement\Repository\Mapper\DateTime('fecha'));
|
||||||
|
return $this->parseData(new Model\UF(), $data, $map);
|
||||||
|
}
|
||||||
|
public function save(Define\Model $model): Model\UF
|
||||||
|
{
|
||||||
|
$this->saveNew(['fecha', 'valor'], [
|
||||||
|
$model->fecha->format('Y-m-d'),
|
||||||
|
$model->valor
|
||||||
|
]);
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
public function edit(Define\Model $model, array $new_data): Model\UF
|
||||||
|
{
|
||||||
|
return $this->update($model, ['fecha', 'valor'], $new_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param DateTimeInterface $dateTime
|
||||||
|
* @return Model\UF
|
||||||
|
* @throws Implement\Exception\EmptyResult
|
||||||
|
*/
|
||||||
|
public function fetchByFecha(DateTimeInterface $dateTime): Model\UF
|
||||||
|
{
|
||||||
|
$query = $this->connection->getQueryBuilder()
|
||||||
|
->select()
|
||||||
|
->from($this->getTable())
|
||||||
|
->where('fecha = :fecha');
|
||||||
|
return $this->fetchOne($query, ['fecha' => $dateTime->format('Y-m-d')]);
|
||||||
|
}
|
||||||
|
}
|
@ -3,14 +3,17 @@ namespace Incoviba\Service;
|
|||||||
|
|
||||||
use DateTimeInterface;
|
use DateTimeInterface;
|
||||||
use DateTimeImmutable;
|
use DateTimeImmutable;
|
||||||
use Incoviba\Common\Implement\Exception\EmptyRedis;
|
use PDOException;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Incoviba\Common\Implement\Exception\{EmptyRedis, EmptyResult};
|
||||||
|
use Incoviba\Repository;
|
||||||
|
|
||||||
class UF
|
class UF
|
||||||
{
|
{
|
||||||
protected string $redisKey = 'uf';
|
protected string $redisKey = 'uf';
|
||||||
|
|
||||||
public function __construct(protected Redis $redisService, protected Money $moneyService,
|
public function __construct(protected Redis $redisService, protected Money $moneyService,
|
||||||
|
protected Repository\UF $ufRepository,
|
||||||
protected LoggerInterface $logger) {}
|
protected LoggerInterface $logger) {}
|
||||||
|
|
||||||
public function get(?DateTimeInterface $date = null): float
|
public function get(?DateTimeInterface $date = null): float
|
||||||
@ -18,21 +21,30 @@ class UF
|
|||||||
if ($date === null) {
|
if ($date === null) {
|
||||||
$date = new DateTimeImmutable();
|
$date = new DateTimeImmutable();
|
||||||
}
|
}
|
||||||
$ufs = [];
|
/**
|
||||||
|
* 1 - Redis
|
||||||
|
* 2 - DB
|
||||||
|
* 3 - Fetch from web
|
||||||
|
*/
|
||||||
try {
|
try {
|
||||||
$ufs = json_decode($this->redisService->get($this->redisKey), JSON_OBJECT_AS_ARRAY);
|
$ufs = $this->getRedisUFs();
|
||||||
if (!isset($ufs[$date->format('Y-m-d')])) {
|
if (!isset($ufs[$date->format('Y-m-d')])) {
|
||||||
throw new EmptyRedis($this->redisKey);
|
throw new EmptyRedis($this->redisKey);
|
||||||
}
|
}
|
||||||
$uf = $ufs[$date->format('Y-m-d')];
|
return $ufs[$date->format('Y-m-d')];
|
||||||
} catch (EmptyRedis) {
|
} catch (EmptyRedis) {
|
||||||
$uf = $this->moneyService->getUF($date);
|
try {
|
||||||
if ($uf === 0.0) {
|
$model = $this->ufRepository->fetchByFecha($date);
|
||||||
return 0.0;
|
return $model->valor;
|
||||||
|
} catch (EmptyResult) {
|
||||||
|
$uf = $this->moneyService->getUF($date);
|
||||||
|
|
||||||
|
if ($uf === 0.0) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->saveUF($date, $uf);
|
||||||
}
|
}
|
||||||
$ufs[$date->format('Y-m-d')] = $uf;
|
|
||||||
ksort($ufs);
|
|
||||||
$this->redisService->set($this->redisKey, json_encode($ufs), 60 * 60 * 24 * 30);
|
|
||||||
}
|
}
|
||||||
return $uf;
|
return $uf;
|
||||||
}
|
}
|
||||||
@ -49,6 +61,7 @@ class UF
|
|||||||
if ($uf === 0.0) {
|
if ($uf === 0.0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
$this->saveUF($date, $uf);
|
||||||
$updated[$date->format('Y-m-d')] = $uf;
|
$updated[$date->format('Y-m-d')] = $uf;
|
||||||
$ufs[$date->format('Y-m-d')] = $this->moneyService->getUF($date);
|
$ufs[$date->format('Y-m-d')] = $this->moneyService->getUF($date);
|
||||||
}
|
}
|
||||||
@ -63,4 +76,45 @@ class UF
|
|||||||
$uf = $this->get($date);
|
$uf = $this->get($date);
|
||||||
return $input * (($from === 'uf') ? $uf : 1/$uf);
|
return $input * (($from === 'uf') ? $uf : 1/$uf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected array $redisUFs;
|
||||||
|
public function getRedisUFs(): array
|
||||||
|
{
|
||||||
|
if (!isset($this->redisUFs)) {
|
||||||
|
try {
|
||||||
|
$this->redisUFs = json_decode($this->redisService->get($this->redisKey), JSON_OBJECT_AS_ARRAY);
|
||||||
|
} catch (EmptyRedis) {
|
||||||
|
$this->redisUFs = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->redisUFs;
|
||||||
|
}
|
||||||
|
protected function saveUF(DateTimeInterface $date, float $value): void
|
||||||
|
{
|
||||||
|
$this->saveUFinRedis($date, $value);
|
||||||
|
$this->saveUFinDB($date, $value);
|
||||||
|
}
|
||||||
|
protected function saveUFinRedis(DateTimeInterface $date, float $value): void
|
||||||
|
{
|
||||||
|
$ufs = $this->redisUFs;
|
||||||
|
|
||||||
|
$ufs[$date->format('Y-m-d')] = $value;
|
||||||
|
if (count($ufs) > 1) {
|
||||||
|
ksort($ufs);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->redisUFs = $ufs;
|
||||||
|
$this->redisService->set($this->redisKey, json_encode($ufs), 60 * 60 * 24 * 30);
|
||||||
|
}
|
||||||
|
protected function saveUFinDB(DateTimeInterface $date, float $value): void
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->ufRepository->fetchByFecha($date);
|
||||||
|
} catch (EmptyResult) {
|
||||||
|
try {
|
||||||
|
$model = $this->ufRepository->create(['fecha' => $date->format('Y-m-d'), 'valor' => $value]);
|
||||||
|
$this->ufRepository->save($model);
|
||||||
|
} catch (PDOException) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user