API update.

This commit is contained in:
Djonathan 2022-07-05 00:26:26 -03:00
parent 8ce9e92550
commit 9b7987a11e
10 changed files with 255 additions and 39 deletions

View File

@ -42,3 +42,16 @@ if (!function_exists('xmlToObject')) {
return @simplexml_load_string(@file_get_contents($link), 'SimpleXMLElement', LIBXML_NOCDATA); return @simplexml_load_string(@file_get_contents($link), 'SimpleXMLElement', LIBXML_NOCDATA);
} }
} }
if ('format_date_sql'){
function format_date_sql($params, $model)
{
foreach ($params->getFields() as $param) {
$params->setFields(["TO_CHAR(TO_DATE({$model->qualifyColumn($param)}, 'YYMM'), 'MM/YYYY')"]);
}
return $params;
}
}

View File

@ -3,6 +3,11 @@
namespace App\Helpers; namespace App\Helpers;
use DateInterval;
use DatePeriod;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
class Helpers class Helpers
{ {
public static function uploadFiles($params, $field): ?string public static function uploadFiles($params, $field): ?string
@ -15,4 +20,50 @@ class Helpers
return $result; return $result;
} }
public static function orderByDate($result): array
{
return collect($result)->transform(fn($value) => Arr::set($value, 'mes', date_format(date_create($value['mes']), "M/Y")))->all();
}
public static function checkDate($value): array
{
$year = collect($value)->transform(fn($item, $value) => collect(Str::of($item['mes'])
->explode('-')->offsetGet(0)))->unique()->toArray();
$month = collect($value)->transform(fn($item, $value) => collect(Str::of($item['mes'])
->explode('-')->offsetGet(1)))->unique()->toArray();
$month_stat = end($month);
$date_stat = current($year);
$date_end = end($year);
$start_date = date_create("{$date_stat[0]}-01-01");
$end_date = date_create("{$date_end[0]}-{$month_stat[0]}-30");
$interval = DateInterval::createFromDateString('1 months');
$daterange = new DatePeriod($start_date, $interval, $end_date);
$date = [];
foreach ($daterange as $date1) {
$date[] = $date1->format('Y-m'.'-01');
}
$arr = collect($value)->toArray();
foreach ($date as $dt) {
if (!in_array($dt, array_column($arr, 'mes'))) {
$arr[] = ['mes' => $dt];
}
}
usort($arr, function ($a, $b, $i = 'mes') {
$t1 = strtotime($a[$i]);
$t2 = strtotime($b[$i]);
return $t1 - $t2;
});
return $arr;
}
} }

View File

@ -16,6 +16,8 @@ abstract class AbstractRepository
protected AbstractRepository|Model $model; protected AbstractRepository|Model $model;
protected $item;
/** /**
* @throws BindingResolutionException * @throws BindingResolutionException
*/ */
@ -24,20 +26,9 @@ abstract class AbstractRepository
$this->model = $model ?? $this::resolveModel(); $this->model = $model ?? $this::resolveModel();
} }
public function __call($name, $arguments) public function filterBuilder($params): void
{ {
$result = $this->forwardCallTo($this->model, $name, $arguments); $this->item = static::getFilterBuilder($params);
if ($result === $this->model) {
return $this;
}
return $result;
}
public function __get($name)
{
return $this->model->{$name};
} }
/** /**
@ -56,4 +47,21 @@ abstract class AbstractRepository
return (new static)->$model; return (new static)->$model;
} }
public function __call($name, $arguments)
{
$result = $this->forwardCallTo($this->model, $name, $arguments);
if ($result === $this->model) {
return $this;
}
return $result;
}
public function __get($name)
{
return $this->model->{$name};
}
} }

View File

@ -33,6 +33,7 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
return $query; return $query;
} }
/* Economia bruta anual */
public function getGrossAnnualEconomy($params): Collection|array public function getGrossAnnualEconomy($params): Collection|array
{ {
$field = [ $field = [
@ -52,11 +53,12 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
->get(); ->get();
} }
/* Economia bruta mensal */
public function getGrossMonthlyEconomy($params) public function getGrossMonthlyEconomy($params)
{ {
$field = [ $field = [
DB::raw("TO_DATE(economia.mes, 'YYMM') as mes"), DB::raw("TO_DATE(economia.mes, 'YYMM') as mes"),
DB::raw("SUM(economia.economia_acumulada)/1000 as economia_acumulada"), DB::raw("SUM(economia.economia_acumulada) as economia_acumulada"),
DB::raw("(SUM(economia.economia_mensal)/SUM(economia.custo_livre)) as econ_percentual"), DB::raw("(SUM(economia.economia_mensal)/SUM(economia.custo_livre)) as econ_percentual"),
"economia.dad_estimado" "economia.dad_estimado"
]; ];
@ -66,14 +68,14 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
">=", ">=",
DB::raw("TO_DATE(TO_CHAR(current_date , 'YYYY-01-01'), 'YYYY-MM-DD') - interval '1' year")) DB::raw("TO_DATE(TO_CHAR(current_date , 'YYYY-01-01'), 'YYYY-MM-DD') - interval '1' year"))
->groupBy(['mes', 'dad_estimado']) ->groupBy(['mes', 'dad_estimado'])
->orderBy('mes') ->orderBy(DB::raw("mes, dad_estimado"))
->orderBy('dad_estimado')
->get(); ->get();
return collect(static::checkDate($result))->transform(fn($value) => Arr::set($value, 'mes', date_format(date_create($value['mes']), "M/Y")))->all(); return collect(static::checkDate($result))->transform(fn($value) => Arr::set($value, 'mes', date_format(date_create($value['mes']), "M/Y")))->all();
} }
/* cativo x livre mensal*/
public function getCaptiveMonthlyEconomy($params) public function getCaptiveMonthlyEconomy($params)
{ {
$field = [ $field = [
@ -93,11 +95,11 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
DB::raw("TO_DATE(TO_CHAR(current_date, 'YYYY-12-31'), 'YYYY-MM-DD') ") DB::raw("TO_DATE(TO_CHAR(current_date, 'YYYY-12-31'), 'YYYY-MM-DD') ")
]) ])
->groupBy(['mes', 'dad_estimado']) ->groupBy(['mes', 'dad_estimado'])
->orderBy('mes') ->orderBy(DB::raw("mes, dad_estimado"))
->orderBy('dad_estimado')
->get(); ->get();
} }
/* Indicador de custo R$/MWh */
public function getCostMWhEconomy($params) public function getCostMWhEconomy($params)
{ {
$field = [ $field = [
@ -114,8 +116,7 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
DB::raw("TO_DATE(TO_CHAR(current_date, 'YYYY-12-31'), 'YYYY-MM-DD') ") DB::raw("TO_DATE(TO_CHAR(current_date, 'YYYY-12-31'), 'YYYY-MM-DD') ")
]) ])
->groupBy(['mes', 'dad_estimado']) ->groupBy(['mes', 'dad_estimado'])
->orderBy('mes') ->orderBy(DB::raw("mes, dad_estimado"))
->orderBy('dad_estimado')
->get(); ->get();
return collect(static::checkDate($result))->transform(fn($value) => Arr::set($value, 'mes', date_format(date_create($value['mes']), "M/Y")))->all(); return collect(static::checkDate($result))->transform(fn($value) => Arr::set($value, 'mes', date_format(date_create($value['mes']), "M/Y")))->all();

View File

@ -4,7 +4,10 @@ declare(strict_types=1);
namespace App\Repositories; namespace App\Repositories;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
trait MethodsTrait trait MethodsTrait
{ {
@ -40,17 +43,20 @@ trait MethodsTrait
} }
public function search($params) /**
* @throws BindingResolutionException
*/
public function search($params, $rowField = false)
{ {
$filter = static::getFilterBuilder($params); $this->filterBuilder($params);
$filter->setFields(collect($filter->getFields())->transform(fn($value) => $this->model->qualifyColumn($value))->all()); $fields = $this->item->applyField();
$query = $this->model->select($filter->getFields()); $query = $this->model->select($fields);
$response = $filter->applyFilter($query); $response = $this->item->applyFilter($query);
if ($filter->isDistinct()){ if ($this->item->isDistinct()){
$response = $response->distinct(); $response = $response->distinct();
} }

View File

@ -34,7 +34,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
/** /**
* @throws BindingResolutionException * Geral por Região
*/ */
public function getOverviewByRegion(): array|Collection public function getOverviewByRegion(): array|Collection
{ {
@ -42,7 +42,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
'pld.submercado as submarket', 'pld.submercado as submarket',
'pld.mes_ref as year_month', 'pld.mes_ref as year_month',
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month_formatted"), DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month_formatted"),
DB::raw("SUM(pld.valor) as value") DB::raw("AVG(pld.valor) as value")
]; ];
@ -52,6 +52,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
->get(); ->get();
} }
/** Tabela de Consumo */
public function getListConsumption($params): Collection|array public function getListConsumption($params): Collection|array
{ {
$fields = [ $fields = [
@ -144,6 +145,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
/** /**
* @throws BindingResolutionException * @throws BindingResolutionException
* PLD, Valores Diários
*/ */
public function getConsumptionByDaily($params, $field = "mes_ref"): Collection|array public function getConsumptionByDaily($params, $field = "mes_ref"): Collection|array
{ {
@ -151,7 +153,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
DB::raw("TO_CHAR((date('1899-12-31') + interval '1' day * pld.dia_num), 'DD') as day_formatted"), DB::raw("TO_CHAR((date('1899-12-31') + interval '1' day * pld.dia_num), 'DD') as day_formatted"),
DB::raw("(date('1899-12-31') + interval '1' day * pld.dia_num) as day_calc"), DB::raw("(date('1899-12-31') + interval '1' day * pld.dia_num) as day_calc"),
'pld.submercado as submarket', 'pld.submercado as submarket',
DB::raw("SUM(pld.valor) as value"), DB::raw("AVG(pld.valor) as value"),
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month"), DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month"),
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month_formatted"), DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month_formatted"),
]; ];
@ -177,7 +179,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
'hora as hour', 'hora as hour',
DB::raw("(date('1899-12-31') + interval '1' day * pld.dia_num) as day_calc"), DB::raw("(date('1899-12-31') + interval '1' day * pld.dia_num) as day_calc"),
'pld.submercado as submarket', 'pld.submercado as submarket',
DB::raw("SUM(pld.valor) as value"), 'pld.valor as value',
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month"), DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month"),
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month_formatted"), DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month_formatted"),
]; ];
@ -185,13 +187,13 @@ class PldRepository extends AbstractRepository implements PldContractInterface
$i = 0; $i = 0;
foreach ($params['filters'] as $param) { foreach ($params['filters'] as $param) {
if ($param['field'] === $field) { if ($param['field'] === $field) {
$params['filters'][$i]['field'] = "(date('1899-12-31') + interval '1' day * pld.{$param['field']})"; $params['filters'][$i]['field'] = "(date('1899-12-30') + interval '1' day * pld.{$param['field']})";
} }
$i++; $i++;
} }
return $this->execute($fields, $params) return $this->execute($fields, $params)
->groupBy('day_formatted', 'hour', 'day_calc', 'submarket', 'year_month', 'year_month_formatted') ->orderBy('hour', 'asc')
->get(); ->get();
} }

View File

@ -0,0 +1,77 @@
<?php
declare(strict_types=1);
namespace App\Support\FilterBuilder\Entity;
use App\Support\FilterBuilder\EntityJson;
class FieldItem extends EntityJson
{
/**
* @var string|null
*/
protected string|null $type = null;
/**
* @var string|null
*/
protected string|null $format = null;
/**
* @var string
*/
protected string $field;
/**
* @return string|null
*/
public function getType(): string|null
{
return $this->type;
}
/**
* @param string $type
*/
public function setType(string $type): void
{
$this->type = $type;
}
/**
* @return string|null
*/
public function getFormat(): ?string
{
return $this->format;
}
/**
* @param string|null $format
*/
public function setFormat(?string $format): void
{
$this->format = $format;
}
/**
* @return string
*/
public function getField(): string
{
return $this->field;
}
/**
* @param string $field
*/
public function setField(string $field): void
{
$this->field = $field;
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Support\FilterBuilder;
use App\Support\FilterBuilder\Entity\FieldItem;
use Illuminate\Database\Query\Expression;
use Illuminate\Support\Facades\DB;
class FieldType
{
const FUNCTION_FIELD = [
"TO_CHAR"
];
public static function field(FieldItem $field)
{
if (in_array($field->getType(), self::FUNCTION_FIELD)) {
return static::makeFormatFieldDate($field);
}
return $field->getField();
}
public static function makeFormatFieldDate($field): Expression
{
return DB::raw("TO_CHAR(TO_DATE({$field->field}, 'YYMM'), '{$field->format}') as {$field->field}");
}
}

View File

@ -4,10 +4,13 @@ declare(strict_types=1);
namespace App\Support\FilterBuilder; namespace App\Support\FilterBuilder;
use App\Support\FilterBuilder\Entity\FieldItem;
use App\Support\FilterBuilder\Entity\FilterItem; use App\Support\FilterBuilder\Entity\FilterItem;
use App\Support\FilterBuilder\Entity\OrderItem; use App\Support\FilterBuilder\Entity\OrderItem;
use App\Support\FilterBuilder\Interfaces\IFilterBuilder; use App\Support\FilterBuilder\Interfaces\IFilterBuilder;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
class FilterQueryBuilder extends EntityJson implements IFilterBuilder class FilterQueryBuilder extends EntityJson implements IFilterBuilder
{ {
@ -47,6 +50,30 @@ class FilterQueryBuilder extends EntityJson implements IFilterBuilder
return $builder; return $builder;
} }
public function applyField($fields = [])
{
if (!empty($this->getFields())) {
foreach ($this->getFields() as $field)
{
$fields[] = FieldType::field($field);
}
}
return $fields;
}
/**
*/
public function format_date_sql(): static
{
foreach ($this->getFields() as $param) {
$this->setFields([DB::raw("TO_CHAR(TO_DATE({$param}, 'YYMM'), 'MM/YYYY') as {$param}")]);
}
return $this;
}
/** /**
* @return array * @return array
*/ */
@ -60,7 +87,7 @@ class FilterQueryBuilder extends EntityJson implements IFilterBuilder
*/ */
public function setFields(array $fields): void public function setFields(array $fields): void
{ {
$this->fields = $fields; $this->fields = $this->arrayObjectCast($fields, FieldItem::class);
} }
/** /**

View File

@ -55,10 +55,11 @@ Route::middleware(['auth:sanctum', 'ability:Admin'])->group(function () {
}); });
Route::middleware(['auth:sanctum', 'ability:Client'])->group(function () { Route::middleware(['auth:sanctum', 'ability:Client'])->group(function () {
Route::post('pld/overview', [\App\Http\Controllers\PldController::class, 'overviewByRegion']);
Route::post('pld/list', [\App\Http\Controllers\PldController::class, 'listConsumption']); Route::post('pld/overview', [\App\Http\Controllers\PldController::class, 'overviewByRegion']); //Visão Geral por Região
Route::post('pld/daily', [\App\Http\Controllers\PldController::class, 'consumptionByDaily']); Route::post('pld/list', [\App\Http\Controllers\PldController::class, 'listConsumption']); // Tabela de Consumo
Route::post('pld/schedule', [\App\Http\Controllers\PldController::class, 'consumptionBySchedule']); Route::post('pld/daily', [\App\Http\Controllers\PldController::class, 'consumptionByDaily']); // Consumo por Diário
Route::post('pld/schedule', [\App\Http\Controllers\PldController::class, 'consumptionBySchedule']); // Consumo por Horários
Route::post('economy', [\App\Http\Controllers\EconomyController::class, 'index']); Route::post('economy', [\App\Http\Controllers\EconomyController::class, 'index']);
Route::post('economy/grossAnnual', [\App\Http\Controllers\EconomyController::class, 'grossAnnualEconomy']); Route::post('economy/grossAnnual', [\App\Http\Controllers\EconomyController::class, 'grossAnnualEconomy']);
@ -70,7 +71,7 @@ Route::middleware(['auth:sanctum', 'ability:Client'])->group(function () {
Route::post('telemetry/demand', [\App\Http\Controllers\TelemetryController::class, 'demand']); Route::post('telemetry/demand', [\App\Http\Controllers\TelemetryController::class, 'demand']);
Route::post('telemetry/discretization', [\App\Http\Controllers\TelemetryController::class, 'discretization']); Route::post('telemetry/discretization', [\App\Http\Controllers\TelemetryController::class, 'discretization']);
Route::post('operation/summary', [\App\Http\Controllers\OperationSummaryController::class, 'operationSummary']); Route::post('operation/summary', [\App\Http\Controllers\OperationSummaryController::class, 'operationSummary']); // Resumo Operações
Route::post('operation', [\App\Http\Controllers\OperationSummaryController::class, 'index']); Route::post('operation', [\App\Http\Controllers\OperationSummaryController::class, 'index']);
Route::post('notify', [\App\Http\Controllers\NotificationController::class, 'notify']); Route::post('notify', [\App\Http\Controllers\NotificationController::class, 'notify']);