From 2fd0c7bf7089071ba0e597ac3ed0ff33cb1cf9c4 Mon Sep 17 00:00:00 2001 From: Djonathan Date: Tue, 14 Jun 2022 11:20:52 -0300 Subject: [PATCH] add profile --- app/Http/Controllers/PldController.php | 47 +++- app/Http/Resources/OverviewResource.php | 19 ++ app/Models/Faq.php | 19 ++ app/Models/Pld.php | 4 + app/Repositories/AbstractRepository.php | 4 +- .../Economy/EconomyRepository.php | 5 +- app/Repositories/Pld/PldContractInterface.php | 5 +- app/Repositories/Pld/PldRepository.php | 78 +++++++ .../FilterBuilder/Entity/FilterItem.php | 76 +++++++ .../FilterBuilder/Entity/OrderItem.php | 42 ++++ app/Support/FilterBuilder/EntityJson.php | 94 ++++++++ .../FilterBuilder/FilterQueryBuilder.php | 71 +++++++ app/Support/FilterBuilder/FilterType.php | 63 ++++++ app/Support/FilterBuilder/FiltersQuery.php | 36 ++++ .../Interfaces/IFilterBuilder.php | 10 + app/Support/FilterQueryBuilder.php | 54 ----- app/Support/FiltersQuery.php | 8 - app/Support/QueryBuilderRequest.php | 201 ------------------ routes/api.php | 2 +- 19 files changed, 559 insertions(+), 279 deletions(-) create mode 100644 app/Http/Resources/OverviewResource.php create mode 100644 app/Support/FilterBuilder/Entity/FilterItem.php create mode 100644 app/Support/FilterBuilder/Entity/OrderItem.php create mode 100644 app/Support/FilterBuilder/EntityJson.php create mode 100644 app/Support/FilterBuilder/FilterQueryBuilder.php create mode 100644 app/Support/FilterBuilder/FilterType.php create mode 100644 app/Support/FilterBuilder/FiltersQuery.php create mode 100644 app/Support/FilterBuilder/Interfaces/IFilterBuilder.php delete mode 100644 app/Support/FilterQueryBuilder.php delete mode 100644 app/Support/FiltersQuery.php delete mode 100644 app/Support/QueryBuilderRequest.php diff --git a/app/Http/Controllers/PldController.php b/app/Http/Controllers/PldController.php index 1064029..936b522 100644 --- a/app/Http/Controllers/PldController.php +++ b/app/Http/Controllers/PldController.php @@ -2,29 +2,60 @@ namespace App\Http\Controllers; +use App\Http\Resources\OverviewResource; +use App\Repositories\Pld\PldContractInterface; +use App\Traits\ApiResponse; use Illuminate\Http\Request; +use Illuminate\Http\Response; class PldController extends Controller { + use ApiResponse; + + public function __construct( + protected PldContractInterface $pldContract + ){} + public function overviewByRegion() { - - dd('oii'); + try { + $response = $this->pldContract->getOverviewByRegion(); + return (new OverviewResource($response)) + ->response() + ->setStatusCode(Response::HTTP_OK); + }catch (\Exception $ex){ + return $this->errorResponse(false, $ex->getMessage(), 404); + } } - public function listConsumption() + public function listConsumption(Request $request) { - dd('oii'); + try { + $response = $this->pldContract->getListConsumption($request->all()); + return response()->json($response, 200); + }catch (\Exception $ex){ + return $this->errorResponse(false, $ex->getMessage(), 404); + } } - public function consumptionByDaily() + public function consumptionByDaily(Request $request) { - dd('oii'); + try { + $response = $this->pldContract->getConsumptionByDaily($request->all()); + return response()->json($response, 200); + }catch (\Exception $ex){ + return $this->errorResponse(false, $ex->getMessage(), 404); + } } - public function consumptionBySchedule() + public function consumptionBySchedule(Request $request) { - dd('oii'); + try { + $response = $this->pldContract->getConsumptionBySchedule($request->all()); + return response()->json($response, 200); + }catch (\Exception $ex){ + return $this->errorResponse(false, $ex->getMessage(), 404); + } } } diff --git a/app/Http/Resources/OverviewResource.php b/app/Http/Resources/OverviewResource.php new file mode 100644 index 0000000..972b89f --- /dev/null +++ b/app/Http/Resources/OverviewResource.php @@ -0,0 +1,19 @@ +format('d/m/Y H:i:s'); + } + } diff --git a/app/Models/Pld.php b/app/Models/Pld.php index 57a7fb7..e5dd760 100644 --- a/app/Models/Pld.php +++ b/app/Models/Pld.php @@ -12,4 +12,8 @@ use OwenIt\Auditing\Auditable; class Pld extends Model implements Auditing { use HasFactory, SoftDeletes, Auditable; + + protected $table = "pld"; + + protected $guarded = ['id']; } diff --git a/app/Repositories/AbstractRepository.php b/app/Repositories/AbstractRepository.php index 746af6e..e2cb834 100644 --- a/app/Repositories/AbstractRepository.php +++ b/app/Repositories/AbstractRepository.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Repositories; +use App\Support\FilterBuilder\FiltersQuery; use Exception; use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Database\Eloquent\Model; @@ -11,7 +12,7 @@ use Illuminate\Support\Traits\ForwardsCalls; abstract class AbstractRepository { - use MethodsTrait, ForwardsCalls; + use MethodsTrait, ForwardsCalls, FiltersQuery; protected AbstractRepository|Model $model; @@ -55,5 +56,4 @@ abstract class AbstractRepository return (new static)->$model; } - } diff --git a/app/Repositories/Economy/EconomyRepository.php b/app/Repositories/Economy/EconomyRepository.php index 275e2ae..83e46ee 100644 --- a/app/Repositories/Economy/EconomyRepository.php +++ b/app/Repositories/Economy/EconomyRepository.php @@ -4,10 +4,7 @@ namespace App\Repositories\Economy; use App\Models\Economy; use App\Repositories\AbstractRepository; -use App\Repository\Repository; -use App\Support\FilterQueryBuilder; -use Illuminate\Contracts\Pagination\LengthAwarePaginator; -use Illuminate\Database\Eloquent\Model; +use App\Support\FilterBuilder\FilterQueryBuilder; use Illuminate\Support\Facades\DB; class EconomyRepository extends AbstractRepository implements EconomyContractInterface diff --git a/app/Repositories/Pld/PldContractInterface.php b/app/Repositories/Pld/PldContractInterface.php index ee8fff7..a5046f2 100644 --- a/app/Repositories/Pld/PldContractInterface.php +++ b/app/Repositories/Pld/PldContractInterface.php @@ -6,5 +6,8 @@ use App\Repositories\ContractInterface; interface PldContractInterface extends ContractInterface { - + public function getOverviewByRegion(); + public function getConsumptionByDaily($params); + public function getListConsumption($params); + public function getConsumptionBySchedule($params); } \ No newline at end of file diff --git a/app/Repositories/Pld/PldRepository.php b/app/Repositories/Pld/PldRepository.php index 67056cd..d09b863 100644 --- a/app/Repositories/Pld/PldRepository.php +++ b/app/Repositories/Pld/PldRepository.php @@ -6,6 +6,11 @@ namespace App\Repositories\Pld; use App\Models\Pld; use App\Repositories\AbstractRepository; +use Carbon\Carbon; +use Illuminate\Contracts\Container\BindingResolutionException; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Support\Facades\DB; class PldRepository extends AbstractRepository implements PldContractInterface { @@ -14,4 +19,77 @@ class PldRepository extends AbstractRepository implements PldContractInterface parent::__construct($pld); } + /** + * @throws BindingResolutionException + */ + private function execute($fields, $params): Builder + { + $query = $this->model->select($fields); + + $query = static::getFilterBuilder($params)->applyFilter($query); + + if (!empty($params)) { + if ($params['field'] === 'mes_ref' && $params['value']) { + $query = $query->where( + DB::raw("TO_CHAR(TO_DATE(pld.{$params['field']}, 'YYMM'), 'MM/YYYY')"), + $params['type'], + $params['value']); + } + } + return $query; + } + + /** + * @throws BindingResolutionException + */ + public function getOverviewByRegion(): Collection|array + { + $fields = [ + '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") + ]; + + $params = ["type" => "=", "field" => 'mes_ref', "value" => Carbon::now()->format('m/Y')]; + + return $this->execute($fields, $params) + ->groupBy(['submarket', 'year_month', 'year_month_formatted']) + ->get(); + } + + public function getListConsumption($params) + { + // TODO: Implement getListConsumption() method. + } + + /** + * @throws BindingResolutionException + */ + public function getConsumptionByDaily($params): Collection|array + { + $fields = static::getRowField(); + + return $this->execute($fields, $params)->get(); + + } + + public function getConsumptionBySchedule($params) + { + $fields = static::getRowField(); + + return $this->execute($fields, $params)->toSql(); + } + + protected static function getRowField(): array + { + return [ + DB::raw("TO_CHAR((date('1899-12-30') + interval '1' day * pld.dia_num), 'DD') as day_formatted"), + DB::raw("(date('1899-12-30') + interval '1' day * pld.dia_num) as day_calc"), + '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"), + ]; + } + } \ No newline at end of file diff --git a/app/Support/FilterBuilder/Entity/FilterItem.php b/app/Support/FilterBuilder/Entity/FilterItem.php new file mode 100644 index 0000000..1fcbfc9 --- /dev/null +++ b/app/Support/FilterBuilder/Entity/FilterItem.php @@ -0,0 +1,76 @@ +row; + } + + /** + * @param bool $row + */ + public function setRow(bool $row): void + { + $this->row = $row; + } + + public function getType() : string + { + return $this->type; + } + + public function getField() :Expression|string + { + return $this->field; + } + + public function getValue() + { + return $this->value; + } + + public function setType(string $type) + { + $this->type = $type; + } + + public function setField($field): void + { + $this->field = $field; + } + + public function setValue($value): void + { + $this->value = $value; + } +} \ No newline at end of file diff --git a/app/Support/FilterBuilder/Entity/OrderItem.php b/app/Support/FilterBuilder/Entity/OrderItem.php new file mode 100644 index 0000000..ec2fc00 --- /dev/null +++ b/app/Support/FilterBuilder/Entity/OrderItem.php @@ -0,0 +1,42 @@ +field; + } + + public function setField(string $field) + { + $this->field = $field; + } + + public function getDirection() : string + { + return $this->direction; + } + + public function setDirection(string $direction = "asc") + { + $this->direction = $direction; + } +} diff --git a/app/Support/FilterBuilder/EntityJson.php b/app/Support/FilterBuilder/EntityJson.php new file mode 100644 index 0000000..833fb50 --- /dev/null +++ b/app/Support/FilterBuilder/EntityJson.php @@ -0,0 +1,94 @@ + $value) { + $this->$key = $value; + } + } + + + public function jsonSerialize(): \stdClass + { + $vars = get_object_vars($this); + $obj = new \stdClass(); + foreach ($vars as $key => $value) { + $obj->$key = $value; + } + return $obj; + } + + public function jsonSetObject(\stdClass $jsonData) + { + $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); + } + } else{ + $this->{$key} = $value; + } + } + } + + public function toArray(): array + { + $vars = get_object_vars($this); + $result = array(); + foreach ($vars as $key => $value) { + $method = "get" . ucfirst($key); + $key = strtoupper($key); + $valor = $value; + if (method_exists($this, $method)) { + $valor = $this->$method(); + } + $result[$key] = $valor; + } + return $result; + } + + + public function arrayObjectCast(array $arrayOfObject, $className) + { + $arr = []; + if (!empty($arrayOfObject)) { + $obj = $arrayOfObject[0]; + if (is_array($obj) && count(array_filter(array_keys($obj), 'is_string')) > 0) { + $obj = (object) $obj; + } + if (get_class($obj) == "stdClass") { + foreach ($arrayOfObject as $item) { + $e = new $className(); + if (method_exists($e, 'jsonSetObject')) { + $e->jsonSetObject($item); + $arr[] = $e; + } + } + } elseif (get_class($obj) == $className) { + return $arrayOfObject; + } + } + + return $arr; + } + + public function __get(string $name) + { + return $this->{$name}; + } + + public function __set(string $name, $value): void + { + $this->{$name} = $value; + } +} \ No newline at end of file diff --git a/app/Support/FilterBuilder/FilterQueryBuilder.php b/app/Support/FilterBuilder/FilterQueryBuilder.php new file mode 100644 index 0000000..0bea3af --- /dev/null +++ b/app/Support/FilterBuilder/FilterQueryBuilder.php @@ -0,0 +1,71 @@ +getFilters())) { + + foreach ($this->getFilters() as $filter) { + + $builder = FilterType::filter($builder, $filter); + } + } + + $builder->limit($this->limit); + $builder->offset($this->offset); + + foreach ($this->getOrder() as $order) { + $builder->orderBy($order->getField(), $order->getDirection()); + } + + return $builder; + } + + /** + * @return array + */ + public function getFilters(): array + { + return $this->filters; + } + + /** + * @param array $filters + */ + public function setFilters(array $filters): void + { + $this->filters = $this->arrayObjectCast($filters, FilterItem::class); + } + + /** + * @return array + */ + public function getOrder(): array + { + return $this->order; + } + + /** + * @param array $order + */ + public function setOrder(array $order): void + { + $this->order = $this->arrayObjectCast($order,OrderItem::class); + } + + + +} \ No newline at end of file diff --git a/app/Support/FilterBuilder/FilterType.php b/app/Support/FilterBuilder/FilterType.php new file mode 100644 index 0000000..19f18da --- /dev/null +++ b/app/Support/FilterBuilder/FilterType.php @@ -0,0 +1,63 @@ +", + ">", + ">=", + "<", + "<=", + "like", + "not_like" + ]; + + const IN_FILTER = [ + "in", + "not_in" + ]; + + const BETWEEN_FILTER = [ + "between", + "not_between" + ]; + + const NULL_FILTER = [ + "null", + "not_null" + ]; + + public static function filter(Builder $builder, FilterItem $filter) : Builder + { + + if (in_array($filter->getType(), self::WHERE_FILTER)) + { + return static::makeWhereFilter($builder, $filter); + } + + return $builder; + } + + public static function makeWhereFilter(Builder $builder, FilterItem $filter): Builder + { + $fType = $filter->getType(); + + if ($fType === 'not_like') { + $fType = 'not like'; + } + + $field = ($filter->getRow()) ? DB::raw($filter->getField()) : $filter->getField(); + + return $builder->where($field, $fType, $filter->getValue()); + + } + + +} \ No newline at end of file diff --git a/app/Support/FilterBuilder/FiltersQuery.php b/app/Support/FilterBuilder/FiltersQuery.php new file mode 100644 index 0000000..f7d288e --- /dev/null +++ b/app/Support/FilterBuilder/FiltersQuery.php @@ -0,0 +1,36 @@ +jsonSetObject($jsonData); + + return $obj; + + } catch (Exception $ex) { + return $ex->getMessage(); + } + } + + public function getFilterBuilder($json): ?FilterQueryBuilder + { + return $this->getJsonObject($json, FilterQueryBuilder::class); + } + +} \ No newline at end of file diff --git a/app/Support/FilterBuilder/Interfaces/IFilterBuilder.php b/app/Support/FilterBuilder/Interfaces/IFilterBuilder.php new file mode 100644 index 0000000..4f92fa3 --- /dev/null +++ b/app/Support/FilterBuilder/Interfaces/IFilterBuilder.php @@ -0,0 +1,10 @@ +initializeRequest($request); - - } - -// public function __construct($class) -// { -// $this->class = $class; -// -// return $this; -// } - - public static function for($request) - { - - return (new static($request)); - } - - - protected function initializeRequest(?Request $request = null): static - { - - $this->request = $request - ? QueryBuilderRequest::fromRequest($request) - : app(QueryBuilderRequest::class); - - return $this; - } - - - public function __get($name) - { - return $this->class->{$name}; - } - - public function __set($name, $value) - { - $this->class->{$name} = $value; - } -} \ No newline at end of file diff --git a/app/Support/FiltersQuery.php b/app/Support/FiltersQuery.php deleted file mode 100644 index 4b6e8dc..0000000 --- a/app/Support/FiltersQuery.php +++ /dev/null @@ -1,8 +0,0 @@ -getRequestData($includeParameterName); - - if (is_string($includeParts)) { - $includeParts = explode(static::getIncludesArrayValueDelimiter(), $includeParts); - } - - return collect($includeParts)->filter(); - } - - public function appends(): Collection - { - $appendParameterName = config('query-builder.parameters.append'); - - $appendParts = $this->getRequestData($appendParameterName); - - if (! is_array($appendParts) && ! is_null($appendParts)) { - $appendParts = explode(static::getAppendsArrayValueDelimiter(), $appendParts); - } - - return collect($appendParts)->filter(); - } - - public function fields(): Collection - { - $fieldsParameterName = config('query-builder.parameters.fields'); - - $fieldsPerTable = collect($this->getRequestData($fieldsParameterName)); - - if ($fieldsPerTable->isEmpty()) { - return collect(); - } - - return $fieldsPerTable->map(function ($fields) { - return explode(static::getFieldsArrayValueDelimiter(), $fields); - }); - } - - public function sorts(): Collection - { - $sortParameterName = config('query-builder.parameters.sort'); - - $sortParts = $this->getRequestData($sortParameterName); - - if (is_string($sortParts)) { - $sortParts = explode(static::getSortsArrayValueDelimiter(), $sortParts); - } - - return collect($sortParts)->filter(); - } - - public function filters(): Collection - { - $filterParameterName = config('query-builder.parameters.filter'); - - $filterParts = $this->getRequestData($filterParameterName, []); - - if (is_string($filterParts)) { - return collect(); - } - - $filters = collect($filterParts); - - return $filters->map(function ($value) { - return $this->getFilterValue($value); - }); - } - - /** - * @param $value - * - * @return array|bool - */ - protected function getFilterValue($value) - { - if (is_array($value)) { - return collect($value)->map(function ($valueValue) { - return $this->getFilterValue($valueValue); - })->all(); - } - - if (Str::contains($value, static::getFilterArrayValueDelimiter())) { - return explode(static::getFilterArrayValueDelimiter(), $value); - } - - if ($value === 'true') { - return true; - } - - if ($value === 'false') { - return false; - } - - return $value; - } - - protected function getRequestData(?string $key = null, $default = null) - { - if (config('query-builder.request_data_source') === 'body') { - return $this->input($key, $default); - } - - return $this->get($key, $default); - } - - public static function setIncludesArrayValueDelimiter(string $includesArrayValueDelimiter): void - { - static::$includesArrayValueDelimiter = $includesArrayValueDelimiter; - } - - public static function setAppendsArrayValueDelimiter(string $appendsArrayValueDelimiter): void - { - static::$appendsArrayValueDelimiter = $appendsArrayValueDelimiter; - } - - public static function setFieldsArrayValueDelimiter(string $fieldsArrayValueDelimiter): void - { - static::$fieldsArrayValueDelimiter = $fieldsArrayValueDelimiter; - } - - public static function setSortsArrayValueDelimiter(string $sortsArrayValueDelimiter): void - { - static::$sortsArrayValueDelimiter = $sortsArrayValueDelimiter; - } - - public static function setFilterArrayValueDelimiter(string $filterArrayValueDelimiter): void - { - static::$filterArrayValueDelimiter = $filterArrayValueDelimiter; - } - - public static function getIncludesArrayValueDelimiter(): string - { - return static::$includesArrayValueDelimiter; - } - - public static function getAppendsArrayValueDelimiter(): string - { - return static::$appendsArrayValueDelimiter; - } - - public static function getFieldsArrayValueDelimiter(): string - { - return static::$fieldsArrayValueDelimiter; - } - - public static function getSortsArrayValueDelimiter(): string - { - return static::$sortsArrayValueDelimiter; - } - - public static function getFilterArrayValueDelimiter(): string - { - return static::$filterArrayValueDelimiter; - } - - public static function resetDelimiters(): void - { - self::$includesArrayValueDelimiter = ','; - self::$appendsArrayValueDelimiter = ','; - self::$fieldsArrayValueDelimiter = ','; - self::$sortsArrayValueDelimiter = ','; - self::$filterArrayValueDelimiter = ','; - } -} diff --git a/routes/api.php b/routes/api.php index 7c5582d..70e744b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -21,7 +21,7 @@ Route::prefix('auth')->group(function (){ Route::middleware(['auth:sanctum', 'verified'])->group(function () { - Route::post('pld/overview', [\App\Http\Controllers\PldController::class, 'overviewByRegion']); + Route::get('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']);