diff --git a/_ide_helper.php b/_ide_helper.php new file mode 100644 index 0000000..5b93b7c --- /dev/null +++ b/_ide_helper.php @@ -0,0 +1,4633 @@ + + * @see https://github.com/barryvdh/laravel-ide-helper + */ + +namespace { + + /** + * @template TCollection of static + * @template TModel of static + * @template TValue of static + * @template TValue of static + */ + class Eloquent extends \Illuminate\Database\Eloquent\Model { /** + * Create and return an un-saved model instance. + * + * @param array $attributes + * @return TModel + * @static + */ + public static function make($attributes = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->make($attributes); + } + + /** + * Register a new global scope. + * + * @param string $identifier + * @param \Illuminate\Database\Eloquent\Scope|\Closure $scope + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withGlobalScope($identifier, $scope) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withGlobalScope($identifier, $scope); + } + + /** + * Remove a registered global scope. + * + * @param \Illuminate\Database\Eloquent\Scope|string $scope + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withoutGlobalScope($scope) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withoutGlobalScope($scope); + } + + /** + * Remove all or passed registered global scopes. + * + * @param array|null $scopes + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withoutGlobalScopes($scopes = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withoutGlobalScopes($scopes); + } + + /** + * Get an array of global scopes that were removed from the query. + * + * @return array + * @static + */ + public static function removedScopes() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->removedScopes(); + } + + /** + * Add a where clause on the primary key to the query. + * + * @param mixed $id + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereKey($id) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereKey($id); + } + + /** + * Add a where clause on the primary key to the query. + * + * @param mixed $id + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereKeyNot($id) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereKeyNot($id); + } + + /** + * Add a basic where clause to the query. + * + * @param (\Closure(static): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function where($column, $operator = null, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->where($column, $operator, $value, $boolean); + } + + /** + * Add a basic where clause to the query, and return the first result. + * + * @param (\Closure(static): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @param string $boolean + * @return TModel|null + * @static + */ + public static function firstWhere($column, $operator = null, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->firstWhere($column, $operator, $value, $boolean); + } + + /** + * Add an "or where" clause to the query. + * + * @param (\Closure(static): mixed)|array|string|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhere($column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhere($column, $operator, $value); + } + + /** + * Add a basic "where not" clause to the query. + * + * @param (\Closure(static): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNot($column, $operator = null, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereNot($column, $operator, $value, $boolean); + } + + /** + * Add an "or where not" clause to the query. + * + * @param (\Closure(static): mixed)|array|string|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNot($column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereNot($column, $operator, $value); + } + + /** + * Add an "order by" clause for a timestamp to the query. + * + * @param string|\Illuminate\Contracts\Database\Query\Expression $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function latest($column = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->latest($column); + } + + /** + * Add an "order by" clause for a timestamp to the query. + * + * @param string|\Illuminate\Contracts\Database\Query\Expression $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function oldest($column = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->oldest($column); + } + + /** + * Create a collection of models from plain arrays. + * + * @param array $items + * @return \Illuminate\Database\Eloquent\Collection + * @static + */ + public static function hydrate($items) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->hydrate($items); + } + + /** + * Create a collection of models from a raw query. + * + * @param string $query + * @param array $bindings + * @return \Illuminate\Database\Eloquent\Collection + * @static + */ + public static function fromQuery($query, $bindings = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->fromQuery($query, $bindings); + } + + /** + * Find a model by its primary key. + * + * @param mixed $id + * @param array|string $columns + * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TModel|null) + * @static + */ + public static function find($id, $columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->find($id, $columns); + } + + /** + * Find a sole model by its primary key. + * + * @param mixed $id + * @param array|string $columns + * @return TModel + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws \Illuminate\Database\MultipleRecordsFoundException + * @static + */ + public static function findSole($id, $columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->findSole($id, $columns); + } + + /** + * Find multiple models by their primary keys. + * + * @param \Illuminate\Contracts\Support\Arrayable|array $ids + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Collection + * @static + */ + public static function findMany($ids, $columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->findMany($ids, $columns); + } + + /** + * Find a model by its primary key or throw an exception. + * + * @param mixed $id + * @param array|string $columns + * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TModel) + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @static + */ + public static function findOrFail($id, $columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->findOrFail($id, $columns); + } + + /** + * Find a model by its primary key or return fresh model instance. + * + * @param mixed $id + * @param array|string $columns + * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TModel) + * @static + */ + public static function findOrNew($id, $columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->findOrNew($id, $columns); + } + + /** + * Find a model by its primary key or call a callback. + * + * @template TValue + * @param mixed $id + * @param (\Closure(): TValue)|list|string $columns + * @param (\Closure(): TValue)|null $callback + * @return ( $id is (\Illuminate\Contracts\Support\Arrayable|array) + * ? \Illuminate\Database\Eloquent\Collection + * : TModel|TValue + * ) + * @static + */ + public static function findOr($id, $columns = [], $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->findOr($id, $columns, $callback); + } + + /** + * Get the first record matching the attributes or instantiate it. + * + * @param array $attributes + * @param array $values + * @return TModel + * @static + */ + public static function firstOrNew($attributes = [], $values = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->firstOrNew($attributes, $values); + } + + /** + * Get the first record matching the attributes. If the record is not found, create it. + * + * @param array $attributes + * @param array $values + * @return TModel + * @static + */ + public static function firstOrCreate($attributes = [], $values = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->firstOrCreate($attributes, $values); + } + + /** + * Attempt to create the record. If a unique constraint violation occurs, attempt to find the matching record. + * + * @param array $attributes + * @param array $values + * @return TModel + * @static + */ + public static function createOrFirst($attributes = [], $values = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->createOrFirst($attributes, $values); + } + + /** + * Create or update a record matching the attributes, and fill it with values. + * + * @param array $attributes + * @param array $values + * @return TModel + * @static + */ + public static function updateOrCreate($attributes, $values = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->updateOrCreate($attributes, $values); + } + + /** + * Create a record matching the attributes, or increment the existing record. + * + * @param array $attributes + * @param string $column + * @param int|float $default + * @param int|float $step + * @param array $extra + * @return TModel + * @static + */ + public static function incrementOrCreate($attributes, $column = 'count', $default = 1, $step = 1, $extra = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->incrementOrCreate($attributes, $column, $default, $step, $extra); + } + + /** + * Execute the query and get the first result or throw an exception. + * + * @param array|string $columns + * @return TModel + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @static + */ + public static function firstOrFail($columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->firstOrFail($columns); + } + + /** + * Execute the query and get the first result or call a callback. + * + * @template TValue + * @param (\Closure(): TValue)|list $columns + * @param (\Closure(): TValue)|null $callback + * @return TModel|TValue + * @static + */ + public static function firstOr($columns = [], $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->firstOr($columns, $callback); + } + + /** + * Execute the query and get the first result if it's the sole matching record. + * + * @param array|string $columns + * @return TModel + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws \Illuminate\Database\MultipleRecordsFoundException + * @static + */ + public static function sole($columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->sole($columns); + } + + /** + * Get a single column's value from the first result of a query. + * + * @param string|\Illuminate\Contracts\Database\Query\Expression $column + * @return mixed + * @static + */ + public static function value($column) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->value($column); + } + + /** + * Get a single column's value from the first result of a query if it's the sole matching record. + * + * @param string|\Illuminate\Contracts\Database\Query\Expression $column + * @return mixed + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws \Illuminate\Database\MultipleRecordsFoundException + * @static + */ + public static function soleValue($column) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->soleValue($column); + } + + /** + * Get a single column's value from the first result of the query or throw an exception. + * + * @param string|\Illuminate\Contracts\Database\Query\Expression $column + * @return mixed + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @static + */ + public static function valueOrFail($column) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->valueOrFail($column); + } + + /** + * Execute the query as a "select" statement. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Collection + * @static + */ + public static function get($columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->get($columns); + } + + /** + * Get the hydrated models without eager loading. + * + * @param array|string $columns + * @return array + * @static + */ + public static function getModels($columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->getModels($columns); + } + + /** + * Eager load the relationships for the models. + * + * @param array $models + * @return array + * @static + */ + public static function eagerLoadRelations($models) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->eagerLoadRelations($models); + } + + /** + * Register a closure to be invoked after the query is executed. + * + * @param \Closure $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function afterQuery($callback) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->afterQuery($callback); + } + + /** + * Invoke the "after query" modification callbacks. + * + * @param mixed $result + * @return mixed + * @static + */ + public static function applyAfterQueryCallbacks($result) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->applyAfterQueryCallbacks($result); + } + + /** + * Get a lazy collection for the given query. + * + * @return \Illuminate\Support\LazyCollection + * @static + */ + public static function cursor() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->cursor(); + } + + /** + * Get a collection with the values of a given column. + * + * @param string|\Illuminate\Contracts\Database\Query\Expression $column + * @param string|null $key + * @return \Illuminate\Support\Collection + * @static + */ + public static function pluck($column, $key = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->pluck($column, $key); + } + + /** + * Paginate the given query. + * + * @param int|null|\Closure $perPage + * @param array|string $columns + * @param string $pageName + * @param int|null $page + * @param \Closure|int|null $total + * @return \Illuminate\Pagination\LengthAwarePaginator + * @throws \InvalidArgumentException + * @static + */ + public static function paginate($perPage = null, $columns = [], $pageName = 'page', $page = null, $total = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->paginate($perPage, $columns, $pageName, $page, $total); + } + + /** + * Paginate the given query into a simple paginator. + * + * @param int|null $perPage + * @param array|string $columns + * @param string $pageName + * @param int|null $page + * @return \Illuminate\Contracts\Pagination\Paginator + * @static + */ + public static function simplePaginate($perPage = null, $columns = [], $pageName = 'page', $page = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->simplePaginate($perPage, $columns, $pageName, $page); + } + + /** + * Paginate the given query into a cursor paginator. + * + * @param int|null $perPage + * @param array|string $columns + * @param string $cursorName + * @param \Illuminate\Pagination\Cursor|string|null $cursor + * @return \Illuminate\Contracts\Pagination\CursorPaginator + * @static + */ + public static function cursorPaginate($perPage = null, $columns = [], $cursorName = 'cursor', $cursor = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->cursorPaginate($perPage, $columns, $cursorName, $cursor); + } + + /** + * Save a new model and return the instance. + * + * @param array $attributes + * @return TModel + * @static + */ + public static function create($attributes = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->create($attributes); + } + + /** + * Save a new model and return the instance without raising model events. + * + * @param array $attributes + * @return TModel + * @static + */ + public static function createQuietly($attributes = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->createQuietly($attributes); + } + + /** + * Save a new model and return the instance. Allow mass-assignment. + * + * @param array $attributes + * @return TModel + * @static + */ + public static function forceCreate($attributes) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->forceCreate($attributes); + } + + /** + * Save a new model instance with mass assignment without raising model events. + * + * @param array $attributes + * @return TModel + * @static + */ + public static function forceCreateQuietly($attributes = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->forceCreateQuietly($attributes); + } + + /** + * Insert new records or update the existing ones. + * + * @param array $values + * @param array|string $uniqueBy + * @param array|null $update + * @return int + * @static + */ + public static function upsert($values, $uniqueBy, $update = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->upsert($values, $uniqueBy, $update); + } + + /** + * Register a replacement for the default delete function. + * + * @param \Closure $callback + * @return void + * @static + */ + public static function onDelete($callback) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + $instance->onDelete($callback); + } + + /** + * Call the given local model scopes. + * + * @param array|string $scopes + * @return static|mixed + * @static + */ + public static function scopes($scopes) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->scopes($scopes); + } + + /** + * Apply the scopes to the Eloquent builder instance and return it. + * + * @return static + * @static + */ + public static function applyScopes() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->applyScopes(); + } + + /** + * Prevent the specified relations from being eager loaded. + * + * @param mixed $relations + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function without($relations) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->without($relations); + } + + /** + * Set the relationships that should be eager loaded while removing any previously added eager loading specifications. + * + * @param array): mixed)|string>|string $relations + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withOnly($relations) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withOnly($relations); + } + + /** + * Create a new instance of the model being queried. + * + * @param array $attributes + * @return TModel + * @static + */ + public static function newModelInstance($attributes = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->newModelInstance($attributes); + } + + /** + * Specify attributes that should be added to any new models created by this builder. + * + * The given key / value pairs will also be added as where conditions to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|array|string $attributes + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withAttributes($attributes, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withAttributes($attributes, $value); + } + + /** + * Apply query-time casts to the model instance. + * + * @param array $casts + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withCasts($casts) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withCasts($casts); + } + + /** + * Execute the given Closure within a transaction savepoint if needed. + * + * @template TModelValue + * @param \Closure(): TModelValue $scope + * @return TModelValue + * @static + */ + public static function withSavepointIfNeeded($scope) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withSavepointIfNeeded($scope); + } + + /** + * Get the underlying query builder instance. + * + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function getQuery() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->getQuery(); + } + + /** + * Set the underlying query builder instance. + * + * @param \Illuminate\Database\Query\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function setQuery($query) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->setQuery($query); + } + + /** + * Get a base query builder instance. + * + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function toBase() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->toBase(); + } + + /** + * Get the relationships being eagerly loaded. + * + * @return array + * @static + */ + public static function getEagerLoads() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->getEagerLoads(); + } + + /** + * Set the relationships being eagerly loaded. + * + * @param array $eagerLoad + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function setEagerLoads($eagerLoad) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->setEagerLoads($eagerLoad); + } + + /** + * Indicate that the given relationships should not be eagerly loaded. + * + * @param array $relations + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withoutEagerLoad($relations) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withoutEagerLoad($relations); + } + + /** + * Flush the relationships being eagerly loaded. + * + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withoutEagerLoads() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withoutEagerLoads(); + } + + /** + * Get the model instance being queried. + * + * @return TModel + * @static + */ + public static function getModel() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->getModel(); + } + + /** + * Set a model instance for the model being queried. + * + * @template TModelNew of \Illuminate\Database\Eloquent\Model + * @param TModelNew $model + * @return static + * @static + */ + public static function setModel($model) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->setModel($model); + } + + /** + * Get the given macro by name. + * + * @param string $name + * @return \Closure + * @static + */ + public static function getMacro($name) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->getMacro($name); + } + + /** + * Checks if a macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->hasMacro($name); + } + + /** + * Get the given global macro by name. + * + * @param string $name + * @return \Closure + * @static + */ + public static function getGlobalMacro($name) + { + return \Illuminate\Database\Eloquent\Builder::getGlobalMacro($name); + } + + /** + * Checks if a global macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasGlobalMacro($name) + { + return \Illuminate\Database\Eloquent\Builder::hasGlobalMacro($name); + } + + /** + * Clone the Eloquent query builder. + * + * @return static + * @static + */ + public static function clone() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->clone(); + } + + /** + * Register a closure to be invoked on a clone. + * + * @param \Closure $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function onClone($callback) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->onClone($callback); + } + + /** + * Chunk the results of the query. + * + * @param int $count + * @param callable(\Illuminate\Support\Collection, int): mixed $callback + * @return bool + * @static + */ + public static function chunk($count, $callback) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->chunk($count, $callback); + } + + /** + * Run a map over each item while chunking. + * + * @template TReturn + * @param callable(TValue): TReturn $callback + * @param int $count + * @return \Illuminate\Support\Collection + * @static + */ + public static function chunkMap($callback, $count = 1000) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->chunkMap($callback, $count); + } + + /** + * Execute a callback over each item while chunking. + * + * @param callable(TValue, int): mixed $callback + * @param int $count + * @return bool + * @throws \RuntimeException + * @static + */ + public static function each($callback, $count = 1000) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->each($callback, $count); + } + + /** + * Chunk the results of a query by comparing IDs. + * + * @param int $count + * @param callable(\Illuminate\Support\Collection, int): mixed $callback + * @param string|null $column + * @param string|null $alias + * @return bool + * @static + */ + public static function chunkById($count, $callback, $column = null, $alias = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->chunkById($count, $callback, $column, $alias); + } + + /** + * Chunk the results of a query by comparing IDs in descending order. + * + * @param int $count + * @param callable(\Illuminate\Support\Collection, int): mixed $callback + * @param string|null $column + * @param string|null $alias + * @return bool + * @static + */ + public static function chunkByIdDesc($count, $callback, $column = null, $alias = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->chunkByIdDesc($count, $callback, $column, $alias); + } + + /** + * Chunk the results of a query by comparing IDs in a given order. + * + * @param int $count + * @param callable(\Illuminate\Support\Collection, int): mixed $callback + * @param string|null $column + * @param string|null $alias + * @param bool $descending + * @return bool + * @throws \RuntimeException + * @static + */ + public static function orderedChunkById($count, $callback, $column = null, $alias = null, $descending = false) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orderedChunkById($count, $callback, $column, $alias, $descending); + } + + /** + * Execute a callback over each item while chunking by ID. + * + * @param callable(TValue, int): mixed $callback + * @param int $count + * @param string|null $column + * @param string|null $alias + * @return bool + * @static + */ + public static function eachById($callback, $count = 1000, $column = null, $alias = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->eachById($callback, $count, $column, $alias); + } + + /** + * Query lazily, by chunks of the given size. + * + * @param int $chunkSize + * @return \Illuminate\Support\LazyCollection + * @throws \InvalidArgumentException + * @static + */ + public static function lazy($chunkSize = 1000) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->lazy($chunkSize); + } + + /** + * Query lazily, by chunking the results of a query by comparing IDs. + * + * @param int $chunkSize + * @param string|null $column + * @param string|null $alias + * @return \Illuminate\Support\LazyCollection + * @throws \InvalidArgumentException + * @static + */ + public static function lazyById($chunkSize = 1000, $column = null, $alias = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->lazyById($chunkSize, $column, $alias); + } + + /** + * Query lazily, by chunking the results of a query by comparing IDs in descending order. + * + * @param int $chunkSize + * @param string|null $column + * @param string|null $alias + * @return \Illuminate\Support\LazyCollection + * @throws \InvalidArgumentException + * @static + */ + public static function lazyByIdDesc($chunkSize = 1000, $column = null, $alias = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->lazyByIdDesc($chunkSize, $column, $alias); + } + + /** + * Execute the query and get the first result. + * + * @param array|string $columns + * @return TValue|null + * @static + */ + public static function first($columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->first($columns); + } + + /** + * Execute the query and get the first result if it's the sole matching record. + * + * @param array|string $columns + * @return TValue + * @throws \Illuminate\Database\RecordsNotFoundException + * @throws \Illuminate\Database\MultipleRecordsFoundException + * @static + */ + public static function baseSole($columns = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->baseSole($columns); + } + + /** + * Pass the query to a given callback. + * + * @param callable($this): mixed $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function tap($callback) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->tap($callback); + } + + /** + * Apply the callback if the given "value" is (or resolves to) truthy. + * + * @template TWhenParameter + * @template TWhenReturnType + * @param (\Closure($this): TWhenParameter)|TWhenParameter|null $value + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $callback + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $default + * @return $this|TWhenReturnType + * @static + */ + public static function when($value = null, $callback = null, $default = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->when($value, $callback, $default); + } + + /** + * Apply the callback if the given "value" is (or resolves to) falsy. + * + * @template TUnlessParameter + * @template TUnlessReturnType + * @param (\Closure($this): TUnlessParameter)|TUnlessParameter|null $value + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $callback + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $default + * @return $this|TUnlessReturnType + * @static + */ + public static function unless($value = null, $callback = null, $default = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->unless($value, $callback, $default); + } + + /** + * Add a relationship count / exists condition to the query. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param string $operator + * @param int $count + * @param string $boolean + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @return \Illuminate\Database\Eloquent\Builder + * @throws \RuntimeException + * @static + */ + public static function has($relation, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->has($relation, $operator, $count, $boolean, $callback); + } + + /** + * Add a relationship count / exists condition to the query with an "or". + * + * @param \Illuminate\Database\Eloquent\Relations\Relation<*, *, *>|string $relation + * @param string $operator + * @param int $count + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orHas($relation, $operator = '>=', $count = 1) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orHas($relation, $operator, $count); + } + + /** + * Add a relationship count / exists condition to the query. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param string $boolean + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function doesntHave($relation, $boolean = 'and', $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->doesntHave($relation, $boolean, $callback); + } + + /** + * Add a relationship count / exists condition to the query with an "or". + * + * @param \Illuminate\Database\Eloquent\Relations\Relation<*, *, *>|string $relation + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orDoesntHave($relation) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orDoesntHave($relation); + } + + /** + * Add a relationship count / exists condition to the query with where clauses. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @param string $operator + * @param int $count + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereHas($relation, $callback = null, $operator = '>=', $count = 1) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereHas($relation, $callback, $operator, $count); + } + + /** + * Add a relationship count / exists condition to the query with where clauses. + * + * Also load the relationship with the same condition. + * + * @param string $relation + * @param (\Closure(\Illuminate\Database\Eloquent\Builder<*>|\Illuminate\Database\Eloquent\Relations\Relation<*, *, *>): mixed)|null $callback + * @param string $operator + * @param int $count + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withWhereHas($relation, $callback = null, $operator = '>=', $count = 1) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withWhereHas($relation, $callback, $operator, $count); + } + + /** + * Add a relationship count / exists condition to the query with where clauses and an "or". + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @param string $operator + * @param int $count + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereHas($relation, $callback = null, $operator = '>=', $count = 1) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereHas($relation, $callback, $operator, $count); + } + + /** + * Add a relationship count / exists condition to the query with where clauses. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereDoesntHave($relation, $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereDoesntHave($relation, $callback); + } + + /** + * Add a relationship count / exists condition to the query with where clauses and an "or". + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereDoesntHave($relation, $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereDoesntHave($relation, $callback); + } + + /** + * Add a polymorphic relationship count / exists condition to the query. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param string $operator + * @param int $count + * @param string $boolean + * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function hasMorph($relation, $types, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->hasMorph($relation, $types, $operator, $count, $boolean, $callback); + } + + /** + * Add a polymorphic relationship count / exists condition to the query with an "or". + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation + * @param string|array $types + * @param string $operator + * @param int $count + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orHasMorph($relation, $types, $operator = '>=', $count = 1) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orHasMorph($relation, $types, $operator, $count); + } + + /** + * Add a polymorphic relationship count / exists condition to the query. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param string $boolean + * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function doesntHaveMorph($relation, $types, $boolean = 'and', $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->doesntHaveMorph($relation, $types, $boolean, $callback); + } + + /** + * Add a polymorphic relationship count / exists condition to the query with an "or". + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation + * @param string|array $types + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orDoesntHaveMorph($relation, $types) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orDoesntHaveMorph($relation, $types); + } + + /** + * Add a polymorphic relationship count / exists condition to the query with where clauses. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @param string $operator + * @param int $count + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereHasMorph($relation, $types, $callback, $operator, $count); + } + + /** + * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @param string $operator + * @param int $count + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereHasMorph($relation, $types, $callback, $operator, $count); + } + + /** + * Add a polymorphic relationship count / exists condition to the query with where clauses. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereDoesntHaveMorph($relation, $types, $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereDoesntHaveMorph($relation, $types, $callback); + } + + /** + * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereDoesntHaveMorph($relation, $types, $callback = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereDoesntHaveMorph($relation, $types, $callback); + } + + /** + * Add a basic where clause to a relationship query. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereRelation($relation, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereRelation($relation, $column, $operator, $value); + } + + /** + * Add a basic where clause to a relationship query and eager-load the relationship with the same conditions. + * + * @param \Illuminate\Database\Eloquent\Relations\Relation<*, *, *>|string $relation + * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withWhereRelation($relation, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withWhereRelation($relation, $column, $operator, $value); + } + + /** + * Add an "or where" clause to a relationship query. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereRelation($relation, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereRelation($relation, $column, $operator, $value); + } + + /** + * Add a basic count / exists condition to a relationship query. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereDoesntHaveRelation($relation, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereDoesntHaveRelation($relation, $column, $operator, $value); + } + + /** + * Add an "or where" clause to a relationship query. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereDoesntHaveRelation($relation, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereDoesntHaveRelation($relation, $column, $operator, $value); + } + + /** + * Add a polymorphic relationship condition to the query with a where clause. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereMorphRelation($relation, $types, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereMorphRelation($relation, $types, $column, $operator, $value); + } + + /** + * Add a polymorphic relationship condition to the query with an "or where" clause. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereMorphRelation($relation, $types, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereMorphRelation($relation, $types, $column, $operator, $value); + } + + /** + * Add a polymorphic relationship condition to the query with a doesn't have clause. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereMorphDoesntHaveRelation($relation, $types, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereMorphDoesntHaveRelation($relation, $types, $column, $operator, $value); + } + + /** + * Add a polymorphic relationship condition to the query with an "or doesn't have" clause. + * + * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation + * @param string|array $types + * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereMorphDoesntHaveRelation($relation, $types, $column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereMorphDoesntHaveRelation($relation, $types, $column, $operator, $value); + } + + /** + * Add a morph-to relationship condition to the query. + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation + * @param \Illuminate\Database\Eloquent\Model|iterable|string|null $model + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereMorphedTo($relation, $model, $boolean = 'and') + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereMorphedTo($relation, $model, $boolean); + } + + /** + * Add a not morph-to relationship condition to the query. + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation + * @param \Illuminate\Database\Eloquent\Model|iterable|string $model + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNotMorphedTo($relation, $model, $boolean = 'and') + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereNotMorphedTo($relation, $model, $boolean); + } + + /** + * Add a morph-to relationship condition to the query with an "or where" clause. + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation + * @param \Illuminate\Database\Eloquent\Model|iterable|string|null $model + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereMorphedTo($relation, $model) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereMorphedTo($relation, $model); + } + + /** + * Add a not morph-to relationship condition to the query with an "or where" clause. + * + * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation + * @param \Illuminate\Database\Eloquent\Model|iterable|string $model + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNotMorphedTo($relation, $model) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereNotMorphedTo($relation, $model); + } + + /** + * Add a "belongs to" relationship where clause to the query. + * + * @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection $related + * @param string|null $relationshipName + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @throws \Illuminate\Database\Eloquent\RelationNotFoundException + * @static + */ + public static function whereBelongsTo($related, $relationshipName = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereBelongsTo($related, $relationshipName, $boolean); + } + + /** + * Add a "BelongsTo" relationship with an "or where" clause to the query. + * + * @param \Illuminate\Database\Eloquent\Model $related + * @param string|null $relationshipName + * @return \Illuminate\Database\Eloquent\Builder + * @throws \RuntimeException + * @static + */ + public static function orWhereBelongsTo($related, $relationshipName = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereBelongsTo($related, $relationshipName); + } + + /** + * Add subselect queries to include an aggregate value for a relationship. + * + * @param mixed $relations + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $function + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withAggregate($relations, $column, $function = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withAggregate($relations, $column, $function); + } + + /** + * Add subselect queries to count the relations. + * + * @param mixed $relations + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withCount($relations) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withCount($relations); + } + + /** + * Add subselect queries to include the max of the relation's column. + * + * @param string|array $relation + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withMax($relation, $column) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withMax($relation, $column); + } + + /** + * Add subselect queries to include the min of the relation's column. + * + * @param string|array $relation + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withMin($relation, $column) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withMin($relation, $column); + } + + /** + * Add subselect queries to include the sum of the relation's column. + * + * @param string|array $relation + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withSum($relation, $column) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withSum($relation, $column); + } + + /** + * Add subselect queries to include the average of the relation's column. + * + * @param string|array $relation + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withAvg($relation, $column) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withAvg($relation, $column); + } + + /** + * Add subselect queries to include the existence of related models. + * + * @param string|array $relation + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withExists($relation) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withExists($relation); + } + + /** + * Merge the where constraints from another query to the current query. + * + * @param \Illuminate\Database\Eloquent\Builder<*> $from + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function mergeConstraintsFrom($from) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->mergeConstraintsFrom($from); + } + + /** + * Set the columns to be selected. + * + * @param array|mixed $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function select($columns = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->select($columns); + } + + /** + * Add a subselect expression to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @param string $as + * @return \Illuminate\Database\Eloquent\Builder + * @throws \InvalidArgumentException + * @static + */ + public static function selectSub($query, $as) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->selectSub($query, $as); + } + + /** + * Add a new "raw" select expression to the query. + * + * @param string $expression + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function selectRaw($expression, $bindings = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->selectRaw($expression, $bindings); + } + + /** + * Makes "from" fetch from a subquery. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @param string $as + * @return \Illuminate\Database\Eloquent\Builder + * @throws \InvalidArgumentException + * @static + */ + public static function fromSub($query, $as) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->fromSub($query, $as); + } + + /** + * Add a raw from clause to the query. + * + * @param string $expression + * @param mixed $bindings + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function fromRaw($expression, $bindings = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->fromRaw($expression, $bindings); + } + + /** + * Add a new select column to the query. + * + * @param array|mixed $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function addSelect($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->addSelect($column); + } + + /** + * Force the query to only return distinct results. + * + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function distinct() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->distinct(); + } + + /** + * Set the table which the query is targeting. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\Illuminate\Contracts\Database\Query\Expression|string $table + * @param string|null $as + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function from($table, $as = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->from($table, $as); + } + + /** + * Add an index hint to suggest a query index. + * + * @param string $index + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function useIndex($index) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->useIndex($index); + } + + /** + * Add an index hint to force a query index. + * + * @param string $index + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function forceIndex($index) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->forceIndex($index); + } + + /** + * Add an index hint to ignore a query index. + * + * @param string $index + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function ignoreIndex($index) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->ignoreIndex($index); + } + + /** + * Add a join clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $table + * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first + * @param string|null $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second + * @param string $type + * @param bool $where + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->join($table, $first, $operator, $second, $type, $where); + } + + /** + * Add a "join where" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $table + * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first + * @param string $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string $second + * @param string $type + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function joinWhere($table, $first, $operator, $second, $type = 'inner') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->joinWhere($table, $first, $operator, $second, $type); + } + + /** + * Add a subquery join clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @param string $as + * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first + * @param string|null $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second + * @param string $type + * @param bool $where + * @return \Illuminate\Database\Eloquent\Builder + * @throws \InvalidArgumentException + * @static + */ + public static function joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->joinSub($query, $as, $first, $operator, $second, $type, $where); + } + + /** + * Add a lateral join clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function joinLateral($query, $as, $type = 'inner') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->joinLateral($query, $as, $type); + } + + /** + * Add a lateral left join to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function leftJoinLateral($query, $as) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->leftJoinLateral($query, $as); + } + + /** + * Add a left join to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $table + * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first + * @param string|null $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function leftJoin($table, $first, $operator = null, $second = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->leftJoin($table, $first, $operator, $second); + } + + /** + * Add a "join where" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $table + * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first + * @param string $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function leftJoinWhere($table, $first, $operator, $second) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->leftJoinWhere($table, $first, $operator, $second); + } + + /** + * Add a subquery left join to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @param string $as + * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first + * @param string|null $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function leftJoinSub($query, $as, $first, $operator = null, $second = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->leftJoinSub($query, $as, $first, $operator, $second); + } + + /** + * Add a right join to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $table + * @param \Closure|string $first + * @param string|null $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function rightJoin($table, $first, $operator = null, $second = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->rightJoin($table, $first, $operator, $second); + } + + /** + * Add a "right join where" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $table + * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first + * @param string $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string $second + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function rightJoinWhere($table, $first, $operator, $second) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->rightJoinWhere($table, $first, $operator, $second); + } + + /** + * Add a subquery right join to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @param string $as + * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first + * @param string|null $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function rightJoinSub($query, $as, $first, $operator = null, $second = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->rightJoinSub($query, $as, $first, $operator, $second); + } + + /** + * Add a "cross join" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $table + * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string|null $first + * @param string|null $operator + * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function crossJoin($table, $first = null, $operator = null, $second = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->crossJoin($table, $first, $operator, $second); + } + + /** + * Add a subquery cross join to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @param string $as + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function crossJoinSub($query, $as) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->crossJoinSub($query, $as); + } + + /** + * Merge an array of where clauses and bindings. + * + * @param array $wheres + * @param array $bindings + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function mergeWheres($wheres, $bindings) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->mergeWheres($wheres, $bindings); + } + + /** + * Prepare the value and operator for a where clause. + * + * @param string $value + * @param string $operator + * @param bool $useDefault + * @return array + * @throws \InvalidArgumentException + * @static + */ + public static function prepareValueAndOperator($value, $operator, $useDefault = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->prepareValueAndOperator($value, $operator, $useDefault); + } + + /** + * Add a "where" clause comparing two columns to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string|array $first + * @param string|null $operator + * @param string|null $second + * @param string|null $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereColumn($first, $operator = null, $second = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereColumn($first, $operator, $second, $boolean); + } + + /** + * Add an "or where" clause comparing two columns to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string|array $first + * @param string|null $operator + * @param string|null $second + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereColumn($first, $operator = null, $second = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereColumn($first, $operator, $second); + } + + /** + * Add a raw where clause to the query. + * + * @param string $sql + * @param mixed $bindings + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereRaw($sql, $bindings = [], $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereRaw($sql, $bindings, $boolean); + } + + /** + * Add a raw or where clause to the query. + * + * @param string $sql + * @param mixed $bindings + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereRaw($sql, $bindings = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereRaw($sql, $bindings); + } + + /** + * Add a "where like" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $value + * @param bool $caseSensitive + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereLike($column, $value, $caseSensitive = false, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereLike($column, $value, $caseSensitive, $boolean, $not); + } + + /** + * Add an "or where like" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $value + * @param bool $caseSensitive + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereLike($column, $value, $caseSensitive = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereLike($column, $value, $caseSensitive); + } + + /** + * Add a "where not like" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $value + * @param bool $caseSensitive + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNotLike($column, $value, $caseSensitive = false, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNotLike($column, $value, $caseSensitive, $boolean); + } + + /** + * Add an "or where not like" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $value + * @param bool $caseSensitive + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNotLike($column, $value, $caseSensitive = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNotLike($column, $value, $caseSensitive); + } + + /** + * Add a "where in" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param mixed $values + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereIn($column, $values, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereIn($column, $values, $boolean, $not); + } + + /** + * Add an "or where in" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param mixed $values + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereIn($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereIn($column, $values); + } + + /** + * Add a "where not in" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param mixed $values + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNotIn($column, $values, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNotIn($column, $values, $boolean); + } + + /** + * Add an "or where not in" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param mixed $values + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNotIn($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNotIn($column, $values); + } + + /** + * Add a "where in raw" clause for integer values to the query. + * + * @param string $column + * @param \Illuminate\Contracts\Support\Arrayable|array $values + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereIntegerInRaw($column, $values, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereIntegerInRaw($column, $values, $boolean, $not); + } + + /** + * Add an "or where in raw" clause for integer values to the query. + * + * @param string $column + * @param \Illuminate\Contracts\Support\Arrayable|array $values + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereIntegerInRaw($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereIntegerInRaw($column, $values); + } + + /** + * Add a "where not in raw" clause for integer values to the query. + * + * @param string $column + * @param \Illuminate\Contracts\Support\Arrayable|array $values + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereIntegerNotInRaw($column, $values, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereIntegerNotInRaw($column, $values, $boolean); + } + + /** + * Add an "or where not in raw" clause for integer values to the query. + * + * @param string $column + * @param \Illuminate\Contracts\Support\Arrayable|array $values + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereIntegerNotInRaw($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereIntegerNotInRaw($column, $values); + } + + /** + * Add a "where null" clause to the query. + * + * @param string|array|\Illuminate\Contracts\Database\Query\Expression $columns + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNull($columns, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNull($columns, $boolean, $not); + } + + /** + * Add an "or where null" clause to the query. + * + * @param string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNull($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNull($column); + } + + /** + * Add a "where not null" clause to the query. + * + * @param string|array|\Illuminate\Contracts\Database\Query\Expression $columns + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNotNull($columns, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNotNull($columns, $boolean); + } + + /** + * Add a where between statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereBetween($column, $values, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereBetween($column, $values, $boolean, $not); + } + + /** + * Add a where between statement using columns to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereBetweenColumns($column, $values, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereBetweenColumns($column, $values, $boolean, $not); + } + + /** + * Add an or where between statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereBetween($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereBetween($column, $values); + } + + /** + * Add an or where between statement using columns to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereBetweenColumns($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereBetweenColumns($column, $values); + } + + /** + * Add a where not between statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNotBetween($column, $values, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNotBetween($column, $values, $boolean); + } + + /** + * Add a where not between statement using columns to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNotBetweenColumns($column, $values, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNotBetweenColumns($column, $values, $boolean); + } + + /** + * Add an or where not between statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNotBetween($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNotBetween($column, $values); + } + + /** + * Add an or where not between statement using columns to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNotBetweenColumns($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNotBetweenColumns($column, $values); + } + + /** + * Add an "or where not null" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNotNull($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNotNull($column); + } + + /** + * Add a "where date" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|null $operator + * @param \DateTimeInterface|string|null $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereDate($column, $operator, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereDate($column, $operator, $value, $boolean); + } + + /** + * Add an "or where date" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|null $operator + * @param \DateTimeInterface|string|null $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereDate($column, $operator, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereDate($column, $operator, $value); + } + + /** + * Add a "where time" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|null $operator + * @param \DateTimeInterface|string|null $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereTime($column, $operator, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereTime($column, $operator, $value, $boolean); + } + + /** + * Add an "or where time" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|null $operator + * @param \DateTimeInterface|string|null $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereTime($column, $operator, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereTime($column, $operator, $value); + } + + /** + * Add a "where day" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|int|null $operator + * @param \DateTimeInterface|string|int|null $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereDay($column, $operator, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereDay($column, $operator, $value, $boolean); + } + + /** + * Add an "or where day" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|int|null $operator + * @param \DateTimeInterface|string|int|null $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereDay($column, $operator, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereDay($column, $operator, $value); + } + + /** + * Add a "where month" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|int|null $operator + * @param \DateTimeInterface|string|int|null $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereMonth($column, $operator, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereMonth($column, $operator, $value, $boolean); + } + + /** + * Add an "or where month" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|int|null $operator + * @param \DateTimeInterface|string|int|null $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereMonth($column, $operator, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereMonth($column, $operator, $value); + } + + /** + * Add a "where year" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|int|null $operator + * @param \DateTimeInterface|string|int|null $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereYear($column, $operator, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereYear($column, $operator, $value, $boolean); + } + + /** + * Add an "or where year" statement to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \DateTimeInterface|string|int|null $operator + * @param \DateTimeInterface|string|int|null $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereYear($column, $operator, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereYear($column, $operator, $value); + } + + /** + * Add a nested where statement to the query. + * + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNested($callback, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNested($callback, $boolean); + } + + /** + * Create a new query instance for nested where condition. + * + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function forNestedWhere() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->forNestedWhere(); + } + + /** + * Add another query builder as a nested where to the query builder. + * + * @param \Illuminate\Database\Query\Builder $query + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function addNestedWhereQuery($query, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->addNestedWhereQuery($query, $boolean); + } + + /** + * Add an exists clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $callback + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereExists($callback, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereExists($callback, $boolean, $not); + } + + /** + * Add an or exists clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $callback + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereExists($callback, $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereExists($callback, $not); + } + + /** + * Add a where not exists clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $callback + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNotExists($callback, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNotExists($callback, $boolean); + } + + /** + * Add a where not exists clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $callback + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNotExists($callback) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNotExists($callback); + } + + /** + * Add an exists clause to the query. + * + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function addWhereExistsQuery($query, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->addWhereExistsQuery($query, $boolean, $not); + } + + /** + * Adds a where condition using row values. + * + * @param array $columns + * @param string $operator + * @param array $values + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @throws \InvalidArgumentException + * @static + */ + public static function whereRowValues($columns, $operator, $values, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereRowValues($columns, $operator, $values, $boolean); + } + + /** + * Adds an or where condition using row values. + * + * @param array $columns + * @param string $operator + * @param array $values + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereRowValues($columns, $operator, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereRowValues($columns, $operator, $values); + } + + /** + * Add a "where JSON contains" clause to the query. + * + * @param string $column + * @param mixed $value + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereJsonContains($column, $value, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereJsonContains($column, $value, $boolean, $not); + } + + /** + * Add an "or where JSON contains" clause to the query. + * + * @param string $column + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereJsonContains($column, $value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereJsonContains($column, $value); + } + + /** + * Add a "where JSON not contains" clause to the query. + * + * @param string $column + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereJsonDoesntContain($column, $value, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereJsonDoesntContain($column, $value, $boolean); + } + + /** + * Add an "or where JSON not contains" clause to the query. + * + * @param string $column + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereJsonDoesntContain($column, $value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereJsonDoesntContain($column, $value); + } + + /** + * Add a "where JSON overlaps" clause to the query. + * + * @param string $column + * @param mixed $value + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereJsonOverlaps($column, $value, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereJsonOverlaps($column, $value, $boolean, $not); + } + + /** + * Add an "or where JSON overlaps" clause to the query. + * + * @param string $column + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereJsonOverlaps($column, $value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereJsonOverlaps($column, $value); + } + + /** + * Add a "where JSON not overlap" clause to the query. + * + * @param string $column + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereJsonDoesntOverlap($column, $value, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereJsonDoesntOverlap($column, $value, $boolean); + } + + /** + * Add an "or where JSON not overlap" clause to the query. + * + * @param string $column + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereJsonDoesntOverlap($column, $value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereJsonDoesntOverlap($column, $value); + } + + /** + * Add a clause that determines if a JSON path exists to the query. + * + * @param string $column + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereJsonContainsKey($column, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereJsonContainsKey($column, $boolean, $not); + } + + /** + * Add an "or" clause that determines if a JSON path exists to the query. + * + * @param string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereJsonContainsKey($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereJsonContainsKey($column); + } + + /** + * Add a clause that determines if a JSON path does not exist to the query. + * + * @param string $column + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereJsonDoesntContainKey($column, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereJsonDoesntContainKey($column, $boolean); + } + + /** + * Add an "or" clause that determines if a JSON path does not exist to the query. + * + * @param string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereJsonDoesntContainKey($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereJsonDoesntContainKey($column); + } + + /** + * Add a "where JSON length" clause to the query. + * + * @param string $column + * @param mixed $operator + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereJsonLength($column, $operator, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereJsonLength($column, $operator, $value, $boolean); + } + + /** + * Add an "or where JSON length" clause to the query. + * + * @param string $column + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereJsonLength($column, $operator, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereJsonLength($column, $operator, $value); + } + + /** + * Handles dynamic "where" clauses to the query. + * + * @param string $method + * @param array $parameters + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function dynamicWhere($method, $parameters) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->dynamicWhere($method, $parameters); + } + + /** + * Add a "where fulltext" clause to the query. + * + * @param string|string[] $columns + * @param string $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereFullText($columns, $value, $options = [], $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereFullText($columns, $value, $options, $boolean); + } + + /** + * Add a "or where fulltext" clause to the query. + * + * @param string|string[] $columns + * @param string $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereFullText($columns, $value, $options = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereFullText($columns, $value, $options); + } + + /** + * Add a "where" clause to the query for multiple columns with "and" conditions between them. + * + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns + * @param mixed $operator + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereAll($columns, $operator = null, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereAll($columns, $operator, $value, $boolean); + } + + /** + * Add an "or where" clause to the query for multiple columns with "and" conditions between them. + * + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereAll($columns, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereAll($columns, $operator, $value); + } + + /** + * Add a "where" clause to the query for multiple columns with "or" conditions between them. + * + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns + * @param mixed $operator + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereAny($columns, $operator = null, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereAny($columns, $operator, $value, $boolean); + } + + /** + * Add an "or where" clause to the query for multiple columns with "or" conditions between them. + * + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereAny($columns, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereAny($columns, $operator, $value); + } + + /** + * Add a "where not" clause to the query for multiple columns where none of the conditions should be true. + * + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns + * @param mixed $operator + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNone($columns, $operator = null, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNone($columns, $operator, $value, $boolean); + } + + /** + * Add an "or where not" clause to the query for multiple columns where none of the conditions should be true. + * + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns + * @param mixed $operator + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNone($columns, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNone($columns, $operator, $value); + } + + /** + * Add a "group by" clause to the query. + * + * @param array|\Illuminate\Contracts\Database\Query\Expression|string $groups + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function groupBy(...$groups) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->groupBy(...$groups); + } + + /** + * Add a raw groupBy clause to the query. + * + * @param string $sql + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function groupByRaw($sql, $bindings = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->groupByRaw($sql, $bindings); + } + + /** + * Add a "having" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|\Closure|string $column + * @param string|int|float|null $operator + * @param string|int|float|null $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function having($column, $operator = null, $value = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->having($column, $operator, $value, $boolean); + } + + /** + * Add an "or having" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|\Closure|string $column + * @param string|int|float|null $operator + * @param string|int|float|null $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orHaving($column, $operator = null, $value = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orHaving($column, $operator, $value); + } + + /** + * Add a nested having statement to the query. + * + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function havingNested($callback, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->havingNested($callback, $boolean); + } + + /** + * Add another query builder as a nested having to the query builder. + * + * @param \Illuminate\Database\Query\Builder $query + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function addNestedHavingQuery($query, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->addNestedHavingQuery($query, $boolean); + } + + /** + * Add a "having null" clause to the query. + * + * @param array|string $columns + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function havingNull($columns, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->havingNull($columns, $boolean, $not); + } + + /** + * Add an "or having null" clause to the query. + * + * @param string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orHavingNull($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orHavingNull($column); + } + + /** + * Add a "having not null" clause to the query. + * + * @param array|string $columns + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function havingNotNull($columns, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->havingNotNull($columns, $boolean); + } + + /** + * Add an "or having not null" clause to the query. + * + * @param string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orHavingNotNull($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orHavingNotNull($column); + } + + /** + * Add a "having between " clause to the query. + * + * @param string $column + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function havingBetween($column, $values, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->havingBetween($column, $values, $boolean, $not); + } + + /** + * Add a raw having clause to the query. + * + * @param string $sql + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function havingRaw($sql, $bindings = [], $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->havingRaw($sql, $bindings, $boolean); + } + + /** + * Add a raw or having clause to the query. + * + * @param string $sql + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orHavingRaw($sql, $bindings = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orHavingRaw($sql, $bindings); + } + + /** + * Add an "order by" clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\Illuminate\Contracts\Database\Query\Expression|string $column + * @param string $direction + * @return \Illuminate\Database\Eloquent\Builder + * @throws \InvalidArgumentException + * @static + */ + public static function orderBy($column, $direction = 'asc') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orderBy($column, $direction); + } + + /** + * Add a descending "order by" clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\Illuminate\Contracts\Database\Query\Expression|string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orderByDesc($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orderByDesc($column); + } + + /** + * Put the query's results in random order. + * + * @param string|int $seed + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function inRandomOrder($seed = '') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->inRandomOrder($seed); + } + + /** + * Add a raw "order by" clause to the query. + * + * @param string $sql + * @param array $bindings + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orderByRaw($sql, $bindings = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orderByRaw($sql, $bindings); + } + + /** + * Alias to set the "offset" value of the query. + * + * @param int $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function skip($value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->skip($value); + } + + /** + * Set the "offset" value of the query. + * + * @param int $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function offset($value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->offset($value); + } + + /** + * Alias to set the "limit" value of the query. + * + * @param int $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function take($value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->take($value); + } + + /** + * Set the "limit" value of the query. + * + * @param int $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function limit($value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->limit($value); + } + + /** + * Add a "group limit" clause to the query. + * + * @param int $value + * @param string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function groupLimit($value, $column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->groupLimit($value, $column); + } + + /** + * Set the limit and offset for a given page. + * + * @param int $page + * @param int $perPage + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function forPage($page, $perPage = 15) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->forPage($page, $perPage); + } + + /** + * Constrain the query to the previous "page" of results before a given ID. + * + * @param int $perPage + * @param int|null $lastId + * @param string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function forPageBeforeId($perPage = 15, $lastId = 0, $column = 'id') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->forPageBeforeId($perPage, $lastId, $column); + } + + /** + * Constrain the query to the next "page" of results after a given ID. + * + * @param int $perPage + * @param int|null $lastId + * @param string $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->forPageAfterId($perPage, $lastId, $column); + } + + /** + * Remove all existing orders and optionally add a new order. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Contracts\Database\Query\Expression|string|null $column + * @param string $direction + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function reorder($column = null, $direction = 'asc') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->reorder($column, $direction); + } + + /** + * Add a union statement to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $query + * @param bool $all + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function union($query, $all = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->union($query, $all); + } + + /** + * Add a union all statement to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $query + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function unionAll($query) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->unionAll($query); + } + + /** + * Lock the selected rows in the table. + * + * @param string|bool $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function lock($value = true) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->lock($value); + } + + /** + * Lock the selected rows in the table for updating. + * + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function lockForUpdate() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->lockForUpdate(); + } + + /** + * Share lock the selected rows in the table. + * + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function sharedLock() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->sharedLock(); + } + + /** + * Register a closure to be invoked before the query is executed. + * + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function beforeQuery($callback) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->beforeQuery($callback); + } + + /** + * Invoke the "before query" modification callbacks. + * + * @return void + * @static + */ + public static function applyBeforeQueryCallbacks() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + $instance->applyBeforeQueryCallbacks(); + } + + /** + * Get the SQL representation of the query. + * + * @return string + * @static + */ + public static function toSql() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->toSql(); + } + + /** + * Get the raw SQL representation of the query with embedded bindings. + * + * @return string + * @static + */ + public static function toRawSql() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->toRawSql(); + } + + /** + * Get a single expression value from the first result of a query. + * + * @return mixed + * @static + */ + public static function rawValue($expression, $bindings = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->rawValue($expression, $bindings); + } + + /** + * Get the count of the total records for the paginator. + * + * @param array $columns + * @return int + * @static + */ + public static function getCountForPagination($columns = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->getCountForPagination($columns); + } + + /** + * Concatenate values of a given column as a string. + * + * @param string $column + * @param string $glue + * @return string + * @static + */ + public static function implode($column, $glue = '') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->implode($column, $glue); + } + + /** + * Determine if any rows exist for the current query. + * + * @return bool + * @static + */ + public static function exists() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->exists(); + } + + /** + * Determine if no rows exist for the current query. + * + * @return bool + * @static + */ + public static function doesntExist() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->doesntExist(); + } + + /** + * Execute the given callback if no rows exist for the current query. + * + * @return mixed + * @static + */ + public static function existsOr($callback) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->existsOr($callback); + } + + /** + * Execute the given callback if rows exist for the current query. + * + * @return mixed + * @static + */ + public static function doesntExistOr($callback) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->doesntExistOr($callback); + } + + /** + * Retrieve the "count" result of the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $columns + * @return int + * @static + */ + public static function count($columns = '*') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->count($columns); + } + + /** + * Retrieve the minimum value of a given column. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return mixed + * @static + */ + public static function min($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->min($column); + } + + /** + * Retrieve the maximum value of a given column. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return mixed + * @static + */ + public static function max($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->max($column); + } + + /** + * Retrieve the sum of the values of a given column. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return mixed + * @static + */ + public static function sum($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->sum($column); + } + + /** + * Retrieve the average of the values of a given column. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return mixed + * @static + */ + public static function avg($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->avg($column); + } + + /** + * Alias for the "avg" method. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @return mixed + * @static + */ + public static function average($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->average($column); + } + + /** + * Execute an aggregate function on the database. + * + * @param string $function + * @param array $columns + * @return mixed + * @static + */ + public static function aggregate($function, $columns = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->aggregate($function, $columns); + } + + /** + * Execute a numeric aggregate function on the database. + * + * @param string $function + * @param array $columns + * @return float|int + * @static + */ + public static function numericAggregate($function, $columns = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->numericAggregate($function, $columns); + } + + /** + * Insert new records into the database. + * + * @return bool + * @static + */ + public static function insert($values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->insert($values); + } + + /** + * Insert new records into the database while ignoring errors. + * + * @return int + * @static + */ + public static function insertOrIgnore($values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->insertOrIgnore($values); + } + + /** + * Insert a new record and get the value of the primary key. + * + * @param string|null $sequence + * @return int + * @static + */ + public static function insertGetId($values, $sequence = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->insertGetId($values, $sequence); + } + + /** + * Insert new records into the table using a subquery. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @return int + * @static + */ + public static function insertUsing($columns, $query) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->insertUsing($columns, $query); + } + + /** + * Insert new records into the table using a subquery while ignoring errors. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query + * @return int + * @static + */ + public static function insertOrIgnoreUsing($columns, $query) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->insertOrIgnoreUsing($columns, $query); + } + + /** + * Update records in a PostgreSQL database using the update from syntax. + * + * @return int + * @static + */ + public static function updateFrom($values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->updateFrom($values); + } + + /** + * Insert or update a record matching the attributes, and fill it with values. + * + * @return bool + * @static + */ + public static function updateOrInsert($attributes, $values = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->updateOrInsert($attributes, $values); + } + + /** + * Increment the given column's values by the given amounts. + * + * @param array $columns + * @param array $extra + * @return int + * @throws \InvalidArgumentException + * @static + */ + public static function incrementEach($columns, $extra = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->incrementEach($columns, $extra); + } + + /** + * Decrement the given column's values by the given amounts. + * + * @param array $columns + * @param array $extra + * @return int + * @throws \InvalidArgumentException + * @static + */ + public static function decrementEach($columns, $extra = []) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->decrementEach($columns, $extra); + } + + /** + * Run a truncate statement on the table. + * + * @return void + * @static + */ + public static function truncate() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + $instance->truncate(); + } + + /** + * Get all of the query builder's columns in a text-only array with all expressions evaluated. + * + * @return array + * @static + */ + public static function getColumns() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->getColumns(); + } + + /** + * Create a raw database expression. + * + * @param mixed $value + * @return \Illuminate\Contracts\Database\Query\Expression + * @static + */ + public static function raw($value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->raw($value); + } + + /** + * Get the current query value bindings in a flattened array. + * + * @return array + * @static + */ + public static function getBindings() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->getBindings(); + } + + /** + * Get the raw array of bindings. + * + * @return array + * @static + */ + public static function getRawBindings() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->getRawBindings(); + } + + /** + * Set the bindings on the query builder. + * + * @param string $type + * @return \Illuminate\Database\Eloquent\Builder + * @throws \InvalidArgumentException + * @static + */ + public static function setBindings($bindings, $type = 'where') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->setBindings($bindings, $type); + } + + /** + * Add a binding to the query. + * + * @param mixed $value + * @param string $type + * @return \Illuminate\Database\Eloquent\Builder + * @throws \InvalidArgumentException + * @static + */ + public static function addBinding($value, $type = 'where') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->addBinding($value, $type); + } + + /** + * Cast the given binding value. + * + * @param mixed $value + * @return mixed + * @static + */ + public static function castBinding($value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->castBinding($value); + } + + /** + * Merge an array of bindings into our bindings. + * + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function mergeBindings($query) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->mergeBindings($query); + } + + /** + * Remove all of the expressions from a list of bindings. + * + * @return array + * @static + */ + public static function cleanBindings($bindings) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->cleanBindings($bindings); + } + + /** + * Get the database query processor instance. + * + * @return \Illuminate\Database\Query\Processors\Processor + * @static + */ + public static function getProcessor() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->getProcessor(); + } + + /** + * Get the query grammar instance. + * + * @return \Illuminate\Database\Query\Grammars\Grammar + * @static + */ + public static function getGrammar() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->getGrammar(); + } + + /** + * Use the "write" PDO connection when executing the query. + * + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function useWritePdo() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->useWritePdo(); + } + + /** + * Clone the query without the given properties. + * + * @return static + * @static + */ + public static function cloneWithout($properties) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->cloneWithout($properties); + } + + /** + * Clone the query without the given bindings. + * + * @return static + * @static + */ + public static function cloneWithoutBindings($except) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->cloneWithoutBindings($except); + } + + /** + * Dump the current SQL and bindings. + * + * @param mixed $args + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function dump(...$args) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->dump(...$args); + } + + /** + * Dump the raw current SQL with embedded bindings. + * + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function dumpRawSql() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->dumpRawSql(); + } + + /** + * Die and dump the current SQL and bindings. + * + * @return never + * @static + */ + public static function dd() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->dd(); + } + + /** + * Die and dump the current SQL with embedded bindings. + * + * @return never + * @static + */ + public static function ddRawSql() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->ddRawSql(); + } + + /** + * Add a where clause to determine if a "date" column is in the past to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function wherePast($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->wherePast($columns); + } + + /** + * Add a where clause to determine if a "date" column is in the past or now to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNowOrPast($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNowOrPast($columns); + } + + /** + * Add an "or where" clause to determine if a "date" column is in the past to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWherePast($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWherePast($columns); + } + + /** + * Add a where clause to determine if a "date" column is in the past or now to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNowOrPast($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNowOrPast($columns); + } + + /** + * Add a where clause to determine if a "date" column is in the future to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereFuture($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereFuture($columns); + } + + /** + * Add a where clause to determine if a "date" column is in the future or now to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNowOrFuture($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNowOrFuture($columns); + } + + /** + * Add an "or where" clause to determine if a "date" column is in the future to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereFuture($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereFuture($columns); + } + + /** + * Add an "or where" clause to determine if a "date" column is in the future or now to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNowOrFuture($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNowOrFuture($columns); + } + + /** + * Add a "where date" clause to determine if a "date" column is today to the query. + * + * @param array|string $columns + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereToday($columns, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereToday($columns, $boolean); + } + + /** + * Add a "where date" clause to determine if a "date" column is before today. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereBeforeToday($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereBeforeToday($columns); + } + + /** + * Add a "where date" clause to determine if a "date" column is today or before to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereTodayOrBefore($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereTodayOrBefore($columns); + } + + /** + * Add a "where date" clause to determine if a "date" column is after today. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereAfterToday($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereAfterToday($columns); + } + + /** + * Add a "where date" clause to determine if a "date" column is today or after to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereTodayOrAfter($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereTodayOrAfter($columns); + } + + /** + * Add an "or where date" clause to determine if a "date" column is today to the query. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereToday($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereToday($columns); + } + + /** + * Add an "or where date" clause to determine if a "date" column is before today. + * + * @param array|string $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereBeforeToday($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereBeforeToday($columns); + } + + /** + * Add an "or where date" clause to determine if a "date" column is today or before to the query. + * + * @param array|string $columns + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereTodayOrBefore($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereTodayOrBefore($columns); + } + + /** + * Add an "or where date" clause to determine if a "date" column is after today. + * + * @param array|string $columns + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereAfterToday($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereAfterToday($columns); + } + + /** + * Add an "or where date" clause to determine if a "date" column is today or after to the query. + * + * @param array|string $columns + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereTodayOrAfter($columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereTodayOrAfter($columns); + } + + /** + * Explains the query. + * + * @return \Illuminate\Support\Collection + * @static + */ + public static function explain() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->explain(); + } + + /** + * Register a custom macro. + * + * @param string $name + * @param object|callable $macro + * @param-closure-this static $macro + * @return void + * @static + */ + public static function macro($name, $macro) + { + \Illuminate\Database\Query\Builder::macro($name, $macro); + } + + /** + * Mix another object into the class. + * + * @param object $mixin + * @param bool $replace + * @return void + * @throws \ReflectionException + * @static + */ + public static function mixin($mixin, $replace = true) + { + \Illuminate\Database\Query\Builder::mixin($mixin, $replace); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Database\Query\Builder::flushMacros(); + } + + /** + * Dynamically handle calls to the class. + * + * @param string $method + * @param array $parameters + * @return mixed + * @throws \BadMethodCallException + * @static + */ + public static function macroCall($method, $parameters) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->macroCall($method, $parameters); + } + +} +} + + + + + diff --git a/app/Dto/BrevoWebHookDto.php b/app/Dto/BrevoWebHookDto.php new file mode 100644 index 0000000..24bdcf6 --- /dev/null +++ b/app/Dto/BrevoWebHookDto.php @@ -0,0 +1,13 @@ + + */ + public function broadcastOn(): array + { + return [ + new PrivateChannel('default'), + ]; + } +} diff --git a/app/Http/Controllers/Bo/BrevoController.php b/app/Http/Controllers/Bo/BrevoController.php deleted file mode 100644 index f02553c..0000000 --- a/app/Http/Controllers/Bo/BrevoController.php +++ /dev/null @@ -1,77 +0,0 @@ -firstOrFail(); - - $formContent = $request->items[0]["ExtractedMarkdownMessage"]; - - $tblRegexPatterns = [ - 'user' => '/Matricule et Nom du demandeur\s*\|\s*([^|]+?)\s*\|/i', - 'email' => '/Email du demandeur\s*\|\s*([^|]+?)\s*\|/i', - 'brand' => '/Marque\s*\/\s*Filiale\s*\|\s*([^|]+?)\s*\|/i', - 'subject' => '/Pour quels besoins avez-vous besoin d\'envoyer des emails en masse\s*\?\s*\|\s*([^|]+?)\s*\|/is', - 'date_mep' => '/Date de première envoi souhaité\s*\|\s*([^|]+?)\s*\|/i', - 'comment' => '/Commentaire\s*\|\s*([^|]+?)(?=\s*\|)/i', - ]; - - foreach ($tblRegexPatterns as $field => $regex) { - if (preg_match($regex, $formContent, $matches)) { - $data[$field] = trim($matches[1]); - } else { - return response()->json(['reason' => "Champ manquant $field"], 422); - } - } - - if ($data['date_mep']) { - $dateMep = Carbon::createFromFormat('d/m/Y', $data['date_mep'])->format('Y-m-d'); - } - - $ticket = new Ticket([ - 'site_id' => $site->id, - 'type' => TicketTypeEnum::mailing->value, - 'status' => TicketStatusEnum::new->value, - 'date_mep' => $dateMep ?? null, - 'text' => " - Bonjour,\n - Nom du demandeur : {$data['user']}, - Adresse mail : {$data['email']}, - Marque / Filiale concernée : {$data['brand']}, - Sujet : {$data['subject']}, - Date d'envoi souhaitée : {$data['date_mep']}, - Commentaire : {$data['comment']},\n - Cordialement. - ", - 'title' => "Demande de mail en masse pour {$data['brand']}", - 'is_internal' => false - ]); - - $ticket->user()->associate($site->projectManager); - $ticket->site()->associate($site); - $ticket->assignedUser()->associate($site->projectManager); - $ticket->saveOrFail(); - - if (config('mail.MAIL_ADMIN')) { - Mail::to(config('mail.MAIL_ADMIN'))->send(new NewTicket($ticket)); - } else { - throw new \ErrorException('Missing MAIL_ADMIN in .env'); - } - - return response()->json(['ok' => true]); - } -} diff --git a/app/Http/Controllers/Bo/BrevoWebhookController.php b/app/Http/Controllers/Bo/BrevoWebhookController.php new file mode 100644 index 0000000..e8c6e48 --- /dev/null +++ b/app/Http/Controllers/Bo/BrevoWebhookController.php @@ -0,0 +1,58 @@ +getFromAddress(); + $toEmail = $request->getToAddress(); + $formContent = $request->getRawHtmlBody(); + + if (!$this->isFromLdc($fromEmail)) { + $this->logger->warning( + 'Received a brevo webhook call from a non ldc email.', + [ + 'from' => $fromEmail, + 'to' => $toEmail, + 'content' => base64_encode($formContent) + ] + ); + + return response()->json( + ['ok' => false], + Response::HTTP_BAD_REQUEST + ); + } + + $this->dispatcher->dispatch( + new BrevoWebhookCallReceived( + from: $fromEmail, + to: $toEmail, + htmlRawContent: $formContent, + ) + ); + + return response()->json(['ok' => true]); + } + + private function isFromLdc(Email $email): bool + { + return substr(strrchr($email->value, "@"), 1) === 'ldc.fr'; + } +} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 7b691f9..65bd9fb 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -28,7 +28,7 @@ class RedirectIfAuthenticated switch ($guard) { case 'backend': if (!$request->routeIs('bo.*') && !$request->routeIs('login')) { - continue; + continue 2; } return \redirect()->route('bo.dashboard'); default: diff --git a/app/Http/Requests/Bo/BrevoWebhookRequest.php b/app/Http/Requests/Bo/BrevoWebhookRequest.php new file mode 100644 index 0000000..0812251 --- /dev/null +++ b/app/Http/Requests/Bo/BrevoWebhookRequest.php @@ -0,0 +1,50 @@ +string('items.0.From.Address')); + } + + public function getToAddress(): Email + { + return new Email((string) $this->input('items.0.To.0.Address')); + } + + public function getRawHtmlBody(): string + { + return $this->string('items.0.RawHtmlBody'); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + $expectedFormAddress = Config::string('mail.brevo_webook.expected_from_address'); + + return [ + 'items' => ['required', 'array', 'min:1'], + 'items.0.From.Address' => ['required', 'email:rfc,spoof'], + 'items.0.To.*.Address' => ['required', 'email:rfc,spoof', "in:{$expectedFormAddress}"], + 'items.0.RawHtmlBody' => ['required', 'string', 'min:10'], + ]; + } +} diff --git a/app/Http/Requests/Bo/BrevoWehbookRequest.php b/app/Http/Requests/Bo/BrevoWehbookRequest.php deleted file mode 100644 index 64d0e5f..0000000 --- a/app/Http/Requests/Bo/BrevoWehbookRequest.php +++ /dev/null @@ -1,31 +0,0 @@ -|string> - */ - public function rules(): array - { - return [ - 'items' => 'required|array|min:1', - 'items.0.From.Address' => 'required|email', - 'items.0.To.*.Address' => 'required|email|in:mailing@reply.uwil.fr', - 'items.0.ExtractedMarkdownMessage' => 'required|string|min:10', - ]; - } -} diff --git a/app/Listeners/CreateTicketAutomatically.php b/app/Listeners/CreateTicketAutomatically.php new file mode 100644 index 0000000..880affa --- /dev/null +++ b/app/Listeners/CreateTicketAutomatically.php @@ -0,0 +1,82 @@ +mailAdmin = new Email( + Config::string('mail.MAIL_ADMIN') + ); + } + + public function handle(BrevoWebhookCallReceived $event): void + { + $fromEmail = $event->from; + $toEmail = $event->to; + $htmlRawContent = $event->htmlRawContent; + + $this->logger->info('Received a ticket creation event from brevo'); + $this->logger->debug( + 'Payload for ticket creation form brevo', + [ + 'from_email' => $fromEmail->value, + 'to_email' => $toEmail->value, + 'html_raw_content' => base64_encode($htmlRawContent) + ] + ); + + $siteReceivingTickets = $this->siteRepository->findByName(self::SITE_NAME_WHERE_TO_CREATE_TICKET); + + if ($siteReceivingTickets === null) { + throw new \UnexpectedValueException( + 'No site found with name \'' . + self::SITE_NAME_WHERE_TO_CREATE_TICKET . '\'' + ); + } + + $projectManager = $siteReceivingTickets->projectManager()->first(); + + if ($projectManager === null) { + throw new \UnexpectedValueException( + 'No project manager found for site \'' . + self::SITE_NAME_WHERE_TO_CREATE_TICKET . '\'' + ); + } + + $ticket = $this->automaticTicketCreator->createTicket( + $siteReceivingTickets, + $projectManager, + $htmlRawContent, + ); + + Mail::to($this->mailAdmin->value) + ->send(new NewTicket( + ticketId: $ticket->id, + siteName: $siteReceivingTickets->name, + ticketTitle: $ticket->title, + ticketType: $ticket->type, + userName: $fromEmail->value, + ticketDescription: $ticket->text, + )); + } +} diff --git a/app/Mail/NewTicket.php b/app/Mail/NewTicket.php index 70078e3..52798a8 100644 --- a/app/Mail/NewTicket.php +++ b/app/Mail/NewTicket.php @@ -2,29 +2,23 @@ namespace App\Mail; -use App\Models\Ticket; +use App\Enums\Tickets\TicketTypeEnum; use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; -use Illuminate\Queue\SerializesModels; -class NewTicket extends Mailable +class NewTicket extends Mailable implements ShouldQueue { use Queueable; - use SerializesModels; - /** @var \App\Models\Ticket */ - private $ticket; - - /** - * Create a new message instance. - * - * @param \App\Models\Ticket $ticket - * @return void - */ - public function __construct(Ticket $ticket) - { - $this->ticket = $ticket; - } + public function __construct( + private readonly int $ticketId, + private readonly string $siteName, + private readonly string $ticketTitle, + private readonly TicketTypeEnum $ticketType, + private readonly string $userName, + private readonly string $ticketDescription, + ) {} /** * Build the message. @@ -33,8 +27,14 @@ class NewTicket extends Mailable */ public function build() { - $ticket = $this->ticket; - return $this->subject("[Support] Nouveau ticket n° $ticket->id - $ticket->title") - ->view('emails.new-ticket', compact('ticket')); + return $this->subject("[Support] Nouveau ticket n° {$this->ticketId} - {$this->ticketTitle}") + ->view('emails.new-ticket', [ + 'ticketId' => $this->ticketId, + 'siteName' => $this->siteName, + 'ticketTitle' => $this->ticketTitle, + 'ticketType' => $this->ticketType, + 'userName' => $this->userName, + 'ticketDescription' => $this->ticketDescription, + ]); } } diff --git a/app/Models/Brand.php b/app/Models/Brand.php index b5513db..a529bb0 100644 --- a/app/Models/Brand.php +++ b/app/Models/Brand.php @@ -7,7 +7,13 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; /** - * @property string $name + * @property int $id Doit correspondre aux ids marques de la CRM + * @property string $name Nom de la marque + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $accounts + * @property-read \Illuminate\Database\Eloquent\Collection $sites + * @mixin \Eloquent */ class Brand extends Model { diff --git a/app/Models/Company.php b/app/Models/Company.php index 63cd49d..139d7ce 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -7,7 +7,14 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Casts\Attribute; /** + * @property int $id * @property string $name + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $invoices + * @property-read mixed $value + * @method static \Database\Factories\CompanyFactory factory($count = null, $state = []) + * @mixin \Eloquent */ class Company extends Model { diff --git a/app/Models/Credit/Account.php b/app/Models/Credit/Account.php index 865b6da..974795d 100644 --- a/app/Models/Credit/Account.php +++ b/app/Models/Credit/Account.php @@ -7,10 +7,16 @@ use App\Models\Brand; use Illuminate\Database\Eloquent\Model; /** - * @property string $label - * @property AccountTypeEnum $type - * @property integer $balance - * @property Brand $brand_id + * @property int $id + * @property AccountTypeEnum $type Enum Credit\AccountTypeEnum + * @property string $label Custom account label + * @property float $balance Account balance + * @property int $brand_id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read Brand $brand + * @property-read \App\Models\Credit\CreditLog|null $creditlogs + * @mixin \Eloquent */ class Account extends Model { diff --git a/app/Models/Credit/CreditLog.php b/app/Models/Credit/CreditLog.php index dc8c250..c71dbe5 100644 --- a/app/Models/Credit/CreditLog.php +++ b/app/Models/Credit/CreditLog.php @@ -6,10 +6,15 @@ use App\Enums\Credit\BalanceOperationEnum; use Illuminate\Database\Eloquent\Model; /** - * @property BalanceOperationEnum $type - * @property double $amount - * @property Account $credit_account_id - * @property date $created_at + * @property int $id + * @property BalanceOperationEnum $type Enum Credit\BalanceOperationEnum + * @property float $amount Montant de l'opération + * @property int $credit_account_id + * @property string $created_at + * @property-read \App\Models\Credit\Account $account + * @property-read \App\Models\Credit\EstimationLog|null $pivot + * @property-read \Illuminate\Database\Eloquent\Collection $estimation + * @mixin \Eloquent */ class CreditLog extends Model { diff --git a/app/Models/Credit/Estimation.php b/app/Models/Credit/Estimation.php index 2069164..c95ee39 100644 --- a/app/Models/Credit/Estimation.php +++ b/app/Models/Credit/Estimation.php @@ -9,6 +9,22 @@ use App\Models\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Validation\ValidationException; +/** + * @property int $id + * @property EstimationStatusEnum $status Enum Credit\EstimationStatusEnum + * @property numeric $amount Estimation amount + * @property int $ticket_id + * @property int $credit_account_id The account to debit. + * @property int $estimator_id The person who has done the estimate. + * @property int|null $validator_id The person who has validate the estimate. + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\Credit\Account $account + * @property-read User|null $estimator + * @property-read Ticket|null $ticket + * @property-read User|null $validator + * @mixin \Eloquent + */ class Estimation extends Model { /** diff --git a/app/Models/Credit/EstimationLog.php b/app/Models/Credit/EstimationLog.php index d2d6c57..1d082c7 100644 --- a/app/Models/Credit/EstimationLog.php +++ b/app/Models/Credit/EstimationLog.php @@ -4,6 +4,14 @@ namespace App\Models\Credit; use Illuminate\Database\Eloquent\Relations\Pivot; +/** + * @property int $id + * @property int $credit_log_id + * @property int $credit_estimation_id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @mixin \Eloquent + */ class EstimationLog extends Pivot { /** diff --git a/app/Models/GitlabIssues.php b/app/Models/GitlabIssues.php index 769705a..16ee661 100644 --- a/app/Models/GitlabIssues.php +++ b/app/Models/GitlabIssues.php @@ -4,6 +4,26 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * @property int $id + * @property string $title Gitlab issue title + * @property string $url Gitlab URL + * @property int $estimate_time Gitlab issue estimate time in seconds + * @property int $spent_time Gitlab issue spent time in seconds + * @property int $is_closed Gitlab issue status + * @property int $gitlab_id Gitlab issue id + * @property int $gitlab_iid Gitlab issue iid in project + * @property int|null $milestone_iid Gitlab issue linked milestone iid in project + * @property int $gitlab_project_id Gitlab project id + * @property string $g_created_at Gitlab issue created at + * @property string $g_updated_at Gitlab issue updated at + * @property string|null $g_closed_at Gitlab issue closed at + * @property string|null $g_due_date Gitlab issue due date + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $gitlabLabels + * @mixin \Eloquent + */ class GitlabIssues extends Model { /** diff --git a/app/Models/GitlabLabels.php b/app/Models/GitlabLabels.php index 4701b71..b78fac4 100644 --- a/app/Models/GitlabLabels.php +++ b/app/Models/GitlabLabels.php @@ -4,6 +4,15 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * @property int $id + * @property string $name Label name + * @property int $gitlab_id Label Gitlab id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $issues + * @mixin \Eloquent + */ class GitlabLabels extends Model { /** diff --git a/app/Models/GitlabMilestones.php b/app/Models/GitlabMilestones.php index 36af898..ec165ec 100644 --- a/app/Models/GitlabMilestones.php +++ b/app/Models/GitlabMilestones.php @@ -4,6 +4,22 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * @property int $id + * @property string $title Milestone title + * @property string $url Gitlab URL + * @property int $is_closed Gitlab milestone status + * @property int $gitlab_id Gitlab milestone id + * @property int $gitlab_iid Gitlab milestone iid in project + * @property int $gitlab_project_id Gitlab project id + * @property string $g_created_at Gitlab milestone created at + * @property string $g_updated_at Gitlab milestone updated at + * @property string|null $g_start_date Gitlab milestone start date + * @property string|null $g_due_date Gitlab milestone due date + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @mixin \Eloquent + */ class GitlabMilestones extends Model { /** diff --git a/app/Models/GitlabProjects.php b/app/Models/GitlabProjects.php index 5c0e773..125bb4d 100644 --- a/app/Models/GitlabProjects.php +++ b/app/Models/GitlabProjects.php @@ -4,6 +4,16 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +/** + * @property int $id + * @property string $name Gitlab project name + * @property string $url Gitlab URL + * @property int $is_archived Gitlab archive status + * @property int $gitlab_id Gitlab unique ID + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @mixin \Eloquent + */ class GitlabProjects extends Model { /** diff --git a/app/Models/Information.php b/app/Models/Information.php index 40d377b..941f039 100644 --- a/app/Models/Information.php +++ b/app/Models/Information.php @@ -7,9 +7,13 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; /** + * @property int $id * @property string $title * @property string $message - * @property InfoColorsEnum $type + * @property InfoColorsEnum $type Defined by the InfoColorsEnum enum. + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @mixin \Eloquent */ class Information extends Model { diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 6cf2c8f..7eebcdf 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -13,22 +13,34 @@ use Mccarlosen\LaravelMpdf\LaravelMpdf; use Illuminate\Database\Eloquent\SoftDeletes; /** - * @property string $ref - * @property string $firstname - * @property string $lastname - * @property string $object - * @property string $tasks - * @property double $total - * @property double $total_days - * @property string $comment - * @property boolean $show_days - * @property date $signed_date - * @property date $sent_client_date - * @property date $sent_accounting_date - * @property Site $site_id - * @property Company $company_id - * @property Company $invoiced_to_id - * @property InvoiceStatusEnum $status + * @property int $id + * @property string $ref The invoice reference built as YYYY_MM_INCREMENT_USER. INCREMENT is the N invoice of the month. USER is the first two letters of the user who last edited the invoice. This field has to generated only on create. + * @property string $firstname The person to which the invoice is addressed. + * @property string $lastname The person to which the invoice is addressed. + * @property string $object The invoice object. + * @property array $tasks A JSON object, each line has to be contructed using these fields description, days, type Invoices\TaskTypeEnum, amount + * @property float $total The total calculated using all tasks + * @property float $total_days The total days calculated using all tasks + * @property string|null $comment Any comment joined to the invoice + * @property int $show_days Show days on the printed invoice + * @property Carbon|null $signed_date The date the invoice was signed + * @property Carbon|null $sent_client_date The date the invoice was send to the client + * @property Carbon|null $sent_accounting_date The date the invoice was send to the client + * @property int $site_id + * @property int $company_id + * @property int $invoiced_to_id + * @property InvoiceStatusEnum $status Status of the invoice. + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property Carbon|null $deleted_at + * @property-read \App\Models\Company $company + * @property-read \App\Models\Company $companyInvoiced + * @property-read \App\Models\Site|null $site + * @method static \Database\Factories\InvoiceFactory factory($count = null, $state = []) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice onlyTrashed() + * @method static \Illuminate\Database\Eloquent\Builder|Invoice withTrashed(bool $withTrashed = true) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice withoutTrashed() + * @mixin \Eloquent */ class Invoice extends Model { diff --git a/app/Models/Label.php b/app/Models/Label.php index 903d86c..12999f2 100644 --- a/app/Models/Label.php +++ b/app/Models/Label.php @@ -7,6 +7,14 @@ use App\Lib\Helpers\ToolboxHelper; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +/** + * @property int $id + * @property string $name Un ou deux mot désignant le label + * @property string $color Cast HTML color + * @property-read \App\Models\Site|null $site + * @property-read \Illuminate\Database\Eloquent\Collection $tickets + * @mixin \Eloquent + */ class Label extends Model { use HasFactory; diff --git a/app/Models/Message.php b/app/Models/Message.php index c12985a..46f3122 100644 --- a/app/Models/Message.php +++ b/app/Models/Message.php @@ -9,12 +9,20 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; /** - * - * @property string $message The message content. - * @property \App\Enums\MessageTypeEnum $type The message is not visible for clients. - * @property string $file The message joined file path. - * * @package App\Models + * @property int $id + * @property int $ticket_id + * @property int|null $user_id + * @property string $message + * @property MessageTypeEnum $type Message Type defined by an enum. + * @property string|null $file + * @property string|null $file2 Pièce jointes n°2 + * @property string|null $file3 Pièce jointes n°3 + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\Ticket|null $ticket + * @property-read \App\Models\User|null $user + * @mixin \Eloquent */ class Message extends Model { diff --git a/app/Models/Package.php b/app/Models/Package.php index 33c3de3..efc6690 100644 --- a/app/Models/Package.php +++ b/app/Models/Package.php @@ -6,8 +6,12 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; /** + * @property int $id * @property string $name - * @property double $amount + * @property float $amount The cost per day + * @property bool $published + * @method static \Database\Factories\PackageFactory factory($count = null, $state = []) + * @mixin \Eloquent */ class Package extends Model { diff --git a/app/Models/Site.php b/app/Models/Site.php index 3ac1f28..eab09c9 100644 --- a/app/Models/Site.php +++ b/app/Models/Site.php @@ -10,11 +10,26 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; /** - * @property string $name - * @property string $url_re7 - * @property string $url_prod - * @property integer $gitlab_project_id - * @property Brand $brand_id + * @property int $id + * @property string $name + * @property string|null $url_re7 + * @property string|null $url_prod + * @property int|null $gitlab_project_id + * @property int|null $brand_id Relation is nullable, since not all site would be affiliate with a brand. + * @property int|null $project_manager_id Project manager relationship + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property \Illuminate\Support\Carbon|null $deleted_at + * @property-read \App\Models\Brand|null $brand + * @property-read \Illuminate\Database\Eloquent\Collection $invoices + * @property-read \App\Models\User|null $projectManager + * @property-read \Illuminate\Database\Eloquent\Collection $tickets + * @property-read \Illuminate\Database\Eloquent\Collection $users + * @property-read mixed $value + * @method static \Illuminate\Database\Eloquent\Builder|Site onlyTrashed() + * @method static \Illuminate\Database\Eloquent\Builder|Site withTrashed(bool $withTrashed = true) + * @method static \Illuminate\Database\Eloquent\Builder|Site withoutTrashed() + * @mixin \Eloquent */ class Site extends Model { diff --git a/app/Models/SiteUser.php b/app/Models/SiteUser.php index aad20c1..3149beb 100644 --- a/app/Models/SiteUser.php +++ b/app/Models/SiteUser.php @@ -4,6 +4,11 @@ namespace App\Models; use Illuminate\Database\Eloquent\Relations\Pivot; +/** + * @property int $site_id + * @property int $user_id + * @mixin \Eloquent + */ class SiteUser extends Pivot { /** diff --git a/app/Models/Ticket.php b/app/Models/Ticket.php index 11fb8b6..814d0af 100644 --- a/app/Models/Ticket.php +++ b/app/Models/Ticket.php @@ -22,6 +22,44 @@ use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\ModelNotFoundException; +/** + * @property int $id + * @property int $created_by + * @property int|null $assigned_to La personne a qui est assigné le ticket. + * @property int $site_id + * @property TicketTypeEnum $type + * @property string $title Titre du ticket + * @property string $text + * @property string|null $file + * @property string|null $file2 + * @property string|null $file3 Pièce jointes n°3 + * @property string|null $file4 Pièce jointes n°4 + * @property string|null $file5 Pièce jointes n°5 + * @property TicketStatusEnum $status + * @property int $order Ticket order. + * @property bool $is_internal + * @property string|null $gitlab_issue URL de l'issue Gitlab + * @property \Illuminate\Support\Carbon|null $date_mep Date MEP souhaitée + * @property int $last_activity Last activity on the ticket. + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property \Illuminate\Support\Carbon|null $deleted_at + * @property-read \App\Models\User|null $assignedUser + * @property-read Estimation|null $estimation + * @property-read string $full_name + * @property-read \Illuminate\Database\Eloquent\Collection $labels + * @property-read \Illuminate\Database\Eloquent\Collection $linkedTickets + * @property-read \Illuminate\Database\Eloquent\Collection $messages + * @property-read \App\Models\User|null $projectManager + * @property-read \App\Models\Site|null $site + * @property-read \Illuminate\Database\Eloquent\Collection $subscriptions + * @property-read TicketType|null $ticketType + * @property-read \App\Models\User|null $user + * @method static \Illuminate\Database\Eloquent\Builder|Ticket onlyTrashed() + * @method static \Illuminate\Database\Eloquent\Builder|Ticket withTrashed(bool $withTrashed = true) + * @method static \Illuminate\Database\Eloquent\Builder|Ticket withoutTrashed() + * @mixin \Eloquent + */ class Ticket extends Model { use HasFactory; diff --git a/app/Models/Ticket/TicketType.php b/app/Models/Ticket/TicketType.php index 264ec40..4a9dc14 100644 --- a/app/Models/Ticket/TicketType.php +++ b/app/Models/Ticket/TicketType.php @@ -9,8 +9,13 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; /** - * @property TicketTypeEnum $type - * @property string $template + * @property int $id + * @property TicketTypeEnum $type TicketType Enum + * @property string $template Le template du type de ticket + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $tickets + * @mixin \Eloquent */ class TicketType extends Model { diff --git a/app/Models/User.php b/app/Models/User.php index 84ea559..38c53fe 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -15,12 +15,27 @@ use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; /** + * @property int $id * @property string $name * @property string $email * @property string $password - * @property string $remember_token * @property RoleEnum $role - * @property Collection $sites + * @property string|null $remember_token + * @property int|null $gitlab_id ID du user Gitlab + * @property int|null $favourite_site_id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property \Illuminate\Support\Carbon|null $deleted_at + * @property-read Collection $messages + * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications + * @property-read Collection $sites + * @property-read Collection $subscriptions + * @property-read Collection $tickets + * @method static \Database\Factories\UserFactory factory($count = null, $state = []) + * @method static \Illuminate\Database\Eloquent\Builder|User onlyTrashed() + * @method static \Illuminate\Database\Eloquent\Builder|User withTrashed(bool $withTrashed = true) + * @method static \Illuminate\Database\Eloquent\Builder|User withoutTrashed() + * @mixin \Eloquent */ class User extends Authenticatable { diff --git a/app/Repositories/EloquentSiteRepository.php b/app/Repositories/EloquentSiteRepository.php new file mode 100644 index 0000000..44f9339 --- /dev/null +++ b/app/Repositories/EloquentSiteRepository.php @@ -0,0 +1,19 @@ +where('name', $name) + ->first(); + } +} diff --git a/app/Repositories/SiteRepository.php b/app/Repositories/SiteRepository.php new file mode 100644 index 0000000..47ff204 --- /dev/null +++ b/app/Repositories/SiteRepository.php @@ -0,0 +1,12 @@ +parser->parseRawHtml($withRawHtmlContent); + + $textContent = "Bonjour,\n"; + $textContent .= " Contenu :\n\n"; + $textContent .= " {$parsedContent->plainTextContent},\n\n"; + $textContent .= " Cordialement."; + + $title = "Demande de mail en masse"; + + if (!empty($parsedContent->brand)) { + $title .= " pour {$parsedContent->brand}"; + } + + $ticket = new Ticket([ + 'site_id' => $forSite->id, + 'type' => TicketTypeEnum::mailing->value, + 'status' => TicketStatusEnum::estimateTodo->value, + 'date_mep' => null, + 'text' => $textContent, + 'title' => $title, + 'is_internal' => false + ]); + + $ticket->site()->associate($forSite); + $ticket->user()->associate($withProjectManager); + $ticket->assignedUser()->associate($withProjectManager); + + $ticket->saveOrFail(); + + return $ticket; + } +} diff --git a/app/Services/BrevoWebookParser.php b/app/Services/BrevoWebookParser.php new file mode 100644 index 0000000..e01fb66 --- /dev/null +++ b/app/Services/BrevoWebookParser.php @@ -0,0 +1,35 @@ + '/^Matricule et Nom du demandeur\s*\r?\n(.*)$/im', + 'email' => '/^Email du demandeur\s*\r?\n(.*)$/im', + 'brand' => '/^Marque\s*\/\s*Filiale\s*\r?\n(.*)$/im', + ]; + + foreach ($tblRegexPatterns as $field => $regex) { + if (preg_match($regex, $plainText, $matches)) { + $data[$field] = trim($matches[1]); + } + } + + return new BrevoWebHookDto( + plainTextContent: $plainText, + brand: $data['brand'] ?? null + ); + } +} diff --git a/composer.json b/composer.json index fb5f091..02cc4c9 100644 --- a/composer.json +++ b/composer.json @@ -28,6 +28,7 @@ "uwil/k8s-laravel": "^1.2" }, "require-dev": { + "barryvdh/laravel-ide-helper": "^3.7", "fakerphp/faker": "^1.9.1", "laravel-lang/common": "^4.0", "laravel/pint": "^1.0", @@ -43,7 +44,8 @@ "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", - "Database\\Seeders\\": "database/seeders/" + "Database\\Seeders\\": "database/seeders/", + "Domain\\": "domain/" } }, "repositories": [ @@ -67,7 +69,11 @@ "@php artisan package:discover --ansi" ], "post-update-cmd": [ - "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + "@php artisan vendor:publish --tag=laravel-assets --ansi --force", + "Illuminate\\Foundation\\ComposerScripts::postUpdate", + "@php artisan lang:update", + "@php artisan ide-helper:generate", + "@php artisan ide-helper:models -RW" ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" diff --git a/composer.lock b/composer.lock index d92b769..d6aa0e7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7416f0b20f3b4cbad37458002462d3d8", + "content-hash": "8d2ff09233a3a226f9f5779c2a66d3a6", "packages": [ { "name": "brick/math", @@ -9097,6 +9097,298 @@ }, "time": "2023-02-15T13:05:41+00:00" }, + { + "name": "barryvdh/laravel-ide-helper", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-ide-helper.git", + "reference": "ad7e37676f1ff985d55ef1b6b96a0c0a40f2609a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/ad7e37676f1ff985d55ef1b6b96a0c0a40f2609a", + "reference": "ad7e37676f1ff985d55ef1b6b96a0c0a40f2609a", + "shasum": "" + }, + "require": { + "barryvdh/reflection-docblock": "^2.4", + "composer/class-map-generator": "^1.0", + "ext-json": "*", + "illuminate/console": "^11.15 || ^12 || ^13.0", + "illuminate/database": "^11.15 || ^12 || ^13.0", + "illuminate/filesystem": "^11.15 || ^12 || ^13.0", + "illuminate/support": "^11.15 || ^12 || ^13.0", + "php": "^8.2" + }, + "require-dev": { + "ext-pdo_sqlite": "*", + "friendsofphp/php-cs-fixer": "^3", + "illuminate/config": "^11.15 || ^12 || ^13.0", + "illuminate/view": "^11.15 || ^12 || ^13.0", + "larastan/larastan": "^3.1", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^9.2 || ^10 || ^11.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5 || ^11.5.3 || ^12.5.12", + "spatie/phpunit-snapshot-assertions": "^4 || ^5", + "vlucas/phpdotenv": "^5" + }, + "suggest": { + "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10|^11)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\LaravelIdeHelper\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", + "keywords": [ + "autocomplete", + "codeintel", + "dev", + "helper", + "ide", + "laravel", + "netbeans", + "phpdoc", + "phpstorm", + "sublime" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2026-03-17T14:12:51+00:00" + }, + { + "name": "barryvdh/reflection-docblock", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/ReflectionDocBlock.git", + "reference": "4f5ba70c30c81f2ce03a16a9965832cfcc31ed3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/4f5ba70c30c81f2ce03a16a9965832cfcc31ed3b", + "reference": "4f5ba70c30c81f2ce03a16a9965832cfcc31ed3b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.14|^9" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Barryvdh": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "support": { + "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.4.1" + }, + "time": "2026-03-05T20:09:01+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.7.3", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/86d8208fc3c649a3a999daf1a63c25201be2990f", + "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f", + "shasum": "" + }, + "require": { + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.7.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2026-05-05T09:17:07+00:00" + }, + { + "name": "composer/pcre", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/d5a341b3fb61f3001970940afb1d332968a183ed", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<2.2.2" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2026-06-07T11:47:49+00:00" + }, { "name": "composer/semver", "version": "3.4.4", diff --git a/config/ide-helper.php b/config/ide-helper.php new file mode 100644 index 0000000..b2e8c7c --- /dev/null +++ b/config/ide-helper.php @@ -0,0 +1,379 @@ + '_ide_helper.php', + + /* + |-------------------------------------------------------------------------- + | Models filename + |-------------------------------------------------------------------------- + | + | The default filename for the models helper file. + | + */ + + 'models_filename' => '_ide_helper_models.php', + + /* + |-------------------------------------------------------------------------- + | PhpStorm meta filename + |-------------------------------------------------------------------------- + | + | PhpStorm also supports the directory `.phpstorm.meta.php/` with arbitrary + | files in it, should you need additional files for your project; e.g. + | `.phpstorm.meta.php/laravel_ide_Helper.php'. + | + */ + 'meta_filename' => '.phpstorm.meta.php', + + /* + |-------------------------------------------------------------------------- + | Fluent helpers + |-------------------------------------------------------------------------- + | + | Set to true to generate commonly used Fluent methods. + | + */ + + 'include_fluent' => false, + + /* + |-------------------------------------------------------------------------- + | Write model query methods + |-------------------------------------------------------------------------- + | + | Set to false to disable generated docs for the 'query()', 'newQuery()' and 'newModelQuery()' methods. + | + */ + + 'write_query_methods' => false, + + /* + |-------------------------------------------------------------------------- + | Write model magic methods + |-------------------------------------------------------------------------- + | + | Set to false to disable write magic methods of model. + | + */ + + 'write_model_magic_where' => false, + + /* + |-------------------------------------------------------------------------- + | Write model external Eloquent builder methods + |-------------------------------------------------------------------------- + | + | Set to false to disable write external Eloquent builder methods. + | + */ + + 'write_model_external_builder_methods' => false, + + /* + |-------------------------------------------------------------------------- + | Write model relation count and exists properties + |-------------------------------------------------------------------------- + | + | Set to false to disable writing of relation count and exists properties + | to model DocBlocks. + | + */ + + 'write_model_relation_count_properties' => false, + 'write_model_relation_exists_properties' => false, + + /* + |-------------------------------------------------------------------------- + | Write Eloquent model mixins + |-------------------------------------------------------------------------- + | + | This will add the necessary DocBlock mixins to the model class + | contained in the Laravel framework. This helps the IDE with + | auto-completion. + | + | Please be aware that this setting changes a file within the /vendor directory. + | + */ + + 'write_eloquent_model_mixins' => false, + + /* + |-------------------------------------------------------------------------- + | Helper files to include + |-------------------------------------------------------------------------- + | + | Include helper files. By default not included, but can be toggled with the + | -- helpers (-H) option. Extra helper files can be included. + | + */ + + 'include_helpers' => false, + + 'helper_files' => [ + base_path() . '/vendor/laravel/framework/src/Illuminate/Support/helpers.php', + base_path() . '/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php', + ], + + /* + |-------------------------------------------------------------------------- + | Model locations to include + |-------------------------------------------------------------------------- + | + | Define in which directories the ide-helper:models command should look + | for models. + | + | glob patterns are supported to easier reach models in sub-directories, + | e.g. `app/Services/* /Models` (without the space). + | + */ + + 'model_locations' => [ + 'app', + ], + + /* + |-------------------------------------------------------------------------- + | Models to ignore + |-------------------------------------------------------------------------- + | + | Define which models should be ignored. + | + */ + + 'ignored_models' => [], + + /* + |-------------------------------------------------------------------------- + | Models hooks + |-------------------------------------------------------------------------- + | + | Define which hook classes you want to run for models to add custom information. + | + | Hooks should implement Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface. + | + */ + + 'model_hooks' => [ + // App\Support\IdeHelper\MyModelHook::class + ], + + /* + |-------------------------------------------------------------------------- + | Extra classes + |-------------------------------------------------------------------------- + | + | These implementations are not really extended, but called with magic functions. + | + */ + + 'extra' => [ + 'Eloquent' => [Builder::class, \Illuminate\Database\Query\Builder::class], + 'Session' => [Store::class], + ], + + 'magic' => [], + + /* + |-------------------------------------------------------------------------- + | Interface implementations + |-------------------------------------------------------------------------- + | + | These interfaces will be replaced with the implementing class. Some interfaces + | are detected by the helpers, others can be listed below. + | + */ + + 'interfaces' => [ + // App\MyInterface::class => App\MyImplementation::class, + ], + + /* + |-------------------------------------------------------------------------- + | Support for camel cased models + |-------------------------------------------------------------------------- + | + | There are some Laravel packages (such as Eloquence) that allow for accessing + | Eloquent model properties via camel case, instead of snake case. + | + | Enabling this option will support these packages by saving all model + | properties as camel case, instead of snake case. + | + | For example, normally you would see this: + | + | * @property \Illuminate\Support\Carbon $created_at + | * @property \Illuminate\Support\Carbon $updated_at + | + | With this enabled, the properties will be this: + | + | * @property \Illuminate\Support\Carbon $createdAt + | * @property \Illuminate\Support\Carbon $updatedAt + | + | Note, it is currently an all-or-nothing option. + | + */ + 'model_camel_case_properties' => false, + + /* + |-------------------------------------------------------------------------- + | Property casts + |-------------------------------------------------------------------------- + | + | Cast the given "real type" to the given "type". + | + */ + 'type_overrides' => [ + 'integer' => 'int', + 'boolean' => 'bool', + ], + + /* + |-------------------------------------------------------------------------- + | Include DocBlocks from classes + |-------------------------------------------------------------------------- + | + | Include DocBlocks from classes to allow additional code inspection for + | magic methods and properties. + | + */ + 'include_class_docblocks' => false, + + /* + |-------------------------------------------------------------------------- + | Force FQN usage + |-------------------------------------------------------------------------- + | + | Use the fully qualified (class) name in DocBlocks, + | even if the class exists in the same namespace + | or there is an import (use className) of the class. + | + */ + 'force_fqn' => false, + + /* + |-------------------------------------------------------------------------- + | Use generics syntax + |-------------------------------------------------------------------------- + | + | Use generics syntax within DocBlocks, + | e.g. `Collection` instead of `Collection|User[]`. + | + */ + 'use_generics_annotations' => true, + + /* + |-------------------------------------------------------------------------- + | Default return types for macros + |-------------------------------------------------------------------------- + | + | Define default return types for macros without explicit return types. + | e.g. `\Illuminate\Database\Query\Builder::class => 'static'`, + | `\Illuminate\Support\Str::class => 'string'` + | + */ + 'macro_default_return_types' => [ + Factory::class => PendingRequest::class, + ], + + /* + |-------------------------------------------------------------------------- + | Additional relation types + |-------------------------------------------------------------------------- + | + | Sometimes it's needed to create custom relation types. The key of the array + | is the relationship method name. The value of the array is the fully-qualified + | class name of the relationship, e.g. `'relationName' => RelationShipClass::class`. + | + */ + 'additional_relation_types' => [], + + /* + |-------------------------------------------------------------------------- + | Additional relation return types + |-------------------------------------------------------------------------- + | + | When using custom relation types its possible for the class name to not contain + | the proper return type of the relation. The key of the array is the relationship + | method name. The value of the array is the return type of the relation ('many' + | or 'morphTo'). + | e.g. `'relationName' => 'many'`. + | + */ + 'additional_relation_return_types' => [], + + /* + |-------------------------------------------------------------------------- + | Enforce nullable Eloquent relationships on not null columns + |-------------------------------------------------------------------------- + | + | When set to true (default), this option enforces nullable Eloquent relationships. + | However, in cases where the application logic ensures the presence of related + | records it may be desirable to set this option to false to avoid unwanted null warnings. + | + | Default: true + | A not null column with no foreign key constraint will have a "nullable" relationship. + | * @property int $not_null_column_with_no_foreign_key_constraint + | * @property-read BelongsToVariation|null $notNullColumnWithNoForeignKeyConstraint + | + | Option: false + | A not null column with no foreign key constraint will have a "not nullable" relationship. + | * @property int $not_null_column_with_no_foreign_key_constraint + | * @property-read BelongsToVariation $notNullColumnWithNoForeignKeyConstraint + | + */ + + 'enforce_nullable_relationships' => true, + + /* + |-------------------------------------------------------------------------- + | Make soft deletable relations nullable + |-------------------------------------------------------------------------- + | + | When set to true (default), relationships to models using SoftDeletes trait + | will be marked as nullable. This is because soft-deleted records are excluded + | from queries by default, meaning even non-nullable foreign keys can return + | null when the related model is soft-deleted. + | + | Default: true + | A relationship to a soft-deletable model will include |null in the type: + | * @property-read Team|null $team + | + | Option: false + | A relationship to a soft-deletable model will NOT include |null (unless + | nullable for other reasons such as nullable foreign key column): + | * @property-read Team $team + | + */ + + 'soft_deletes_force_nullable' => true, + + /* + |-------------------------------------------------------------------------- + | Run artisan commands after migrations to generate model helpers + |-------------------------------------------------------------------------- + | + | The specified commands should run after migrations are finished running. + | + */ + 'post_migrate' => [ + // 'ide-helper:models --nowrite', + ], + +]; diff --git a/config/mail.php b/config/mail.php index 030c464..15ba681 100644 --- a/config/mail.php +++ b/config/mail.php @@ -18,6 +18,10 @@ return [ // * Mail admin 'MAIL_ADMIN' => env('MAIL_ADMIN', 'digital@ldc.fr'), + 'brevo_webook' => [ + 'expected_from_address' => 'mailing@reply.uwil.fr' + ], + /* |-------------------------------------------------------------------------- | Mailer Configurations diff --git a/database/factories/SiteFactory.php b/database/factories/SiteFactory.php new file mode 100644 index 0000000..0ecc7ae --- /dev/null +++ b/database/factories/SiteFactory.php @@ -0,0 +1,46 @@ + + */ + public function definition(): array + { + return [ + 'name' => fake()->company(), + 'url_re7' => fake()->url(), + 'url_prod' => fake()->url(), + 'gitlab_project_id' => fake()->optional()->randomNumber(4), + 'brand_id' => null, + 'project_manager_id' => null, + ]; + } + + /** + * Indique que le site a un chef de projet assigné. + */ + public function withProjectManager(): static + { + return $this->state(fn(array $attributes) => [ + 'project_manager_id' => User::factory(), + ]); + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 7b01f11..def9ae2 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -1,10 +1,12 @@ */ - public function definition() + public function definition(): array { return [ - 'name' => $this->faker->name, - 'email' => $this->faker->unique()->safeEmail, - 'email_verified_at' => now(), - // * password - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', - 'remember_token' => Str::random(10), + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'role' => RoleEnum::developper, + 'gitlab_id' => fake()->optional()->randomNumber(5), + 'favourite_site_id' => null, ]; } + + public function admin(): static + { + return $this->state(fn(array $attributes) => [ + 'role' => RoleEnum::admin, + ]); + } } diff --git a/domain/Models/ValueObjects/Email.php b/domain/Models/ValueObjects/Email.php new file mode 100644 index 0000000..5f0606c --- /dev/null +++ b/domain/Models/ValueObjects/Email.php @@ -0,0 +1,21 @@ +validate($value); + } + + private function validate(string $email): void + { + if (! filter_var($email, FILTER_VALIDATE_EMAIL)) { + throw new \DomainException('Invalid email address'); + } + } +} diff --git a/resources/views/emails/new-ticket.blade.php b/resources/views/emails/new-ticket.blade.php index bf19818..19078e9 100644 --- a/resources/views/emails/new-ticket.blade.php +++ b/resources/views/emails/new-ticket.blade.php @@ -1,13 +1,13 @@

Bonjour,

-

Un nouveau ticket (n°{{ $ticket->id }}) a été créé sur le support :

+

Un nouveau ticket (n°{{ $ticketId }}) a été créé sur le support :

    -
  • Projet : {{ $ticket->site->name }}
  • -
  • Titre : {{ $ticket->title }}
  • -
  • Type : {{ $ticket->type->label() }}
  • -
  • Créé par : {{ $ticket->user()->withTrashed()->firstOrFail()->name }}
  • +
  • Projet : {{ $siteName }}
  • +
  • Titre : {{ $ticketTitle }}
  • +
  • Type : {{ $ticketType->label() }}
  • +
  • Créé par : {{ $userName }}

Description :
{!! clean(nl2br($ticket->text)) !!}

-

Lien vers le ticket : Ouvrir dans un nouvel onglet

+

Lien vers le ticket : Ouvrir dans un nouvel onglet

diff --git a/routes/web-bo.php b/routes/web-bo.php index c303d5e..d7945a4 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -12,13 +12,13 @@ use App\Http\Controllers\Bo\PackageController; use App\Http\Controllers\Bo\SiteController; use App\Http\Controllers\Bo\TicketController; use App\Http\Controllers\Bo\TicketTypeController; -use App\Http\Controllers\Bo\BrevoController; +use App\Http\Controllers\Bo\BrevoWebhookController; use App\Http\Controllers\Bo\UserController; use App\Http\Middleware\SecureHeaders; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; -Route::post('/brevo-in', [BrevoController::class, 'createTicket']); +Route::post('/brevo-in', [BrevoWebhookController::class, 'webhookCallReceived']); Route::middleware('admin-secure') ->group(function () { @@ -130,7 +130,8 @@ Route::middleware('admin-secure') ->middleware('can:estimate,ticket') ->name('estimateSubmit'); Route::post('/{ticket}/estimate/answer', [ - EstimationController::class, 'estimatePendingSubmit' + EstimationController::class, + 'estimatePendingSubmit' ]) ->middleware('can:validateEstimate,ticket') ->name('estimatePendingSubmit'); diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php index 8fbf370..a526614 100644 --- a/tests/Feature/ExampleTest.php +++ b/tests/Feature/ExampleTest.php @@ -15,6 +15,6 @@ class ExampleTest extends TestCase { $response = $this->get('/'); - $response->assertStatus(200); + $response->assertStatus(302); } } diff --git a/tests/Unit/ExampleTest.php b/tests/Unit/ExampleTest.php deleted file mode 100644 index 358cfc8..0000000 --- a/tests/Unit/ExampleTest.php +++ /dev/null @@ -1,18 +0,0 @@ -assertTrue(true); - } -} diff --git a/tests/Unit/Services/AutomaticTicketCreatorTest.php b/tests/Unit/Services/AutomaticTicketCreatorTest.php new file mode 100644 index 0000000..244e3f1 --- /dev/null +++ b/tests/Unit/Services/AutomaticTicketCreatorTest.php @@ -0,0 +1,78 @@ +parserMock = Mockery::mock(BrevoWebookParser::class); + $this->creator = new AutomaticTicketCreator($this->parserMock); + } + + public function testCanCreateTicketWithProjectManagerAndBrand(): void + { + // GIVEN + $site = Site::factory()->create(); + $manager = User::factory()->create(); + $rawHtml = 'Simili HTML dynamique'; + + $dto = new BrevoWebHookDto( + plainTextContent: 'Contenu parsé', + brand: 'LDC Service' + ); + + $this->parserMock + ->shouldReceive('parseRawHtml') + ->once() + ->with($rawHtml) + ->andReturn($dto); + + // WHEN + $ticket = $this->creator->createTicket($site, $manager, $rawHtml); + + // THEN + $this->assertInstanceOf(Ticket::class, $ticket); + $this->assertEquals($site->id, $ticket->site_id); + $this->assertEquals(TicketTypeEnum::mailing, $ticket->type); + $this->assertEquals(TicketStatusEnum::estimateTodo, $ticket->status); + + $this->assertEquals('Demande de mail en masse pour LDC Service', $ticket->title); + $this->assertStringContainsString('Contenu :', $ticket->text); + $this->assertStringContainsString('Contenu parsé', $ticket->text); + + $this->assertFalse($ticket->is_internal); + + $this->assertTrue($ticket->user->is($manager)); + $this->assertTrue($ticket->assignedUser->is($manager)); + + $this->assertDatabaseHas('tickets', [ + 'id' => $ticket->id, + 'created_by' => $manager->id, + 'assigned_to' => $manager->id, + 'title' => 'Demande de mail en masse pour LDC Service' + ]); + } +} diff --git a/tests/Unit/Services/BrevoWebookParserTest.php b/tests/Unit/Services/BrevoWebookParserTest.php new file mode 100644 index 0000000..a436cc2 --- /dev/null +++ b/tests/Unit/Services/BrevoWebookParserTest.php @@ -0,0 +1,49 @@ +parser = new BrevoWebookParser(); + } + + public function testCanExtractDataWithRegexUsingPipedFormat(): void + { + // GIVEN + $rawHtml = <<parser->parseRawHtml($rawHtml); + + // THEN + $this->assertInstanceOf(BrevoWebHookDto::class, $dto); + $this->assertEquals('LDC Service', $dto->brand); + $this->assertEquals($rawHtml, $dto->plainTextContent); + } + + public function testHandlesMissingFieldsGracefully(): void + { + // GIVEN + $rawHtml = "

Contenu classique sans le formalisme du tableau markdown

"; + + // WHEN + $dto = $this->parser->parseRawHtml($rawHtml); + + // THEN + $this->assertNull($dto->brand); + $this->assertEquals("Contenu classique sans le formalisme du tableau markdown", $dto->plainTextContent); + } +}