The PLD api, operation summary and some general corrections were developed.

This commit is contained in:
Djonathan 2022-06-15 11:53:02 -03:00
parent 2335dc6540
commit 18cf6ddad5
21 changed files with 458 additions and 32 deletions

View File

@ -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,

View File

@ -1,22 +1,18 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use App\Actions\EconomyAction;
use App\Helper\Model\filter\FilterBuilder;
use App\Http\Requests\AzuxRequest;
use App\Models\DadosCadastrais;
use App\Models\Economy;
use App\Repositories\Economy\EconomyContractInterface;
use App\Repository\Economy\EconomyRepository;
use App\Traits\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Gate;
use Symfony\Component\HttpFoundation\Response as ResponseAlias;
class EconomyController extends Controller
{
use ApiResponse;
public function __construct(
protected EconomyContractInterface $economyContract
@ -24,6 +20,46 @@ class EconomyController extends Controller
{
}
public function grossEconomy(Request $request): JsonResponse
{
try {
$response = $this->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 {

View File

@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\OperationSummaryResource;
use App\Repositories\DadosTe\DadosTeContractInterface;
use App\Traits\ApiResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class OperationController extends Controller
{
use ApiResponse;
public function __construct(
protected DadosTeContractInterface $dadosTeContract
)
{
}
public function operationSummary(Request $request)
{
try {
$response = $this->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);
}
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class OperationSummaryResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return parent::toArray($request);
}
}

View File

@ -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;
@ -13,4 +14,33 @@ class DadosCadastrais extends Model implements Auditing
use HasFactory, SoftDeletes, Auditable;
protected $table = 'dados_cadastrais';
protected $guarded = ['cod_smart_unidade'];
protected $fillable = [
'cliente',
'unidade',
'codigo_scde',
'demanda_p',
'demanda_fp',
'status_empresa',
'status_unidade',
'data_de_migracao',
'cod_smart_cliente',
'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');
}
}

View File

@ -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');
}
}

View File

@ -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');
}
}

View File

@ -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');

View File

@ -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');

View File

@ -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');
}
}

View File

@ -32,6 +32,9 @@ class User extends Authenticatable implements Auditing
protected $hidden = [
'password',
'remember_token',
'created_at',
'updated_at',
'deleted_at',
];
protected $casts = [

View File

@ -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
);
}
/**

View File

@ -0,0 +1,12 @@
<?php
namespace App\Repositories\DadosTe;
use App\Repositories\ContractInterface;
interface DadosTeContractInterface extends ContractInterface
{
public function getOperationSummary($params);
}

View File

@ -0,0 +1,67 @@
<?php
declare(strict_types=1);
namespace App\Repositories\DadosTe;
use App\Models\DadosTe;
use App\Repositories\AbstractRepository;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Arr;
class DadosTeRepository extends AbstractRepository implements DadosTeContractInterface
{
public function __construct(DadosTe $dadosTe)
{
parent::__construct($dadosTe);
}
private function execute($params): Builder
{
$query = $this->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;
}
}

View File

@ -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);
}

View File

@ -1,10 +1,13 @@
<?php
declare(strict_types=1);
namespace App\Repositories\Economy;
use App\Models\Economy;
use App\Repositories\AbstractRepository;
use App\Support\FilterBuilder\FilterQueryBuilder;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\DB;
class EconomyRepository extends AbstractRepository implements EconomyContractInterface
@ -15,15 +18,12 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
parent::__construct($economy);
}
public function execute($params)
public function execute($params, $field): Builder
{
$test = FilterQueryBuilder::for($params);
dd($test);
$query = $this->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")
];
}
}

View File

@ -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();

View File

@ -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);
$method = "set" . ucfirst($key);
if (method_exists($this, $method)) {
$this->$method($value);
}
} else {
$this->{$key} = $value;
if (property_exists(get_class($this), $key)) {
$this->$key = $value;
}
}
}
}

View File

@ -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;
}
}

View File

@ -37,11 +37,14 @@ class FilterType
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;
}
}

View File

@ -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);