From 18cf6ddad51593471d3c1953b3d135a74b1d8256 Mon Sep 17 00:00:00 2001 From: Djonathan Date: Wed, 15 Jun 2022 11:53:02 -0300 Subject: [PATCH] The PLD api, operation summary and some general corrections were developed. --- app/Http/Controllers/Auth/AuthController.php | 7 +- app/Http/Controllers/EconomyController.php | 52 +++++++++++--- app/Http/Controllers/OperationController.php | 33 +++++++++ .../Resources/OperationSummaryResource.php | 19 ++++++ app/Models/DadosCadastrais.php | 30 +++++++++ app/Models/DadosTe.php | 30 +++++++++ app/Models/Economy.php | 27 ++++++++ app/Models/Faq.php | 6 ++ app/Models/Notifications.php | 8 ++- app/Models/Pld.php | 25 +++++++ app/Models/User.php | 3 + app/Providers/AppServiceProvider.php | 6 ++ .../DadosTe/DadosTeContractInterface.php | 12 ++++ .../DadosTe/DadosTeRepository.php | 67 +++++++++++++++++++ .../Economy/EconomyContractInterface.php | 6 +- .../Economy/EconomyRepository.php | 64 +++++++++++++++--- app/Repositories/Pld/PldRepository.php | 2 +- app/Support/FilterBuilder/EntityJson.php | 13 ++-- .../FilterBuilder/FilterQueryBuilder.php | 53 +++++++++++++++ app/Support/FilterBuilder/FilterType.php | 20 +++++- routes/api.php | 7 +- 21 files changed, 458 insertions(+), 32 deletions(-) create mode 100644 app/Http/Controllers/OperationController.php create mode 100644 app/Http/Resources/OperationSummaryResource.php create mode 100644 app/Repositories/DadosTe/DadosTeContractInterface.php create mode 100644 app/Repositories/DadosTe/DadosTeRepository.php diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php index 2a193c5..b51ce22 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/AuthController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Http\Requests\LoginResquest; +use App\Models\User; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Laravel\Sanctum\PersonalAccessToken; @@ -19,8 +20,10 @@ class AuthController extends Controller abort(401, 'Inavalid Credentials'); } - $user = auth()->user(); - $token = $user->createToken('API Token'); + $user = User::with('roles')->firstWhere('email', $credentials['email']); + $role = $user->roles()->first(); + + $token = $user->createToken('API Token', [$role->name]); return response()->json([ 'token' => $token->plainTextToken, diff --git a/app/Http/Controllers/EconomyController.php b/app/Http/Controllers/EconomyController.php index 965e5fb..5032e8a 100644 --- a/app/Http/Controllers/EconomyController.php +++ b/app/Http/Controllers/EconomyController.php @@ -1,22 +1,18 @@ economyContract->getGrossEconomy($request->all()); + + return $this->successResponse($response); + } catch (\Exception $ex) { + return $this->errorResponse(false, $ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); + } + } + + public function accumulatedEconomy(Request $request): JsonResponse + { + try { + $this->economyContract->getAccumulatedEconomy($request->all()); + } catch (\Exception $ex) { + return $this->errorResponse(false, $ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); + } + } + + public function costEstimatesEconomy(Request $request): JsonResponse + { + try { + $this->economyContract->getCostEstimatesEconomy($request->all()); + } catch (\Exception $ex) { + return $this->errorResponse(false, $ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); + } + } + + public function costMWhEconomy(Request $request): JsonResponse + { + try { + $response = $this->economyContract->getCostMWhEconomy($request->all()); + return $this->successResponse($response); + } catch (\Exception $ex) { + return $this->errorResponse(false, $ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); + } + } + + public function __invoke(Request $request) { try { diff --git a/app/Http/Controllers/OperationController.php b/app/Http/Controllers/OperationController.php new file mode 100644 index 0000000..94f465b --- /dev/null +++ b/app/Http/Controllers/OperationController.php @@ -0,0 +1,33 @@ +dadosTeContract->getOperationSummary($request->all()); + return (new OperationSummaryResource($response)) + ->response() + ->setStatusCode(Response::HTTP_OK); + } catch (\Exception $ex) { + return $this->errorResponse(false, $ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); + } + } + +} diff --git a/app/Http/Resources/OperationSummaryResource.php b/app/Http/Resources/OperationSummaryResource.php new file mode 100644 index 0000000..270be5e --- /dev/null +++ b/app/Http/Resources/OperationSummaryResource.php @@ -0,0 +1,19 @@ +format('d/m/Y H:i:s'); + } + } diff --git a/app/Models/DadosTe.php b/app/Models/DadosTe.php index b049587..264baf9 100644 --- a/app/Models/DadosTe.php +++ b/app/Models/DadosTe.php @@ -2,6 +2,7 @@ namespace App\Models; +use DateTimeInterface; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -12,4 +13,33 @@ use OwenIt\Auditing\Auditable; class DadosTe extends Model implements Auditing { use HasFactory, SoftDeletes, Auditable; + + protected $table = "dados_te"; + + protected $guarded = ['cod_te', 'cod_smart_unidade']; + + protected $fillable = [ + 'mes', + 'operacao', + 'tipo', + 'montante_nf', + 'preco_nf', + 'nf_c_icms', + 'perfil_contr', + 'created_at', + 'updated_at', + 'deleted_at', + ]; + + protected $hidden = [ + 'updated_at', + 'created_at', + 'deleted_at', + ]; + + protected function serializeDate(DateTimeInterface $date): string + { + return $date->format('d/m/Y H:i:s'); + } + } diff --git a/app/Models/Economy.php b/app/Models/Economy.php index c8cb236..2d7592a 100644 --- a/app/Models/Economy.php +++ b/app/Models/Economy.php @@ -2,6 +2,7 @@ namespace App\Models; +use DateTimeInterface; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -15,4 +16,30 @@ class Economy extends Model implements Auditing protected $table = 'economia'; + protected $guarded = ['cod_te', 'cod_smart_unidade']; + + protected $fillable = [ + 'mes', + 'custo_cativo', + 'custo_livre', + 'economia_mensal', + 'economia_acumulada', + 'custo_unit', + 'dad_estimado', + 'created_at', + 'updated_at', + 'deleted_at', + ]; + + protected $hidden = [ + 'updated_at', + 'created_at', + 'deleted_at', + ]; + + protected function serializeDate(DateTimeInterface $date): string + { + return $date->format('d/m/Y H:i:s'); + } + } diff --git a/app/Models/Faq.php b/app/Models/Faq.php index 8e099d8..9bd9a99 100644 --- a/app/Models/Faq.php +++ b/app/Models/Faq.php @@ -25,6 +25,12 @@ class Faq extends Model implements Auditing 'deleted_at', ]; + protected $hidden = [ + 'updated_at', + 'created_at', + 'deleted_at', + ]; + protected function serializeDate(DateTimeInterface $date): string { return $date->format('d/m/Y H:i:s'); diff --git a/app/Models/Notifications.php b/app/Models/Notifications.php index e011621..f3456e1 100644 --- a/app/Models/Notifications.php +++ b/app/Models/Notifications.php @@ -21,6 +21,12 @@ class Notifications extends Model 'user_id' ]; + protected $hidden = [ + 'updated_at', + 'created_at', + 'deleted_at', + ]; + protected function serializeDate(DateTimeInterface $date): string { return $date->format('d/m/Y H:i:s'); @@ -28,7 +34,7 @@ class Notifications extends Model public function users(): BelongsToMany { - return $this->belongsToMany(User::class, 'notificacoes_users', 'notification_id', 'user_id', ); + return $this->belongsToMany(User::class, 'notificacoes_users', 'notification_id', 'user_id',); } } diff --git a/app/Models/Pld.php b/app/Models/Pld.php index 0e57365..d93c12d 100644 --- a/app/Models/Pld.php +++ b/app/Models/Pld.php @@ -2,6 +2,7 @@ namespace App\Models; +use DateTimeInterface; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -17,4 +18,28 @@ class Pld extends Model implements Auditing protected $guarded = ['id']; + protected $fillable = [ + 'dia_num', + 'hora', + 'submercado', + 'valor', + 'mes_ref', + 'dia_da_semana', + 'created_at', + 'updated_at', + 'deleted_at', + ]; + + protected $hidden = [ + 'updated_at', + 'created_at', + 'deleted_at', + ]; + + protected function serializeDate(DateTimeInterface $date): string + { + return $date->format('d/m/Y H:i:s'); + } + + } diff --git a/app/Models/User.php b/app/Models/User.php index 3b79c6f..c5defe3 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -32,6 +32,9 @@ class User extends Authenticatable implements Auditing protected $hidden = [ 'password', 'remember_token', + 'created_at', + 'updated_at', + 'deleted_at', ]; protected $casts = [ diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 8757589..e6e545c 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,8 @@ namespace App\Providers; +use App\Repositories\DadosTe\DadosTeContractInterface; +use App\Repositories\DadosTe\DadosTeRepository; use App\Repositories\Economy\EconomyContractInterface; use App\Repositories\Economy\EconomyRepository; use App\Repositories\Faqs\FaqContractInterface; @@ -43,6 +45,10 @@ class AppServiceProvider extends ServiceProvider EconomyContractInterface::class, EconomyRepository::class ); + $this->app->bind( + DadosTeContractInterface::class, + DadosTeRepository::class + ); } /** diff --git a/app/Repositories/DadosTe/DadosTeContractInterface.php b/app/Repositories/DadosTe/DadosTeContractInterface.php new file mode 100644 index 0000000..c32df87 --- /dev/null +++ b/app/Repositories/DadosTe/DadosTeContractInterface.php @@ -0,0 +1,12 @@ +model + ->select( + 'dados_te.mes', + 'dados_te.cod_smart_unidade', + 'dados_te.operacao', + 'dados_te.tipo', + 'dados_te.perfil_contr as contraparte', + 'dados_te.montante_nf', + 'dados_te.preco_nf', + 'dados_te.nf_c_icms' + ) + ->join( + "dados_cadastrais", + "dados_cadastrais.cod_smart_unidade", + "=", + "dados_te.cod_smart_unidade" + ); + + if (!empty($params)) { + $query = static::getFilterBuilder($params)->applyFilter($query); + } + + return $query; + } + + public function getOperationSummary($params): Collection|array + { + $params = static::filterRow($params); + return $this->execute($params)->get(); + } + + public static function filterRow($params, $field = 'mes'): array + { + $arr['filters'] = collect($params['filters']) + ->map(function ($value, $key) use ($field) { + if ($value['field'] === $field) { + Arr::set( $value, "field", "TO_CHAR(TO_DATE(dados_te.{$value['field']}, 'YYMM'), 'MM/YYYY')"); + $value['row'] = true; + } + return $value; + })->all(); + return $arr; + } +} diff --git a/app/Repositories/Economy/EconomyContractInterface.php b/app/Repositories/Economy/EconomyContractInterface.php index f6ad9d8..8b4d79e 100644 --- a/app/Repositories/Economy/EconomyContractInterface.php +++ b/app/Repositories/Economy/EconomyContractInterface.php @@ -7,6 +7,10 @@ use App\Repositories\ContractInterface; interface EconomyContractInterface extends ContractInterface { - public function execute($params); + public function getGrossEconomy($params); + public function getAccumulatedEconomy($params); + public function getCostEstimatesEconomy($params); + public function getCostMWhEconomy($params); + } \ No newline at end of file diff --git a/app/Repositories/Economy/EconomyRepository.php b/app/Repositories/Economy/EconomyRepository.php index 83e46ee..16a0918 100644 --- a/app/Repositories/Economy/EconomyRepository.php +++ b/app/Repositories/Economy/EconomyRepository.php @@ -1,10 +1,13 @@ model ->select( - $this->getRowField() + $field ) ->join( "dados_cadastrais", @@ -32,7 +32,56 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt "economia.cod_smart_unidade", ); - dd( $query->limit(5)->get()); + if (!empty($params)) { + $query = static::getFilterBuilder($params)->applyFilter($query); + } + return $query; + } + + public function getGrossEconomy($params): Collection|array + { + $field = [ + DB::raw("TO_CHAR(TO_DATE(economia.mes, 'YYMM'), 'MM/YYYY') as mes"), + 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" + ]; + + return $this->execute($params, $field) + ->where(DB::raw("TO_DATE(economia.mes, 'YYMM')"), + ">=", + DB::raw("TO_DATE(TO_CHAR(current_date , 'YYYY-01-01'), 'YYYY-MM-DD') - interval '1' year")) + ->groupBy(['mes', 'dad_estimado']) + ->get(); + } + + public function getAccumulatedEconomy($params) + { + // TODO: Implement getAccumulatedEconomy() method. + } + + public function getCostEstimatesEconomy($params) + { + // TODO: Implement getCostEstimatesEconomy() method. + } + + public function getCostMWhEconomy($params) + { + $field = [ + DB::raw("TO_CHAR(TO_DATE(economia.mes, 'YYMM'), 'MM/YYYY') as mes"), + DB::raw("SUM(economia.custo_unit) as custo_unit"), + "economia.dad_estimado" + ]; + + return $this->execute($params, $field) + ->whereBetween(DB::raw("TO_DATE(economia.mes, 'YYMM')"), + [ + 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-12-31'), 'YYYY-MM-DD') ") + ] + ) + ->groupBy(['mes', 'dad_estimado']) + ->get(); } @@ -56,5 +105,4 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt DB::raw("COALESCE(economia.economia_mensal / NULLIF(economia.custo_livre, 0), 0) as custo") ]; } - } diff --git a/app/Repositories/Pld/PldRepository.php b/app/Repositories/Pld/PldRepository.php index 8c9b6e6..fb64c1b 100644 --- a/app/Repositories/Pld/PldRepository.php +++ b/app/Repositories/Pld/PldRepository.php @@ -128,7 +128,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface } - public function getConsumptionBySchedule($params, $field = "dia_num") + public function getConsumptionBySchedule($params, $field = "dia_num"): Collection|array { $fields = static::getRowField(); diff --git a/app/Support/FilterBuilder/EntityJson.php b/app/Support/FilterBuilder/EntityJson.php index 833fb50..f33ad34 100644 --- a/app/Support/FilterBuilder/EntityJson.php +++ b/app/Support/FilterBuilder/EntityJson.php @@ -29,14 +29,13 @@ abstract class EntityJson implements \JsonSerializable { $vars = get_object_vars($jsonData); foreach ($vars as $key => $value) { - if (is_array($value)){ - $campo = strtolower($key); - $method = "set" . ucfirst($campo); - if (method_exists($this, $method)) { - $this->$method($value); + $method = "set" . ucfirst($key); + if (method_exists($this, $method)) { + $this->$method($value); + } else { + if (property_exists(get_class($this), $key)) { + $this->$key = $value; } - } else{ - $this->{$key} = $value; } } } diff --git a/app/Support/FilterBuilder/FilterQueryBuilder.php b/app/Support/FilterBuilder/FilterQueryBuilder.php index a668779..85222d3 100644 --- a/app/Support/FilterBuilder/FilterQueryBuilder.php +++ b/app/Support/FilterBuilder/FilterQueryBuilder.php @@ -10,10 +10,17 @@ use Illuminate\Database\Eloquent\Builder; class FilterQueryBuilder extends EntityJson implements IFilterBuilder { + protected int $limit = 10; + + protected int $offset = 0; + protected array $filters = []; protected array $order = []; + protected array $fields = []; + + public function applyFilter(Builder $builder): Builder { if (!empty($this->getFilters())) { @@ -36,6 +43,22 @@ class FilterQueryBuilder extends EntityJson implements IFilterBuilder return $builder; } + /** + * @return array + */ + public function getFields(): array + { + return $this->fields; + } + + /** + * @param array $fields + */ + public function setFields(array $fields): void + { + $this->fields = $fields; + } + /** * @return array */ @@ -68,6 +91,36 @@ class FilterQueryBuilder extends EntityJson implements IFilterBuilder $this->order = $this->arrayObjectCast($order,OrderItem::class); } + /** + * @return int + */ + public function getLimit(): int + { + return $this->limit; + } + /** + * @param int $limit + */ + public function setLimit(int $limit): void + { + $this->limit = $limit; + } + + /** + * @return int + */ + public function getOffset(): int + { + return $this->offset; + } + + /** + * @param int $offset + */ + public function setOffset(int $offset): void + { + $this->offset = $offset; + } } \ No newline at end of file diff --git a/app/Support/FilterBuilder/FilterType.php b/app/Support/FilterBuilder/FilterType.php index 19f18da..ad4339f 100644 --- a/app/Support/FilterBuilder/FilterType.php +++ b/app/Support/FilterBuilder/FilterType.php @@ -34,14 +34,17 @@ class FilterType "not_null" ]; - public static function filter(Builder $builder, FilterItem $filter) : Builder + public static function filter(Builder $builder, FilterItem $filter): Builder { - if (in_array($filter->getType(), self::WHERE_FILTER)) - { + if (in_array($filter->getType(), self::WHERE_FILTER)) { return static::makeWhereFilter($builder, $filter); } + if (in_array($filter->getType(), self::BETWEEN_FILTER)) { + return static::makeBetweenFilter($builder, $filter); + } + return $builder; } @@ -59,5 +62,16 @@ class FilterType } + private static function makeBetweenFilter(Builder $builder, FilterItem $filter): Builder + { + if ($filter->getType() === "between") { + return $builder->whereBetween($filter->getField(), $filter->getValue()); + } elseif ($filter->getType() === "not_between") { + return $builder->whereNotBetween($filter->getField(), $filter->getValue()); + } + + return $builder; + } + } \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 7c5582d..cc2816d 100644 --- a/routes/api.php +++ b/routes/api.php @@ -26,7 +26,12 @@ Route::middleware(['auth:sanctum', 'verified'])->group(function () { Route::post('pld/daily', [\App\Http\Controllers\PldController::class, 'consumptionByDaily']); Route::post('pld/schedule', [\App\Http\Controllers\PldController::class, 'consumptionBySchedule']); - Route::post('economy', \App\Http\Controllers\EconomyController::class); + Route::post('economy/gross', [\App\Http\Controllers\EconomyController::class, 'grossEconomy']); + Route::post('economy/accumulated', [\App\Http\Controllers\EconomyController::class, 'accumulatedEconomy']); + Route::post('economy/estimates', [\App\Http\Controllers\EconomyController::class, 'costEstimatesEconomy']); + Route::post('economy/MWh', [\App\Http\Controllers\EconomyController::class, 'costMWhEconomy']); + + Route::post('operation', [\App\Http\Controllers\OperationController::class, 'operationSummary']); Route::apiResource('user', \App\Http\Controllers\UserController::class); Route::apiResource('notification', \App\Http\Controllers\NotificationController::class);