From 9b7987a11e2d638f27d500d430c4a074fc821b1e Mon Sep 17 00:00:00 2001 From: Djonathan Date: Tue, 5 Jul 2022 00:26:26 -0300 Subject: [PATCH] API update. --- app/Helpers/CustomHelpers.php | 13 ++++ app/Helpers/Helpers.php | 51 ++++++++++++ app/Repositories/AbstractRepository.php | 34 ++++---- .../Economy/EconomyRepository.php | 15 ++-- app/Repositories/MethodsTrait.php | 20 +++-- app/Repositories/Pld/PldRepository.php | 14 ++-- .../FilterBuilder/Entity/FieldItem.php | 77 +++++++++++++++++++ app/Support/FilterBuilder/FieldType.php | 30 ++++++++ .../FilterBuilder/FilterQueryBuilder.php | 29 ++++++- routes/api.php | 11 +-- 10 files changed, 255 insertions(+), 39 deletions(-) create mode 100644 app/Support/FilterBuilder/Entity/FieldItem.php create mode 100644 app/Support/FilterBuilder/FieldType.php diff --git a/app/Helpers/CustomHelpers.php b/app/Helpers/CustomHelpers.php index 850916b..0946e23 100644 --- a/app/Helpers/CustomHelpers.php +++ b/app/Helpers/CustomHelpers.php @@ -42,3 +42,16 @@ if (!function_exists('xmlToObject')) { 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; + } + +} diff --git a/app/Helpers/Helpers.php b/app/Helpers/Helpers.php index b367d90..d85c167 100644 --- a/app/Helpers/Helpers.php +++ b/app/Helpers/Helpers.php @@ -3,6 +3,11 @@ namespace App\Helpers; +use DateInterval; +use DatePeriod; +use Illuminate\Support\Arr; +use Illuminate\Support\Str; + class Helpers { public static function uploadFiles($params, $field): ?string @@ -15,4 +20,50 @@ class Helpers 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; + } + + } diff --git a/app/Repositories/AbstractRepository.php b/app/Repositories/AbstractRepository.php index e2cb834..2cafd15 100644 --- a/app/Repositories/AbstractRepository.php +++ b/app/Repositories/AbstractRepository.php @@ -16,6 +16,8 @@ abstract class AbstractRepository protected AbstractRepository|Model $model; + protected $item; + /** * @throws BindingResolutionException */ @@ -24,20 +26,9 @@ abstract class AbstractRepository $this->model = $model ?? $this::resolveModel(); } - public function __call($name, $arguments) + public function filterBuilder($params): void { - $result = $this->forwardCallTo($this->model, $name, $arguments); - - if ($result === $this->model) { - return $this; - } - - return $result; - } - - public function __get($name) - { - return $this->model->{$name}; + $this->item = static::getFilterBuilder($params); } /** @@ -56,4 +47,21 @@ abstract class AbstractRepository 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}; + } } diff --git a/app/Repositories/Economy/EconomyRepository.php b/app/Repositories/Economy/EconomyRepository.php index 7189adb..40441a7 100644 --- a/app/Repositories/Economy/EconomyRepository.php +++ b/app/Repositories/Economy/EconomyRepository.php @@ -33,6 +33,7 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt return $query; } + /* Economia bruta anual */ public function getGrossAnnualEconomy($params): Collection|array { $field = [ @@ -52,11 +53,12 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt ->get(); } + /* Economia bruta mensal */ public function getGrossMonthlyEconomy($params) { $field = [ 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"), "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")) ->groupBy(['mes', 'dad_estimado']) - ->orderBy('mes') - ->orderBy('dad_estimado') + ->orderBy(DB::raw("mes, dad_estimado")) ->get(); 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) { $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') ") ]) ->groupBy(['mes', 'dad_estimado']) - ->orderBy('mes') - ->orderBy('dad_estimado') + ->orderBy(DB::raw("mes, dad_estimado")) ->get(); } + /* Indicador de custo R$/MWh */ public function getCostMWhEconomy($params) { $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') ") ]) ->groupBy(['mes', 'dad_estimado']) - ->orderBy('mes') - ->orderBy('dad_estimado') + ->orderBy(DB::raw("mes, dad_estimado")) ->get(); return collect(static::checkDate($result))->transform(fn($value) => Arr::set($value, 'mes', date_format(date_create($value['mes']), "M/Y")))->all(); diff --git a/app/Repositories/MethodsTrait.php b/app/Repositories/MethodsTrait.php index 1e31eb3..0d11617 100644 --- a/app/Repositories/MethodsTrait.php +++ b/app/Repositories/MethodsTrait.php @@ -4,7 +4,10 @@ declare(strict_types=1); namespace App\Repositories; +use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Support\Arr; +use Illuminate\Support\Facades\DB; trait MethodsTrait { @@ -40,20 +43,23 @@ 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(); } - return $response->get(); + return $response->get(); } } \ No newline at end of file diff --git a/app/Repositories/Pld/PldRepository.php b/app/Repositories/Pld/PldRepository.php index 6844300..ad8b165 100644 --- a/app/Repositories/Pld/PldRepository.php +++ b/app/Repositories/Pld/PldRepository.php @@ -34,7 +34,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface /** - * @throws BindingResolutionException + * Geral por Região */ public function getOverviewByRegion(): array|Collection { @@ -42,7 +42,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface 'pld.submercado as submarket', 'pld.mes_ref as year_month', 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(); } + /** Tabela de Consumo */ public function getListConsumption($params): Collection|array { $fields = [ @@ -144,6 +145,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface /** * @throws BindingResolutionException + * PLD, Valores Diários */ 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("(date('1899-12-31') + interval '1' day * pld.dia_num) as day_calc"), '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_formatted"), ]; @@ -177,7 +179,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface 'hora as hour', DB::raw("(date('1899-12-31') + interval '1' day * pld.dia_num) as day_calc"), '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_formatted"), ]; @@ -185,13 +187,13 @@ class PldRepository extends AbstractRepository implements PldContractInterface $i = 0; foreach ($params['filters'] as $param) { 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++; } return $this->execute($fields, $params) - ->groupBy('day_formatted', 'hour', 'day_calc', 'submarket', 'year_month', 'year_month_formatted') + ->orderBy('hour', 'asc') ->get(); } diff --git a/app/Support/FilterBuilder/Entity/FieldItem.php b/app/Support/FilterBuilder/Entity/FieldItem.php new file mode 100644 index 0000000..fdf8ab0 --- /dev/null +++ b/app/Support/FilterBuilder/Entity/FieldItem.php @@ -0,0 +1,77 @@ +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; + } + + +} diff --git a/app/Support/FilterBuilder/FieldType.php b/app/Support/FilterBuilder/FieldType.php new file mode 100644 index 0000000..fd4d94e --- /dev/null +++ b/app/Support/FilterBuilder/FieldType.php @@ -0,0 +1,30 @@ +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}"); + } + + +} \ No newline at end of file diff --git a/app/Support/FilterBuilder/FilterQueryBuilder.php b/app/Support/FilterBuilder/FilterQueryBuilder.php index 02940fa..e525120 100644 --- a/app/Support/FilterBuilder/FilterQueryBuilder.php +++ b/app/Support/FilterBuilder/FilterQueryBuilder.php @@ -4,10 +4,13 @@ declare(strict_types=1); namespace App\Support\FilterBuilder; +use App\Support\FilterBuilder\Entity\FieldItem; use App\Support\FilterBuilder\Entity\FilterItem; use App\Support\FilterBuilder\Entity\OrderItem; use App\Support\FilterBuilder\Interfaces\IFilterBuilder; +use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Facades\DB; class FilterQueryBuilder extends EntityJson implements IFilterBuilder { @@ -47,6 +50,30 @@ class FilterQueryBuilder extends EntityJson implements IFilterBuilder 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 */ @@ -60,7 +87,7 @@ class FilterQueryBuilder extends EntityJson implements IFilterBuilder */ public function setFields(array $fields): void { - $this->fields = $fields; + $this->fields = $this->arrayObjectCast($fields, FieldItem::class); } /** diff --git a/routes/api.php b/routes/api.php index ea4c40d..33f2e6b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -55,10 +55,11 @@ Route::middleware(['auth:sanctum', 'ability:Admin'])->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/daily', [\App\Http\Controllers\PldController::class, 'consumptionByDaily']); - Route::post('pld/schedule', [\App\Http\Controllers\PldController::class, 'consumptionBySchedule']); + + Route::post('pld/overview', [\App\Http\Controllers\PldController::class, 'overviewByRegion']); //Visão Geral por Região + Route::post('pld/list', [\App\Http\Controllers\PldController::class, 'listConsumption']); // Tabela de Consumo + 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/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/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('notify', [\App\Http\Controllers\NotificationController::class, 'notify']);