diff --git a/.gitignore b/.gitignore index 656cf1b..3f9cf0f 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,6 @@ Homestead.json Homestead.yaml Thumbs.db /docker-compose.yaml + +# HTML-Report von composer test:coverage +/storage/coverage diff --git a/_ide_helper.php b/_ide_helper.php new file mode 100644 index 0000000..27310d4 --- /dev/null +++ b/_ide_helper.php @@ -0,0 +1,29010 @@ + + * @see https://github.com/barryvdh/laravel-ide-helper + */ +namespace Illuminate\Support\Facades { + /** + * @see \Illuminate\Foundation\Application + */ + class App { + /** + * Begin configuring a new Laravel application instance. + * + * @param string|null $basePath + * @return \Illuminate\Foundation\Configuration\ApplicationBuilder + * @static + */ + public static function configure($basePath = null) + { + return \Illuminate\Foundation\Application::configure($basePath); + } + + /** + * Infer the application's base directory from the environment. + * + * @return string + * @static + */ + public static function inferBasePath() + { + return \Illuminate\Foundation\Application::inferBasePath(); + } + + /** + * Get the version number of the application. + * + * @return string + * @static + */ + public static function version() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->version(); + } + + /** + * Run the given array of bootstrap classes. + * + * @param string[] $bootstrappers + * @return void + * @static + */ + public static function bootstrapWith($bootstrappers) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->bootstrapWith($bootstrappers); + } + + /** + * Register a callback to run after loading the environment. + * + * @param \Closure $callback + * @return void + * @static + */ + public static function afterLoadingEnvironment($callback) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->afterLoadingEnvironment($callback); + } + + /** + * Register a callback to run before a bootstrapper. + * + * @param string $bootstrapper + * @param \Closure $callback + * @return void + * @static + */ + public static function beforeBootstrapping($bootstrapper, $callback) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->beforeBootstrapping($bootstrapper, $callback); + } + + /** + * Register a callback to run after a bootstrapper. + * + * @param string $bootstrapper + * @param \Closure $callback + * @return void + * @static + */ + public static function afterBootstrapping($bootstrapper, $callback) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->afterBootstrapping($bootstrapper, $callback); + } + + /** + * Determine if the application has been bootstrapped before. + * + * @return bool + * @static + */ + public static function hasBeenBootstrapped() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->hasBeenBootstrapped(); + } + + /** + * Set the base path for the application. + * + * @param string $basePath + * @return \Illuminate\Foundation\Application + * @static + */ + public static function setBasePath($basePath) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->setBasePath($basePath); + } + + /** + * Get the path to the application "app" directory. + * + * @param string $path + * @return string + * @static + */ + public static function path($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->path($path); + } + + /** + * Set the application directory. + * + * @param string $path + * @return \Illuminate\Foundation\Application + * @static + */ + public static function useAppPath($path) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->useAppPath($path); + } + + /** + * Get the base path of the Laravel installation. + * + * @param string $path + * @return string + * @static + */ + public static function basePath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->basePath($path); + } + + /** + * Get the path to the bootstrap directory. + * + * @param string $path + * @return string + * @static + */ + public static function bootstrapPath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->bootstrapPath($path); + } + + /** + * Get the path to the service provider list in the bootstrap directory. + * + * @return string + * @static + */ + public static function getBootstrapProvidersPath() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getBootstrapProvidersPath(); + } + + /** + * Set the bootstrap file directory. + * + * @param string $path + * @return \Illuminate\Foundation\Application + * @static + */ + public static function useBootstrapPath($path) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->useBootstrapPath($path); + } + + /** + * Get the path to the application configuration files. + * + * @param string $path + * @return string + * @static + */ + public static function configPath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->configPath($path); + } + + /** + * Set the configuration directory. + * + * @param string $path + * @return \Illuminate\Foundation\Application + * @static + */ + public static function useConfigPath($path) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->useConfigPath($path); + } + + /** + * Get the path to the database directory. + * + * @param string $path + * @return string + * @static + */ + public static function databasePath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->databasePath($path); + } + + /** + * Set the database directory. + * + * @param string $path + * @return \Illuminate\Foundation\Application + * @static + */ + public static function useDatabasePath($path) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->useDatabasePath($path); + } + + /** + * Get the path to the language files. + * + * @param string $path + * @return string + * @static + */ + public static function langPath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->langPath($path); + } + + /** + * Set the language file directory. + * + * @param string $path + * @return \Illuminate\Foundation\Application + * @static + */ + public static function useLangPath($path) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->useLangPath($path); + } + + /** + * Get the path to the public / web directory. + * + * @param string $path + * @return string + * @static + */ + public static function publicPath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->publicPath($path); + } + + /** + * Set the public / web directory. + * + * @param string $path + * @return \Illuminate\Foundation\Application + * @static + */ + public static function usePublicPath($path) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->usePublicPath($path); + } + + /** + * Get the path to the storage directory. + * + * @param string $path + * @return string + * @static + */ + public static function storagePath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->storagePath($path); + } + + /** + * Set the storage directory. + * + * @param string $path + * @return \Illuminate\Foundation\Application + * @static + */ + public static function useStoragePath($path) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->useStoragePath($path); + } + + /** + * Get the path to the resources directory. + * + * @param string $path + * @return string + * @static + */ + public static function resourcePath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->resourcePath($path); + } + + /** + * Get the path to the views directory. + * + * This method returns the first configured path in the array of view paths. + * + * @param string $path + * @return string + * @static + */ + public static function viewPath($path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->viewPath($path); + } + + /** + * Join the given paths together. + * + * @param string $basePath + * @param string $path + * @return string + * @static + */ + public static function joinPaths($basePath, $path = '') + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->joinPaths($basePath, $path); + } + + /** + * Get the path to the environment file directory. + * + * @return string + * @static + */ + public static function environmentPath() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->environmentPath(); + } + + /** + * Set the directory for the environment file. + * + * @param string $path + * @return \Illuminate\Foundation\Application + * @static + */ + public static function useEnvironmentPath($path) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->useEnvironmentPath($path); + } + + /** + * Set the environment file to be loaded during bootstrapping. + * + * @param string $file + * @return \Illuminate\Foundation\Application + * @static + */ + public static function loadEnvironmentFrom($file) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->loadEnvironmentFrom($file); + } + + /** + * Get the environment file the application is using. + * + * @return string + * @static + */ + public static function environmentFile() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->environmentFile(); + } + + /** + * Get the fully-qualified path to the environment file. + * + * @return string + * @static + */ + public static function environmentFilePath() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->environmentFilePath(); + } + + /** + * Get or check the current application environment. + * + * @param string|array $environments + * @return string|bool + * @static + */ + public static function environment(...$environments) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->environment(...$environments); + } + + /** + * Determine if the application is in the local environment. + * + * @return bool + * @static + */ + public static function isLocal() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->isLocal(); + } + + /** + * Determine if the application is in the production environment. + * + * @return bool + * @static + */ + public static function isProduction() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->isProduction(); + } + + /** + * Detect the application's current environment. + * + * @param \Closure $callback + * @return string + * @static + */ + public static function detectEnvironment($callback) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->detectEnvironment($callback); + } + + /** + * Determine if the application is running in the console. + * + * @return bool + * @static + */ + public static function runningInConsole() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->runningInConsole(); + } + + /** + * Determine if the application is running any of the given console commands. + * + * @param string|array $commands + * @return bool + * @static + */ + public static function runningConsoleCommand(...$commands) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->runningConsoleCommand(...$commands); + } + + /** + * Determine if the application is running unit tests. + * + * @return bool + * @static + */ + public static function runningUnitTests() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->runningUnitTests(); + } + + /** + * Determine if the application is running with debug mode enabled. + * + * @return bool + * @static + */ + public static function hasDebugModeEnabled() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->hasDebugModeEnabled(); + } + + /** + * Register a new registered listener. + * + * @param callable $callback + * @return void + * @static + */ + public static function registered($callback) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->registered($callback); + } + + /** + * Register all of the configured providers. + * + * @return void + * @static + */ + public static function registerConfiguredProviders() + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->registerConfiguredProviders(); + } + + /** + * Register a service provider with the application. + * + * @param \Illuminate\Support\ServiceProvider|string $provider + * @param bool $force + * @return \Illuminate\Support\ServiceProvider + * @static + */ + public static function register($provider, $force = false) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->register($provider, $force); + } + + /** + * Get the registered service provider instance if it exists. + * + * @param \Illuminate\Support\ServiceProvider|string $provider + * @return \Illuminate\Support\ServiceProvider|null + * @static + */ + public static function getProvider($provider) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getProvider($provider); + } + + /** + * Get the registered service provider instances if any exist. + * + * @param \Illuminate\Support\ServiceProvider|string $provider + * @return array + * @static + */ + public static function getProviders($provider) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getProviders($provider); + } + + /** + * Resolve a service provider instance from the class name. + * + * @param string $provider + * @return \Illuminate\Support\ServiceProvider + * @static + */ + public static function resolveProvider($provider) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->resolveProvider($provider); + } + + /** + * Load and boot all of the remaining deferred providers. + * + * @return void + * @static + */ + public static function loadDeferredProviders() + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->loadDeferredProviders(); + } + + /** + * Load the provider for a deferred service. + * + * @param string $service + * @return void + * @static + */ + public static function loadDeferredProvider($service) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->loadDeferredProvider($service); + } + + /** + * Register a deferred provider and service. + * + * @param string $provider + * @param string|null $service + * @return void + * @static + */ + public static function registerDeferredProvider($provider, $service = null) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->registerDeferredProvider($provider, $service); + } + + /** + * Resolve the given type from the container. + * + * @template TClass of object + * @param string|class-string $abstract + * @param array $parameters + * @return ($abstract is class-string ? TClass : mixed) + * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @static + */ + public static function make($abstract, $parameters = []) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->make($abstract, $parameters); + } + + /** + * Determine if the given abstract type has been bound. + * + * @param string $abstract + * @return bool + * @static + */ + public static function bound($abstract) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->bound($abstract); + } + + /** + * Determine if the application has booted. + * + * @return bool + * @static + */ + public static function isBooted() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->isBooted(); + } + + /** + * Boot the application's service providers. + * + * @return void + * @static + */ + public static function boot() + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->boot(); + } + + /** + * Register a new boot listener. + * + * @param callable $callback + * @return void + * @static + */ + public static function booting($callback) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->booting($callback); + } + + /** + * Register a new "booted" listener. + * + * @param callable $callback + * @return void + * @static + */ + public static function booted($callback) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->booted($callback); + } + + /** + * {@inheritdoc} + * + * @return \Symfony\Component\HttpFoundation\Response + * @static + */ + public static function handle($request, $type = 1, $catch = true) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->handle($request, $type, $catch); + } + + /** + * Handle the incoming HTTP request and send the response to the browser. + * + * @param \Illuminate\Http\Request $request + * @return void + * @static + */ + public static function handleRequest($request) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->handleRequest($request); + } + + /** + * Handle the incoming Artisan command. + * + * @param \Symfony\Component\Console\Input\InputInterface $input + * @return int + * @static + */ + public static function handleCommand($input) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->handleCommand($input); + } + + /** + * Determine if the framework's base configuration should be merged. + * + * @return bool + * @static + */ + public static function shouldMergeFrameworkConfiguration() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->shouldMergeFrameworkConfiguration(); + } + + /** + * Indicate that the framework's base configuration should not be merged. + * + * @return \Illuminate\Foundation\Application + * @static + */ + public static function dontMergeFrameworkConfiguration() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->dontMergeFrameworkConfiguration(); + } + + /** + * Determine if middleware has been disabled for the application. + * + * @return bool + * @static + */ + public static function shouldSkipMiddleware() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->shouldSkipMiddleware(); + } + + /** + * Get the path to the cached services.php file. + * + * @return string + * @static + */ + public static function getCachedServicesPath() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getCachedServicesPath(); + } + + /** + * Get the path to the cached packages.php file. + * + * @return string + * @static + */ + public static function getCachedPackagesPath() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getCachedPackagesPath(); + } + + /** + * Determine if the application configuration is cached. + * + * @return bool + * @static + */ + public static function configurationIsCached() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->configurationIsCached(); + } + + /** + * Get the path to the configuration cache file. + * + * @return string + * @static + */ + public static function getCachedConfigPath() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getCachedConfigPath(); + } + + /** + * Determine if the application routes are cached. + * + * @return bool + * @static + */ + public static function routesAreCached() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->routesAreCached(); + } + + /** + * Get the path to the routes cache file. + * + * @return string + * @static + */ + public static function getCachedRoutesPath() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getCachedRoutesPath(); + } + + /** + * Determine if the application events are cached. + * + * @return bool + * @static + */ + public static function eventsAreCached() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->eventsAreCached(); + } + + /** + * Get the path to the events cache file. + * + * @return string + * @static + */ + public static function getCachedEventsPath() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getCachedEventsPath(); + } + + /** + * Add new prefix to list of absolute path prefixes. + * + * @param string $prefix + * @return \Illuminate\Foundation\Application + * @static + */ + public static function addAbsoluteCachePathPrefix($prefix) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->addAbsoluteCachePathPrefix($prefix); + } + + /** + * Get an instance of the maintenance mode manager implementation. + * + * @return \Illuminate\Contracts\Foundation\MaintenanceMode + * @static + */ + public static function maintenanceMode() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->maintenanceMode(); + } + + /** + * Determine if the application is currently down for maintenance. + * + * @return bool + * @static + */ + public static function isDownForMaintenance() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->isDownForMaintenance(); + } + + /** + * Throw an HttpException with the given data. + * + * @param int $code + * @param string $message + * @param array $headers + * @return never + * @throws \Symfony\Component\HttpKernel\Exception\HttpException + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + * @static + */ + public static function abort($code, $message = '', $headers = []) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->abort($code, $message, $headers); + } + + /** + * Register a terminating callback with the application. + * + * @param callable|string $callback + * @return \Illuminate\Foundation\Application + * @static + */ + public static function terminating($callback) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->terminating($callback); + } + + /** + * Terminate the application. + * + * @return void + * @static + */ + public static function terminate() + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->terminate(); + } + + /** + * Get the service providers that have been loaded. + * + * @return array + * @static + */ + public static function getLoadedProviders() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getLoadedProviders(); + } + + /** + * Determine if the given service provider is loaded. + * + * @param string $provider + * @return bool + * @static + */ + public static function providerIsLoaded($provider) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->providerIsLoaded($provider); + } + + /** + * Get the application's deferred services. + * + * @return array + * @static + */ + public static function getDeferredServices() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getDeferredServices(); + } + + /** + * Set the application's deferred services. + * + * @param array $services + * @return void + * @static + */ + public static function setDeferredServices($services) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->setDeferredServices($services); + } + + /** + * Determine if the given service is a deferred service. + * + * @param string $service + * @return bool + * @static + */ + public static function isDeferredService($service) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->isDeferredService($service); + } + + /** + * Add an array of services to the application's deferred services. + * + * @param array $services + * @return void + * @static + */ + public static function addDeferredServices($services) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->addDeferredServices($services); + } + + /** + * Remove an array of services from the application's deferred services. + * + * @param array $services + * @return void + * @static + */ + public static function removeDeferredServices($services) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->removeDeferredServices($services); + } + + /** + * Configure the real-time facade namespace. + * + * @param string $namespace + * @return void + * @static + */ + public static function provideFacades($namespace) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->provideFacades($namespace); + } + + /** + * Get the current application locale. + * + * @return string + * @static + */ + public static function getLocale() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getLocale(); + } + + /** + * Get the current application locale. + * + * @return string + * @static + */ + public static function currentLocale() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->currentLocale(); + } + + /** + * Get the current application fallback locale. + * + * @return string + * @static + */ + public static function getFallbackLocale() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getFallbackLocale(); + } + + /** + * Set the current application locale. + * + * @param string $locale + * @return void + * @static + */ + public static function setLocale($locale) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->setLocale($locale); + } + + /** + * Set the current application fallback locale. + * + * @param string $fallbackLocale + * @return void + * @static + */ + public static function setFallbackLocale($fallbackLocale) + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->setFallbackLocale($fallbackLocale); + } + + /** + * Determine if the application locale is the given locale. + * + * @param string $locale + * @return bool + * @static + */ + public static function isLocale($locale) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->isLocale($locale); + } + + /** + * Register the core class aliases in the container. + * + * @return void + * @static + */ + public static function registerCoreContainerAliases() + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->registerCoreContainerAliases(); + } + + /** + * Flush the container of all bindings and resolved instances. + * + * @return void + * @static + */ + public static function flush() + { + /** @var \Illuminate\Foundation\Application $instance */ + $instance->flush(); + } + + /** + * Get the application namespace. + * + * @return string + * @throws \RuntimeException + * @static + */ + public static function getNamespace() + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getNamespace(); + } + + /** + * 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\Foundation\Application::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\Foundation\Application::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Foundation\Application::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Foundation\Application::flushMacros(); + } + + /** + * Define a contextual binding. + * + * @param array|string $concrete + * @return \Illuminate\Contracts\Container\ContextualBindingBuilder + * @static + */ + public static function when($concrete) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->when($concrete); + } + + /** + * Define a contextual binding based on an attribute. + * + * @return void + * @static + */ + public static function whenHasAttribute($attribute, $handler) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->whenHasAttribute($attribute, $handler); + } + + /** + * Returns true if the container can return an entry for the given identifier. + * + * Returns false otherwise. + * + * `has($id)` returning true does not mean that `get($id)` will not throw an exception. + * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`. + * + * @param string $id Identifier of the entry to look for. + * @return bool + * @static + */ + public static function has($id) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->has($id); + } + + /** + * Determine if the given abstract type has been resolved. + * + * @param string $abstract + * @return bool + * @static + */ + public static function resolved($abstract) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->resolved($abstract); + } + + /** + * Determine if a given type is shared. + * + * @param string $abstract + * @return bool + * @static + */ + public static function isShared($abstract) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->isShared($abstract); + } + + /** + * Determine if a given string is an alias. + * + * @param string $name + * @return bool + * @static + */ + public static function isAlias($name) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->isAlias($name); + } + + /** + * Register a binding with the container. + * + * @param \Closure|string $abstract + * @param \Closure|string|null $concrete + * @param bool $shared + * @return void + * @throws \TypeError + * @throws ReflectionException + * @static + */ + public static function bind($abstract, $concrete = null, $shared = false) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->bind($abstract, $concrete, $shared); + } + + /** + * Determine if the container has a method binding. + * + * @param string $method + * @return bool + * @static + */ + public static function hasMethodBinding($method) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->hasMethodBinding($method); + } + + /** + * Bind a callback to resolve with Container::call. + * + * @param array|string $method + * @param \Closure $callback + * @return void + * @static + */ + public static function bindMethod($method, $callback) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->bindMethod($method, $callback); + } + + /** + * Get the method binding for the given method. + * + * @param string $method + * @param mixed $instance + * @return mixed + * @static + */ + public static function callMethodBinding($method, $instance) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->callMethodBinding($method, $instance); + } + + /** + * Add a contextual binding to the container. + * + * @param string $concrete + * @param \Closure|string $abstract + * @param \Closure|string $implementation + * @return void + * @static + */ + public static function addContextualBinding($concrete, $abstract, $implementation) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->addContextualBinding($concrete, $abstract, $implementation); + } + + /** + * Register a binding if it hasn't already been registered. + * + * @param \Closure|string $abstract + * @param \Closure|string|null $concrete + * @param bool $shared + * @return void + * @static + */ + public static function bindIf($abstract, $concrete = null, $shared = false) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->bindIf($abstract, $concrete, $shared); + } + + /** + * Register a shared binding in the container. + * + * @param \Closure|string $abstract + * @param \Closure|string|null $concrete + * @return void + * @static + */ + public static function singleton($abstract, $concrete = null) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->singleton($abstract, $concrete); + } + + /** + * Register a shared binding if it hasn't already been registered. + * + * @param \Closure|string $abstract + * @param \Closure|string|null $concrete + * @return void + * @static + */ + public static function singletonIf($abstract, $concrete = null) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->singletonIf($abstract, $concrete); + } + + /** + * Register a scoped binding in the container. + * + * @param \Closure|string $abstract + * @param \Closure|string|null $concrete + * @return void + * @static + */ + public static function scoped($abstract, $concrete = null) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->scoped($abstract, $concrete); + } + + /** + * Register a scoped binding if it hasn't already been registered. + * + * @param \Closure|string $abstract + * @param \Closure|string|null $concrete + * @return void + * @static + */ + public static function scopedIf($abstract, $concrete = null) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->scopedIf($abstract, $concrete); + } + + /** + * "Extend" an abstract type in the container. + * + * @param string $abstract + * @return void + * @throws \InvalidArgumentException + * @static + */ + public static function extend($abstract, $closure) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->extend($abstract, $closure); + } + + /** + * Register an existing instance as shared in the container. + * + * @template TInstance of mixed + * @param string $abstract + * @param TInstance $instance + * @return TInstance + * @static + */ + public static function instance($abstract, $instance) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->instance($abstract, $instance); + } + + /** + * Assign a set of tags to a given binding. + * + * @param array|string $abstracts + * @param mixed $tags + * @return void + * @static + */ + public static function tag($abstracts, $tags) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->tag($abstracts, $tags); + } + + /** + * Resolve all of the bindings for a given tag. + * + * @param string $tag + * @return iterable + * @static + */ + public static function tagged($tag) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->tagged($tag); + } + + /** + * Alias a type to a different name. + * + * @param string $abstract + * @param string $alias + * @return void + * @throws \LogicException + * @static + */ + public static function alias($abstract, $alias) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->alias($abstract, $alias); + } + + /** + * Bind a new callback to an abstract's rebind event. + * + * @param string $abstract + * @return mixed + * @static + */ + public static function rebinding($abstract, $callback) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->rebinding($abstract, $callback); + } + + /** + * Refresh an instance on the given target and method. + * + * @param string $abstract + * @param mixed $target + * @param string $method + * @return mixed + * @static + */ + public static function refresh($abstract, $target, $method) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->refresh($abstract, $target, $method); + } + + /** + * Wrap the given closure such that its dependencies will be injected when executed. + * + * @return \Closure + * @static + */ + public static function wrap($callback, $parameters = []) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->wrap($callback, $parameters); + } + + /** + * Call the given Closure / class@method and inject its dependencies. + * + * @param callable|string $callback + * @param array $parameters + * @param string|null $defaultMethod + * @return mixed + * @throws \InvalidArgumentException + * @static + */ + public static function call($callback, $parameters = [], $defaultMethod = null) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->call($callback, $parameters, $defaultMethod); + } + + /** + * Get a closure to resolve the given type from the container. + * + * @template TClass of object + * @param string|class-string $abstract + * @return ($abstract is class-string ? \Closure(): TClass : \Closure(): mixed) + * @static + */ + public static function factory($abstract) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->factory($abstract); + } + + /** + * An alias function name for make(). + * + * @template TClass of object + * @param string|class-string|callable $abstract + * @return ($abstract is class-string ? TClass : mixed) + * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @static + */ + public static function makeWith($abstract, $parameters = []) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->makeWith($abstract, $parameters); + } + + /** + * {@inheritdoc} + * + * @template TClass of object + * @param string|class-string $id + * @return ($id is class-string ? TClass : mixed) + * @static + */ + public static function get($id) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->get($id); + } + + /** + * Instantiate a concrete instance of the given type. + * + * @template TClass of object + * @param \Closure(static, array): TClass|class-string $concrete + * @return TClass + * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @throws \Illuminate\Contracts\Container\CircularDependencyException + * @static + */ + public static function build($concrete) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->build($concrete); + } + + /** + * Resolve a dependency based on an attribute. + * + * @return mixed + * @static + */ + public static function resolveFromAttribute($attribute) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->resolveFromAttribute($attribute); + } + + /** + * Register a new before resolving callback for all types. + * + * @param \Closure|string $abstract + * @return void + * @static + */ + public static function beforeResolving($abstract, $callback = null) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->beforeResolving($abstract, $callback); + } + + /** + * Register a new resolving callback. + * + * @param \Closure|string $abstract + * @return void + * @static + */ + public static function resolving($abstract, $callback = null) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->resolving($abstract, $callback); + } + + /** + * Register a new after resolving callback for all types. + * + * @param \Closure|string $abstract + * @return void + * @static + */ + public static function afterResolving($abstract, $callback = null) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->afterResolving($abstract, $callback); + } + + /** + * Register a new after resolving attribute callback for all types. + * + * @return void + * @static + */ + public static function afterResolvingAttribute($attribute, $callback) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->afterResolvingAttribute($attribute, $callback); + } + + /** + * Fire all of the after resolving attribute callbacks. + * + * @param \ReflectionAttribute[] $attributes + * @param mixed $object + * @return void + * @static + */ + public static function fireAfterResolvingAttributeCallbacks($attributes, $object) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->fireAfterResolvingAttributeCallbacks($attributes, $object); + } + + /** + * Get the name of the binding the container is currently resolving. + * + * @return class-string|string|null + * @static + */ + public static function currentlyResolving() + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->currentlyResolving(); + } + + /** + * Get the container's bindings. + * + * @return array + * @static + */ + public static function getBindings() + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getBindings(); + } + + /** + * Get the alias for an abstract if available. + * + * @param string $abstract + * @return string + * @static + */ + public static function getAlias($abstract) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->getAlias($abstract); + } + + /** + * Remove all of the extender callbacks for a given type. + * + * @param string $abstract + * @return void + * @static + */ + public static function forgetExtenders($abstract) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->forgetExtenders($abstract); + } + + /** + * Remove a resolved instance from the instance cache. + * + * @param string $abstract + * @return void + * @static + */ + public static function forgetInstance($abstract) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->forgetInstance($abstract); + } + + /** + * Clear all of the instances from the container. + * + * @return void + * @static + */ + public static function forgetInstances() + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->forgetInstances(); + } + + /** + * Clear all of the scoped instances from the container. + * + * @return void + * @static + */ + public static function forgetScopedInstances() + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->forgetScopedInstances(); + } + + /** + * Set the callback which determines the current container environment. + * + * @param (callable(array|string): bool|string)|null $callback + * @return void + * @static + */ + public static function resolveEnvironmentUsing($callback) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + $instance->resolveEnvironmentUsing($callback); + } + + /** + * Determine the environment for the container. + * + * @param array|string $environments + * @return bool + * @static + */ + public static function currentEnvironmentIs($environments) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->currentEnvironmentIs($environments); + } + + /** + * Get the globally available instance of the container. + * + * @return static + * @static + */ + public static function getInstance() + { + //Method inherited from \Illuminate\Container\Container + return \Illuminate\Foundation\Application::getInstance(); + } + + /** + * Set the shared instance of the container. + * + * @return \Illuminate\Contracts\Container\Container|static + * @static + */ + public static function setInstance($container = null) + { + //Method inherited from \Illuminate\Container\Container + return \Illuminate\Foundation\Application::setInstance($container); + } + + /** + * Determine if a given offset exists. + * + * @param string $key + * @static + */ + public static function offsetExists($key) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->offsetExists($key); + } + + /** + * Get the value at a given offset. + * + * @param string $key + * @static + */ + public static function offsetGet($key) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->offsetGet($key); + } + + /** + * Set the value at a given offset. + * + * @param string $key + * @param mixed $value + * @static + */ + public static function offsetSet($key, $value) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->offsetSet($key, $value); + } + + /** + * Unset the value at a given offset. + * + * @param string $key + * @static + */ + public static function offsetUnset($key) + { + //Method inherited from \Illuminate\Container\Container + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->offsetUnset($key); + } + + } + /** + * @see \Illuminate\Foundation\Console\Kernel + */ + class Artisan { + /** + * Re-route the Symfony command events to their Laravel counterparts. + * + * @internal + * @return \Illuminate\Foundation\Console\Kernel + * @static + */ + public static function rerouteSymfonyCommandEvents() + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->rerouteSymfonyCommandEvents(); + } + + /** + * Run the console application. + * + * @param \Symfony\Component\Console\Input\InputInterface $input + * @param \Symfony\Component\Console\Output\OutputInterface|null $output + * @return int + * @static + */ + public static function handle($input, $output = null) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->handle($input, $output); + } + + /** + * Terminate the application. + * + * @param \Symfony\Component\Console\Input\InputInterface $input + * @param int $status + * @return void + * @static + */ + public static function terminate($input, $status) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + $instance->terminate($input, $status); + } + + /** + * Register a callback to be invoked when the command lifecycle duration exceeds a given amount of time. + * + * @param \DateTimeInterface|\Carbon\CarbonInterval|float|int $threshold + * @param callable $handler + * @return void + * @static + */ + public static function whenCommandLifecycleIsLongerThan($threshold, $handler) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + $instance->whenCommandLifecycleIsLongerThan($threshold, $handler); + } + + /** + * When the command being handled started. + * + * @return \Illuminate\Support\Carbon|null + * @static + */ + public static function commandStartedAt() + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->commandStartedAt(); + } + + /** + * Resolve a console schedule instance. + * + * @return \Illuminate\Console\Scheduling\Schedule + * @static + */ + public static function resolveConsoleSchedule() + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->resolveConsoleSchedule(); + } + + /** + * Register a Closure based command with the application. + * + * @param string $signature + * @param \Closure $callback + * @return \Illuminate\Foundation\Console\ClosureCommand + * @static + */ + public static function command($signature, $callback) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->command($signature, $callback); + } + + /** + * Register the given command with the console application. + * + * @param \Symfony\Component\Console\Command\Command $command + * @return void + * @static + */ + public static function registerCommand($command) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + $instance->registerCommand($command); + } + + /** + * Run an Artisan console command by name. + * + * @param \Symfony\Component\Console\Command\Command|string $command + * @param array $parameters + * @param \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer + * @return int + * @throws \Symfony\Component\Console\Exception\CommandNotFoundException + * @static + */ + public static function call($command, $parameters = [], $outputBuffer = null) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->call($command, $parameters, $outputBuffer); + } + + /** + * Queue the given console command. + * + * @param string $command + * @param array $parameters + * @return \Illuminate\Foundation\Bus\PendingDispatch + * @static + */ + public static function queue($command, $parameters = []) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->queue($command, $parameters); + } + + /** + * Get all of the commands registered with the console. + * + * @return array + * @static + */ + public static function all() + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->all(); + } + + /** + * Get the output for the last run command. + * + * @return string + * @static + */ + public static function output() + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->output(); + } + + /** + * Bootstrap the application for artisan commands. + * + * @return void + * @static + */ + public static function bootstrap() + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + $instance->bootstrap(); + } + + /** + * Bootstrap the application without booting service providers. + * + * @return void + * @static + */ + public static function bootstrapWithoutBootingProviders() + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + $instance->bootstrapWithoutBootingProviders(); + } + + /** + * Set the Artisan application instance. + * + * @param \Illuminate\Console\Application|null $artisan + * @return void + * @static + */ + public static function setArtisan($artisan) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + $instance->setArtisan($artisan); + } + + /** + * Set the Artisan commands provided by the application. + * + * @param array $commands + * @return \Illuminate\Foundation\Console\Kernel + * @static + */ + public static function addCommands($commands) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->addCommands($commands); + } + + /** + * Set the paths that should have their Artisan commands automatically discovered. + * + * @param array $paths + * @return \Illuminate\Foundation\Console\Kernel + * @static + */ + public static function addCommandPaths($paths) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->addCommandPaths($paths); + } + + /** + * Set the paths that should have their Artisan "routes" automatically discovered. + * + * @param array $paths + * @return \Illuminate\Foundation\Console\Kernel + * @static + */ + public static function addCommandRoutePaths($paths) + { + /** @var \Illuminate\Foundation\Console\Kernel $instance */ + return $instance->addCommandRoutePaths($paths); + } + + } + /** + * @see \Illuminate\Auth\AuthManager + * @see \Illuminate\Auth\SessionGuard + */ + class Auth { + /** + * Attempt to get the guard from the local cache. + * + * @param string|null $name + * @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard + * @static + */ + public static function guard($name = null) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->guard($name); + } + + /** + * Create a session based authentication guard. + * + * @param string $name + * @param array $config + * @return \Illuminate\Auth\SessionGuard + * @static + */ + public static function createSessionDriver($name, $config) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->createSessionDriver($name, $config); + } + + /** + * Create a token based authentication guard. + * + * @param string $name + * @param array $config + * @return \Illuminate\Auth\TokenGuard + * @static + */ + public static function createTokenDriver($name, $config) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->createTokenDriver($name, $config); + } + + /** + * Get the default authentication driver name. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Set the default guard driver the factory should serve. + * + * @param string $name + * @return void + * @static + */ + public static function shouldUse($name) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + $instance->shouldUse($name); + } + + /** + * Set the default authentication driver name. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultDriver($name) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + $instance->setDefaultDriver($name); + } + + /** + * Register a new callback based request guard. + * + * @param string $driver + * @param callable $callback + * @return \Illuminate\Auth\AuthManager + * @static + */ + public static function viaRequest($driver, $callback) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->viaRequest($driver, $callback); + } + + /** + * Get the user resolver callback. + * + * @return \Closure + * @static + */ + public static function userResolver() + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->userResolver(); + } + + /** + * Set the callback to be used to resolve users. + * + * @param \Closure $userResolver + * @return \Illuminate\Auth\AuthManager + * @static + */ + public static function resolveUsersUsing($userResolver) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->resolveUsersUsing($userResolver); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return \Illuminate\Auth\AuthManager + * @static + */ + public static function extend($driver, $callback) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->extend($driver, $callback); + } + + /** + * Register a custom provider creator Closure. + * + * @param string $name + * @param \Closure $callback + * @return \Illuminate\Auth\AuthManager + * @static + */ + public static function provider($name, $callback) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->provider($name, $callback); + } + + /** + * Determines if any guards have already been resolved. + * + * @return bool + * @static + */ + public static function hasResolvedGuards() + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->hasResolvedGuards(); + } + + /** + * Forget all of the resolved guard instances. + * + * @return \Illuminate\Auth\AuthManager + * @static + */ + public static function forgetGuards() + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->forgetGuards(); + } + + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Auth\AuthManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->setApplication($app); + } + + /** + * Create the user provider implementation for the driver. + * + * @param string|null $provider + * @return \Illuminate\Contracts\Auth\UserProvider|null + * @throws \InvalidArgumentException + * @static + */ + public static function createUserProvider($provider = null) + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->createUserProvider($provider); + } + + /** + * Get the default user provider name. + * + * @return string + * @static + */ + public static function getDefaultUserProvider() + { + /** @var \Illuminate\Auth\AuthManager $instance */ + return $instance->getDefaultUserProvider(); + } + + /** + * Get the currently authenticated user. + * + * @return \App\Models\User|null + * @static + */ + public static function user() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->user(); + } + + /** + * Get the ID for the currently authenticated user. + * + * @return int|string|null + * @static + */ + public static function id() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->id(); + } + + /** + * Log a user into the application without sessions or cookies. + * + * @param array $credentials + * @return bool + * @static + */ + public static function once($credentials = []) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->once($credentials); + } + + /** + * Log the given user ID into the application without sessions or cookies. + * + * @param mixed $id + * @return \App\Models\User|false + * @static + */ + public static function onceUsingId($id) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->onceUsingId($id); + } + + /** + * Validate a user's credentials. + * + * @param array $credentials + * @return bool + * @static + */ + public static function validate($credentials = []) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->validate($credentials); + } + + /** + * Attempt to authenticate using HTTP Basic Auth. + * + * @param string $field + * @param array $extraConditions + * @return \Symfony\Component\HttpFoundation\Response|null + * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException + * @static + */ + public static function basic($field = 'email', $extraConditions = []) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->basic($field, $extraConditions); + } + + /** + * Perform a stateless HTTP Basic login attempt. + * + * @param string $field + * @param array $extraConditions + * @return \Symfony\Component\HttpFoundation\Response|null + * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException + * @static + */ + public static function onceBasic($field = 'email', $extraConditions = []) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->onceBasic($field, $extraConditions); + } + + /** + * Attempt to authenticate a user using the given credentials. + * + * @param array $credentials + * @param bool $remember + * @return bool + * @static + */ + public static function attempt($credentials = [], $remember = false) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->attempt($credentials, $remember); + } + + /** + * Attempt to authenticate a user with credentials and additional callbacks. + * + * @param array $credentials + * @param array|callable|null $callbacks + * @param bool $remember + * @return bool + * @static + */ + public static function attemptWhen($credentials = [], $callbacks = null, $remember = false) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->attemptWhen($credentials, $callbacks, $remember); + } + + /** + * Log the given user ID into the application. + * + * @param mixed $id + * @param bool $remember + * @return \App\Models\User|false + * @static + */ + public static function loginUsingId($id, $remember = false) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->loginUsingId($id, $remember); + } + + /** + * Log a user into the application. + * + * @param \Illuminate\Contracts\Auth\Authenticatable $user + * @param bool $remember + * @return void + * @static + */ + public static function login($user, $remember = false) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + $instance->login($user, $remember); + } + + /** + * Create a HMAC of the password hash for storage in cookies. + * + * @param string $passwordHash + * @return string + * @static + */ + public static function hashPasswordForCookie($passwordHash) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->hashPasswordForCookie($passwordHash); + } + + /** + * Log the user out of the application. + * + * @return void + * @static + */ + public static function logout() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + $instance->logout(); + } + + /** + * Log the user out of the application on their current device only. + * + * This method does not cycle the "remember" token. + * + * @return void + * @static + */ + public static function logoutCurrentDevice() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + $instance->logoutCurrentDevice(); + } + + /** + * Invalidate other sessions for the current user. + * + * The application must be using the AuthenticateSession middleware. + * + * @param string $password + * @return \App\Models\User|null + * @throws \Illuminate\Auth\AuthenticationException + * @static + */ + public static function logoutOtherDevices($password) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->logoutOtherDevices($password); + } + + /** + * Register an authentication attempt event listener. + * + * @param mixed $callback + * @return void + * @static + */ + public static function attempting($callback) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + $instance->attempting($callback); + } + + /** + * Get the last user we attempted to authenticate. + * + * @return \App\Models\User + * @static + */ + public static function getLastAttempted() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getLastAttempted(); + } + + /** + * Get a unique identifier for the auth session value. + * + * @return string + * @static + */ + public static function getName() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getName(); + } + + /** + * Get the name of the cookie used to store the "recaller". + * + * @return string + * @static + */ + public static function getRecallerName() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getRecallerName(); + } + + /** + * Determine if the user was authenticated via "remember me" cookie. + * + * @return bool + * @static + */ + public static function viaRemember() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->viaRemember(); + } + + /** + * Set the number of minutes the remember me cookie should be valid for. + * + * @param int $minutes + * @return \Illuminate\Auth\SessionGuard + * @static + */ + public static function setRememberDuration($minutes) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->setRememberDuration($minutes); + } + + /** + * Get the cookie creator instance used by the guard. + * + * @return \Illuminate\Contracts\Cookie\QueueingFactory + * @throws \RuntimeException + * @static + */ + public static function getCookieJar() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getCookieJar(); + } + + /** + * Set the cookie creator instance used by the guard. + * + * @param \Illuminate\Contracts\Cookie\QueueingFactory $cookie + * @return void + * @static + */ + public static function setCookieJar($cookie) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + $instance->setCookieJar($cookie); + } + + /** + * Get the event dispatcher instance. + * + * @return \Illuminate\Contracts\Events\Dispatcher + * @static + */ + public static function getDispatcher() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getDispatcher(); + } + + /** + * Set the event dispatcher instance. + * + * @param \Illuminate\Contracts\Events\Dispatcher $events + * @return void + * @static + */ + public static function setDispatcher($events) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + $instance->setDispatcher($events); + } + + /** + * Get the session store used by the guard. + * + * @return \Illuminate\Contracts\Session\Session + * @static + */ + public static function getSession() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getSession(); + } + + /** + * Return the currently cached user. + * + * @return \App\Models\User|null + * @static + */ + public static function getUser() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getUser(); + } + + /** + * Set the current user. + * + * @param \Illuminate\Contracts\Auth\Authenticatable $user + * @return \Illuminate\Auth\SessionGuard + * @static + */ + public static function setUser($user) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->setUser($user); + } + + /** + * Get the current request instance. + * + * @return \Symfony\Component\HttpFoundation\Request + * @static + */ + public static function getRequest() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getRequest(); + } + + /** + * Set the current request instance. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * @return \Illuminate\Auth\SessionGuard + * @static + */ + public static function setRequest($request) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->setRequest($request); + } + + /** + * Get the timebox instance used by the guard. + * + * @return \Illuminate\Support\Timebox + * @static + */ + public static function getTimebox() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getTimebox(); + } + + /** + * Determine if the current user is authenticated. If not, throw an exception. + * + * @return \App\Models\User + * @throws \Illuminate\Auth\AuthenticationException + * @static + */ + public static function authenticate() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->authenticate(); + } + + /** + * Determine if the guard has a user instance. + * + * @return bool + * @static + */ + public static function hasUser() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->hasUser(); + } + + /** + * Determine if the current user is authenticated. + * + * @return bool + * @static + */ + public static function check() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->check(); + } + + /** + * Determine if the current user is a guest. + * + * @return bool + * @static + */ + public static function guest() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->guest(); + } + + /** + * Forget the current user. + * + * @return \Illuminate\Auth\SessionGuard + * @static + */ + public static function forgetUser() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->forgetUser(); + } + + /** + * Get the user provider used by the guard. + * + * @return \Illuminate\Contracts\Auth\UserProvider + * @static + */ + public static function getProvider() + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + return $instance->getProvider(); + } + + /** + * Set the user provider used by the guard. + * + * @param \Illuminate\Contracts\Auth\UserProvider $provider + * @return void + * @static + */ + public static function setProvider($provider) + { + /** @var \Illuminate\Auth\SessionGuard $instance */ + $instance->setProvider($provider); + } + + /** + * 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\Auth\SessionGuard::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\Auth\SessionGuard::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Auth\SessionGuard::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Auth\SessionGuard::flushMacros(); + } + + } + /** + * @see \Illuminate\View\Compilers\BladeCompiler + */ + class Blade { + /** + * Compile the view at the given path. + * + * @param string|null $path + * @return void + * @static + */ + public static function compile($path = null) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->compile($path); + } + + /** + * Get the path currently being compiled. + * + * @return string + * @static + */ + public static function getPath() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getPath(); + } + + /** + * Set the path currently being compiled. + * + * @param string $path + * @return void + * @static + */ + public static function setPath($path) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->setPath($path); + } + + /** + * Compile the given Blade template contents. + * + * @param string $value + * @return string + * @static + */ + public static function compileString($value) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->compileString($value); + } + + /** + * Evaluate and render a Blade string to HTML. + * + * @param string $string + * @param array $data + * @param bool $deleteCachedView + * @return string + * @static + */ + public static function render($string, $data = [], $deleteCachedView = false) + { + return \Illuminate\View\Compilers\BladeCompiler::render($string, $data, $deleteCachedView); + } + + /** + * Render a component instance to HTML. + * + * @param \Illuminate\View\Component $component + * @return string + * @static + */ + public static function renderComponent($component) + { + return \Illuminate\View\Compilers\BladeCompiler::renderComponent($component); + } + + /** + * Strip the parentheses from the given expression. + * + * @param string $expression + * @return string + * @static + */ + public static function stripParentheses($expression) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->stripParentheses($expression); + } + + /** + * Register a custom Blade compiler. + * + * @param callable $compiler + * @return void + * @static + */ + public static function extend($compiler) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->extend($compiler); + } + + /** + * Get the extensions used by the compiler. + * + * @return array + * @static + */ + public static function getExtensions() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getExtensions(); + } + + /** + * Register an "if" statement directive. + * + * @param string $name + * @param callable $callback + * @return void + * @static + */ + public static function if($name, $callback) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->if($name, $callback); + } + + /** + * Check the result of a condition. + * + * @param string $name + * @param mixed $parameters + * @return bool + * @static + */ + public static function check($name, ...$parameters) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->check($name, ...$parameters); + } + + /** + * Register a class-based component alias directive. + * + * @param string $class + * @param string|null $alias + * @param string $prefix + * @return void + * @static + */ + public static function component($class, $alias = null, $prefix = '') + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->component($class, $alias, $prefix); + } + + /** + * Register an array of class-based components. + * + * @param array $components + * @param string $prefix + * @return void + * @static + */ + public static function components($components, $prefix = '') + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->components($components, $prefix); + } + + /** + * Get the registered class component aliases. + * + * @return array + * @static + */ + public static function getClassComponentAliases() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getClassComponentAliases(); + } + + /** + * Register a new anonymous component path. + * + * @param string $path + * @param string|null $prefix + * @return void + * @static + */ + public static function anonymousComponentPath($path, $prefix = null) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->anonymousComponentPath($path, $prefix); + } + + /** + * Register an anonymous component namespace. + * + * @param string $directory + * @param string|null $prefix + * @return void + * @static + */ + public static function anonymousComponentNamespace($directory, $prefix = null) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->anonymousComponentNamespace($directory, $prefix); + } + + /** + * Register a class-based component namespace. + * + * @param string $namespace + * @param string $prefix + * @return void + * @static + */ + public static function componentNamespace($namespace, $prefix) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->componentNamespace($namespace, $prefix); + } + + /** + * Get the registered anonymous component paths. + * + * @return array + * @static + */ + public static function getAnonymousComponentPaths() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getAnonymousComponentPaths(); + } + + /** + * Get the registered anonymous component namespaces. + * + * @return array + * @static + */ + public static function getAnonymousComponentNamespaces() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getAnonymousComponentNamespaces(); + } + + /** + * Get the registered class component namespaces. + * + * @return array + * @static + */ + public static function getClassComponentNamespaces() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getClassComponentNamespaces(); + } + + /** + * Register a component alias directive. + * + * @param string $path + * @param string|null $alias + * @return void + * @static + */ + public static function aliasComponent($path, $alias = null) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->aliasComponent($path, $alias); + } + + /** + * Register an include alias directive. + * + * @param string $path + * @param string|null $alias + * @return void + * @static + */ + public static function include($path, $alias = null) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->include($path, $alias); + } + + /** + * Register an include alias directive. + * + * @param string $path + * @param string|null $alias + * @return void + * @static + */ + public static function aliasInclude($path, $alias = null) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->aliasInclude($path, $alias); + } + + /** + * Register a handler for custom directives, binding the handler to the compiler. + * + * @param string $name + * @param callable $handler + * @return void + * @throws \InvalidArgumentException + * @static + */ + public static function bindDirective($name, $handler) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->bindDirective($name, $handler); + } + + /** + * Register a handler for custom directives. + * + * @param string $name + * @param ($bind is true ? \Closure : callable) $handler + * @param bool $bind + * @return void + * @throws \InvalidArgumentException + * @static + */ + public static function directive($name, $handler, $bind = false) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->directive($name, $handler, $bind); + } + + /** + * Get the list of custom directives. + * + * @return array + * @static + */ + public static function getCustomDirectives() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getCustomDirectives(); + } + + /** + * Indicate that the following callable should be used to prepare strings for compilation. + * + * @param callable $callback + * @return \Illuminate\View\Compilers\BladeCompiler + * @static + */ + public static function prepareStringsForCompilationUsing($callback) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->prepareStringsForCompilationUsing($callback); + } + + /** + * Register a new precompiler. + * + * @param callable $precompiler + * @return void + * @static + */ + public static function precompiler($precompiler) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->precompiler($precompiler); + } + + /** + * Execute the given callback using a custom echo format. + * + * @param string $format + * @param callable $callback + * @return string + * @static + */ + public static function usingEchoFormat($format, $callback) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->usingEchoFormat($format, $callback); + } + + /** + * Set the echo format to be used by the compiler. + * + * @param string $format + * @return void + * @static + */ + public static function setEchoFormat($format) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->setEchoFormat($format); + } + + /** + * Set the "echo" format to double encode entities. + * + * @return void + * @static + */ + public static function withDoubleEncoding() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->withDoubleEncoding(); + } + + /** + * Set the "echo" format to not double encode entities. + * + * @return void + * @static + */ + public static function withoutDoubleEncoding() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->withoutDoubleEncoding(); + } + + /** + * Indicate that component tags should not be compiled. + * + * @return void + * @static + */ + public static function withoutComponentTags() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->withoutComponentTags(); + } + + /** + * Get a new component hash for a component name. + * + * @param string $component + * @return string + * @static + */ + public static function newComponentHash($component) + { + return \Illuminate\View\Compilers\BladeCompiler::newComponentHash($component); + } + + /** + * Compile a class component opening. + * + * @param string $component + * @param string $alias + * @param string $data + * @param string $hash + * @return string + * @static + */ + public static function compileClassComponentOpening($component, $alias, $data, $hash) + { + return \Illuminate\View\Compilers\BladeCompiler::compileClassComponentOpening($component, $alias, $data, $hash); + } + + /** + * Compile the end-component statements into valid PHP. + * + * @return string + * @static + */ + public static function compileEndComponentClass() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->compileEndComponentClass(); + } + + /** + * Sanitize the given component attribute value. + * + * @param mixed $value + * @return mixed + * @static + */ + public static function sanitizeComponentAttribute($value) + { + return \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value); + } + + /** + * Compile an end-once block into valid PHP. + * + * @return string + * @static + */ + public static function compileEndOnce() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->compileEndOnce(); + } + + /** + * Add a handler to be executed before echoing a given class. + * + * @param string|callable $class + * @param callable|null $handler + * @return void + * @static + */ + public static function stringable($class, $handler = null) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->stringable($class, $handler); + } + + /** + * Compile Blade echos into valid PHP. + * + * @param string $value + * @return string + * @static + */ + public static function compileEchos($value) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->compileEchos($value); + } + + /** + * Apply the echo handler for the value if it exists. + * + * @param string $value + * @return string + * @static + */ + public static function applyEchoHandler($value) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->applyEchoHandler($value); + } + + /** + * Get the path to the compiled version of a view. + * + * @param string $path + * @return string + * @static + */ + public static function getCompiledPath($path) + { + //Method inherited from \Illuminate\View\Compilers\Compiler + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getCompiledPath($path); + } + + /** + * Determine if the view at the given path is expired. + * + * @param string $path + * @return bool + * @throws \ErrorException + * @static + */ + public static function isExpired($path) + { + //Method inherited from \Illuminate\View\Compilers\Compiler + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->isExpired($path); + } + + } + /** + * @method static mixed auth(\Illuminate\Http\Request $request) + * @method static mixed validAuthenticationResponse(\Illuminate\Http\Request $request, mixed $result) + * @method static void broadcast(array $channels, string $event, array $payload = []) + * @method static array|null resolveAuthenticatedUser(\Illuminate\Http\Request $request) + * @method static void resolveAuthenticatedUserUsing(\Closure $callback) + * @method static \Illuminate\Broadcasting\Broadcasters\Broadcaster channel(\Illuminate\Contracts\Broadcasting\HasBroadcastChannel|string $channel, callable|string $callback, array $options = []) + * @method static \Illuminate\Support\Collection getChannels() + * @see \Illuminate\Broadcasting\BroadcastManager + * @see \Illuminate\Broadcasting\Broadcasters\Broadcaster + */ + class Broadcast { + /** + * Register the routes for handling broadcast channel authentication and sockets. + * + * @param array|null $attributes + * @return void + * @static + */ + public static function routes($attributes = null) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + $instance->routes($attributes); + } + + /** + * Register the routes for handling broadcast user authentication. + * + * @param array|null $attributes + * @return void + * @static + */ + public static function userRoutes($attributes = null) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + $instance->userRoutes($attributes); + } + + /** + * Register the routes for handling broadcast authentication and sockets. + * + * Alias of "routes" method. + * + * @param array|null $attributes + * @return void + * @static + */ + public static function channelRoutes($attributes = null) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + $instance->channelRoutes($attributes); + } + + /** + * Get the socket ID for the given request. + * + * @param \Illuminate\Http\Request|null $request + * @return string|null + * @static + */ + public static function socket($request = null) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->socket($request); + } + + /** + * Begin sending an anonymous broadcast to the given channels. + * + * @static + */ + public static function on($channels) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->on($channels); + } + + /** + * Begin sending an anonymous broadcast to the given private channels. + * + * @static + */ + public static function private($channel) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->private($channel); + } + + /** + * Begin sending an anonymous broadcast to the given presence channels. + * + * @static + */ + public static function presence($channel) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->presence($channel); + } + + /** + * Begin broadcasting an event. + * + * @param mixed $event + * @return \Illuminate\Broadcasting\PendingBroadcast + * @static + */ + public static function event($event = null) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->event($event); + } + + /** + * Queue the given event for broadcast. + * + * @param mixed $event + * @return void + * @static + */ + public static function queue($event) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + $instance->queue($event); + } + + /** + * Get a driver instance. + * + * @param string|null $driver + * @return mixed + * @static + */ + public static function connection($driver = null) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->connection($driver); + } + + /** + * Get a driver instance. + * + * @param string|null $name + * @return mixed + * @static + */ + public static function driver($name = null) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->driver($name); + } + + /** + * Get a Pusher instance for the given configuration. + * + * @param array $config + * @return \Pusher\Pusher + * @static + */ + public static function pusher($config) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->pusher($config); + } + + /** + * Get an Ably instance for the given configuration. + * + * @param array $config + * @return \Ably\AblyRest + * @static + */ + public static function ably($config) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->ably($config); + } + + /** + * Get the default driver name. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Set the default driver name. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultDriver($name) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + $instance->setDefaultDriver($name); + } + + /** + * Disconnect the given driver / connection and remove it from local cache. + * + * @param string|null $name + * @return void + * @static + */ + public static function purge($name = null) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + $instance->purge($name); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return \Illuminate\Broadcasting\BroadcastManager + * @static + */ + public static function extend($driver, $callback) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->extend($driver, $callback); + } + + /** + * Get the application instance used by the manager. + * + * @return \Illuminate\Contracts\Foundation\Application + * @static + */ + public static function getApplication() + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->getApplication(); + } + + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Broadcasting\BroadcastManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->setApplication($app); + } + + /** + * Forget all of the resolved driver instances. + * + * @return \Illuminate\Broadcasting\BroadcastManager + * @static + */ + public static function forgetDrivers() + { + /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ + return $instance->forgetDrivers(); + } + + } + /** + * @see \Illuminate\Bus\Dispatcher + * @see \Illuminate\Support\Testing\Fakes\BusFake + */ + class Bus { + /** + * Dispatch a command to its appropriate handler. + * + * @param mixed $command + * @return mixed + * @static + */ + public static function dispatch($command) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->dispatch($command); + } + + /** + * Dispatch a command to its appropriate handler in the current process. + * + * Queueable jobs will be dispatched to the "sync" queue. + * + * @param mixed $command + * @param mixed $handler + * @return mixed + * @static + */ + public static function dispatchSync($command, $handler = null) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->dispatchSync($command, $handler); + } + + /** + * Dispatch a command to its appropriate handler in the current process without using the synchronous queue. + * + * @param mixed $command + * @param mixed $handler + * @return mixed + * @static + */ + public static function dispatchNow($command, $handler = null) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->dispatchNow($command, $handler); + } + + /** + * Attempt to find the batch with the given ID. + * + * @return \Illuminate\Bus\Batch|null + * @static + */ + public static function findBatch($batchId) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->findBatch($batchId); + } + + /** + * Create a new batch of queueable jobs. + * + * @param \Illuminate\Support\Collection|mixed $jobs + * @return \Illuminate\Bus\PendingBatch + * @static + */ + public static function batch($jobs) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->batch($jobs); + } + + /** + * Create a new chain of queueable jobs. + * + * @param \Illuminate\Support\Collection|array|null $jobs + * @return \Illuminate\Foundation\Bus\PendingChain + * @static + */ + public static function chain($jobs = null) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->chain($jobs); + } + + /** + * Determine if the given command has a handler. + * + * @param mixed $command + * @return bool + * @static + */ + public static function hasCommandHandler($command) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->hasCommandHandler($command); + } + + /** + * Retrieve the handler for a command. + * + * @param mixed $command + * @return mixed + * @static + */ + public static function getCommandHandler($command) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->getCommandHandler($command); + } + + /** + * Dispatch a command to its appropriate handler behind a queue. + * + * @param mixed $command + * @return mixed + * @throws \RuntimeException + * @static + */ + public static function dispatchToQueue($command) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->dispatchToQueue($command); + } + + /** + * Dispatch a command to its appropriate handler after the current process. + * + * @param mixed $command + * @param mixed $handler + * @return void + * @static + */ + public static function dispatchAfterResponse($command, $handler = null) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + $instance->dispatchAfterResponse($command, $handler); + } + + /** + * Set the pipes through which commands should be piped before dispatching. + * + * @return \Illuminate\Bus\Dispatcher + * @static + */ + public static function pipeThrough($pipes) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->pipeThrough($pipes); + } + + /** + * Map a command to a handler. + * + * @return \Illuminate\Bus\Dispatcher + * @static + */ + public static function map($map) + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->map($map); + } + + /** + * Allow dispatching after responses. + * + * @return \Illuminate\Bus\Dispatcher + * @static + */ + public static function withDispatchingAfterResponses() + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->withDispatchingAfterResponses(); + } + + /** + * Disable dispatching after responses. + * + * @return \Illuminate\Bus\Dispatcher + * @static + */ + public static function withoutDispatchingAfterResponses() + { + /** @var \Illuminate\Bus\Dispatcher $instance */ + return $instance->withoutDispatchingAfterResponses(); + } + + /** + * Specify the jobs that should be dispatched instead of faked. + * + * @param array|string $jobsToDispatch + * @return \Illuminate\Support\Testing\Fakes\BusFake + * @static + */ + public static function except($jobsToDispatch) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->except($jobsToDispatch); + } + + /** + * Assert if a job was dispatched based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|int|null $callback + * @return void + * @static + */ + public static function assertDispatched($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatched($command, $callback); + } + + /** + * Assert if a job was pushed exactly once. + * + * @param string|\Closure $command + * @return void + * @static + */ + public static function assertDispatchedOnce($command) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatchedOnce($command); + } + + /** + * Assert if a job was pushed a number of times. + * + * @param string|\Closure $command + * @param int $times + * @return void + * @static + */ + public static function assertDispatchedTimes($command, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatchedTimes($command, $times); + } + + /** + * Determine if a job was dispatched based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|null $callback + * @return void + * @static + */ + public static function assertNotDispatched($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertNotDispatched($command, $callback); + } + + /** + * Assert that no jobs were dispatched. + * + * @return void + * @static + */ + public static function assertNothingDispatched() + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertNothingDispatched(); + } + + /** + * Assert if a job was explicitly dispatched synchronously based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|int|null $callback + * @return void + * @static + */ + public static function assertDispatchedSync($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatchedSync($command, $callback); + } + + /** + * Assert if a job was pushed synchronously a number of times. + * + * @param string|\Closure $command + * @param int $times + * @return void + * @static + */ + public static function assertDispatchedSyncTimes($command, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatchedSyncTimes($command, $times); + } + + /** + * Determine if a job was dispatched based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|null $callback + * @return void + * @static + */ + public static function assertNotDispatchedSync($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertNotDispatchedSync($command, $callback); + } + + /** + * Assert if a job was dispatched after the response was sent based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|int|null $callback + * @return void + * @static + */ + public static function assertDispatchedAfterResponse($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatchedAfterResponse($command, $callback); + } + + /** + * Assert if a job was pushed after the response was sent a number of times. + * + * @param string|\Closure $command + * @param int $times + * @return void + * @static + */ + public static function assertDispatchedAfterResponseTimes($command, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatchedAfterResponseTimes($command, $times); + } + + /** + * Determine if a job was dispatched based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|null $callback + * @return void + * @static + */ + public static function assertNotDispatchedAfterResponse($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertNotDispatchedAfterResponse($command, $callback); + } + + /** + * Assert if a chain of jobs was dispatched. + * + * @param array $expectedChain + * @return void + * @static + */ + public static function assertChained($expectedChain) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertChained($expectedChain); + } + + /** + * Assert no chained jobs was dispatched. + * + * @return void + * @static + */ + public static function assertNothingChained() + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertNothingChained(); + } + + /** + * Assert if a job was dispatched with an empty chain based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|null $callback + * @return void + * @static + */ + public static function assertDispatchedWithoutChain($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertDispatchedWithoutChain($command, $callback); + } + + /** + * Create a new assertion about a chained batch. + * + * @param \Closure(\Illuminate\Bus\PendingBatch): bool $callback + * @return \Illuminate\Support\Testing\Fakes\ChainedBatchTruthTest + * @static + */ + public static function chainedBatch($callback) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->chainedBatch($callback); + } + + /** + * Assert if a batch was dispatched based on a truth-test callback. + * + * @param array|callable(\Illuminate\Bus\PendingBatch): bool $callback + * @return void + * @static + */ + public static function assertBatched($callback) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertBatched($callback); + } + + /** + * Assert the number of batches that have been dispatched. + * + * @param int $count + * @return void + * @static + */ + public static function assertBatchCount($count) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertBatchCount($count); + } + + /** + * Assert that no batched jobs were dispatched. + * + * @return void + * @static + */ + public static function assertNothingBatched() + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertNothingBatched(); + } + + /** + * Assert that no jobs were dispatched, chained, or batched. + * + * @return void + * @static + */ + public static function assertNothingPlaced() + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + $instance->assertNothingPlaced(); + } + + /** + * Get all of the jobs matching a truth-test callback. + * + * @param string $command + * @param callable|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function dispatched($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->dispatched($command, $callback); + } + + /** + * Get all of the jobs dispatched synchronously matching a truth-test callback. + * + * @param string $command + * @param callable|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function dispatchedSync($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->dispatchedSync($command, $callback); + } + + /** + * Get all of the jobs dispatched after the response was sent matching a truth-test callback. + * + * @param string $command + * @param callable|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function dispatchedAfterResponse($command, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->dispatchedAfterResponse($command, $callback); + } + + /** + * Get all of the pending batches matching a truth-test callback. + * + * @param callable(\Illuminate\Bus\PendingBatch): bool $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function batched($callback) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->batched($callback); + } + + /** + * Determine if there are any stored commands for a given class. + * + * @param string $command + * @return bool + * @static + */ + public static function hasDispatched($command) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->hasDispatched($command); + } + + /** + * Determine if there are any stored commands for a given class. + * + * @param string $command + * @return bool + * @static + */ + public static function hasDispatchedSync($command) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->hasDispatchedSync($command); + } + + /** + * Determine if there are any stored commands for a given class. + * + * @param string $command + * @return bool + * @static + */ + public static function hasDispatchedAfterResponse($command) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->hasDispatchedAfterResponse($command); + } + + /** + * Dispatch an empty job batch for testing. + * + * @param string $name + * @return \Illuminate\Bus\Batch + * @static + */ + public static function dispatchFakeBatch($name = '') + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->dispatchFakeBatch($name); + } + + /** + * Record the fake pending batch dispatch. + * + * @param \Illuminate\Bus\PendingBatch $pendingBatch + * @return \Illuminate\Bus\Batch + * @static + */ + public static function recordPendingBatch($pendingBatch) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->recordPendingBatch($pendingBatch); + } + + /** + * Specify if commands should be serialized and restored when being batched. + * + * @param bool $serializeAndRestore + * @return \Illuminate\Support\Testing\Fakes\BusFake + * @static + */ + public static function serializeAndRestore($serializeAndRestore = true) + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->serializeAndRestore($serializeAndRestore); + } + + /** + * Get the batches that have been dispatched. + * + * @return array + * @static + */ + public static function dispatchedBatches() + { + /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ + return $instance->dispatchedBatches(); + } + + } + /** + * @see \Illuminate\Cache\CacheManager + * @see \Illuminate\Cache\Repository + */ + class Cache { + /** + * Get a cache store instance by name, wrapped in a repository. + * + * @param string|null $name + * @return \Illuminate\Contracts\Cache\Repository + * @static + */ + public static function store($name = null) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->store($name); + } + + /** + * Get a cache driver instance. + * + * @param string|null $driver + * @return \Illuminate\Contracts\Cache\Repository + * @static + */ + public static function driver($driver = null) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->driver($driver); + } + + /** + * Get a memoized cache driver instance. + * + * @param string|null $driver + * @return \Illuminate\Contracts\Cache\Repository + * @static + */ + public static function memo($driver = null) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->memo($driver); + } + + /** + * Resolve the given store. + * + * @param string $name + * @return \Illuminate\Contracts\Cache\Repository + * @throws \InvalidArgumentException + * @static + */ + public static function resolve($name) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->resolve($name); + } + + /** + * Build a cache repository with the given configuration. + * + * @param array $config + * @return \Illuminate\Cache\Repository + * @throws \InvalidArgumentException + * @static + */ + public static function build($config) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->build($config); + } + + /** + * Create a new cache repository with the given implementation. + * + * @param \Illuminate\Contracts\Cache\Store $store + * @param array $config + * @return \Illuminate\Cache\Repository + * @static + */ + public static function repository($store, $config = []) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->repository($store, $config); + } + + /** + * Re-set the event dispatcher on all resolved cache repositories. + * + * @return void + * @static + */ + public static function refreshEventDispatcher() + { + /** @var \Illuminate\Cache\CacheManager $instance */ + $instance->refreshEventDispatcher(); + } + + /** + * Get the default cache driver name. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Set the default cache driver name. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultDriver($name) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + $instance->setDefaultDriver($name); + } + + /** + * Unset the given driver instances. + * + * @param array|string|null $name + * @return \Illuminate\Cache\CacheManager + * @static + */ + public static function forgetDriver($name = null) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->forgetDriver($name); + } + + /** + * Disconnect the given driver and remove from local cache. + * + * @param string|null $name + * @return void + * @static + */ + public static function purge($name = null) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + $instance->purge($name); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @param-closure-this $this $callback + * @return \Illuminate\Cache\CacheManager + * @static + */ + public static function extend($driver, $callback) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->extend($driver, $callback); + } + + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Cache\CacheManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Cache\CacheManager $instance */ + return $instance->setApplication($app); + } + + /** + * Determine if an item exists in the cache. + * + * @param \UnitEnum|array|string $key + * @return bool + * @static + */ + public static function has($key) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->has($key); + } + + /** + * Determine if an item doesn't exist in the cache. + * + * @param \UnitEnum|string $key + * @return bool + * @static + */ + public static function missing($key) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->missing($key); + } + + /** + * Retrieve an item from the cache by key. + * + * @param \UnitEnum|array|string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function get($key, $default = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->get($key, $default); + } + + /** + * Retrieve multiple items from the cache by key. + * + * Items not found in the cache will have a null value. + * + * @param array $keys + * @return array + * @static + */ + public static function many($keys) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->many($keys); + } + + /** + * Obtains multiple cache items by their unique keys. + * + * @return iterable + * @param iterable $keys A list of keys that can be obtained in a single operation. + * @param mixed $default Default value to return for keys that do not exist. + * @return iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $keys is neither an array nor a Traversable, + * or if any of the $keys are not a legal value. + * @static + */ + public static function getMultiple($keys, $default = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->getMultiple($keys, $default); + } + + /** + * Retrieve an item from the cache and delete it. + * + * @param \UnitEnum|array|string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function pull($key, $default = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->pull($key, $default); + } + + /** + * Retrieve a string item from the cache. + * + * @param \UnitEnum|string $key + * @param (\Closure():(string|null))|string|null $default + * @return string + * @throws \InvalidArgumentException + * @static + */ + public static function string($key, $default = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->string($key, $default); + } + + /** + * Retrieve an integer item from the cache. + * + * @param \UnitEnum|string $key + * @param (\Closure():(int|null))|int|null $default + * @return int + * @throws \InvalidArgumentException + * @static + */ + public static function integer($key, $default = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->integer($key, $default); + } + + /** + * Retrieve a float item from the cache. + * + * @param \UnitEnum|string $key + * @param (\Closure():(float|null))|float|null $default + * @return float + * @throws \InvalidArgumentException + * @static + */ + public static function float($key, $default = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->float($key, $default); + } + + /** + * Retrieve a boolean item from the cache. + * + * @param \UnitEnum|string $key + * @param (\Closure():(bool|null))|bool|null $default + * @return bool + * @throws \InvalidArgumentException + * @static + */ + public static function boolean($key, $default = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->boolean($key, $default); + } + + /** + * Retrieve an array item from the cache. + * + * @param \UnitEnum|string $key + * @param (\Closure():(array|null))|array|null $default + * @return array + * @throws \InvalidArgumentException + * @static + */ + public static function array($key, $default = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->array($key, $default); + } + + /** + * Store an item in the cache. + * + * @param \UnitEnum|array|string $key + * @param mixed $value + * @param \DateTimeInterface|\DateInterval|int|null $ttl + * @return bool + * @static + */ + public static function put($key, $value, $ttl = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->put($key, $value, $ttl); + } + + /** + * Store an item in the cache. + * + * @param \UnitEnum|array|string $key + * @param mixed $value + * @param \DateTimeInterface|\DateInterval|int|null $ttl + * @return bool + * @static + */ + public static function set($key, $value, $ttl = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->set($key, $value, $ttl); + } + + /** + * Store multiple items in the cache for a given number of seconds. + * + * @param array $values + * @param \DateTimeInterface|\DateInterval|int|null $ttl + * @return bool + * @static + */ + public static function putMany($values, $ttl = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->putMany($values, $ttl); + } + + /** + * Persists a set of key => value pairs in the cache, with an optional TTL. + * + * @return bool + * @param iterable $values A list of key => value pairs for a multiple-set operation. + * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and + * the driver supports TTL then the library may set a default value + * for it or let the driver take care of that. + * @return bool True on success and false on failure. + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $values is neither an array nor a Traversable, + * or if any of the $values are not a legal value. + * @static + */ + public static function setMultiple($values, $ttl = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->setMultiple($values, $ttl); + } + + /** + * Store an item in the cache if the key does not exist. + * + * @param \UnitEnum|array|string $key + * @param mixed $value + * @param \DateTimeInterface|\DateInterval|int|null $ttl + * @return bool + * @static + */ + public static function add($key, $value, $ttl = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->add($key, $value, $ttl); + } + + /** + * Increment the value of an item in the cache. + * + * @param \UnitEnum|string $key + * @param mixed $value + * @return int|bool + * @static + */ + public static function increment($key, $value = 1) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->increment($key, $value); + } + + /** + * Decrement the value of an item in the cache. + * + * @param \UnitEnum|string $key + * @param mixed $value + * @return int|bool + * @static + */ + public static function decrement($key, $value = 1) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->decrement($key, $value); + } + + /** + * Store an item in the cache indefinitely. + * + * @param \UnitEnum|string $key + * @param mixed $value + * @return bool + * @static + */ + public static function forever($key, $value) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->forever($key, $value); + } + + /** + * Get an item from the cache, or execute the given Closure and store the result. + * + * @template TCacheValue + * @param \UnitEnum|string $key + * @param \Closure|\DateTimeInterface|\DateInterval|int|null $ttl + * @param \Closure(): TCacheValue $callback + * @return TCacheValue + * @static + */ + public static function remember($key, $ttl, $callback) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->remember($key, $ttl, $callback); + } + + /** + * Get an item from the cache, or execute the given Closure and store the result forever. + * + * @template TCacheValue + * @param \UnitEnum|string $key + * @param \Closure(): TCacheValue $callback + * @return TCacheValue + * @static + */ + public static function sear($key, $callback) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->sear($key, $callback); + } + + /** + * Get an item from the cache, or execute the given Closure and store the result forever. + * + * @template TCacheValue + * @param \UnitEnum|string $key + * @param \Closure(): TCacheValue $callback + * @return TCacheValue + * @static + */ + public static function rememberForever($key, $callback) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->rememberForever($key, $callback); + } + + /** + * Retrieve an item from the cache by key, refreshing it in the background if it is stale. + * + * @template TCacheValue + * @param \UnitEnum|string $key + * @param array{ 0: \DateTimeInterface|\DateInterval|int, 1: \DateTimeInterface|\DateInterval|int } $ttl + * @param (callable(): TCacheValue) $callback + * @param array{ seconds?: int, owner?: string }|null $lock + * @param bool $alwaysDefer + * @return TCacheValue + * @static + */ + public static function flexible($key, $ttl, $callback, $lock = null, $alwaysDefer = false) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->flexible($key, $ttl, $callback, $lock, $alwaysDefer); + } + + /** + * Execute a callback while holding an atomic lock on a cache mutex to prevent overlapping calls. + * + * @template TReturn + * @param \UnitEnum|string $key + * @param callable(): TReturn $callback + * @param int $lockFor + * @param int $waitFor + * @param string|null $owner + * @return TReturn + * @throws \Illuminate\Contracts\Cache\LockTimeoutException + * @static + */ + public static function withoutOverlapping($key, $callback, $lockFor = 0, $waitFor = 10, $owner = null) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->withoutOverlapping($key, $callback, $lockFor, $waitFor, $owner); + } + + /** + * Funnel a callback for a maximum number of simultaneous executions. + * + * @param \UnitEnum|string $name + * @return \Illuminate\Cache\Limiters\ConcurrencyLimiterBuilder + * @static + */ + public static function funnel($name) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->funnel($name); + } + + /** + * Remove an item from the cache. + * + * @param \UnitEnum|array|string $key + * @return bool + * @static + */ + public static function forget($key) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->forget($key); + } + + /** + * Remove an item from the cache. + * + * @param \UnitEnum|array|string $key + * @return bool + * @static + */ + public static function delete($key) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->delete($key); + } + + /** + * Deletes multiple cache items in a single operation. + * + * @return bool + * @param iterable $keys A list of string-based keys to be deleted. + * @return bool True if the items were successfully removed. False if there was an error. + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $keys is neither an array nor a Traversable, + * or if any of the $keys are not a legal value. + * @static + */ + public static function deleteMultiple($keys) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->deleteMultiple($keys); + } + + /** + * Wipes clean the entire cache's keys. + * + * @return bool + * @return bool True on success and false on failure. + * @static + */ + public static function clear() + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->clear(); + } + + /** + * Begin executing a new tags operation if the store supports it. + * + * @param mixed $names + * @return \Illuminate\Cache\TaggedCache + * @throws \BadMethodCallException + * @static + */ + public static function tags($names) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->tags($names); + } + + /** + * Get the name of the cache store. + * + * @return string|null + * @static + */ + public static function getName() + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->getName(); + } + + /** + * Determine if the current store supports tags. + * + * @return bool + * @static + */ + public static function supportsTags() + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->supportsTags(); + } + + /** + * Get the default cache time. + * + * @return int|null + * @static + */ + public static function getDefaultCacheTime() + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->getDefaultCacheTime(); + } + + /** + * Set the default cache time in seconds. + * + * @param int|null $seconds + * @return \Illuminate\Cache\Repository + * @static + */ + public static function setDefaultCacheTime($seconds) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->setDefaultCacheTime($seconds); + } + + /** + * Get the cache store implementation. + * + * @return \Illuminate\Contracts\Cache\Store + * @static + */ + public static function getStore() + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->getStore(); + } + + /** + * Set the cache store implementation. + * + * @param \Illuminate\Contracts\Cache\Store $store + * @return static + * @static + */ + public static function setStore($store) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->setStore($store); + } + + /** + * Get the event dispatcher instance. + * + * @return \Illuminate\Contracts\Events\Dispatcher|null + * @static + */ + public static function getEventDispatcher() + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->getEventDispatcher(); + } + + /** + * Set the event dispatcher instance. + * + * @param \Illuminate\Contracts\Events\Dispatcher $events + * @return void + * @static + */ + public static function setEventDispatcher($events) + { + /** @var \Illuminate\Cache\Repository $instance */ + $instance->setEventDispatcher($events); + } + + /** + * Determine if a cached value exists. + * + * @param \UnitEnum|string $key + * @return bool + * @static + */ + public static function offsetExists($key) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->offsetExists($key); + } + + /** + * Retrieve an item from the cache by key. + * + * @param \UnitEnum|string $key + * @return mixed + * @static + */ + public static function offsetGet($key) + { + /** @var \Illuminate\Cache\Repository $instance */ + return $instance->offsetGet($key); + } + + /** + * Store an item in the cache for the default time. + * + * @param \UnitEnum|string $key + * @param mixed $value + * @return void + * @static + */ + public static function offsetSet($key, $value) + { + /** @var \Illuminate\Cache\Repository $instance */ + $instance->offsetSet($key, $value); + } + + /** + * Remove an item from the cache. + * + * @param \UnitEnum|string $key + * @return void + * @static + */ + public static function offsetUnset($key) + { + /** @var \Illuminate\Cache\Repository $instance */ + $instance->offsetUnset($key); + } + + /** + * 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\Cache\Repository::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\Cache\Repository::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Cache\Repository::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Cache\Repository::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\Cache\Repository $instance */ + return $instance->macroCall($method, $parameters); + } + + /** + * Get a lock instance. + * + * @param string $name + * @param int $seconds + * @param string|null $owner + * @return \Illuminate\Contracts\Cache\Lock + * @static + */ + public static function lock($name, $seconds = 0, $owner = null) + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + return $instance->lock($name, $seconds, $owner); + } + + /** + * Restore a lock instance using the owner identifier. + * + * @param string $name + * @param string $owner + * @return \Illuminate\Contracts\Cache\Lock + * @static + */ + public static function restoreLock($name, $owner) + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + return $instance->restoreLock($name, $owner); + } + + /** + * Remove an item from the cache if it is expired. + * + * @param string $key + * @return bool + * @static + */ + public static function forgetIfExpired($key) + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + return $instance->forgetIfExpired($key); + } + + /** + * Remove all items from the cache. + * + * @return bool + * @static + */ + public static function flush() + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + return $instance->flush(); + } + + /** + * Get the underlying database connection. + * + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function getConnection() + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + return $instance->getConnection(); + } + + /** + * Set the underlying database connection. + * + * @param \Illuminate\Database\ConnectionInterface $connection + * @return \Illuminate\Cache\DatabaseStore + * @static + */ + public static function setConnection($connection) + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + return $instance->setConnection($connection); + } + + /** + * Get the connection used to manage locks. + * + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function getLockConnection() + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + return $instance->getLockConnection(); + } + + /** + * Specify the connection that should be used to manage locks. + * + * @param \Illuminate\Database\ConnectionInterface $connection + * @return \Illuminate\Cache\DatabaseStore + * @static + */ + public static function setLockConnection($connection) + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + return $instance->setLockConnection($connection); + } + + /** + * Get the cache key prefix. + * + * @return string + * @static + */ + public static function getPrefix() + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + return $instance->getPrefix(); + } + + /** + * Set the cache key prefix. + * + * @param string $prefix + * @return void + * @static + */ + public static function setPrefix($prefix) + { + /** @var \Illuminate\Cache\DatabaseStore $instance */ + $instance->setPrefix($prefix); + } + + } + /** + * @method static array run(\Closure|array $tasks) + * @method static \Illuminate\Support\Defer\DeferredCallback defer(\Closure|array $tasks) + * @see \Illuminate\Concurrency\ConcurrencyManager + */ + class Concurrency { + /** + * Get a driver instance by name. + * + * @param string|null $name + * @return mixed + * @static + */ + public static function driver($name = null) + { + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->driver($name); + } + + /** + * Create an instance of the process concurrency driver. + * + * @return \Illuminate\Concurrency\ProcessDriver + * @static + */ + public static function createProcessDriver() + { + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->createProcessDriver(); + } + + /** + * Create an instance of the fork concurrency driver. + * + * @return \Illuminate\Concurrency\ForkDriver + * @throws \RuntimeException + * @static + */ + public static function createForkDriver() + { + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->createForkDriver(); + } + + /** + * Create an instance of the sync concurrency driver. + * + * @return \Illuminate\Concurrency\SyncDriver + * @static + */ + public static function createSyncDriver() + { + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->createSyncDriver(); + } + + /** + * Get the default instance name. + * + * @return string + * @static + */ + public static function getDefaultInstance() + { + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->getDefaultInstance(); + } + + /** + * Set the default instance name. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultInstance($name) + { + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + $instance->setDefaultInstance($name); + } + + /** + * Get the instance specific configuration. + * + * @param string $name + * @return array + * @static + */ + public static function getInstanceConfig($name) + { + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->getInstanceConfig($name); + } + + /** + * Get an instance by name. + * + * @param string|null $name + * @return mixed + * @static + */ + public static function instance($name = null) + { + //Method inherited from \Illuminate\Support\MultipleInstanceManager + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->instance($name); + } + + /** + * Unset the given instances. + * + * @param array|string|null $name + * @return \Illuminate\Concurrency\ConcurrencyManager + * @static + */ + public static function forgetInstance($name = null) + { + //Method inherited from \Illuminate\Support\MultipleInstanceManager + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->forgetInstance($name); + } + + /** + * Disconnect the given instance and remove from local cache. + * + * @param string|null $name + * @return void + * @static + */ + public static function purge($name = null) + { + //Method inherited from \Illuminate\Support\MultipleInstanceManager + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + $instance->purge($name); + } + + /** + * Register a custom instance creator Closure. + * + * @param string $name + * @param \Closure $callback + * @param-closure-this $this $callback + * @return \Illuminate\Concurrency\ConcurrencyManager + * @static + */ + public static function extend($name, $callback) + { + //Method inherited from \Illuminate\Support\MultipleInstanceManager + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->extend($name, $callback); + } + + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Concurrency\ConcurrencyManager + * @static + */ + public static function setApplication($app) + { + //Method inherited from \Illuminate\Support\MultipleInstanceManager + /** @var \Illuminate\Concurrency\ConcurrencyManager $instance */ + return $instance->setApplication($app); + } + + } + /** + * @see \Illuminate\Config\Repository + */ + class Config { + /** + * Determine if the given configuration value exists. + * + * @param string $key + * @return bool + * @static + */ + public static function has($key) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->has($key); + } + + /** + * Get the specified configuration value. + * + * @param array|string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function get($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->get($key, $default); + } + + /** + * Get many configuration values. + * + * @param array $keys + * @return array + * @static + */ + public static function getMany($keys) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->getMany($keys); + } + + /** + * Get the specified string configuration value. + * + * @param string $key + * @param (\Closure():(string|null))|string|null $default + * @return string + * @throws \InvalidArgumentException + * @static + */ + public static function string($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->string($key, $default); + } + + /** + * Get the specified integer configuration value. + * + * @param string $key + * @param (\Closure():(int|null))|int|null $default + * @return int + * @throws \InvalidArgumentException + * @static + */ + public static function integer($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->integer($key, $default); + } + + /** + * Get the specified float configuration value. + * + * @param string $key + * @param (\Closure():(float|null))|float|null $default + * @return float + * @throws \InvalidArgumentException + * @static + */ + public static function float($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->float($key, $default); + } + + /** + * Get the specified boolean configuration value. + * + * @param string $key + * @param (\Closure():(bool|null))|bool|null $default + * @return bool + * @throws \InvalidArgumentException + * @static + */ + public static function boolean($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->boolean($key, $default); + } + + /** + * Get the specified array configuration value. + * + * @param string $key + * @param (\Closure():(array|null))|array|null $default + * @return array + * @throws \InvalidArgumentException + * @static + */ + public static function array($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->array($key, $default); + } + + /** + * Get the specified array configuration value as a collection. + * + * @param string $key + * @param (\Closure():(array|null))|array|null $default + * @return Collection + * @static + */ + public static function collection($key, $default = null) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->collection($key, $default); + } + + /** + * Set a given configuration value. + * + * @param array|string $key + * @param mixed $value + * @return void + * @static + */ + public static function set($key, $value = null) + { + /** @var \Illuminate\Config\Repository $instance */ + $instance->set($key, $value); + } + + /** + * Prepend a value onto an array configuration value. + * + * @param string $key + * @param mixed $value + * @return void + * @static + */ + public static function prepend($key, $value) + { + /** @var \Illuminate\Config\Repository $instance */ + $instance->prepend($key, $value); + } + + /** + * Push a value onto an array configuration value. + * + * @param string $key + * @param mixed $value + * @return void + * @static + */ + public static function push($key, $value) + { + /** @var \Illuminate\Config\Repository $instance */ + $instance->push($key, $value); + } + + /** + * Get all of the configuration items for the application. + * + * @return array + * @static + */ + public static function all() + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->all(); + } + + /** + * Determine if the given configuration option exists. + * + * @param string $key + * @return bool + * @static + */ + public static function offsetExists($key) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->offsetExists($key); + } + + /** + * Get a configuration option. + * + * @param string $key + * @return mixed + * @static + */ + public static function offsetGet($key) + { + /** @var \Illuminate\Config\Repository $instance */ + return $instance->offsetGet($key); + } + + /** + * Set a configuration option. + * + * @param string $key + * @param mixed $value + * @return void + * @static + */ + public static function offsetSet($key, $value) + { + /** @var \Illuminate\Config\Repository $instance */ + $instance->offsetSet($key, $value); + } + + /** + * Unset a configuration option. + * + * @param string $key + * @return void + * @static + */ + public static function offsetUnset($key) + { + /** @var \Illuminate\Config\Repository $instance */ + $instance->offsetUnset($key); + } + + /** + * 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\Config\Repository::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\Config\Repository::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Config\Repository::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Config\Repository::flushMacros(); + } + + } + /** + * @see \Illuminate\Log\Context\Repository + */ + class Context { + /** + * Determine if the given key exists. + * + * @param string $key + * @return bool + * @static + */ + public static function has($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->has($key); + } + + /** + * Determine if the given key is missing. + * + * @param string $key + * @return bool + * @static + */ + public static function missing($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->missing($key); + } + + /** + * Determine if the given key exists within the hidden context data. + * + * @param string $key + * @return bool + * @static + */ + public static function hasHidden($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->hasHidden($key); + } + + /** + * Determine if the given key is missing within the hidden context data. + * + * @param string $key + * @return bool + * @static + */ + public static function missingHidden($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->missingHidden($key); + } + + /** + * Retrieve all the context data. + * + * @return array + * @static + */ + public static function all() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->all(); + } + + /** + * Retrieve all the hidden context data. + * + * @return array + * @static + */ + public static function allHidden() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->allHidden(); + } + + /** + * Retrieve the given key's value. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function get($key, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->get($key, $default); + } + + /** + * Retrieve the given key's hidden value. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function getHidden($key, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->getHidden($key, $default); + } + + /** + * Retrieve the given key's value and then forget it. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function pull($key, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->pull($key, $default); + } + + /** + * Retrieve the given key's hidden value and then forget it. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function pullHidden($key, $default = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->pullHidden($key, $default); + } + + /** + * Retrieve only the values of the given keys. + * + * @param array $keys + * @return array + * @static + */ + public static function only($keys) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->only($keys); + } + + /** + * Retrieve only the hidden values of the given keys. + * + * @param array $keys + * @return array + * @static + */ + public static function onlyHidden($keys) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->onlyHidden($keys); + } + + /** + * Retrieve all values except those with the given keys. + * + * @param array $keys + * @return array + * @static + */ + public static function except($keys) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->except($keys); + } + + /** + * Retrieve all hidden values except those with the given keys. + * + * @param array $keys + * @return array + * @static + */ + public static function exceptHidden($keys) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->exceptHidden($keys); + } + + /** + * Add a context value. + * + * @param string|array $key + * @param mixed $value + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function add($key, $value = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->add($key, $value); + } + + /** + * Add a hidden context value. + * + * @param string|array $key + * @param mixed $value + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function addHidden($key, $value = null) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->addHidden($key, $value); + } + + /** + * Add a context value if it does not exist yet, and return the value. + * + * @param string $key + * @param mixed $value + * @return mixed + * @static + */ + public static function remember($key, $value) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->remember($key, $value); + } + + /** + * Add a hidden context value if it does not exist yet, and return the value. + * + * @param string $key + * @param mixed $value + * @return mixed + * @static + */ + public static function rememberHidden($key, $value) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->rememberHidden($key, $value); + } + + /** + * Forget the given context key. + * + * @param string|array $key + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function forget($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->forget($key); + } + + /** + * Forget the given hidden context key. + * + * @param string|array $key + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function forgetHidden($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->forgetHidden($key); + } + + /** + * Add a context value if it does not exist yet. + * + * @param string $key + * @param mixed $value + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function addIf($key, $value) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->addIf($key, $value); + } + + /** + * Add a hidden context value if it does not exist yet. + * + * @param string $key + * @param mixed $value + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function addHiddenIf($key, $value) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->addHiddenIf($key, $value); + } + + /** + * Push the given values onto the key's stack. + * + * @param string $key + * @param mixed $values + * @return \Illuminate\Log\Context\Repository + * @throws \RuntimeException + * @static + */ + public static function push($key, ...$values) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->push($key, ...$values); + } + + /** + * Pop the latest value from the key's stack. + * + * @param string $key + * @return mixed + * @throws \RuntimeException + * @static + */ + public static function pop($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->pop($key); + } + + /** + * Push the given hidden values onto the key's stack. + * + * @param string $key + * @param mixed $values + * @return \Illuminate\Log\Context\Repository + * @throws \RuntimeException + * @static + */ + public static function pushHidden($key, ...$values) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->pushHidden($key, ...$values); + } + + /** + * Pop the latest hidden value from the key's stack. + * + * @param string $key + * @return mixed + * @throws \RuntimeException + * @static + */ + public static function popHidden($key) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->popHidden($key); + } + + /** + * Increment a context counter. + * + * @param string $key + * @param int $amount + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function increment($key, $amount = 1) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->increment($key, $amount); + } + + /** + * Decrement a context counter. + * + * @param string $key + * @param int $amount + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function decrement($key, $amount = 1) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->decrement($key, $amount); + } + + /** + * Determine if the given value is in the given stack. + * + * @param string $key + * @param mixed $value + * @param bool $strict + * @return bool + * @throws \RuntimeException + * @static + */ + public static function stackContains($key, $value, $strict = false) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->stackContains($key, $value, $strict); + } + + /** + * Determine if the given value is in the given hidden stack. + * + * @param string $key + * @param mixed $value + * @param bool $strict + * @return bool + * @throws \RuntimeException + * @static + */ + public static function hiddenStackContains($key, $value, $strict = false) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->hiddenStackContains($key, $value, $strict); + } + + /** + * @template TReturn of mixed + * + * Run the callback function with the given context values and restore the original context state when complete. + * @param (callable(): TReturn) $callback + * @param array $data + * @param array $hidden + * @return TReturn + * @throws \Throwable + * @static + */ + public static function scope($callback, $data = [], $hidden = []) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->scope($callback, $data, $hidden); + } + + /** + * Determine if the repository is empty. + * + * @return bool + * @static + */ + public static function isEmpty() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->isEmpty(); + } + + /** + * Execute the given callback when context is about to be dehydrated. + * + * @param (callable(static): void) $callback + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function dehydrating($callback) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->dehydrating($callback); + } + + /** + * Execute the given callback when context has been hydrated. + * + * @param (callable(static): void) $callback + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function hydrated($callback) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->hydrated($callback); + } + + /** + * Handle unserialize exceptions using the given callback. + * + * @param callable|null $callback + * @return static + * @static + */ + public static function handleUnserializeExceptionsUsing($callback) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->handleUnserializeExceptionsUsing($callback); + } + + /** + * Flush all context data. + * + * @return \Illuminate\Log\Context\Repository + * @static + */ + public static function flush() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->flush(); + } + + /** + * Dehydrate the context data. + * + * @internal + * @return \Illuminate\Log\Context\?array + * @static + */ + public static function dehydrate() + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->dehydrate(); + } + + /** + * Hydrate the context instance. + * + * @internal + * @param \Illuminate\Log\Context\?array $context + * @return \Illuminate\Log\Context\Repository + * @throws \RuntimeException + * @static + */ + public static function hydrate($context) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->hydrate($context); + } + + /** + * 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\Log\Context\Repository $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\Log\Context\Repository $instance */ + return $instance->unless($value, $callback, $default); + } + + /** + * 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\Log\Context\Repository::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\Log\Context\Repository::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Log\Context\Repository::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Log\Context\Repository::flushMacros(); + } + + /** + * Restore the model from the model identifier instance. + * + * @param \Illuminate\Contracts\Database\ModelIdentifier $value + * @return \Illuminate\Database\Eloquent\Model + * @static + */ + public static function restoreModel($value) + { + /** @var \Illuminate\Log\Context\Repository $instance */ + return $instance->restoreModel($value); + } + + } + /** + * @see \Illuminate\Cookie\CookieJar + */ + class Cookie { + /** + * Create a new cookie instance. + * + * @param string $name + * @param string $value + * @param int $minutes + * @param string|null $path + * @param string|null $domain + * @param bool|null $secure + * @param bool $httpOnly + * @param bool $raw + * @param string|null $sameSite + * @return \Symfony\Component\HttpFoundation\Cookie + * @static + */ + public static function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + return $instance->make($name, $value, $minutes, $path, $domain, $secure, $httpOnly, $raw, $sameSite); + } + + /** + * Create a cookie that lasts "forever" (400 days). + * + * @param string $name + * @param string $value + * @param string|null $path + * @param string|null $domain + * @param bool|null $secure + * @param bool $httpOnly + * @param bool $raw + * @param string|null $sameSite + * @return \Symfony\Component\HttpFoundation\Cookie + * @static + */ + public static function forever($name, $value, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + return $instance->forever($name, $value, $path, $domain, $secure, $httpOnly, $raw, $sameSite); + } + + /** + * Expire the given cookie. + * + * @param string $name + * @param string|null $path + * @param string|null $domain + * @return \Symfony\Component\HttpFoundation\Cookie + * @static + */ + public static function forget($name, $path = null, $domain = null) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + return $instance->forget($name, $path, $domain); + } + + /** + * Determine if a cookie has been queued. + * + * @param string $key + * @param string|null $path + * @return bool + * @static + */ + public static function hasQueued($key, $path = null) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + return $instance->hasQueued($key, $path); + } + + /** + * Get a queued cookie instance. + * + * @param string $key + * @param mixed $default + * @param string|null $path + * @return \Symfony\Component\HttpFoundation\Cookie|null + * @static + */ + public static function queued($key, $default = null, $path = null) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + return $instance->queued($key, $default, $path); + } + + /** + * Queue a cookie to send with the next response. + * + * @param mixed $parameters + * @return void + * @static + */ + public static function queue(...$parameters) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + $instance->queue(...$parameters); + } + + /** + * Queue a cookie to expire with the next response. + * + * @param string $name + * @param string|null $path + * @param string|null $domain + * @return void + * @static + */ + public static function expire($name, $path = null, $domain = null) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + $instance->expire($name, $path, $domain); + } + + /** + * Remove a cookie from the queue. + * + * @param string $name + * @param string|null $path + * @return void + * @static + */ + public static function unqueue($name, $path = null) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + $instance->unqueue($name, $path); + } + + /** + * Set the default path and domain for the jar. + * + * @param string $path + * @param string|null $domain + * @param bool|null $secure + * @param string|null $sameSite + * @return \Illuminate\Cookie\CookieJar + * @static + */ + public static function setDefaultPathAndDomain($path, $domain, $secure = false, $sameSite = null) + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + return $instance->setDefaultPathAndDomain($path, $domain, $secure, $sameSite); + } + + /** + * Get the cookies which have been queued for the next request. + * + * @return \Symfony\Component\HttpFoundation\Cookie[] + * @static + */ + public static function getQueuedCookies() + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + return $instance->getQueuedCookies(); + } + + /** + * Flush the cookies which have been queued for the next request. + * + * @return \Illuminate\Cookie\CookieJar + * @static + */ + public static function flushQueuedCookies() + { + /** @var \Illuminate\Cookie\CookieJar $instance */ + return $instance->flushQueuedCookies(); + } + + /** + * 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\Cookie\CookieJar::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\Cookie\CookieJar::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Cookie\CookieJar::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Cookie\CookieJar::flushMacros(); + } + + } + /** + * @see \Illuminate\Encryption\Encrypter + */ + class Crypt { + /** + * Determine if the given key and cipher combination is valid. + * + * @param string $key + * @param string $cipher + * @return bool + * @static + */ + public static function supported($key, $cipher) + { + return \Illuminate\Encryption\Encrypter::supported($key, $cipher); + } + + /** + * Create a new encryption key for the given cipher. + * + * @param string $cipher + * @return string + * @static + */ + public static function generateKey($cipher) + { + return \Illuminate\Encryption\Encrypter::generateKey($cipher); + } + + /** + * Encrypt the given value. + * + * @param mixed $value + * @param bool $serialize + * @return string + * @throws \Illuminate\Contracts\Encryption\EncryptException + * @static + */ + public static function encrypt($value, $serialize = true) + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->encrypt($value, $serialize); + } + + /** + * Encrypt a string without serialization. + * + * @param string $value + * @return string + * @throws \Illuminate\Contracts\Encryption\EncryptException + * @static + */ + public static function encryptString($value) + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->encryptString($value); + } + + /** + * Decrypt the given value. + * + * @param string $payload + * @param bool $unserialize + * @return mixed + * @throws \Illuminate\Contracts\Encryption\DecryptException + * @static + */ + public static function decrypt($payload, $unserialize = true) + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->decrypt($payload, $unserialize); + } + + /** + * Decrypt the given string without unserialization. + * + * @param string $payload + * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException + * @static + */ + public static function decryptString($payload) + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->decryptString($payload); + } + + /** + * Determine if the given value appears to be encrypted by this encrypter. + * + * @param mixed $value + * @return bool + * @static + */ + public static function appearsEncrypted($value) + { + return \Illuminate\Encryption\Encrypter::appearsEncrypted($value); + } + + /** + * Get the encryption key that the encrypter is currently using. + * + * @return string + * @static + */ + public static function getKey() + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->getKey(); + } + + /** + * Get the current encryption key and all previous encryption keys. + * + * @return array + * @static + */ + public static function getAllKeys() + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->getAllKeys(); + } + + /** + * Get the previous encryption keys. + * + * @return array + * @static + */ + public static function getPreviousKeys() + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->getPreviousKeys(); + } + + /** + * Set the previous / legacy encryption keys that should be utilized if decryption fails. + * + * @param array $keys + * @return \Illuminate\Encryption\Encrypter + * @throws \RuntimeException + * @static + */ + public static function previousKeys($keys) + { + /** @var \Illuminate\Encryption\Encrypter $instance */ + return $instance->previousKeys($keys); + } + + } + /** + * @see https://carbon.nesbot.com/docs/ + * @see https://github.com/briannesbitt/Carbon/blob/master/src/Carbon/Factory.php + * @method static bool canBeCreatedFromFormat(?string $date, string $format) + * @method static \Illuminate\Support\Carbon|null create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $timezone = null) + * @method static \Illuminate\Support\Carbon createFromDate($year = null, $month = null, $day = null, $timezone = null) + * @method static \Illuminate\Support\Carbon|null createFromFormat($format, $time, $timezone = null) + * @method static \Illuminate\Support\Carbon|null createFromIsoFormat(string $format, string $time, $timezone = null, ?string $locale = 'en', ?\Symfony\Contracts\Translation\TranslatorInterface $translator = null) + * @method static \Illuminate\Support\Carbon|null createFromLocaleFormat(string $format, string $locale, string $time, $timezone = null) + * @method static \Illuminate\Support\Carbon|null createFromLocaleIsoFormat(string $format, string $locale, string $time, $timezone = null) + * @method static \Illuminate\Support\Carbon createFromTime($hour = 0, $minute = 0, $second = 0, $timezone = null) + * @method static \Illuminate\Support\Carbon createFromTimeString(string $time, \DateTimeZone|string|int|null $timezone = null) + * @method static \Illuminate\Support\Carbon createFromTimestamp(string|int|float $timestamp, \DateTimeZone|string|int|null $timezone = null) + * @method static \Illuminate\Support\Carbon createFromTimestampMs(string|int|float $timestamp, \DateTimeZone|string|int|null $timezone = null) + * @method static \Illuminate\Support\Carbon createFromTimestampMsUTC($timestamp) + * @method static \Illuminate\Support\Carbon createFromTimestampUTC(string|int|float $timestamp) + * @method static \Illuminate\Support\Carbon createMidnightDate($year = null, $month = null, $day = null, $timezone = null) + * @method static \Illuminate\Support\Carbon|null createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $timezone = null) + * @method static \Illuminate\Support\Carbon createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $timezone = null) + * @method static void disableHumanDiffOption($humanDiffOption) + * @method static void enableHumanDiffOption($humanDiffOption) + * @method static mixed executeWithLocale(string $locale, callable $func) + * @method static \Illuminate\Support\Carbon fromSerialized($value) + * @method static array getAvailableLocales() + * @method static array getAvailableLocalesInfo() + * @method static array getDays() + * @method static ?string getFallbackLocale() + * @method static array getFormatsToIsoReplacements() + * @method static int getHumanDiffOptions() + * @method static array getIsoUnits() + * @method static array|false getLastErrors() + * @method static string getLocale() + * @method static int getMidDayAt() + * @method static string getTimeFormatByPrecision(string $unitPrecision) + * @method static string|\Closure|null getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) + * @method static \Illuminate\Support\Carbon|null getTestNow() + * @method static \Symfony\Contracts\Translation\TranslatorInterface getTranslator() + * @method static int getWeekEndsAt(?string $locale = null) + * @method static int getWeekStartsAt(?string $locale = null) + * @method static array getWeekendDays() + * @method static bool hasFormat(string $date, string $format) + * @method static bool hasFormatWithModifiers(string $date, string $format) + * @method static bool hasMacro($name) + * @method static bool hasRelativeKeywords(?string $time) + * @method static bool hasTestNow() + * @method static \Illuminate\Support\Carbon instance(\DateTimeInterface $date) + * @method static bool isImmutable() + * @method static bool isModifiableUnit($unit) + * @method static bool isMutable() + * @method static bool isStrictModeEnabled() + * @method static bool localeHasDiffOneDayWords(string $locale) + * @method static bool localeHasDiffSyntax(string $locale) + * @method static bool localeHasDiffTwoDayWords(string $locale) + * @method static bool localeHasPeriodSyntax($locale) + * @method static bool localeHasShortUnits(string $locale) + * @method static void macro(string $name, ?callable $macro) + * @method static \Illuminate\Support\Carbon|null make($var, \DateTimeZone|string|null $timezone = null) + * @method static void mixin(object|string $mixin) + * @method static \Illuminate\Support\Carbon now(\DateTimeZone|string|int|null $timezone = null) + * @method static \Illuminate\Support\Carbon parse(\DateTimeInterface|\Carbon\WeekDay|\Carbon\Month|string|int|float|null $time, \DateTimeZone|string|int|null $timezone = null) + * @method static \Illuminate\Support\Carbon parseFromLocale(string $time, ?string $locale = null, \DateTimeZone|string|int|null $timezone = null) + * @method static string pluralUnit(string $unit) + * @method static \Illuminate\Support\Carbon|null rawCreateFromFormat(string $format, string $time, $timezone = null) + * @method static \Illuminate\Support\Carbon rawParse(\DateTimeInterface|\Carbon\WeekDay|\Carbon\Month|string|int|float|null $time, \DateTimeZone|string|int|null $timezone = null) + * @method static void resetMonthsOverflow() + * @method static void resetToStringFormat() + * @method static void resetYearsOverflow() + * @method static void serializeUsing($callback) + * @method static void setFallbackLocale(string $locale) + * @method static void setHumanDiffOptions($humanDiffOptions) + * @method static void setLocale(string $locale) + * @method static void setMidDayAt($hour) + * @method static void setTestNow(mixed $testNow = null) + * @method static void setTestNowAndTimezone(mixed $testNow = null, $timezone = null) + * @method static void setToStringFormat(string|\Closure|null $format) + * @method static void setTranslator(\Symfony\Contracts\Translation\TranslatorInterface $translator) + * @method static void setWeekEndsAt($day) + * @method static void setWeekStartsAt($day) + * @method static void setWeekendDays($days) + * @method static bool shouldOverflowMonths() + * @method static bool shouldOverflowYears() + * @method static string singularUnit(string $unit) + * @method static void sleep(int|float $seconds) + * @method static \Illuminate\Support\Carbon today(\DateTimeZone|string|int|null $timezone = null) + * @method static \Illuminate\Support\Carbon tomorrow(\DateTimeZone|string|int|null $timezone = null) + * @method static string translateTimeString(string $timeString, ?string $from = null, ?string $to = null, int $mode = \Carbon\CarbonInterface::TRANSLATE_ALL) + * @method static string translateWith(\Symfony\Contracts\Translation\TranslatorInterface $translator, string $key, array $parameters = [], $number = null) + * @method static void useMonthsOverflow($monthsOverflow = true) + * @method static void useStrictMode($strictModeEnabled = true) + * @method static void useYearsOverflow($yearsOverflow = true) + * @method static mixed withTestNow(mixed $testNow, callable $callback) + * @method static static withTimeZone(\DateTimeZone|string|int|null $timezone) + * @method static \Illuminate\Support\Carbon yesterday(\DateTimeZone|string|int|null $timezone = null) + * @see \Illuminate\Support\DateFactory + */ + class Date { + /** + * Use the given handler when generating dates (class name, callable, or factory). + * + * @param mixed $handler + * @return mixed + * @throws \InvalidArgumentException + * @static + */ + public static function use($handler) + { + return \Illuminate\Support\DateFactory::use($handler); + } + + /** + * Use the default date class when generating dates. + * + * @return void + * @static + */ + public static function useDefault() + { + \Illuminate\Support\DateFactory::useDefault(); + } + + /** + * Execute the given callable on each date creation. + * + * @param callable $callable + * @return void + * @static + */ + public static function useCallable($callable) + { + \Illuminate\Support\DateFactory::useCallable($callable); + } + + /** + * Use the given date type (class) when generating dates. + * + * @param string $dateClass + * @return void + * @static + */ + public static function useClass($dateClass) + { + \Illuminate\Support\DateFactory::useClass($dateClass); + } + + /** + * Use the given Carbon factory when generating dates. + * + * @param object $factory + * @return void + * @static + */ + public static function useFactory($factory) + { + \Illuminate\Support\DateFactory::useFactory($factory); + } + + } + /** + * @see \Illuminate\Database\DatabaseManager + */ + class DB { + /** + * Get a database connection instance. + * + * @param \UnitEnum|string|null $name + * @return \Illuminate\Database\Connection + * @static + */ + public static function connection($name = null) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->connection($name); + } + + /** + * Build a database connection instance from the given configuration. + * + * @param array $config + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function build($config) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->build($config); + } + + /** + * Calculate the dynamic connection name for an on-demand connection based on its configuration. + * + * @param array $config + * @return string + * @static + */ + public static function calculateDynamicConnectionName($config) + { + return \Illuminate\Database\DatabaseManager::calculateDynamicConnectionName($config); + } + + /** + * Get a database connection instance from the given configuration. + * + * @param \UnitEnum|string $name + * @param array $config + * @param bool $force + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function connectUsing($name, $config, $force = false) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->connectUsing($name, $config, $force); + } + + /** + * Disconnect from the given database and remove from local cache. + * + * @param \UnitEnum|string|null $name + * @return void + * @static + */ + public static function purge($name = null) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + $instance->purge($name); + } + + /** + * Disconnect from the given database. + * + * @param \UnitEnum|string|null $name + * @return void + * @static + */ + public static function disconnect($name = null) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + $instance->disconnect($name); + } + + /** + * Reconnect to the given database. + * + * @param \UnitEnum|string|null $name + * @return \Illuminate\Database\Connection + * @static + */ + public static function reconnect($name = null) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->reconnect($name); + } + + /** + * Set the default database connection for the callback execution. + * + * @param \UnitEnum|string $name + * @param callable $callback + * @return mixed + * @static + */ + public static function usingConnection($name, $callback) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->usingConnection($name, $callback); + } + + /** + * Get the default connection name. + * + * @return string + * @static + */ + public static function getDefaultConnection() + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->getDefaultConnection(); + } + + /** + * Set the default connection name. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultConnection($name) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + $instance->setDefaultConnection($name); + } + + /** + * Get all of the supported drivers. + * + * @return string[] + * @static + */ + public static function supportedDrivers() + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->supportedDrivers(); + } + + /** + * Get all of the drivers that are actually available. + * + * @return string[] + * @static + */ + public static function availableDrivers() + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->availableDrivers(); + } + + /** + * Register an extension connection resolver. + * + * @param string $name + * @param callable $resolver + * @return void + * @static + */ + public static function extend($name, $resolver) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + $instance->extend($name, $resolver); + } + + /** + * Remove an extension connection resolver. + * + * @param string $name + * @return void + * @static + */ + public static function forgetExtension($name) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + $instance->forgetExtension($name); + } + + /** + * Return all of the created connections. + * + * @return array + * @static + */ + public static function getConnections() + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->getConnections(); + } + + /** + * Set the database reconnector callback. + * + * @param callable $reconnector + * @return void + * @static + */ + public static function setReconnector($reconnector) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + $instance->setReconnector($reconnector); + } + + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Database\DatabaseManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->setApplication($app); + } + + /** + * 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\DatabaseManager::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\DatabaseManager::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Database\DatabaseManager::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Database\DatabaseManager::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\DatabaseManager $instance */ + return $instance->macroCall($method, $parameters); + } + + /** + * Get a human-readable name for the given connection driver. + * + * @return string + * @static + */ + public static function getDriverTitle() + { + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getDriverTitle(); + } + + /** + * Run an insert statement against the database. + * + * @param string $query + * @param array $bindings + * @param string|null $sequence + * @return bool + * @static + */ + public static function insert($query, $bindings = [], $sequence = null) + { + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->insert($query, $bindings, $sequence); + } + + /** + * Get the connection's last insert ID. + * + * @return string|int|null + * @static + */ + public static function getLastInsertId() + { + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getLastInsertId(); + } + + /** + * Determine if the connected database is a MariaDB database. + * + * @return bool + * @static + */ + public static function isMaria() + { + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->isMaria(); + } + + /** + * Get the server version for the connection. + * + * @return string + * @static + */ + public static function getServerVersion() + { + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getServerVersion(); + } + + /** + * Get a schema builder instance for the connection. + * + * @return \Illuminate\Database\Schema\MySqlBuilder + * @static + */ + public static function getSchemaBuilder() + { + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getSchemaBuilder(); + } + + /** + * Get the schema state for the connection. + * + * @param \Illuminate\Filesystem\Filesystem|null $files + * @param callable|null $processFactory + * @return \Illuminate\Database\Schema\MySqlSchemaState + * @static + */ + public static function getSchemaState($files = null, $processFactory = null) + { + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getSchemaState($files, $processFactory); + } + + /** + * Set the query grammar to the default implementation. + * + * @return void + * @static + */ + public static function useDefaultQueryGrammar() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->useDefaultQueryGrammar(); + } + + /** + * Set the schema grammar to the default implementation. + * + * @return void + * @static + */ + public static function useDefaultSchemaGrammar() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->useDefaultSchemaGrammar(); + } + + /** + * Set the query post processor to the default implementation. + * + * @return void + * @static + */ + public static function useDefaultPostProcessor() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->useDefaultPostProcessor(); + } + + /** + * Begin a fluent query against a database table. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Contracts\Database\Query\Expression|\UnitEnum|string $table + * @param string|null $as + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function table($table, $as = null) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->table($table, $as); + } + + /** + * Get a new query builder instance. + * + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function query() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->query(); + } + + /** + * Run a select statement and return a single result. + * + * @param string $query + * @param array $bindings + * @param bool $useReadPdo + * @return mixed + * @static + */ + public static function selectOne($query, $bindings = [], $useReadPdo = true) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->selectOne($query, $bindings, $useReadPdo); + } + + /** + * Run a select statement and return the first column of the first row. + * + * @param string $query + * @param array $bindings + * @param bool $useReadPdo + * @return mixed + * @throws \Illuminate\Database\MultipleColumnsSelectedException + * @static + */ + public static function scalar($query, $bindings = [], $useReadPdo = true) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->scalar($query, $bindings, $useReadPdo); + } + + /** + * Run a select statement against the database. + * + * @param string $query + * @param array $bindings + * @return array + * @static + */ + public static function selectFromWriteConnection($query, $bindings = []) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->selectFromWriteConnection($query, $bindings); + } + + /** + * Run a select statement against the database. + * + * @param string $query + * @param array $bindings + * @param bool $useReadPdo + * @return array + * @static + */ + public static function select($query, $bindings = [], $useReadPdo = true) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->select($query, $bindings, $useReadPdo); + } + + /** + * Run a select statement against the database and returns all of the result sets. + * + * @param string $query + * @param array $bindings + * @param bool $useReadPdo + * @return array + * @static + */ + public static function selectResultSets($query, $bindings = [], $useReadPdo = true) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->selectResultSets($query, $bindings, $useReadPdo); + } + + /** + * Run a select statement against the database and returns a generator. + * + * @param string $query + * @param array $bindings + * @param bool $useReadPdo + * @return \Generator + * @static + */ + public static function cursor($query, $bindings = [], $useReadPdo = true) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->cursor($query, $bindings, $useReadPdo); + } + + /** + * Run an update statement against the database. + * + * @param string $query + * @param array $bindings + * @return int + * @static + */ + public static function update($query, $bindings = []) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->update($query, $bindings); + } + + /** + * Run a delete statement against the database. + * + * @param string $query + * @param array $bindings + * @return int + * @static + */ + public static function delete($query, $bindings = []) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->delete($query, $bindings); + } + + /** + * Execute an SQL statement and return the boolean result. + * + * @param string $query + * @param array $bindings + * @return bool + * @static + */ + public static function statement($query, $bindings = []) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->statement($query, $bindings); + } + + /** + * Run an SQL statement and get the number of rows affected. + * + * @param string $query + * @param array $bindings + * @return int + * @static + */ + public static function affectingStatement($query, $bindings = []) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->affectingStatement($query, $bindings); + } + + /** + * Run a raw, unprepared query against the PDO connection. + * + * @param string $query + * @return bool + * @static + */ + public static function unprepared($query) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->unprepared($query); + } + + /** + * Get the number of open connections for the database. + * + * @return int|null + * @static + */ + public static function threadCount() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->threadCount(); + } + + /** + * Execute the given callback in "dry run" mode. + * + * @param (\Closure(\Illuminate\Database\Connection): mixed) $callback + * @return \Illuminate\Database\array{query: string, bindings: array, time: float|null}[] + * @static + */ + public static function pretend($callback) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->pretend($callback); + } + + /** + * Execute the given callback without "pretending". + * + * @param \Closure $callback + * @return mixed + * @static + */ + public static function withoutPretending($callback) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->withoutPretending($callback); + } + + /** + * Bind values to their parameters in the given statement. + * + * @param \PDOStatement $statement + * @param array $bindings + * @return void + * @static + */ + public static function bindValues($statement, $bindings) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->bindValues($statement, $bindings); + } + + /** + * Prepare the query bindings for execution. + * + * @param array $bindings + * @return array + * @static + */ + public static function prepareBindings($bindings) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->prepareBindings($bindings); + } + + /** + * Log a query in the connection's query log. + * + * @param string $query + * @param array $bindings + * @param float|null $time + * @return void + * @static + */ + public static function logQuery($query, $bindings, $time = null) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->logQuery($query, $bindings, $time); + } + + /** + * Register a callback to be invoked when the connection queries for longer than a given amount of time. + * + * @param \DateTimeInterface|\Carbon\CarbonInterval|float|int $threshold + * @param (callable(\Illuminate\Database\Connection, \Illuminate\Database\Events\QueryExecuted): mixed) $handler + * @return void + * @static + */ + public static function whenQueryingForLongerThan($threshold, $handler) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->whenQueryingForLongerThan($threshold, $handler); + } + + /** + * Allow all the query duration handlers to run again, even if they have already run. + * + * @return void + * @static + */ + public static function allowQueryDurationHandlersToRunAgain() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->allowQueryDurationHandlersToRunAgain(); + } + + /** + * Get the duration of all run queries in milliseconds. + * + * @return float + * @static + */ + public static function totalQueryDuration() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->totalQueryDuration(); + } + + /** + * Reset the duration of all run queries. + * + * @return void + * @static + */ + public static function resetTotalQueryDuration() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->resetTotalQueryDuration(); + } + + /** + * Reconnect to the database if a PDO connection is missing. + * + * @return void + * @static + */ + public static function reconnectIfMissingConnection() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->reconnectIfMissingConnection(); + } + + /** + * Register a hook to be run just before a database transaction is started. + * + * @param \Closure $callback + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function beforeStartingTransaction($callback) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->beforeStartingTransaction($callback); + } + + /** + * Register a hook to be run just before a database query is executed. + * + * @param \Closure $callback + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function beforeExecuting($callback) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->beforeExecuting($callback); + } + + /** + * Register a database query listener with the connection. + * + * @param \Closure(\Illuminate\Database\Events\QueryExecuted) $callback + * @return void + * @static + */ + public static function listen($callback) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->listen($callback); + } + + /** + * Get a new raw query expression. + * + * @param mixed $value + * @return \Illuminate\Contracts\Database\Query\Expression + * @static + */ + public static function raw($value) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->raw($value); + } + + /** + * Escape a value for safe SQL embedding. + * + * @param string|float|int|bool|null $value + * @param bool $binary + * @return string + * @throws \RuntimeException + * @static + */ + public static function escape($value, $binary = false) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->escape($value, $binary); + } + + /** + * Determine if the database connection has modified any database records. + * + * @return bool + * @static + */ + public static function hasModifiedRecords() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->hasModifiedRecords(); + } + + /** + * Indicate if any records have been modified. + * + * @param bool $value + * @return void + * @static + */ + public static function recordsHaveBeenModified($value = true) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->recordsHaveBeenModified($value); + } + + /** + * Set the record modification state. + * + * @param bool $value + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setRecordModificationState($value) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setRecordModificationState($value); + } + + /** + * Reset the record modification state. + * + * @return void + * @static + */ + public static function forgetRecordModificationState() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->forgetRecordModificationState(); + } + + /** + * Indicate that the connection should use the write PDO connection for reads. + * + * @param bool $value + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function useWriteConnectionWhenReading($value = true) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->useWriteConnectionWhenReading($value); + } + + /** + * Get the current PDO connection. + * + * @return \PDO + * @static + */ + public static function getPdo() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getPdo(); + } + + /** + * Get the current PDO connection parameter without executing any reconnect logic. + * + * @return \PDO|\Closure|null + * @static + */ + public static function getRawPdo() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getRawPdo(); + } + + /** + * Get the current PDO connection used for reading. + * + * @return \PDO + * @static + */ + public static function getReadPdo() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getReadPdo(); + } + + /** + * Get the current read PDO connection parameter without executing any reconnect logic. + * + * @return \PDO|\Closure|null + * @static + */ + public static function getRawReadPdo() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getRawReadPdo(); + } + + /** + * Set the PDO connection. + * + * @param \PDO|\Closure|null $pdo + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setPdo($pdo) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setPdo($pdo); + } + + /** + * Set the PDO connection used for reading. + * + * @param \PDO|\Closure|null $pdo + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setReadPdo($pdo) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setReadPdo($pdo); + } + + /** + * Set the read PDO connection configuration. + * + * @param array $config + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setReadPdoConfig($config) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setReadPdoConfig($config); + } + + /** + * Get the database connection name. + * + * @return string|null + * @static + */ + public static function getName() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getName(); + } + + /** + * Get the database connection with its read / write type. + * + * @return string|null + * @static + */ + public static function getNameWithReadWriteType() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getNameWithReadWriteType(); + } + + /** + * Get an option from the configuration options. + * + * @param string|null $option + * @return mixed + * @static + */ + public static function getConfig($option = null) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getConfig($option); + } + + /** + * Get the PDO driver name. + * + * @return string + * @static + */ + public static function getDriverName() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getDriverName(); + } + + /** + * Get the query grammar used by the connection. + * + * @return \Illuminate\Database\Query\Grammars\Grammar + * @static + */ + public static function getQueryGrammar() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getQueryGrammar(); + } + + /** + * Set the query grammar used by the connection. + * + * @param \Illuminate\Database\Query\Grammars\Grammar $grammar + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setQueryGrammar($grammar) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setQueryGrammar($grammar); + } + + /** + * Get the schema grammar used by the connection. + * + * @return \Illuminate\Database\Schema\Grammars\Grammar + * @static + */ + public static function getSchemaGrammar() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getSchemaGrammar(); + } + + /** + * Set the schema grammar used by the connection. + * + * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setSchemaGrammar($grammar) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setSchemaGrammar($grammar); + } + + /** + * Get the query post processor used by the connection. + * + * @return \Illuminate\Database\Query\Processors\Processor + * @static + */ + public static function getPostProcessor() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getPostProcessor(); + } + + /** + * Set the query post processor used by the connection. + * + * @param \Illuminate\Database\Query\Processors\Processor $processor + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setPostProcessor($processor) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setPostProcessor($processor); + } + + /** + * Get the event dispatcher used by the connection. + * + * @return \Illuminate\Contracts\Events\Dispatcher|null + * @static + */ + public static function getEventDispatcher() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getEventDispatcher(); + } + + /** + * Set the event dispatcher instance on the connection. + * + * @param \Illuminate\Contracts\Events\Dispatcher $events + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setEventDispatcher($events) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setEventDispatcher($events); + } + + /** + * Unset the event dispatcher for this connection. + * + * @return void + * @static + */ + public static function unsetEventDispatcher() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->unsetEventDispatcher(); + } + + /** + * Set the transaction manager instance on the connection. + * + * @param \Illuminate\Database\DatabaseTransactionsManager $manager + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setTransactionManager($manager) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setTransactionManager($manager); + } + + /** + * Unset the transaction manager for this connection. + * + * @return void + * @static + */ + public static function unsetTransactionManager() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->unsetTransactionManager(); + } + + /** + * Determine if the connection is in a "dry run". + * + * @return bool + * @static + */ + public static function pretending() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->pretending(); + } + + /** + * Get the connection query log. + * + * @return \Illuminate\Database\array{query: string, bindings: array, time: float|null}[] + * @static + */ + public static function getQueryLog() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getQueryLog(); + } + + /** + * Get the connection query log with embedded bindings. + * + * @return array + * @static + */ + public static function getRawQueryLog() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getRawQueryLog(); + } + + /** + * Clear the query log. + * + * @return void + * @static + */ + public static function flushQueryLog() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->flushQueryLog(); + } + + /** + * Enable the query log on the connection. + * + * @return void + * @static + */ + public static function enableQueryLog() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->enableQueryLog(); + } + + /** + * Disable the query log on the connection. + * + * @return void + * @static + */ + public static function disableQueryLog() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->disableQueryLog(); + } + + /** + * Determine whether we're logging queries. + * + * @return bool + * @static + */ + public static function logging() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->logging(); + } + + /** + * Get the name of the connected database. + * + * @return string + * @static + */ + public static function getDatabaseName() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getDatabaseName(); + } + + /** + * Set the name of the connected database. + * + * @param string $database + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setDatabaseName($database) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setDatabaseName($database); + } + + /** + * Set the read / write type of the connection. + * + * @param string|null $readWriteType + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setReadWriteType($readWriteType) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setReadWriteType($readWriteType); + } + + /** + * Get the table prefix for the connection. + * + * @return string + * @static + */ + public static function getTablePrefix() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->getTablePrefix(); + } + + /** + * Set the table prefix in use by the connection. + * + * @param string $prefix + * @return \Illuminate\Database\MySqlConnection + * @static + */ + public static function setTablePrefix($prefix) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->setTablePrefix($prefix); + } + + /** + * Execute the given callback without table prefix. + * + * @param \Closure $callback + * @return mixed + * @static + */ + public static function withoutTablePrefix($callback) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->withoutTablePrefix($callback); + } + + /** + * Register a connection resolver. + * + * @param string $driver + * @param \Closure $callback + * @return void + * @static + */ + public static function resolverFor($driver, $callback) + { + //Method inherited from \Illuminate\Database\Connection + \Illuminate\Database\MySqlConnection::resolverFor($driver, $callback); + } + + /** + * Get the connection resolver for the given driver. + * + * @param string $driver + * @return \Closure|null + * @static + */ + public static function getResolver($driver) + { + //Method inherited from \Illuminate\Database\Connection + return \Illuminate\Database\MySqlConnection::getResolver($driver); + } + + /** + * @template TReturn of mixed + * + * Execute a Closure within a transaction. + * @param (\Closure(static): TReturn) $callback + * @param int $attempts + * @return TReturn + * @throws \Throwable + * @static + */ + public static function transaction($callback, $attempts = 1) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->transaction($callback, $attempts); + } + + /** + * Start a new database transaction. + * + * @return void + * @throws \Throwable + * @static + */ + public static function beginTransaction() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->beginTransaction(); + } + + /** + * Commit the active database transaction. + * + * @return void + * @throws \Throwable + * @static + */ + public static function commit() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->commit(); + } + + /** + * Rollback the active database transaction. + * + * @param int|null $toLevel + * @return void + * @throws \Throwable + * @static + */ + public static function rollBack($toLevel = null) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->rollBack($toLevel); + } + + /** + * Get the number of active transactions. + * + * @return int + * @static + */ + public static function transactionLevel() + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + return $instance->transactionLevel(); + } + + /** + * Execute the callback after a transaction commits. + * + * @param callable $callback + * @return void + * @throws \RuntimeException + * @static + */ + public static function afterCommit($callback) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->afterCommit($callback); + } + + /** + * Execute the callback after a transaction rolls back. + * + * @param callable $callback + * @return void + * @throws \RuntimeException + * @static + */ + public static function afterRollBack($callback) + { + //Method inherited from \Illuminate\Database\Connection + /** @var \Illuminate\Database\MySqlConnection $instance */ + $instance->afterRollBack($callback); + } + + } + /** + * @see \Illuminate\Events\Dispatcher + * @see \Illuminate\Support\Testing\Fakes\EventFake + */ + class Event { + /** + * Register an event listener with the dispatcher. + * + * @param \Illuminate\Events\Queued\Closure|callable|array|class-string|string $events + * @param \Illuminate\Events\Queued\Closure|callable|array|class-string|null $listener + * @return void + * @static + */ + public static function listen($events, $listener = null) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + $instance->listen($events, $listener); + } + + /** + * Determine if a given event has listeners. + * + * @param string $eventName + * @return bool + * @static + */ + public static function hasListeners($eventName) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->hasListeners($eventName); + } + + /** + * Determine if the given event has any wildcard listeners. + * + * @param string $eventName + * @return bool + * @static + */ + public static function hasWildcardListeners($eventName) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->hasWildcardListeners($eventName); + } + + /** + * Register an event and payload to be fired later. + * + * @param string $event + * @param object|array $payload + * @return void + * @static + */ + public static function push($event, $payload = []) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + $instance->push($event, $payload); + } + + /** + * Flush a set of pushed events. + * + * @param string $event + * @return void + * @static + */ + public static function flush($event) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + $instance->flush($event); + } + + /** + * Register an event subscriber with the dispatcher. + * + * @param object|string $subscriber + * @return void + * @static + */ + public static function subscribe($subscriber) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + $instance->subscribe($subscriber); + } + + /** + * Fire an event until the first non-null response is returned. + * + * @param string|object $event + * @param mixed $payload + * @return array|null + * @static + */ + public static function until($event, $payload = []) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->until($event, $payload); + } + + /** + * Fire an event and call the listeners. + * + * @param string|object $event + * @param mixed $payload + * @param bool $halt + * @return array|null + * @static + */ + public static function dispatch($event, $payload = [], $halt = false) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->dispatch($event, $payload, $halt); + } + + /** + * Get all of the listeners for a given event name. + * + * @param string $eventName + * @return array + * @static + */ + public static function getListeners($eventName) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->getListeners($eventName); + } + + /** + * Register an event listener with the dispatcher. + * + * @param \Closure|string|array{class-string, string} $listener + * @param bool $wildcard + * @return \Closure + * @static + */ + public static function makeListener($listener, $wildcard = false) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->makeListener($listener, $wildcard); + } + + /** + * Create a class based listener using the IoC container. + * + * @param string $listener + * @param bool $wildcard + * @return \Closure + * @static + */ + public static function createClassListener($listener, $wildcard = false) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->createClassListener($listener, $wildcard); + } + + /** + * Remove a set of listeners from the dispatcher. + * + * @param string $event + * @return void + * @static + */ + public static function forget($event) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + $instance->forget($event); + } + + /** + * Forget all of the pushed listeners. + * + * @return void + * @static + */ + public static function forgetPushed() + { + /** @var \Illuminate\Events\Dispatcher $instance */ + $instance->forgetPushed(); + } + + /** + * Set the queue resolver implementation. + * + * @param callable(): \Illuminate\Contracts\Queue\Queue $resolver + * @return \Illuminate\Events\Dispatcher + * @static + */ + public static function setQueueResolver($resolver) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->setQueueResolver($resolver); + } + + /** + * Set the database transaction manager resolver implementation. + * + * @param (callable(): (\Illuminate\Database\DatabaseTransactionsManager|null)) $resolver + * @return \Illuminate\Events\Dispatcher + * @static + */ + public static function setTransactionManagerResolver($resolver) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->setTransactionManagerResolver($resolver); + } + + /** + * Execute the given callback while deferring events, then dispatch all deferred events. + * + * @template TResult + * @param callable(): TResult $callback + * @param string[]|null $events + * @return TResult + * @static + */ + public static function defer($callback, $events = null) + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->defer($callback, $events); + } + + /** + * Gets the raw, unprepared listeners. + * + * @return array + * @static + */ + public static function getRawListeners() + { + /** @var \Illuminate\Events\Dispatcher $instance */ + return $instance->getRawListeners(); + } + + /** + * 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\Events\Dispatcher::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\Events\Dispatcher::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Events\Dispatcher::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Events\Dispatcher::flushMacros(); + } + + /** + * Specify the events that should be dispatched instead of faked. + * + * @param array|string $eventsToDispatch + * @return \Illuminate\Support\Testing\Fakes\EventFake + * @static + */ + public static function except($eventsToDispatch) + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + return $instance->except($eventsToDispatch); + } + + /** + * Assert if an event has a listener attached to it. + * + * @param string $expectedEvent + * @param string|array $expectedListener + * @return void + * @static + */ + public static function assertListening($expectedEvent, $expectedListener) + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + $instance->assertListening($expectedEvent, $expectedListener); + } + + /** + * Assert if an event was dispatched based on a truth-test callback. + * + * @param string|\Closure $event + * @param callable|int|null $callback + * @return void + * @static + */ + public static function assertDispatched($event, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + $instance->assertDispatched($event, $callback); + } + + /** + * Assert if an event was dispatched exactly once. + * + * @param string $event + * @return void + * @static + */ + public static function assertDispatchedOnce($event) + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + $instance->assertDispatchedOnce($event); + } + + /** + * Assert if an event was dispatched a number of times. + * + * @param string $event + * @param int $times + * @return void + * @static + */ + public static function assertDispatchedTimes($event, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + $instance->assertDispatchedTimes($event, $times); + } + + /** + * Determine if an event was dispatched based on a truth-test callback. + * + * @param string|\Closure $event + * @param callable|null $callback + * @return void + * @static + */ + public static function assertNotDispatched($event, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + $instance->assertNotDispatched($event, $callback); + } + + /** + * Assert that no events were dispatched. + * + * @return void + * @static + */ + public static function assertNothingDispatched() + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + $instance->assertNothingDispatched(); + } + + /** + * Get all of the events matching a truth-test callback. + * + * @param string $event + * @param callable|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function dispatched($event, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + return $instance->dispatched($event, $callback); + } + + /** + * Determine if the given event has been dispatched. + * + * @param string $event + * @return bool + * @static + */ + public static function hasDispatched($event) + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + return $instance->hasDispatched($event); + } + + /** + * Get the events that have been dispatched. + * + * @return array + * @static + */ + public static function dispatchedEvents() + { + /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ + return $instance->dispatchedEvents(); + } + + } + /** + * @see \Illuminate\Filesystem\Filesystem + */ + class File { + /** + * Determine if a file or directory exists. + * + * @param string $path + * @return bool + * @static + */ + public static function exists($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->exists($path); + } + + /** + * Determine if a file or directory is missing. + * + * @param string $path + * @return bool + * @static + */ + public static function missing($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->missing($path); + } + + /** + * Get the contents of a file. + * + * @param string $path + * @param bool $lock + * @return string + * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException + * @static + */ + public static function get($path, $lock = false) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->get($path, $lock); + } + + /** + * Get the contents of a file as decoded JSON. + * + * @param string $path + * @param int $flags + * @param bool $lock + * @return array + * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException + * @static + */ + public static function json($path, $flags = 0, $lock = false) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->json($path, $flags, $lock); + } + + /** + * Get contents of a file with shared access. + * + * @param string $path + * @return string + * @static + */ + public static function sharedGet($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->sharedGet($path); + } + + /** + * Get the returned value of a file. + * + * @param string $path + * @param array $data + * @return mixed + * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException + * @static + */ + public static function getRequire($path, $data = []) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->getRequire($path, $data); + } + + /** + * Require the given file once. + * + * @param string $path + * @param array $data + * @return mixed + * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException + * @static + */ + public static function requireOnce($path, $data = []) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->requireOnce($path, $data); + } + + /** + * Get the contents of a file one line at a time. + * + * @param string $path + * @return \Illuminate\Support\LazyCollection + * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException + * @static + */ + public static function lines($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->lines($path); + } + + /** + * Get the hash of the file at the given path. + * + * @param string $path + * @param string $algorithm + * @return string|false + * @static + */ + public static function hash($path, $algorithm = 'md5') + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->hash($path, $algorithm); + } + + /** + * Write the contents of a file. + * + * @param string $path + * @param string $contents + * @param bool $lock + * @return int|bool + * @static + */ + public static function put($path, $contents, $lock = false) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->put($path, $contents, $lock); + } + + /** + * Write the contents of a file, replacing it atomically if it already exists. + * + * @param string $path + * @param string $content + * @param int|null $mode + * @return void + * @static + */ + public static function replace($path, $content, $mode = null) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + $instance->replace($path, $content, $mode); + } + + /** + * Replace a given string within a given file. + * + * @param array|string $search + * @param array|string $replace + * @param string $path + * @return void + * @static + */ + public static function replaceInFile($search, $replace, $path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + $instance->replaceInFile($search, $replace, $path); + } + + /** + * Prepend to a file. + * + * @param string $path + * @param string $data + * @return int + * @static + */ + public static function prepend($path, $data) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->prepend($path, $data); + } + + /** + * Append to a file. + * + * @param string $path + * @param string $data + * @param bool $lock + * @return int + * @static + */ + public static function append($path, $data, $lock = false) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->append($path, $data, $lock); + } + + /** + * Get or set UNIX mode of a file or directory. + * + * @param string $path + * @param int|null $mode + * @return mixed + * @static + */ + public static function chmod($path, $mode = null) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->chmod($path, $mode); + } + + /** + * Delete the file at a given path. + * + * @param string|array $paths + * @return bool + * @static + */ + public static function delete($paths) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->delete($paths); + } + + /** + * Move a file to a new location. + * + * @param string $path + * @param string $target + * @return bool + * @static + */ + public static function move($path, $target) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->move($path, $target); + } + + /** + * Copy a file to a new location. + * + * @param string $path + * @param string $target + * @return bool + * @static + */ + public static function copy($path, $target) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->copy($path, $target); + } + + /** + * Create a symlink to the target file or directory. On Windows, a hard link is created if the target is a file. + * + * @param string $target + * @param string $link + * @return bool|null + * @static + */ + public static function link($target, $link) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->link($target, $link); + } + + /** + * Create a relative symlink to the target file or directory. + * + * @param string $target + * @param string $link + * @return void + * @throws \RuntimeException + * @static + */ + public static function relativeLink($target, $link) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + $instance->relativeLink($target, $link); + } + + /** + * Extract the file name from a file path. + * + * @param string $path + * @return string + * @static + */ + public static function name($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->name($path); + } + + /** + * Extract the trailing name component from a file path. + * + * @param string $path + * @return string + * @static + */ + public static function basename($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->basename($path); + } + + /** + * Extract the parent directory from a file path. + * + * @param string $path + * @return string + * @static + */ + public static function dirname($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->dirname($path); + } + + /** + * Extract the file extension from a file path. + * + * @param string $path + * @return string + * @static + */ + public static function extension($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->extension($path); + } + + /** + * Guess the file extension from the MIME type of a given file. + * + * @param string $path + * @return string|null + * @throws \RuntimeException + * @static + */ + public static function guessExtension($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->guessExtension($path); + } + + /** + * Get the file type of a given file. + * + * @param string $path + * @return string|false + * @static + */ + public static function type($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->type($path); + } + + /** + * Get the MIME type of a given file. + * + * @param string $path + * @return string|false + * @static + */ + public static function mimeType($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->mimeType($path); + } + + /** + * Get the file size of a given file. + * + * @param string $path + * @return int + * @static + */ + public static function size($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->size($path); + } + + /** + * Get the file's last modification time. + * + * @param string $path + * @return int + * @static + */ + public static function lastModified($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->lastModified($path); + } + + /** + * Determine if the given path is a directory. + * + * @param string $directory + * @return bool + * @static + */ + public static function isDirectory($directory) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->isDirectory($directory); + } + + /** + * Determine if the given path is a directory that does not contain any other files or directories. + * + * @param string $directory + * @param bool $ignoreDotFiles + * @return bool + * @static + */ + public static function isEmptyDirectory($directory, $ignoreDotFiles = false) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->isEmptyDirectory($directory, $ignoreDotFiles); + } + + /** + * Determine if the given path is readable. + * + * @param string $path + * @return bool + * @static + */ + public static function isReadable($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->isReadable($path); + } + + /** + * Determine if the given path is writable. + * + * @param string $path + * @return bool + * @static + */ + public static function isWritable($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->isWritable($path); + } + + /** + * Determine if two files are the same by comparing their hashes. + * + * @param string $firstFile + * @param string $secondFile + * @return bool + * @static + */ + public static function hasSameHash($firstFile, $secondFile) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->hasSameHash($firstFile, $secondFile); + } + + /** + * Determine if the given path is a file. + * + * @param string $file + * @return bool + * @static + */ + public static function isFile($file) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->isFile($file); + } + + /** + * Find path names matching a given pattern. + * + * @param string $pattern + * @param int $flags + * @return array + * @static + */ + public static function glob($pattern, $flags = 0) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->glob($pattern, $flags); + } + + /** + * Get an array of all files in a directory. + * + * @param string $directory + * @param bool $hidden + * @return \Symfony\Component\Finder\SplFileInfo[] + * @static + */ + public static function files($directory, $hidden = false, $depth = 0) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->files($directory, $hidden, $depth); + } + + /** + * Get all of the files from the given directory (recursive). + * + * @param string $directory + * @param bool $hidden + * @return \Symfony\Component\Finder\SplFileInfo[] + * @static + */ + public static function allFiles($directory, $hidden = false) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->allFiles($directory, $hidden); + } + + /** + * Get all of the directories within a given directory. + * + * @param string $directory + * @return array + * @static + */ + public static function directories($directory, $depth = 0) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->directories($directory, $depth); + } + + /** + * Get all the directories within a given directory (recursive). + * + * @return array + * @static + */ + public static function allDirectories($directory) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->allDirectories($directory); + } + + /** + * Ensure a directory exists. + * + * @param string $path + * @param int $mode + * @param bool $recursive + * @return void + * @static + */ + public static function ensureDirectoryExists($path, $mode = 493, $recursive = true) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + $instance->ensureDirectoryExists($path, $mode, $recursive); + } + + /** + * Create a directory. + * + * @param string $path + * @param int $mode + * @param bool $recursive + * @param bool $force + * @return bool + * @static + */ + public static function makeDirectory($path, $mode = 493, $recursive = false, $force = false) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->makeDirectory($path, $mode, $recursive, $force); + } + + /** + * Move a directory. + * + * @param string $from + * @param string $to + * @param bool $overwrite + * @return bool + * @static + */ + public static function moveDirectory($from, $to, $overwrite = false) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->moveDirectory($from, $to, $overwrite); + } + + /** + * Copy a directory from one location to another. + * + * @param string $directory + * @param string $destination + * @param int|null $options + * @return bool + * @static + */ + public static function copyDirectory($directory, $destination, $options = null) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->copyDirectory($directory, $destination, $options); + } + + /** + * Recursively delete a directory. + * + * The directory itself may be optionally preserved. + * + * @param string $directory + * @param bool $preserve + * @return bool + * @static + */ + public static function deleteDirectory($directory, $preserve = false) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->deleteDirectory($directory, $preserve); + } + + /** + * Remove all of the directories within a given directory. + * + * @param string $directory + * @return bool + * @static + */ + public static function deleteDirectories($directory) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->deleteDirectories($directory); + } + + /** + * Empty the specified directory of all files and folders. + * + * @param string $directory + * @return bool + * @static + */ + public static function cleanDirectory($directory) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->cleanDirectory($directory); + } + + /** + * 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\Filesystem\Filesystem $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\Filesystem\Filesystem $instance */ + return $instance->unless($value, $callback, $default); + } + + /** + * 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\Filesystem\Filesystem::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\Filesystem\Filesystem::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Filesystem\Filesystem::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Filesystem\Filesystem::flushMacros(); + } + + } + /** + * @see \Illuminate\Auth\Access\Gate + */ + class Gate { + /** + * Determine if a given ability has been defined. + * + * @param \UnitEnum|array|string $ability + * @return bool + * @static + */ + public static function has($ability) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->has($ability); + } + + /** + * Perform an on-demand authorization check. Throw an authorization exception if the condition or callback is false. + * + * @param \Illuminate\Auth\Access\Response|\Closure|bool $condition + * @param string|null $message + * @param string|null $code + * @return \Illuminate\Auth\Access\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + * @static + */ + public static function allowIf($condition, $message = null, $code = null) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->allowIf($condition, $message, $code); + } + + /** + * Perform an on-demand authorization check. Throw an authorization exception if the condition or callback is true. + * + * @param \Illuminate\Auth\Access\Response|\Closure|bool $condition + * @param string|null $message + * @param string|null $code + * @return \Illuminate\Auth\Access\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + * @static + */ + public static function denyIf($condition, $message = null, $code = null) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->denyIf($condition, $message, $code); + } + + /** + * Define a new ability. + * + * @param \UnitEnum|string $ability + * @param callable|array|string $callback + * @return \Illuminate\Auth\Access\Gate + * @throws \InvalidArgumentException + * @static + */ + public static function define($ability, $callback) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->define($ability, $callback); + } + + /** + * Define abilities for a resource. + * + * @param string $name + * @param string $class + * @param array|null $abilities + * @return \Illuminate\Auth\Access\Gate + * @static + */ + public static function resource($name, $class, $abilities = null) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->resource($name, $class, $abilities); + } + + /** + * Define a policy class for a given class type. + * + * @param string $class + * @param string $policy + * @return \Illuminate\Auth\Access\Gate + * @static + */ + public static function policy($class, $policy) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->policy($class, $policy); + } + + /** + * Register a callback to run before all Gate checks. + * + * @param callable $callback + * @return \Illuminate\Auth\Access\Gate + * @static + */ + public static function before($callback) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->before($callback); + } + + /** + * Register a callback to run after all Gate checks. + * + * @param callable $callback + * @return \Illuminate\Auth\Access\Gate + * @static + */ + public static function after($callback) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->after($callback); + } + + /** + * Determine if all of the given abilities should be granted for the current user. + * + * @param iterable|\UnitEnum|string $ability + * @param mixed $arguments + * @return bool + * @static + */ + public static function allows($ability, $arguments = []) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->allows($ability, $arguments); + } + + /** + * Determine if any of the given abilities should be denied for the current user. + * + * @param iterable|\UnitEnum|string $ability + * @param mixed $arguments + * @return bool + * @static + */ + public static function denies($ability, $arguments = []) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->denies($ability, $arguments); + } + + /** + * Determine if all of the given abilities should be granted for the current user. + * + * @param iterable|\UnitEnum|string $abilities + * @param mixed $arguments + * @return bool + * @static + */ + public static function check($abilities, $arguments = []) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->check($abilities, $arguments); + } + + /** + * Determine if any one of the given abilities should be granted for the current user. + * + * @param iterable|\UnitEnum|string $abilities + * @param mixed $arguments + * @return bool + * @static + */ + public static function any($abilities, $arguments = []) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->any($abilities, $arguments); + } + + /** + * Determine if all of the given abilities should be denied for the current user. + * + * @param iterable|\UnitEnum|string $abilities + * @param mixed $arguments + * @return bool + * @static + */ + public static function none($abilities, $arguments = []) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->none($abilities, $arguments); + } + + /** + * Determine if the given ability should be granted for the current user. + * + * @param \UnitEnum|string $ability + * @param mixed $arguments + * @return \Illuminate\Auth\Access\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + * @static + */ + public static function authorize($ability, $arguments = []) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->authorize($ability, $arguments); + } + + /** + * Inspect the user for the given ability. + * + * @param \UnitEnum|string $ability + * @param mixed $arguments + * @return \Illuminate\Auth\Access\Response + * @static + */ + public static function inspect($ability, $arguments = []) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->inspect($ability, $arguments); + } + + /** + * Get the raw result from the authorization callback. + * + * @param string $ability + * @param mixed $arguments + * @return mixed + * @throws \Illuminate\Auth\Access\AuthorizationException + * @static + */ + public static function raw($ability, $arguments = []) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->raw($ability, $arguments); + } + + /** + * Get a policy instance for a given class. + * + * @param object|string $class + * @return mixed + * @static + */ + public static function getPolicyFor($class) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->getPolicyFor($class); + } + + /** + * Specify a callback to be used to guess policy names. + * + * @param callable $callback + * @return \Illuminate\Auth\Access\Gate + * @static + */ + public static function guessPolicyNamesUsing($callback) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->guessPolicyNamesUsing($callback); + } + + /** + * Build a policy class instance of the given type. + * + * @param object|string $class + * @return mixed + * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @static + */ + public static function resolvePolicy($class) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->resolvePolicy($class); + } + + /** + * Get a gate instance for the given user. + * + * @param \Illuminate\Contracts\Auth\Authenticatable|mixed $user + * @return static + * @static + */ + public static function forUser($user) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->forUser($user); + } + + /** + * Get all of the defined abilities. + * + * @return array + * @static + */ + public static function abilities() + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->abilities(); + } + + /** + * Get all of the defined policies. + * + * @return array + * @static + */ + public static function policies() + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->policies(); + } + + /** + * Set the default denial response for gates and policies. + * + * @param \Illuminate\Auth\Access\Response $response + * @return \Illuminate\Auth\Access\Gate + * @static + */ + public static function defaultDenialResponse($response) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->defaultDenialResponse($response); + } + + /** + * Set the container instance used by the gate. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Auth\Access\Gate + * @static + */ + public static function setContainer($container) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->setContainer($container); + } + + /** + * Deny with a HTTP status code. + * + * @param int $status + * @param string|null $message + * @param int|null $code + * @return \Illuminate\Auth\Access\Response + * @static + */ + public static function denyWithStatus($status, $message = null, $code = null) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->denyWithStatus($status, $message, $code); + } + + /** + * Deny with a 404 HTTP status code. + * + * @param string|null $message + * @param int|null $code + * @return \Illuminate\Auth\Access\Response + * @static + */ + public static function denyAsNotFound($message = null, $code = null) + { + /** @var \Illuminate\Auth\Access\Gate $instance */ + return $instance->denyAsNotFound($message, $code); + } + + } + /** + * @see \Illuminate\Hashing\HashManager + * @see \Illuminate\Hashing\AbstractHasher + */ + class Hash { + /** + * Create an instance of the Bcrypt hash Driver. + * + * @return \Illuminate\Hashing\BcryptHasher + * @static + */ + public static function createBcryptDriver() + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->createBcryptDriver(); + } + + /** + * Create an instance of the Argon2i hash Driver. + * + * @return \Illuminate\Hashing\ArgonHasher + * @static + */ + public static function createArgonDriver() + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->createArgonDriver(); + } + + /** + * Create an instance of the Argon2id hash Driver. + * + * @return \Illuminate\Hashing\Argon2IdHasher + * @static + */ + public static function createArgon2idDriver() + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->createArgon2idDriver(); + } + + /** + * Get information about the given hashed value. + * + * @param string $hashedValue + * @return array + * @static + */ + public static function info($hashedValue) + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->info($hashedValue); + } + + /** + * Hash the given value. + * + * @param string $value + * @param array $options + * @return string + * @static + */ + public static function make($value, $options = []) + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->make($value, $options); + } + + /** + * Check the given plain value against a hash. + * + * @param string $value + * @param string $hashedValue + * @param array $options + * @return bool + * @static + */ + public static function check($value, $hashedValue, $options = []) + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->check($value, $hashedValue, $options); + } + + /** + * Check if the given hash has been hashed using the given options. + * + * @param string $hashedValue + * @param array $options + * @return bool + * @static + */ + public static function needsRehash($hashedValue, $options = []) + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->needsRehash($hashedValue, $options); + } + + /** + * Determine if a given string is already hashed. + * + * @param string $value + * @return bool + * @static + */ + public static function isHashed($value) + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->isHashed($value); + } + + /** + * Get the default driver name. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Verifies that the configuration is less than or equal to what is configured. + * + * @param array $value + * @return bool + * @internal + * @static + */ + public static function verifyConfiguration($value) + { + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->verifyConfiguration($value); + } + + /** + * Get a driver instance. + * + * @param string|null $driver + * @return mixed + * @throws \InvalidArgumentException + * @static + */ + public static function driver($driver = null) + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->driver($driver); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return \Illuminate\Hashing\HashManager + * @static + */ + public static function extend($driver, $callback) + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->extend($driver, $callback); + } + + /** + * Get all of the created "drivers". + * + * @return array + * @static + */ + public static function getDrivers() + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->getDrivers(); + } + + /** + * Get the container instance used by the manager. + * + * @return \Illuminate\Contracts\Container\Container + * @static + */ + public static function getContainer() + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->getContainer(); + } + + /** + * Set the container instance used by the manager. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Hashing\HashManager + * @static + */ + public static function setContainer($container) + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->setContainer($container); + } + + /** + * Forget all of the resolved driver instances. + * + * @return \Illuminate\Hashing\HashManager + * @static + */ + public static function forgetDrivers() + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Hashing\HashManager $instance */ + return $instance->forgetDrivers(); + } + + } + /** + * @method static \Illuminate\Http\Client\PendingRequest baseUrl(string $url) + * @method static \Illuminate\Http\Client\PendingRequest withBody(\Psr\Http\Message\StreamInterface|string $content, string $contentType = 'application/json') + * @method static \Illuminate\Http\Client\PendingRequest asJson() + * @method static \Illuminate\Http\Client\PendingRequest asForm() + * @method static \Illuminate\Http\Client\PendingRequest attach(string|array $name, string|resource $contents = '', string|null $filename = null, array $headers = []) + * @method static \Illuminate\Http\Client\PendingRequest asMultipart() + * @method static \Illuminate\Http\Client\PendingRequest bodyFormat(string $format) + * @method static \Illuminate\Http\Client\PendingRequest withQueryParameters(array $parameters) + * @method static \Illuminate\Http\Client\PendingRequest contentType(string $contentType) + * @method static \Illuminate\Http\Client\PendingRequest acceptJson() + * @method static \Illuminate\Http\Client\PendingRequest accept(string $contentType) + * @method static \Illuminate\Http\Client\PendingRequest withHeaders(array $headers) + * @method static \Illuminate\Http\Client\PendingRequest withHeader(string $name, mixed $value) + * @method static \Illuminate\Http\Client\PendingRequest replaceHeaders(array $headers) + * @method static \Illuminate\Http\Client\PendingRequest withBasicAuth(string $username, string $password) + * @method static \Illuminate\Http\Client\PendingRequest withDigestAuth(string $username, string $password) + * @method static \Illuminate\Http\Client\PendingRequest withNtlmAuth(string $username, string $password) + * @method static \Illuminate\Http\Client\PendingRequest withToken(string $token, string $type = 'Bearer') + * @method static \Illuminate\Http\Client\PendingRequest withUserAgent(string|bool $userAgent) + * @method static \Illuminate\Http\Client\PendingRequest withUrlParameters(array $parameters = []) + * @method static \Illuminate\Http\Client\PendingRequest withCookies(array $cookies, string $domain) + * @method static \Illuminate\Http\Client\PendingRequest maxRedirects(int $max) + * @method static \Illuminate\Http\Client\PendingRequest withoutRedirecting() + * @method static \Illuminate\Http\Client\PendingRequest withoutVerifying() + * @method static \Illuminate\Http\Client\PendingRequest sink(string|resource $to) + * @method static \Illuminate\Http\Client\PendingRequest timeout(int|float $seconds) + * @method static \Illuminate\Http\Client\PendingRequest connectTimeout(int|float $seconds) + * @method static \Illuminate\Http\Client\PendingRequest retry(array|int $times, \Closure|int $sleepMilliseconds = 0, callable|null $when = null, bool $throw = true) + * @method static \Illuminate\Http\Client\PendingRequest withOptions(array $options) + * @method static \Illuminate\Http\Client\PendingRequest withMiddleware(callable $middleware) + * @method static \Illuminate\Http\Client\PendingRequest withRequestMiddleware(callable $middleware) + * @method static \Illuminate\Http\Client\PendingRequest withResponseMiddleware(callable $middleware) + * @method static \Illuminate\Http\Client\PendingRequest withAttributes(array $attributes) + * @method static \Illuminate\Http\Client\PendingRequest beforeSending(callable $callback) + * @method static \Illuminate\Http\Client\PendingRequest afterResponse(callable|null $callback) + * @method static \Illuminate\Http\Client\PendingRequest throw(callable|null $callback = null) + * @method static \Illuminate\Http\Client\PendingRequest throwIf(callable|bool $condition) + * @method static \Illuminate\Http\Client\PendingRequest throwUnless(callable|bool $condition) + * @method static \Illuminate\Http\Client\PendingRequest dump() + * @method static \Illuminate\Http\Client\PendingRequest dd() + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface get(string $url, array|string|null $query = null) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface head(string $url, array|string|null $query = null) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface post(string $url, array|\JsonSerializable|\Illuminate\Contracts\Support\Arrayable $data = []) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface patch(string $url, array|\JsonSerializable|\Illuminate\Contracts\Support\Arrayable $data = []) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface put(string $url, array|\JsonSerializable|\Illuminate\Contracts\Support\Arrayable $data = []) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface delete(string $url, array|\JsonSerializable|\Illuminate\Contracts\Support\Arrayable $data = []) + * @method static array pool(callable $callback, int|null $concurrency = null) + * @method static \Illuminate\Http\Client\Batch batch(callable $callback) + * @method static \Illuminate\Http\Client\Response|\Illuminate\Http\Client\Promises\LazyPromise send(string $method, string $url, array $options = []) + * @method static \GuzzleHttp\Client buildClient() + * @method static \GuzzleHttp\Client createClient(\GuzzleHttp\HandlerStack $handlerStack) + * @method static \GuzzleHttp\HandlerStack buildHandlerStack() + * @method static \GuzzleHttp\HandlerStack pushHandlers(\GuzzleHttp\HandlerStack $handlerStack) + * @method static \Closure buildBeforeSendingHandler() + * @method static \Closure buildRecorderHandler() + * @method static \Closure buildStubHandler() + * @method static \Psr\Http\Message\RequestInterface runBeforeSendingCallbacks(\Psr\Http\Message\RequestInterface $request, array $options) + * @method static array mergeOptions(array ...$options) + * @method static \Illuminate\Http\Client\PendingRequest stub(callable $callback) + * @method static bool isAllowedRequestUrl(string $url) + * @method static \Illuminate\Http\Client\PendingRequest async(bool $async = true) + * @method static \GuzzleHttp\Promise\PromiseInterface|null getPromise() + * @method static \Illuminate\Http\Client\PendingRequest truncateExceptionsAt(int $length) + * @method static \Illuminate\Http\Client\PendingRequest dontTruncateExceptions() + * @method static \Illuminate\Http\Client\PendingRequest setClient(\GuzzleHttp\Client $client) + * @method static \Illuminate\Http\Client\PendingRequest setHandler(callable $handler) + * @method static array getOptions() + * @method static \Illuminate\Http\Client\PendingRequest|mixed when(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) + * @method static \Illuminate\Http\Client\PendingRequest|mixed unless(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) + * @see \Illuminate\Http\Client\Factory + */ + class Http { + /** + * Add middleware to apply to every request. + * + * @param callable $middleware + * @return \Illuminate\Http\Client\Factory + * @static + */ + public static function globalMiddleware($middleware) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->globalMiddleware($middleware); + } + + /** + * Add request middleware to apply to every request. + * + * @param callable $middleware + * @return \Illuminate\Http\Client\Factory + * @static + */ + public static function globalRequestMiddleware($middleware) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->globalRequestMiddleware($middleware); + } + + /** + * Add response middleware to apply to every request. + * + * @param callable $middleware + * @return \Illuminate\Http\Client\Factory + * @static + */ + public static function globalResponseMiddleware($middleware) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->globalResponseMiddleware($middleware); + } + + /** + * Set the options to apply to every request. + * + * @param \Closure|array $options + * @return \Illuminate\Http\Client\Factory + * @static + */ + public static function globalOptions($options) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->globalOptions($options); + } + + /** + * Create a new response instance for use during stubbing. + * + * @param array|string|null $body + * @param int $status + * @param array $headers + * @return \GuzzleHttp\Promise\PromiseInterface + * @static + */ + public static function response($body = null, $status = 200, $headers = []) + { + return \Illuminate\Http\Client\Factory::response($body, $status, $headers); + } + + /** + * Create a new PSR-7 response instance for use during stubbing. + * + * @param array|string|null $body + * @param int $status + * @param array $headers + * @return \GuzzleHttp\Psr7\Response + * @static + */ + public static function psr7Response($body = null, $status = 200, $headers = []) + { + return \Illuminate\Http\Client\Factory::psr7Response($body, $status, $headers); + } + + /** + * Create a new RequestException instance for use during stubbing. + * + * @param array|string|null $body + * @param int $status + * @param array $headers + * @return \Illuminate\Http\Client\RequestException + * @static + */ + public static function failedRequest($body = null, $status = 200, $headers = []) + { + return \Illuminate\Http\Client\Factory::failedRequest($body, $status, $headers); + } + + /** + * Create a new connection exception for use during stubbing. + * + * @param string|null $message + * @return \Closure(\Illuminate\Http\Client\Request): \GuzzleHttp\Promise\PromiseInterface + * @static + */ + public static function failedConnection($message = null) + { + return \Illuminate\Http\Client\Factory::failedConnection($message); + } + + /** + * Get an invokable object that returns a sequence of responses in order for use during stubbing. + * + * @param array $responses + * @return \Illuminate\Http\Client\ResponseSequence + * @static + */ + public static function sequence($responses = []) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->sequence($responses); + } + + /** + * Register a stub callable that will intercept requests and be able to return stub responses. + * + * @param callable|array|null $callback + * @return \Illuminate\Http\Client\Factory + * @static + */ + public static function fake($callback = null) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->fake($callback); + } + + /** + * Register a response sequence for the given URL pattern. + * + * @param string $url + * @return \Illuminate\Http\Client\ResponseSequence + * @static + */ + public static function fakeSequence($url = '*') + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->fakeSequence($url); + } + + /** + * Stub the given URL using the given callback. + * + * @param string $url + * @param \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface|callable|int|string|array|\Illuminate\Http\Client\ResponseSequence $callback + * @return \Illuminate\Http\Client\Factory + * @static + */ + public static function stubUrl($url, $callback) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->stubUrl($url, $callback); + } + + /** + * Indicate that an exception should be thrown if any request is not faked. + * + * @param bool $prevent + * @return \Illuminate\Http\Client\Factory + * @static + */ + public static function preventStrayRequests($prevent = true) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->preventStrayRequests($prevent); + } + + /** + * Determine if stray requests are being prevented. + * + * @return bool + * @static + */ + public static function preventingStrayRequests() + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->preventingStrayRequests(); + } + + /** + * Allow stray, unfaked requests entirely, or optionally allow only specific URLs. + * + * @param array|null $only + * @return \Illuminate\Http\Client\Factory + * @static + */ + public static function allowStrayRequests($only = null) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->allowStrayRequests($only); + } + + /** + * Begin recording request / response pairs. + * + * @return \Illuminate\Http\Client\Factory + * @static + */ + public static function record() + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->record(); + } + + /** + * Record a request response pair. + * + * @param \Illuminate\Http\Client\Request $request + * @param \Illuminate\Http\Client\Response|null $response + * @return void + * @static + */ + public static function recordRequestResponsePair($request, $response) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + $instance->recordRequestResponsePair($request, $response); + } + + /** + * Assert that a request / response pair was recorded matching a given truth test. + * + * @param callable|(\Closure(\Illuminate\Http\Client\Request, \Illuminate\Http\Client\Response|null): bool) $callback + * @return void + * @static + */ + public static function assertSent($callback) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + $instance->assertSent($callback); + } + + /** + * Assert that the given request was sent in the given order. + * + * @param list $callbacks + * @return void + * @static + */ + public static function assertSentInOrder($callbacks) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + $instance->assertSentInOrder($callbacks); + } + + /** + * Assert that a request / response pair was not recorded matching a given truth test. + * + * @param callable|(\Closure(\Illuminate\Http\Client\Request, \Illuminate\Http\Client\Response|null): bool) $callback + * @return void + * @static + */ + public static function assertNotSent($callback) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + $instance->assertNotSent($callback); + } + + /** + * Assert that no request / response pair was recorded. + * + * @return void + * @static + */ + public static function assertNothingSent() + { + /** @var \Illuminate\Http\Client\Factory $instance */ + $instance->assertNothingSent(); + } + + /** + * Assert how many requests have been recorded. + * + * @param int $count + * @return void + * @static + */ + public static function assertSentCount($count) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + $instance->assertSentCount($count); + } + + /** + * Assert that every created response sequence is empty. + * + * @return void + * @static + */ + public static function assertSequencesAreEmpty() + { + /** @var \Illuminate\Http\Client\Factory $instance */ + $instance->assertSequencesAreEmpty(); + } + + /** + * Get a collection of the request / response pairs matching the given truth test. + * + * @param (\Closure(\Illuminate\Http\Client\Request, \Illuminate\Http\Client\Response|null): bool)|callable $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function recorded($callback = null) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->recorded($callback); + } + + /** + * Create a new pending request instance for this factory. + * + * @return \Illuminate\Http\Client\PendingRequest + * @static + */ + public static function createPendingRequest() + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->createPendingRequest(); + } + + /** + * Get the current event dispatcher implementation. + * + * @return \Illuminate\Contracts\Events\Dispatcher|null + * @static + */ + public static function getDispatcher() + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->getDispatcher(); + } + + /** + * Get the array of global middleware. + * + * @return array + * @static + */ + public static function getGlobalMiddleware() + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->getGlobalMiddleware(); + } + + /** + * 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\Http\Client\Factory::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\Http\Client\Factory::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Http\Client\Factory::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Http\Client\Factory::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\Http\Client\Factory $instance */ + return $instance->macroCall($method, $parameters); + } + + } + /** + * @see \Illuminate\Translation\Translator + */ + class Lang { + /** + * Determine if a translation exists for a given locale. + * + * @param string $key + * @param string|null $locale + * @return bool + * @static + */ + public static function hasForLocale($key, $locale = null) + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->hasForLocale($key, $locale); + } + + /** + * Determine if a translation exists. + * + * @param string $key + * @param string|null $locale + * @param bool $fallback + * @return bool + * @static + */ + public static function has($key, $locale = null, $fallback = true) + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->has($key, $locale, $fallback); + } + + /** + * Get the translation for the given key. + * + * @param string $key + * @param array $replace + * @param string|null $locale + * @param bool $fallback + * @return string|array + * @static + */ + public static function get($key, $replace = [], $locale = null, $fallback = true) + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->get($key, $replace, $locale, $fallback); + } + + /** + * Get a translation according to an integer value. + * + * @param string $key + * @param \Countable|int|float|array $number + * @param array $replace + * @param string|null $locale + * @return string + * @static + */ + public static function choice($key, $number, $replace = [], $locale = null) + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->choice($key, $number, $replace, $locale); + } + + /** + * Add translation lines to the given locale. + * + * @param array $lines + * @param string $locale + * @param string $namespace + * @return void + * @static + */ + public static function addLines($lines, $locale, $namespace = '*') + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->addLines($lines, $locale, $namespace); + } + + /** + * Load the specified language group. + * + * @param string $namespace + * @param string $group + * @param string $locale + * @return void + * @static + */ + public static function load($namespace, $group, $locale) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->load($namespace, $group, $locale); + } + + /** + * Register a callback that is responsible for handling missing translation keys. + * + * @param callable|null $callback + * @return static + * @static + */ + public static function handleMissingKeysUsing($callback) + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->handleMissingKeysUsing($callback); + } + + /** + * Add a new namespace to the loader. + * + * @param string $namespace + * @param string $hint + * @return void + * @static + */ + public static function addNamespace($namespace, $hint) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->addNamespace($namespace, $hint); + } + + /** + * Add a new path to the loader. + * + * @param string $path + * @return void + * @static + */ + public static function addPath($path) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->addPath($path); + } + + /** + * Add a new JSON path to the loader. + * + * @param string $path + * @return void + * @static + */ + public static function addJsonPath($path) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->addJsonPath($path); + } + + /** + * Parse a key into namespace, group, and item. + * + * @param string $key + * @return array + * @static + */ + public static function parseKey($key) + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->parseKey($key); + } + + /** + * Specify a callback that should be invoked to determined the applicable locale array. + * + * @param callable $callback + * @return void + * @static + */ + public static function determineLocalesUsing($callback) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->determineLocalesUsing($callback); + } + + /** + * Get the message selector instance. + * + * @return \Illuminate\Translation\MessageSelector + * @static + */ + public static function getSelector() + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->getSelector(); + } + + /** + * Set the message selector instance. + * + * @param \Illuminate\Translation\MessageSelector $selector + * @return void + * @static + */ + public static function setSelector($selector) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->setSelector($selector); + } + + /** + * Get the language line loader implementation. + * + * @return \Illuminate\Contracts\Translation\Loader + * @static + */ + public static function getLoader() + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->getLoader(); + } + + /** + * Get the default locale being used. + * + * @return string + * @static + */ + public static function locale() + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->locale(); + } + + /** + * Get the default locale being used. + * + * @return string + * @static + */ + public static function getLocale() + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->getLocale(); + } + + /** + * Set the default locale. + * + * @param string $locale + * @return void + * @throws \InvalidArgumentException + * @static + */ + public static function setLocale($locale) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->setLocale($locale); + } + + /** + * Get the fallback locale being used. + * + * @return string + * @static + */ + public static function getFallback() + { + /** @var \Illuminate\Translation\Translator $instance */ + return $instance->getFallback(); + } + + /** + * Set the fallback locale being used. + * + * @param string $fallback + * @return void + * @static + */ + public static function setFallback($fallback) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->setFallback($fallback); + } + + /** + * Set the loaded translation groups. + * + * @param array $loaded + * @return void + * @static + */ + public static function setLoaded($loaded) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->setLoaded($loaded); + } + + /** + * Add a handler to be executed in order to format a given class to a string during translation replacements. + * + * @param callable|string $class + * @param callable|null $handler + * @return void + * @static + */ + public static function stringable($class, $handler = null) + { + /** @var \Illuminate\Translation\Translator $instance */ + $instance->stringable($class, $handler); + } + + /** + * 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\Translation\Translator::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\Translation\Translator::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Translation\Translator::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Translation\Translator::flushMacros(); + } + + /** + * Set the parsed value of a key. + * + * @param string $key + * @param array $parsed + * @return void + * @static + */ + public static function setParsedKey($key, $parsed) + { + //Method inherited from \Illuminate\Support\NamespacedItemResolver + /** @var \Illuminate\Translation\Translator $instance */ + $instance->setParsedKey($key, $parsed); + } + + /** + * Flush the cache of parsed keys. + * + * @return void + * @static + */ + public static function flushParsedKeys() + { + //Method inherited from \Illuminate\Support\NamespacedItemResolver + /** @var \Illuminate\Translation\Translator $instance */ + $instance->flushParsedKeys(); + } + + } + /** + * @method static void write(string $level, \Illuminate\Contracts\Support\Arrayable|\Illuminate\Contracts\Support\Jsonable|\Illuminate\Support\Stringable|array|string $message, array $context = []) + * @method static \Illuminate\Log\Logger withContext(array $context = []) + * @method static void listen(\Closure $callback) + * @method static \Psr\Log\LoggerInterface getLogger() + * @method static \Illuminate\Contracts\Events\Dispatcher|null getEventDispatcher() + * @method static void setEventDispatcher(\Illuminate\Contracts\Events\Dispatcher $dispatcher) + * @method static \Illuminate\Log\Logger|mixed when(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) + * @method static \Illuminate\Log\Logger|mixed unless(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) + * @see \Illuminate\Log\LogManager + */ + class Log { + /** + * Build an on-demand log channel. + * + * @param array $config + * @return \Psr\Log\LoggerInterface + * @static + */ + public static function build($config) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->build($config); + } + + /** + * Create a new, on-demand aggregate logger instance. + * + * @param array $channels + * @param string|null $channel + * @return \Psr\Log\LoggerInterface + * @static + */ + public static function stack($channels, $channel = null) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->stack($channels, $channel); + } + + /** + * Get a log channel instance. + * + * @param string|null $channel + * @return \Psr\Log\LoggerInterface + * @static + */ + public static function channel($channel = null) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->channel($channel); + } + + /** + * Get a log driver instance. + * + * @param string|null $driver + * @return \Psr\Log\LoggerInterface + * @static + */ + public static function driver($driver = null) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->driver($driver); + } + + /** + * Share context across channels and stacks. + * + * @param array $context + * @return \Illuminate\Log\LogManager + * @static + */ + public static function shareContext($context) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->shareContext($context); + } + + /** + * The context shared across channels and stacks. + * + * @return array + * @static + */ + public static function sharedContext() + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->sharedContext(); + } + + /** + * Flush the log context on all currently resolved channels. + * + * @param string[]|null $keys + * @return \Illuminate\Log\LogManager + * @static + */ + public static function withoutContext($keys = null) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->withoutContext($keys); + } + + /** + * Flush the shared context. + * + * @return \Illuminate\Log\LogManager + * @static + */ + public static function flushSharedContext() + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->flushSharedContext(); + } + + /** + * Get the default log driver name. + * + * @return string|null + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Set the default log driver name. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultDriver($name) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->setDefaultDriver($name); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @param-closure-this $this $callback + * @return \Illuminate\Log\LogManager + * @static + */ + public static function extend($driver, $callback) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->extend($driver, $callback); + } + + /** + * Unset the given channel instance. + * + * @param string|null $driver + * @return void + * @static + */ + public static function forgetChannel($driver = null) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->forgetChannel($driver); + } + + /** + * Get all of the resolved log channels. + * + * @return array + * @static + */ + public static function getChannels() + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->getChannels(); + } + + /** + * System is unusable. + * + * @param string|\Stringable $message + * @param array $context + * @return void + * @static + */ + public static function emergency($message, $context = []) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->emergency($message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string|\Stringable $message + * @param array $context + * @return void + * @static + */ + public static function alert($message, $context = []) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->alert($message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string|\Stringable $message + * @param array $context + * @return void + * @static + */ + public static function critical($message, $context = []) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->critical($message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string|\Stringable $message + * @param array $context + * @return void + * @static + */ + public static function error($message, $context = []) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->error($message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string|\Stringable $message + * @param array $context + * @return void + * @static + */ + public static function warning($message, $context = []) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->warning($message, $context); + } + + /** + * Normal but significant events. + * + * @param string|\Stringable $message + * @param array $context + * @return void + * @static + */ + public static function notice($message, $context = []) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->notice($message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string|\Stringable $message + * @param array $context + * @return void + * @static + */ + public static function info($message, $context = []) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->info($message, $context); + } + + /** + * Detailed debug information. + * + * @param string|\Stringable $message + * @param array $context + * @return void + * @static + */ + public static function debug($message, $context = []) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->debug($message, $context); + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string|\Stringable $message + * @param array $context + * @return void + * @static + */ + public static function log($level, $message, $context = []) + { + /** @var \Illuminate\Log\LogManager $instance */ + $instance->log($level, $message, $context); + } + + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Log\LogManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Log\LogManager $instance */ + return $instance->setApplication($app); + } + + } + /** + * @method static void alwaysFrom(string $address, string|null $name = null) + * @method static void alwaysReplyTo(string $address, string|null $name = null) + * @method static void alwaysReturnPath(string $address) + * @method static void alwaysTo(string $address, string|null $name = null) + * @method static \Illuminate\Mail\SentMessage|null html(string $html, mixed $callback) + * @method static \Illuminate\Mail\SentMessage|null plain(string $view, array $data, mixed $callback) + * @method static string render(string|array $view, array $data = []) + * @method static mixed onQueue(\BackedEnum|string|null $queue, \Illuminate\Contracts\Mail\Mailable $view) + * @method static mixed queueOn(string $queue, \Illuminate\Contracts\Mail\Mailable $view) + * @method static mixed laterOn(string $queue, \DateTimeInterface|\DateInterval|int $delay, \Illuminate\Contracts\Mail\Mailable $view) + * @method static \Symfony\Component\Mailer\Transport\TransportInterface getSymfonyTransport() + * @method static \Illuminate\Contracts\View\Factory getViewFactory() + * @method static void setSymfonyTransport(\Symfony\Component\Mailer\Transport\TransportInterface $transport) + * @method static \Illuminate\Mail\Mailer setQueue(\Illuminate\Contracts\Queue\Factory $queue) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @see \Illuminate\Mail\MailManager + * @see \Illuminate\Support\Testing\Fakes\MailFake + */ + class Mail { + /** + * Get a mailer instance by name. + * + * @param string|null $name + * @return \Illuminate\Contracts\Mail\Mailer + * @static + */ + public static function mailer($name = null) + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->mailer($name); + } + + /** + * Get a mailer driver instance. + * + * @param string|null $driver + * @return \Illuminate\Mail\Mailer + * @static + */ + public static function driver($driver = null) + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->driver($driver); + } + + /** + * Build a new mailer instance. + * + * @param array $config + * @return \Illuminate\Mail\Mailer + * @static + */ + public static function build($config) + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->build($config); + } + + /** + * Create a new transport instance. + * + * @param array $config + * @return \Symfony\Component\Mailer\Transport\TransportInterface + * @throws \InvalidArgumentException + * @static + */ + public static function createSymfonyTransport($config) + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->createSymfonyTransport($config); + } + + /** + * Get the default mail driver name. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Set the default mail driver name. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultDriver($name) + { + /** @var \Illuminate\Mail\MailManager $instance */ + $instance->setDefaultDriver($name); + } + + /** + * Disconnect the given mailer and remove from local cache. + * + * @param string|null $name + * @return void + * @static + */ + public static function purge($name = null) + { + /** @var \Illuminate\Mail\MailManager $instance */ + $instance->purge($name); + } + + /** + * Register a custom transport creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return \Illuminate\Mail\MailManager + * @static + */ + public static function extend($driver, $callback) + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->extend($driver, $callback); + } + + /** + * Get the application instance used by the manager. + * + * @return \Illuminate\Contracts\Foundation\Application + * @static + */ + public static function getApplication() + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->getApplication(); + } + + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Mail\MailManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->setApplication($app); + } + + /** + * Forget all of the resolved mailer instances. + * + * @return \Illuminate\Mail\MailManager + * @static + */ + public static function forgetMailers() + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->forgetMailers(); + } + + /** + * Assert if a mailable was sent based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|array|string|int|null $callback + * @return void + * @static + */ + public static function assertSent($mailable, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertSent($mailable, $callback); + } + + /** + * Assert if a mailable was sent a number of times. + * + * @param string $mailable + * @param int $times + * @return void + * @static + */ + public static function assertSentTimes($mailable, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertSentTimes($mailable, $times); + } + + /** + * Determine if a mailable was not sent or queued to be sent based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return void + * @static + */ + public static function assertNotOutgoing($mailable, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertNotOutgoing($mailable, $callback); + } + + /** + * Determine if a mailable was not sent based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|array|string|null $callback + * @return void + * @static + */ + public static function assertNotSent($mailable, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertNotSent($mailable, $callback); + } + + /** + * Assert that no mailables were sent or queued to be sent. + * + * @return void + * @static + */ + public static function assertNothingOutgoing() + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertNothingOutgoing(); + } + + /** + * Assert that no mailables were sent. + * + * @return void + * @static + */ + public static function assertNothingSent() + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertNothingSent(); + } + + /** + * Assert if a mailable was queued based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|array|string|int|null $callback + * @return void + * @static + */ + public static function assertQueued($mailable, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertQueued($mailable, $callback); + } + + /** + * Determine if a mailable was not queued based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|array|string|null $callback + * @return void + * @static + */ + public static function assertNotQueued($mailable, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertNotQueued($mailable, $callback); + } + + /** + * Assert that no mailables were queued. + * + * @return void + * @static + */ + public static function assertNothingQueued() + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertNothingQueued(); + } + + /** + * Assert the total number of mailables that were sent. + * + * @param int $count + * @return void + * @static + */ + public static function assertSentCount($count) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertSentCount($count); + } + + /** + * Assert the total number of mailables that were queued. + * + * @param int $count + * @return void + * @static + */ + public static function assertQueuedCount($count) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertQueuedCount($count); + } + + /** + * Assert the total number of mailables that were sent or queued. + * + * @param int $count + * @return void + * @static + */ + public static function assertOutgoingCount($count) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->assertOutgoingCount($count); + } + + /** + * Get all of the mailables matching a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function sent($mailable, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->sent($mailable, $callback); + } + + /** + * Determine if the given mailable has been sent. + * + * @param string $mailable + * @return bool + * @static + */ + public static function hasSent($mailable) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->hasSent($mailable); + } + + /** + * Get all of the queued mailables matching a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function queued($mailable, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->queued($mailable, $callback); + } + + /** + * Determine if the given mailable has been queued. + * + * @param string $mailable + * @return bool + * @static + */ + public static function hasQueued($mailable) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->hasQueued($mailable); + } + + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + * @static + */ + public static function to($users) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->to($users); + } + + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + * @static + */ + public static function cc($users) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->cc($users); + } + + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + * @static + */ + public static function bcc($users) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->bcc($users); + } + + /** + * Send a new message with only a raw text part. + * + * @param string $text + * @param \Closure|string $callback + * @return void + * @static + */ + public static function raw($text, $callback) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->raw($text, $callback); + } + + /** + * Send a new message using a view. + * + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param array $data + * @param \Closure|string|null $callback + * @return mixed|void + * @static + */ + public static function send($view, $data = [], $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->send($view, $data, $callback); + } + + /** + * Send a new message synchronously using a view. + * + * @param \Illuminate\Contracts\Mail\Mailable|string|array $mailable + * @param array $data + * @param \Closure|string|null $callback + * @return void + * @static + */ + public static function sendNow($mailable, $data = [], $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->sendNow($mailable, $data, $callback); + } + + /** + * Queue a new message for sending. + * + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param string|null $queue + * @return mixed + * @static + */ + public static function queue($view, $queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->queue($view, $queue); + } + + /** + * Queue a new e-mail message for sending after (n) seconds. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param string|null $queue + * @return mixed + * @static + */ + public static function later($delay, $view, $queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->later($delay, $view, $queue); + } + + } + /** + * @see \Illuminate\Notifications\ChannelManager + * @see \Illuminate\Support\Testing\Fakes\NotificationFake + */ + class Notification { + /** + * Send the given notification to the given notifiable entities. + * + * @param \Illuminate\Support\Collection|mixed $notifiables + * @param mixed $notification + * @return void + * @static + */ + public static function send($notifiables, $notification) + { + /** @var \Illuminate\Notifications\ChannelManager $instance */ + $instance->send($notifiables, $notification); + } + + /** + * Send the given notification immediately. + * + * @param \Illuminate\Support\Collection|mixed $notifiables + * @param mixed $notification + * @param array|null $channels + * @return void + * @static + */ + public static function sendNow($notifiables, $notification, $channels = null) + { + /** @var \Illuminate\Notifications\ChannelManager $instance */ + $instance->sendNow($notifiables, $notification, $channels); + } + + /** + * Get a channel instance. + * + * @param string|null $name + * @return mixed + * @static + */ + public static function channel($name = null) + { + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->channel($name); + } + + /** + * Get the default channel driver name. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Get the default channel driver name. + * + * @return string + * @static + */ + public static function deliversVia() + { + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->deliversVia(); + } + + /** + * Set the default channel driver name. + * + * @param string $channel + * @return void + * @static + */ + public static function deliverVia($channel) + { + /** @var \Illuminate\Notifications\ChannelManager $instance */ + $instance->deliverVia($channel); + } + + /** + * Set the locale of notifications. + * + * @param string $locale + * @return \Illuminate\Notifications\ChannelManager + * @static + */ + public static function locale($locale) + { + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->locale($locale); + } + + /** + * 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\Notifications\ChannelManager::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\Notifications\ChannelManager::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Notifications\ChannelManager::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Notifications\ChannelManager::flushMacros(); + } + + /** + * Get a driver instance. + * + * @param string|null $driver + * @return mixed + * @throws \InvalidArgumentException + * @static + */ + public static function driver($driver = null) + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->driver($driver); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return \Illuminate\Notifications\ChannelManager + * @static + */ + public static function extend($driver, $callback) + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->extend($driver, $callback); + } + + /** + * Get all of the created "drivers". + * + * @return array + * @static + */ + public static function getDrivers() + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->getDrivers(); + } + + /** + * Get the container instance used by the manager. + * + * @return \Illuminate\Contracts\Container\Container + * @static + */ + public static function getContainer() + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->getContainer(); + } + + /** + * Set the container instance used by the manager. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Notifications\ChannelManager + * @static + */ + public static function setContainer($container) + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->setContainer($container); + } + + /** + * Forget all of the resolved driver instances. + * + * @return \Illuminate\Notifications\ChannelManager + * @static + */ + public static function forgetDrivers() + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Notifications\ChannelManager $instance */ + return $instance->forgetDrivers(); + } + + /** + * Assert if a notification was sent on-demand based on a truth-test callback. + * + * @param string|\Closure $notification + * @param callable|null $callback + * @return void + * @throws \Exception + * @static + */ + public static function assertSentOnDemand($notification, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertSentOnDemand($notification, $callback); + } + + /** + * Assert if a notification was sent based on a truth-test callback. + * + * @param mixed $notifiable + * @param string|\Closure $notification + * @param callable|null $callback + * @return void + * @throws \Exception + * @static + */ + public static function assertSentTo($notifiable, $notification, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertSentTo($notifiable, $notification, $callback); + } + + /** + * Assert if a notification was sent on-demand a number of times. + * + * @param string $notification + * @param int $times + * @return void + * @static + */ + public static function assertSentOnDemandTimes($notification, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertSentOnDemandTimes($notification, $times); + } + + /** + * Assert if a notification was sent a number of times. + * + * @param mixed $notifiable + * @param string $notification + * @param int $times + * @return void + * @static + */ + public static function assertSentToTimes($notifiable, $notification, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertSentToTimes($notifiable, $notification, $times); + } + + /** + * Determine if a notification was sent based on a truth-test callback. + * + * @param mixed $notifiable + * @param string|\Closure $notification + * @param callable|null $callback + * @return void + * @throws \Exception + * @static + */ + public static function assertNotSentTo($notifiable, $notification, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertNotSentTo($notifiable, $notification, $callback); + } + + /** + * Assert that no notifications were sent. + * + * @return void + * @static + */ + public static function assertNothingSent() + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertNothingSent(); + } + + /** + * Assert that no notifications were sent to the given notifiable. + * + * @param mixed $notifiable + * @return void + * @throws \Exception + * @static + */ + public static function assertNothingSentTo($notifiable) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertNothingSentTo($notifiable); + } + + /** + * Assert the total amount of times a notification was sent. + * + * @param string $notification + * @param int $expectedCount + * @return void + * @static + */ + public static function assertSentTimes($notification, $expectedCount) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertSentTimes($notification, $expectedCount); + } + + /** + * Assert the total count of notification that were sent. + * + * @param int $expectedCount + * @return void + * @static + */ + public static function assertCount($expectedCount) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + $instance->assertCount($expectedCount); + } + + /** + * Get all of the notifications matching a truth-test callback. + * + * @param mixed $notifiable + * @param string $notification + * @param callable|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function sent($notifiable, $notification, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + return $instance->sent($notifiable, $notification, $callback); + } + + /** + * Determine if there are more notifications left to inspect. + * + * @param mixed $notifiable + * @param string $notification + * @return bool + * @static + */ + public static function hasSent($notifiable, $notification) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + return $instance->hasSent($notifiable, $notification); + } + + /** + * Specify if notification should be serialized and restored when being "pushed" to the queue. + * + * @param bool $serializeAndRestore + * @return \Illuminate\Support\Testing\Fakes\NotificationFake + * @static + */ + public static function serializeAndRestore($serializeAndRestore = true) + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + return $instance->serializeAndRestore($serializeAndRestore); + } + + /** + * Get the notifications that have been sent. + * + * @return array + * @static + */ + public static function sentNotifications() + { + /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ + return $instance->sentNotifications(); + } + + } + /** + * @method static string sendResetLink(array $credentials, \Closure|null $callback = null) + * @method static mixed reset(array $credentials, \Closure $callback) + * @method static \Illuminate\Contracts\Auth\CanResetPassword|null getUser(array $credentials) + * @method static string createToken(\Illuminate\Contracts\Auth\CanResetPassword $user) + * @method static void deleteToken(\Illuminate\Contracts\Auth\CanResetPassword $user) + * @method static bool tokenExists(\Illuminate\Contracts\Auth\CanResetPassword $user, string $token) + * @method static \Illuminate\Auth\Passwords\TokenRepositoryInterface getRepository() + * @method static \Illuminate\Support\Timebox getTimebox() + * @see \Illuminate\Auth\Passwords\PasswordBrokerManager + * @see \Illuminate\Auth\Passwords\PasswordBroker + */ + class Password { + /** + * Attempt to get the broker from the local cache. + * + * @param string|null $name + * @return \Illuminate\Contracts\Auth\PasswordBroker + * @static + */ + public static function broker($name = null) + { + /** @var \Illuminate\Auth\Passwords\PasswordBrokerManager $instance */ + return $instance->broker($name); + } + + /** + * Get the default password broker name. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Auth\Passwords\PasswordBrokerManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Set the default password broker name. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultDriver($name) + { + /** @var \Illuminate\Auth\Passwords\PasswordBrokerManager $instance */ + $instance->setDefaultDriver($name); + } + + } + /** + * @method static \Illuminate\Process\PendingProcess command(array|string $command) + * @method static \Illuminate\Process\PendingProcess path(string $path) + * @method static \Illuminate\Process\PendingProcess timeout(int $timeout) + * @method static \Illuminate\Process\PendingProcess idleTimeout(int $timeout) + * @method static \Illuminate\Process\PendingProcess forever() + * @method static \Illuminate\Process\PendingProcess env(array $environment) + * @method static \Illuminate\Process\PendingProcess input(\Traversable|resource|string|int|float|bool|null $input) + * @method static \Illuminate\Process\PendingProcess quietly() + * @method static \Illuminate\Process\PendingProcess tty(bool $tty = true) + * @method static \Illuminate\Process\PendingProcess options(array $options) + * @method static \Illuminate\Contracts\Process\ProcessResult run(array|string|null $command = null, callable|null $output = null) + * @method static \Illuminate\Process\InvokedProcess start(array|string|null $command = null, callable|null $output = null) + * @method static bool supportsTty() + * @method static \Illuminate\Process\PendingProcess withFakeHandlers(array $fakeHandlers) + * @method static \Illuminate\Process\PendingProcess|mixed when(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) + * @method static \Illuminate\Process\PendingProcess|mixed unless(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) + * @see \Illuminate\Process\PendingProcess + * @see \Illuminate\Process\Factory + */ + class Process { + /** + * Create a new fake process response for testing purposes. + * + * @param array|string $output + * @param array|string $errorOutput + * @param int $exitCode + * @return \Illuminate\Process\FakeProcessResult + * @static + */ + public static function result($output = '', $errorOutput = '', $exitCode = 0) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->result($output, $errorOutput, $exitCode); + } + + /** + * Begin describing a fake process lifecycle. + * + * @return \Illuminate\Process\FakeProcessDescription + * @static + */ + public static function describe() + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->describe(); + } + + /** + * Begin describing a fake process sequence. + * + * @param array $processes + * @return \Illuminate\Process\FakeProcessSequence + * @static + */ + public static function sequence($processes = []) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->sequence($processes); + } + + /** + * Indicate that the process factory should fake processes. + * + * @param \Closure|array|null $callback + * @return \Illuminate\Process\Factory + * @static + */ + public static function fake($callback = null) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->fake($callback); + } + + /** + * Determine if the process factory has fake process handlers and is recording processes. + * + * @return bool + * @static + */ + public static function isRecording() + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->isRecording(); + } + + /** + * Record the given process if processes should be recorded. + * + * @param \Illuminate\Process\PendingProcess $process + * @param \Illuminate\Contracts\Process\ProcessResult $result + * @return \Illuminate\Process\Factory + * @static + */ + public static function recordIfRecording($process, $result) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->recordIfRecording($process, $result); + } + + /** + * Record the given process. + * + * @param \Illuminate\Process\PendingProcess $process + * @param \Illuminate\Contracts\Process\ProcessResult $result + * @return \Illuminate\Process\Factory + * @static + */ + public static function record($process, $result) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->record($process, $result); + } + + /** + * Indicate that an exception should be thrown if any process is not faked. + * + * @param bool $prevent + * @return \Illuminate\Process\Factory + * @static + */ + public static function preventStrayProcesses($prevent = true) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->preventStrayProcesses($prevent); + } + + /** + * Determine if stray processes are being prevented. + * + * @return bool + * @static + */ + public static function preventingStrayProcesses() + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->preventingStrayProcesses(); + } + + /** + * Assert that a process was recorded matching a given truth test. + * + * @param \Closure|string $callback + * @return \Illuminate\Process\Factory + * @static + */ + public static function assertRan($callback) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->assertRan($callback); + } + + /** + * Assert that a process was recorded a given number of times matching a given truth test. + * + * @param \Closure|string $callback + * @param int $times + * @return \Illuminate\Process\Factory + * @static + */ + public static function assertRanTimes($callback, $times = 1) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->assertRanTimes($callback, $times); + } + + /** + * Assert that a process was not recorded matching a given truth test. + * + * @param \Closure|string $callback + * @return \Illuminate\Process\Factory + * @static + */ + public static function assertNotRan($callback) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->assertNotRan($callback); + } + + /** + * Assert that a process was not recorded matching a given truth test. + * + * @param \Closure|string $callback + * @return \Illuminate\Process\Factory + * @static + */ + public static function assertDidntRun($callback) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->assertDidntRun($callback); + } + + /** + * Assert that no processes were recorded. + * + * @return \Illuminate\Process\Factory + * @static + */ + public static function assertNothingRan() + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->assertNothingRan(); + } + + /** + * Start defining a pool of processes. + * + * @param callable $callback + * @return \Illuminate\Process\Pool + * @static + */ + public static function pool($callback) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->pool($callback); + } + + /** + * Start defining a series of piped processes. + * + * @param callable|array $callback + * @return \Illuminate\Contracts\Process\ProcessResult + * @static + */ + public static function pipe($callback, $output = null) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->pipe($callback, $output); + } + + /** + * Run a pool of processes and wait for them to finish executing. + * + * @param callable $callback + * @param callable|null $output + * @return \Illuminate\Process\ProcessPoolResults + * @static + */ + public static function concurrently($callback, $output = null) + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->concurrently($callback, $output); + } + + /** + * Create a new pending process associated with this factory. + * + * @return \Illuminate\Process\PendingProcess + * @static + */ + public static function newPendingProcess() + { + /** @var \Illuminate\Process\Factory $instance */ + return $instance->newPendingProcess(); + } + + /** + * 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\Process\Factory::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\Process\Factory::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Process\Factory::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Process\Factory::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\Process\Factory $instance */ + return $instance->macroCall($method, $parameters); + } + + } + /** + * @see \Illuminate\Queue\QueueManager + * @see \Illuminate\Queue\Queue + * @see \Illuminate\Support\Testing\Fakes\QueueFake + */ + class Queue { + /** + * Register an event listener for the before job event. + * + * @param mixed $callback + * @return void + * @static + */ + public static function before($callback) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->before($callback); + } + + /** + * Register an event listener for the after job event. + * + * @param mixed $callback + * @return void + * @static + */ + public static function after($callback) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->after($callback); + } + + /** + * Register an event listener for the exception occurred job event. + * + * @param mixed $callback + * @return void + * @static + */ + public static function exceptionOccurred($callback) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->exceptionOccurred($callback); + } + + /** + * Register an event listener for the daemon queue loop. + * + * @param mixed $callback + * @return void + * @static + */ + public static function looping($callback) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->looping($callback); + } + + /** + * Register an event listener for the failed job event. + * + * @param mixed $callback + * @return void + * @static + */ + public static function failing($callback) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->failing($callback); + } + + /** + * Register an event listener for the daemon queue starting. + * + * @param mixed $callback + * @return void + * @static + */ + public static function starting($callback) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->starting($callback); + } + + /** + * Register an event listener for the daemon queue stopping. + * + * @param mixed $callback + * @return void + * @static + */ + public static function stopping($callback) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->stopping($callback); + } + + /** + * Determine if the driver is connected. + * + * @param string|null $name + * @return bool + * @static + */ + public static function connected($name = null) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + return $instance->connected($name); + } + + /** + * Resolve a queue connection instance. + * + * @param string|null $name + * @return \Illuminate\Contracts\Queue\Queue + * @static + */ + public static function connection($name = null) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + return $instance->connection($name); + } + + /** + * Pause a queue by its connection and name. + * + * @param string $connection + * @param string $queue + * @return void + * @static + */ + public static function pause($connection, $queue) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->pause($connection, $queue); + } + + /** + * Pause a queue by its connection and name for a given amount of time. + * + * @param string $connection + * @param string $queue + * @param \DateTimeInterface|\DateInterval|int $ttl + * @return void + * @static + */ + public static function pauseFor($connection, $queue, $ttl) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->pauseFor($connection, $queue, $ttl); + } + + /** + * Resume a paused queue by its connection and name. + * + * @param string $connection + * @param string $queue + * @return void + * @static + */ + public static function resume($connection, $queue) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->resume($connection, $queue); + } + + /** + * Determine if a queue is paused. + * + * @param string $connection + * @param string $queue + * @return bool + * @static + */ + public static function isPaused($connection, $queue) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + return $instance->isPaused($connection, $queue); + } + + /** + * Indicate that queue workers should not poll for restart or pause signals. + * + * This prevents the workers from hitting the application cache to determine if they need to pause or restart. + * + * @return void + * @static + */ + public static function withoutInterruptionPolling() + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->withoutInterruptionPolling(); + } + + /** + * Add a queue connection resolver. + * + * @param string $driver + * @param \Closure $resolver + * @return void + * @static + */ + public static function extend($driver, $resolver) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->extend($driver, $resolver); + } + + /** + * Add a queue connection resolver. + * + * @param string $driver + * @param \Closure $resolver + * @return void + * @static + */ + public static function addConnector($driver, $resolver) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->addConnector($driver, $resolver); + } + + /** + * Get the name of the default queue connection. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Queue\QueueManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Set the name of the default queue connection. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultDriver($name) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + $instance->setDefaultDriver($name); + } + + /** + * Get the full name for the given connection. + * + * @param string|null $connection + * @return string + * @static + */ + public static function getName($connection = null) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + return $instance->getName($connection); + } + + /** + * Get the application instance used by the manager. + * + * @return \Illuminate\Contracts\Foundation\Application + * @static + */ + public static function getApplication() + { + /** @var \Illuminate\Queue\QueueManager $instance */ + return $instance->getApplication(); + } + + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Queue\QueueManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Queue\QueueManager $instance */ + return $instance->setApplication($app); + } + + /** + * Specify the jobs that should be queued instead of faked. + * + * @param array|string $jobsToBeQueued + * @return \Illuminate\Support\Testing\Fakes\QueueFake + * @static + */ + public static function except($jobsToBeQueued) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->except($jobsToBeQueued); + } + + /** + * Assert if a job was pushed based on a truth-test callback. + * + * @param string|\Closure $job + * @param callable|int|null $callback + * @return void + * @static + */ + public static function assertPushed($job, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertPushed($job, $callback); + } + + /** + * Assert if a job was pushed a number of times. + * + * @param string $job + * @param int $times + * @return void + * @static + */ + public static function assertPushedTimes($job, $times = 1) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertPushedTimes($job, $times); + } + + /** + * Assert if a job was pushed based on a truth-test callback. + * + * @param string $queue + * @param string|\Closure $job + * @param callable|null $callback + * @return void + * @static + */ + public static function assertPushedOn($queue, $job, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertPushedOn($queue, $job, $callback); + } + + /** + * Assert if a job was pushed with chained jobs based on a truth-test callback. + * + * @param string $job + * @param array $expectedChain + * @param callable|null $callback + * @return void + * @static + */ + public static function assertPushedWithChain($job, $expectedChain = [], $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertPushedWithChain($job, $expectedChain, $callback); + } + + /** + * Assert if a job was pushed with an empty chain based on a truth-test callback. + * + * @param string $job + * @param callable|null $callback + * @return void + * @static + */ + public static function assertPushedWithoutChain($job, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertPushedWithoutChain($job, $callback); + } + + /** + * Assert if a closure was pushed based on a truth-test callback. + * + * @param callable|int|null $callback + * @return void + * @static + */ + public static function assertClosurePushed($callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertClosurePushed($callback); + } + + /** + * Assert that a closure was not pushed based on a truth-test callback. + * + * @param callable|null $callback + * @return void + * @static + */ + public static function assertClosureNotPushed($callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertClosureNotPushed($callback); + } + + /** + * Determine if a job was pushed based on a truth-test callback. + * + * @param string|\Closure $job + * @param callable|null $callback + * @return void + * @static + */ + public static function assertNotPushed($job, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertNotPushed($job, $callback); + } + + /** + * Assert the total count of jobs that were pushed. + * + * @param int $expectedCount + * @return void + * @static + */ + public static function assertCount($expectedCount) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertCount($expectedCount); + } + + /** + * Assert that no jobs were pushed. + * + * @return void + * @static + */ + public static function assertNothingPushed() + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->assertNothingPushed(); + } + + /** + * Get all of the jobs matching a truth-test callback. + * + * @param string $job + * @param callable|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function pushed($job, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->pushed($job, $callback); + } + + /** + * Get all of the raw pushes matching a truth-test callback. + * + * @param null|\Closure(string, ?string, array): bool $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function pushedRaw($callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->pushedRaw($callback); + } + + /** + * Get all of the jobs by listener class, passing an optional truth-test callback. + * + * @param class-string $listenerClass + * @param (\Closure(mixed, \Illuminate\Events\CallQueuedListener, string|null, mixed): bool)|null $callback + * @return \Illuminate\Support\Collection + * @static + */ + public static function listenersPushed($listenerClass, $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->listenersPushed($listenerClass, $callback); + } + + /** + * Determine if there are any stored jobs for a given class. + * + * @param string $job + * @return bool + * @static + */ + public static function hasPushed($job) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->hasPushed($job); + } + + /** + * Get the size of the queue. + * + * @param string|null $queue + * @return int + * @static + */ + public static function size($queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->size($queue); + } + + /** + * Get the number of pending jobs. + * + * @param string|null $queue + * @return int + * @static + */ + public static function pendingSize($queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->pendingSize($queue); + } + + /** + * Get the number of delayed jobs. + * + * @param string|null $queue + * @return int + * @static + */ + public static function delayedSize($queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->delayedSize($queue); + } + + /** + * Get the number of reserved jobs. + * + * @param string|null $queue + * @return int + * @static + */ + public static function reservedSize($queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->reservedSize($queue); + } + + /** + * Get the creation timestamp of the oldest pending job, excluding delayed jobs. + * + * @param string|null $queue + * @return int|null + * @static + */ + public static function creationTimeOfOldestPendingJob($queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->creationTimeOfOldestPendingJob($queue); + } + + /** + * Push a new job onto the queue. + * + * @param string|object $job + * @param mixed $data + * @param string|null $queue + * @return mixed + * @static + */ + public static function push($job, $data = '', $queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->push($job, $data, $queue); + } + + /** + * Determine if a job should be faked or actually dispatched. + * + * @param object $job + * @return bool + * @static + */ + public static function shouldFakeJob($job) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->shouldFakeJob($job); + } + + /** + * Push a raw payload onto the queue. + * + * @param string $payload + * @param string|null $queue + * @param array $options + * @return mixed + * @static + */ + public static function pushRaw($payload, $queue = null, $options = []) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->pushRaw($payload, $queue, $options); + } + + /** + * Push a new job onto the queue after (n) seconds. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @param string|object $job + * @param mixed $data + * @param string|null $queue + * @return mixed + * @static + */ + public static function later($delay, $job, $data = '', $queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->later($delay, $job, $data, $queue); + } + + /** + * Push a new job onto the queue. + * + * @param string $queue + * @param string|object $job + * @param mixed $data + * @return mixed + * @static + */ + public static function pushOn($queue, $job, $data = '') + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->pushOn($queue, $job, $data); + } + + /** + * Push a new job onto a specific queue after (n) seconds. + * + * @param string $queue + * @param \DateTimeInterface|\DateInterval|int $delay + * @param string|object $job + * @param mixed $data + * @return mixed + * @static + */ + public static function laterOn($queue, $delay, $job, $data = '') + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->laterOn($queue, $delay, $job, $data); + } + + /** + * Pop the next job off of the queue. + * + * @param string|null $queue + * @return \Illuminate\Contracts\Queue\Job|null + * @static + */ + public static function pop($queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->pop($queue); + } + + /** + * Push an array of jobs onto the queue. + * + * @param array $jobs + * @param mixed $data + * @param string|null $queue + * @return mixed + * @static + */ + public static function bulk($jobs, $data = '', $queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->bulk($jobs, $data, $queue); + } + + /** + * Get the jobs that have been pushed. + * + * @return array + * @static + */ + public static function pushedJobs() + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->pushedJobs(); + } + + /** + * Get the payloads that were pushed raw. + * + * @return list + * @static + */ + public static function rawPushes() + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->rawPushes(); + } + + /** + * Specify if jobs should be serialized and restored when being "pushed" to the queue. + * + * @param bool $serializeAndRestore + * @return \Illuminate\Support\Testing\Fakes\QueueFake + * @static + */ + public static function serializeAndRestore($serializeAndRestore = true) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->serializeAndRestore($serializeAndRestore); + } + + /** + * Release the locks for all unique jobs that were pushed. + * + * @return void + * @static + */ + public static function releaseUniqueJobLocks() + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + $instance->releaseUniqueJobLocks(); + } + + /** + * Get the connection name for the queue. + * + * @return string + * @static + */ + public static function getConnectionName() + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->getConnectionName(); + } + + /** + * Set the connection name for the queue. + * + * @param string $name + * @return \Illuminate\Support\Testing\Fakes\QueueFake + * @static + */ + public static function setConnectionName($name) + { + /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ + return $instance->setConnectionName($name); + } + + /** + * Release a reserved job back onto the queue after (n) seconds. + * + * @param string $queue + * @param \Illuminate\Queue\Jobs\DatabaseJobRecord $job + * @param int $delay + * @return mixed + * @static + */ + public static function release($queue, $job, $delay) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->release($queue, $job, $delay); + } + + /** + * Delete a reserved job from the queue. + * + * @param string $queue + * @param string $id + * @return void + * @throws \Throwable + * @static + */ + public static function deleteReserved($queue, $id) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + $instance->deleteReserved($queue, $id); + } + + /** + * Delete a reserved job from the reserved queue and release it. + * + * @param string $queue + * @param \Illuminate\Queue\Jobs\DatabaseJob $job + * @param int $delay + * @return void + * @static + */ + public static function deleteAndRelease($queue, $job, $delay) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + $instance->deleteAndRelease($queue, $job, $delay); + } + + /** + * Delete all of the jobs from the queue. + * + * @param string $queue + * @return int + * @static + */ + public static function clear($queue) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->clear($queue); + } + + /** + * Get the queue or return the default. + * + * @param string|null $queue + * @return string + * @static + */ + public static function getQueue($queue) + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->getQueue($queue); + } + + /** + * Get the underlying database instance. + * + * @return \Illuminate\Database\Connection + * @static + */ + public static function getDatabase() + { + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->getDatabase(); + } + + /** + * Get the maximum number of attempts for an object-based queue handler. + * + * @param mixed $job + * @return mixed + * @static + */ + public static function getJobTries($job) + { + //Method inherited from \Illuminate\Queue\Queue + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->getJobTries($job); + } + + /** + * Get the backoff for an object-based queue handler. + * + * @param mixed $job + * @return mixed + * @static + */ + public static function getJobBackoff($job) + { + //Method inherited from \Illuminate\Queue\Queue + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->getJobBackoff($job); + } + + /** + * Get the expiration timestamp for an object-based queue handler. + * + * @param mixed $job + * @return mixed + * @static + */ + public static function getJobExpiration($job) + { + //Method inherited from \Illuminate\Queue\Queue + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->getJobExpiration($job); + } + + /** + * Register a callback to be executed when creating job payloads. + * + * @param callable|null $callback + * @return void + * @static + */ + public static function createPayloadUsing($callback) + { + //Method inherited from \Illuminate\Queue\Queue + \Illuminate\Queue\DatabaseQueue::createPayloadUsing($callback); + } + + /** + * Get the queue configuration array. + * + * @return array + * @static + */ + public static function getConfig() + { + //Method inherited from \Illuminate\Queue\Queue + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->getConfig(); + } + + /** + * Set the queue configuration array. + * + * @param array $config + * @return \Illuminate\Queue\DatabaseQueue + * @static + */ + public static function setConfig($config) + { + //Method inherited from \Illuminate\Queue\Queue + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->setConfig($config); + } + + /** + * Get the container instance being used by the connection. + * + * @return \Illuminate\Container\Container + * @static + */ + public static function getContainer() + { + //Method inherited from \Illuminate\Queue\Queue + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + return $instance->getContainer(); + } + + /** + * Set the IoC container instance. + * + * @param \Illuminate\Container\Container $container + * @return void + * @static + */ + public static function setContainer($container) + { + //Method inherited from \Illuminate\Queue\Queue + /** @var \Illuminate\Queue\DatabaseQueue $instance */ + $instance->setContainer($container); + } + + } + /** + * @see \Illuminate\Cache\RateLimiter + */ + class RateLimiter { + /** + * Register a named rate limiter configuration. + * + * @param \UnitEnum|string $name + * @param \Closure $callback + * @return \Illuminate\Cache\RateLimiter + * @static + */ + public static function for($name, $callback) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->for($name, $callback); + } + + /** + * Get the given named rate limiter. + * + * @param \UnitEnum|string $name + * @return \Closure|null + * @static + */ + public static function limiter($name) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->limiter($name); + } + + /** + * Attempts to execute a callback if it's not limited. + * + * @param string $key + * @param int $maxAttempts + * @param \Closure $callback + * @param \DateTimeInterface|\DateInterval|int $decaySeconds + * @return mixed + * @static + */ + public static function attempt($key, $maxAttempts, $callback, $decaySeconds = 60) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->attempt($key, $maxAttempts, $callback, $decaySeconds); + } + + /** + * Determine if the given key has been "accessed" too many times. + * + * @param string $key + * @param int $maxAttempts + * @return bool + * @static + */ + public static function tooManyAttempts($key, $maxAttempts) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->tooManyAttempts($key, $maxAttempts); + } + + /** + * Increment (by 1) the counter for a given key for a given decay time. + * + * @param string $key + * @param \DateTimeInterface|\DateInterval|int $decaySeconds + * @return int + * @static + */ + public static function hit($key, $decaySeconds = 60) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->hit($key, $decaySeconds); + } + + /** + * Increment the counter for a given key for a given decay time by a given amount. + * + * @param string $key + * @param \DateTimeInterface|\DateInterval|int $decaySeconds + * @param int $amount + * @return int + * @static + */ + public static function increment($key, $decaySeconds = 60, $amount = 1) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->increment($key, $decaySeconds, $amount); + } + + /** + * Decrement the counter for a given key for a given decay time by a given amount. + * + * @param string $key + * @param \DateTimeInterface|\DateInterval|int $decaySeconds + * @param int $amount + * @return int + * @static + */ + public static function decrement($key, $decaySeconds = 60, $amount = 1) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->decrement($key, $decaySeconds, $amount); + } + + /** + * Get the number of attempts for the given key. + * + * @param string $key + * @return mixed + * @static + */ + public static function attempts($key) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->attempts($key); + } + + /** + * Reset the number of attempts for the given key. + * + * @param string $key + * @return bool + * @static + */ + public static function resetAttempts($key) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->resetAttempts($key); + } + + /** + * Get the number of retries left for the given key. + * + * @param string $key + * @param int $maxAttempts + * @return int + * @static + */ + public static function remaining($key, $maxAttempts) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->remaining($key, $maxAttempts); + } + + /** + * Get the number of retries left for the given key. + * + * @param string $key + * @param int $maxAttempts + * @return int + * @static + */ + public static function retriesLeft($key, $maxAttempts) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->retriesLeft($key, $maxAttempts); + } + + /** + * Clear the hits and lockout timer for the given key. + * + * @param string $key + * @return void + * @static + */ + public static function clear($key) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + $instance->clear($key); + } + + /** + * Get the number of seconds until the "key" is accessible again. + * + * @param string $key + * @return int + * @static + */ + public static function availableIn($key) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->availableIn($key); + } + + /** + * Clean the rate limiter key from unicode characters. + * + * @param string $key + * @return string + * @static + */ + public static function cleanRateLimiterKey($key) + { + /** @var \Illuminate\Cache\RateLimiter $instance */ + return $instance->cleanRateLimiterKey($key); + } + + } + /** + * @see \Illuminate\Routing\Redirector + */ + class Redirect { + /** + * Create a new redirect response to the previous location. + * + * @param int $status + * @param array $headers + * @param mixed $fallback + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function back($status = 302, $headers = [], $fallback = false) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->back($status, $headers, $fallback); + } + + /** + * Create a new redirect response to the current URI. + * + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function refresh($status = 302, $headers = []) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->refresh($status, $headers); + } + + /** + * Create a new redirect response, while putting the current URL in the session. + * + * @param string $path + * @param int $status + * @param array $headers + * @param bool|null $secure + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function guest($path, $status = 302, $headers = [], $secure = null) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->guest($path, $status, $headers, $secure); + } + + /** + * Create a new redirect response to the previously intended location. + * + * @param mixed $default + * @param int $status + * @param array $headers + * @param bool|null $secure + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function intended($default = '/', $status = 302, $headers = [], $secure = null) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->intended($default, $status, $headers, $secure); + } + + /** + * Create a new redirect response to the given path. + * + * @param string $path + * @param int $status + * @param array $headers + * @param bool|null $secure + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function to($path, $status = 302, $headers = [], $secure = null) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->to($path, $status, $headers, $secure); + } + + /** + * Create a new redirect response to an external URL (no validation). + * + * @param string $path + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function away($path, $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->away($path, $status, $headers); + } + + /** + * Create a new redirect response to the given HTTPS path. + * + * @param string $path + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function secure($path, $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->secure($path, $status, $headers); + } + + /** + * Create a new redirect response to a named route. + * + * @param \BackedEnum|string $route + * @param mixed $parameters + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function route($route, $parameters = [], $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->route($route, $parameters, $status, $headers); + } + + /** + * Create a new redirect response to a signed named route. + * + * @param \BackedEnum|string $route + * @param mixed $parameters + * @param \DateTimeInterface|\DateInterval|int|null $expiration + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function signedRoute($route, $parameters = [], $expiration = null, $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->signedRoute($route, $parameters, $expiration, $status, $headers); + } + + /** + * Create a new redirect response to a signed named route. + * + * @param \BackedEnum|string $route + * @param \DateTimeInterface|\DateInterval|int|null $expiration + * @param mixed $parameters + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function temporarySignedRoute($route, $expiration, $parameters = [], $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->temporarySignedRoute($route, $expiration, $parameters, $status, $headers); + } + + /** + * Create a new redirect response to a controller action. + * + * @param string|array $action + * @param mixed $parameters + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function action($action, $parameters = [], $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->action($action, $parameters, $status, $headers); + } + + /** + * Get the URL generator instance. + * + * @return \Illuminate\Routing\UrlGenerator + * @static + */ + public static function getUrlGenerator() + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->getUrlGenerator(); + } + + /** + * Set the active session store. + * + * @param \Illuminate\Session\Store $session + * @return void + * @static + */ + public static function setSession($session) + { + /** @var \Illuminate\Routing\Redirector $instance */ + $instance->setSession($session); + } + + /** + * Get the "intended" URL from the session. + * + * @return string|null + * @static + */ + public static function getIntendedUrl() + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->getIntendedUrl(); + } + + /** + * Set the "intended" URL in the session. + * + * @param string $url + * @return \Illuminate\Routing\Redirector + * @static + */ + public static function setIntendedUrl($url) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->setIntendedUrl($url); + } + + /** + * 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\Routing\Redirector::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\Routing\Redirector::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Routing\Redirector::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Routing\Redirector::flushMacros(); + } + + } + /** + * @method static \BackedEnum|(\BackedEnum|null enum(string $key, string $enumClass, \BackedEnum|null $default = null) + * @see \Illuminate\Http\Request + */ + class Request { + /** + * Create a new Illuminate HTTP request from server variables. + * + * @return static + * @static + */ + public static function capture() + { + return \Illuminate\Http\Request::capture(); + } + + /** + * Return the Request instance. + * + * @return \Illuminate\Http\Request + * @static + */ + public static function instance() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->instance(); + } + + /** + * Get the request method. + * + * @return string + * @static + */ + public static function method() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->method(); + } + + /** + * Get a URI instance for the request. + * + * @return \Illuminate\Support\Uri + * @static + */ + public static function uri() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->uri(); + } + + /** + * Get the root URL for the application. + * + * @return string + * @static + */ + public static function root() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->root(); + } + + /** + * Get the URL (no query string) for the request. + * + * @return string + * @static + */ + public static function url() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->url(); + } + + /** + * Get the full URL for the request. + * + * @return string + * @static + */ + public static function fullUrl() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->fullUrl(); + } + + /** + * Get the full URL for the request with the added query string parameters. + * + * @param array $query + * @return string + * @static + */ + public static function fullUrlWithQuery($query) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->fullUrlWithQuery($query); + } + + /** + * Get the full URL for the request without the given query string parameters. + * + * @param array|string $keys + * @return string + * @static + */ + public static function fullUrlWithoutQuery($keys) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->fullUrlWithoutQuery($keys); + } + + /** + * Get the current path info for the request. + * + * @return string + * @static + */ + public static function path() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->path(); + } + + /** + * Get the current decoded path info for the request. + * + * @return string + * @static + */ + public static function decodedPath() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->decodedPath(); + } + + /** + * Get a segment from the URI (1 based index). + * + * @param int $index + * @param string|null $default + * @return string|null + * @static + */ + public static function segment($index, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->segment($index, $default); + } + + /** + * Get all of the segments for the request path. + * + * @return array + * @static + */ + public static function segments() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->segments(); + } + + /** + * Determine if the current request URI matches a pattern. + * + * @param mixed $patterns + * @return bool + * @static + */ + public static function is(...$patterns) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->is(...$patterns); + } + + /** + * Determine if the route name matches a given pattern. + * + * @param mixed $patterns + * @return bool + * @static + */ + public static function routeIs(...$patterns) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->routeIs(...$patterns); + } + + /** + * Determine if the current request URL and query string match a pattern. + * + * @param mixed $patterns + * @return bool + * @static + */ + public static function fullUrlIs(...$patterns) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->fullUrlIs(...$patterns); + } + + /** + * Get the host name. + * + * @return string + * @static + */ + public static function host() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->host(); + } + + /** + * Get the HTTP host being requested. + * + * @return string + * @static + */ + public static function httpHost() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->httpHost(); + } + + /** + * Get the scheme and HTTP host. + * + * @return string + * @static + */ + public static function schemeAndHttpHost() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->schemeAndHttpHost(); + } + + /** + * Determine if the request is the result of an AJAX call. + * + * @return bool + * @static + */ + public static function ajax() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->ajax(); + } + + /** + * Determine if the request is the result of a PJAX call. + * + * @return bool + * @static + */ + public static function pjax() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->pjax(); + } + + /** + * Determine if the request is the result of a prefetch call. + * + * @return bool + * @static + */ + public static function prefetch() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->prefetch(); + } + + /** + * Determine if the request is over HTTPS. + * + * @return bool + * @static + */ + public static function secure() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->secure(); + } + + /** + * Get the client IP address. + * + * @return string|null + * @static + */ + public static function ip() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->ip(); + } + + /** + * Get the client IP addresses. + * + * @return array + * @static + */ + public static function ips() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->ips(); + } + + /** + * Get the client user agent. + * + * @return string|null + * @static + */ + public static function userAgent() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->userAgent(); + } + + /** + * Gets a list of content types acceptable by the client browser in preferable order. + * + * @return string[] + * @static + */ + public static function getAcceptableContentTypes() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->getAcceptableContentTypes(); + } + + /** + * Merge new input into the current request's input array. + * + * @param array $input + * @return \Illuminate\Http\Request + * @static + */ + public static function merge($input) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->merge($input); + } + + /** + * Merge new input into the request's input, but only when that key is missing from the request. + * + * @param array $input + * @return \Illuminate\Http\Request + * @static + */ + public static function mergeIfMissing($input) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->mergeIfMissing($input); + } + + /** + * Replace the input values for the current request. + * + * @param array $input + * @return \Illuminate\Http\Request + * @static + */ + public static function replace($input) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->replace($input); + } + + /** + * This method belongs to Symfony HttpFoundation and is not usually needed when using Laravel. + * + * Instead, you may use the "input" method. + * + * @param string $key + * @param mixed $default + * @return mixed + * @deprecated use ->input() instead + * @static + */ + public static function get($key, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->get($key, $default); + } + + /** + * Get the JSON payload for the request. + * + * @param string|null $key + * @param mixed $default + * @return ($key is null ? \Symfony\Component\HttpFoundation\InputBag : mixed) + * @static + */ + public static function json($key = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->json($key, $default); + } + + /** + * Create a new request instance from the given Laravel request. + * + * @param \Illuminate\Http\Request $from + * @param \Illuminate\Http\Request|null $to + * @return static + * @static + */ + public static function createFrom($from, $to = null) + { + return \Illuminate\Http\Request::createFrom($from, $to); + } + + /** + * Create an Illuminate request from a Symfony instance. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * @return static + * @static + */ + public static function createFromBase($request) + { + return \Illuminate\Http\Request::createFromBase($request); + } + + /** + * Clones a request and overrides some of its parameters. + * + * @return static + * @param array|null $query The GET parameters + * @param array|null $request The POST parameters + * @param array|null $attributes The request attributes (parameters parsed from the PATH_INFO, ...) + * @param array|null $cookies The COOKIE parameters + * @param array|null $files The FILES parameters + * @param array|null $server The SERVER parameters + * @static + */ + public static function duplicate($query = null, $request = null, $attributes = null, $cookies = null, $files = null, $server = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->duplicate($query, $request, $attributes, $cookies, $files, $server); + } + + /** + * Whether the request contains a Session object. + * + * This method does not give any information about the state of the session object, + * like whether the session is started or not. It is just a way to check if this Request + * is associated with a Session instance. + * + * @param bool $skipIfUninitialized When true, ignores factories injected by `setSessionFactory` + * @static + */ + public static function hasSession($skipIfUninitialized = false) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->hasSession($skipIfUninitialized); + } + + /** + * Gets the Session. + * + * @throws \Symfony\Component\HttpFoundation\Exception\SessionNotFoundException + * @throws SessionNotFoundException When session is not set properly + * @static + */ + public static function getSession() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->getSession(); + } + + /** + * Get the session associated with the request. + * + * @return \Illuminate\Contracts\Session\Session + * @throws \RuntimeException + * @static + */ + public static function session() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->session(); + } + + /** + * Set the session instance on the request. + * + * @param \Illuminate\Contracts\Session\Session $session + * @return void + * @static + */ + public static function setLaravelSession($session) + { + /** @var \Illuminate\Http\Request $instance */ + $instance->setLaravelSession($session); + } + + /** + * Set the locale for the request instance. + * + * @param string $locale + * @return void + * @static + */ + public static function setRequestLocale($locale) + { + /** @var \Illuminate\Http\Request $instance */ + $instance->setRequestLocale($locale); + } + + /** + * Set the default locale for the request instance. + * + * @param string $locale + * @return void + * @static + */ + public static function setDefaultRequestLocale($locale) + { + /** @var \Illuminate\Http\Request $instance */ + $instance->setDefaultRequestLocale($locale); + } + + /** + * Get the user making the request. + * + * @param string|null $guard + * @return mixed + * @static + */ + public static function user($guard = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->user($guard); + } + + /** + * Get the route handling the request. + * + * @param string|null $param + * @param mixed $default + * @return ($param is null ? \Illuminate\Routing\Route : object|string|null) + * @static + */ + public static function route($param = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->route($param, $default); + } + + /** + * Get a unique fingerprint for the request / route / IP address. + * + * @return string + * @throws \RuntimeException + * @static + */ + public static function fingerprint() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->fingerprint(); + } + + /** + * Set the JSON payload for the request. + * + * @param \Symfony\Component\HttpFoundation\InputBag $json + * @return \Illuminate\Http\Request + * @static + */ + public static function setJson($json) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->setJson($json); + } + + /** + * Get the user resolver callback. + * + * @return \Closure + * @static + */ + public static function getUserResolver() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->getUserResolver(); + } + + /** + * Set the user resolver callback. + * + * @param \Closure $callback + * @return \Illuminate\Http\Request + * @static + */ + public static function setUserResolver($callback) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->setUserResolver($callback); + } + + /** + * Get the route resolver callback. + * + * @return \Closure + * @static + */ + public static function getRouteResolver() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->getRouteResolver(); + } + + /** + * Set the route resolver callback. + * + * @param \Closure $callback + * @return \Illuminate\Http\Request + * @static + */ + public static function setRouteResolver($callback) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->setRouteResolver($callback); + } + + /** + * Get all of the input and files for the request. + * + * @return array + * @static + */ + public static function toArray() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->toArray(); + } + + /** + * Determine if the given offset exists. + * + * @param string $offset + * @return bool + * @static + */ + public static function offsetExists($offset) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->offsetExists($offset); + } + + /** + * Get the value at the given offset. + * + * @param string $offset + * @return mixed + * @static + */ + public static function offsetGet($offset) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->offsetGet($offset); + } + + /** + * Set the value at the given offset. + * + * @param string $offset + * @param mixed $value + * @return void + * @static + */ + public static function offsetSet($offset, $value) + { + /** @var \Illuminate\Http\Request $instance */ + $instance->offsetSet($offset, $value); + } + + /** + * Remove the value at the given offset. + * + * @param string $offset + * @return void + * @static + */ + public static function offsetUnset($offset) + { + /** @var \Illuminate\Http\Request $instance */ + $instance->offsetUnset($offset); + } + + /** + * Filter the given array of rules into an array of rules that are included in precognitive headers. + * + * @param array $rules + * @return array + * @static + */ + public static function filterPrecognitiveRules($rules) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->filterPrecognitiveRules($rules); + } + + /** + * Determine if the request is attempting to be precognitive. + * + * @return bool + * @static + */ + public static function isAttemptingPrecognition() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->isAttemptingPrecognition(); + } + + /** + * Determine if the request is precognitive. + * + * @return bool + * @static + */ + public static function isPrecognitive() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->isPrecognitive(); + } + + /** + * Determine if the request is sending JSON. + * + * @return bool + * @static + */ + public static function isJson() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->isJson(); + } + + /** + * Determine if the current request probably expects a JSON response. + * + * @return bool + * @static + */ + public static function expectsJson() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->expectsJson(); + } + + /** + * Determine if the current request is asking for JSON. + * + * @return bool + * @static + */ + public static function wantsJson() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->wantsJson(); + } + + /** + * Determine if the current request is asking for Markdown. + * + * @return bool + * @static + */ + public static function wantsMarkdown() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->wantsMarkdown(); + } + + /** + * Determines whether the current requests accepts a given content type. + * + * @param string|array $contentTypes + * @return bool + * @static + */ + public static function accepts($contentTypes) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->accepts($contentTypes); + } + + /** + * Return the most suitable content type from the given array based on content negotiation. + * + * @param string|array $contentTypes + * @return string|null + * @static + */ + public static function prefers($contentTypes) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->prefers($contentTypes); + } + + /** + * Determine if the current request accepts any content type. + * + * @return bool + * @static + */ + public static function acceptsAnyContentType() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->acceptsAnyContentType(); + } + + /** + * Determines whether a request accepts JSON. + * + * @return bool + * @static + */ + public static function acceptsJson() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->acceptsJson(); + } + + /** + * Determines whether a request accepts Markdown. + * + * @return bool + * @static + */ + public static function acceptsMarkdown() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->acceptsMarkdown(); + } + + /** + * Determines whether a request accepts HTML. + * + * @return bool + * @static + */ + public static function acceptsHtml() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->acceptsHtml(); + } + + /** + * Determine if the given content types match. + * + * @param string $actual + * @param string $type + * @return bool + * @static + */ + public static function matchesType($actual, $type) + { + return \Illuminate\Http\Request::matchesType($actual, $type); + } + + /** + * Get the data format expected in the response. + * + * @param string $default + * @return string + * @static + */ + public static function format($default = 'html') + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->format($default); + } + + /** + * Retrieve an old input item. + * + * @param string|null $key + * @param \Illuminate\Database\Eloquent\Model|string|array|null $default + * @return string|array|null + * @static + */ + public static function old($key = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->old($key, $default); + } + + /** + * Flash the input for the current request to the session. + * + * @return void + * @static + */ + public static function flash() + { + /** @var \Illuminate\Http\Request $instance */ + $instance->flash(); + } + + /** + * Flash only some of the input to the session. + * + * @param mixed $keys + * @return void + * @static + */ + public static function flashOnly($keys) + { + /** @var \Illuminate\Http\Request $instance */ + $instance->flashOnly($keys); + } + + /** + * Flash only some of the input to the session. + * + * @param mixed $keys + * @return void + * @static + */ + public static function flashExcept($keys) + { + /** @var \Illuminate\Http\Request $instance */ + $instance->flashExcept($keys); + } + + /** + * Flush all of the old input from the session. + * + * @return void + * @static + */ + public static function flush() + { + /** @var \Illuminate\Http\Request $instance */ + $instance->flush(); + } + + /** + * Retrieve a server variable from the request. + * + * @param string|null $key + * @param string|array|null $default + * @return string|array|null + * @static + */ + public static function server($key = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->server($key, $default); + } + + /** + * Determine if a header is set on the request. + * + * @param string $key + * @return bool + * @static + */ + public static function hasHeader($key) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->hasHeader($key); + } + + /** + * Retrieve a header from the request. + * + * @param string|null $key + * @param string|array|null $default + * @return string|array|null + * @static + */ + public static function header($key = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->header($key, $default); + } + + /** + * Get the bearer token from the request headers. + * + * @return string|null + * @static + */ + public static function bearerToken() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->bearerToken(); + } + + /** + * Get the keys for all of the input and files. + * + * @return array + * @static + */ + public static function keys() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->keys(); + } + + /** + * Get all of the input and files for the request. + * + * @param mixed $keys + * @return array + * @static + */ + public static function all($keys = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->all($keys); + } + + /** + * Retrieve an input item from the request. + * + * @param string|null $key + * @param mixed $default + * @return mixed + * @static + */ + public static function input($key = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->input($key, $default); + } + + /** + * Retrieve input from the request as a Fluent object instance. + * + * @param array|string|null $key + * @param array $default + * @return \Illuminate\Support\Fluent + * @static + */ + public static function fluent($key = null, $default = []) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->fluent($key, $default); + } + + /** + * Retrieve a query string item from the request. + * + * @param string|null $key + * @param string|array|null $default + * @return string|array|null + * @static + */ + public static function query($key = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->query($key, $default); + } + + /** + * Retrieve a request payload item from the request. + * + * @param string|null $key + * @param string|array|null $default + * @return string|array|null + * @static + */ + public static function post($key = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->post($key, $default); + } + + /** + * Determine if a cookie is set on the request. + * + * @param string $key + * @return bool + * @static + */ + public static function hasCookie($key) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->hasCookie($key); + } + + /** + * Retrieve a cookie from the request. + * + * @param string|null $key + * @param string|array|null $default + * @return string|array|null + * @static + */ + public static function cookie($key = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->cookie($key, $default); + } + + /** + * Get an array of all of the files on the request. + * + * @return array + * @static + */ + public static function allFiles() + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->allFiles(); + } + + /** + * Determine if the uploaded data contains a file. + * + * @param string $key + * @return bool + * @static + */ + public static function hasFile($key) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->hasFile($key); + } + + /** + * Retrieve a file from the request. + * + * @param string|null $key + * @param mixed $default + * @return ($key is null ? array : \Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|null) + * @static + */ + public static function file($key = null, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->file($key, $default); + } + + /** + * Dump the items. + * + * @param mixed $keys + * @return \Illuminate\Http\Request + * @static + */ + public static function dump($keys = []) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->dump($keys); + } + + /** + * Dump the given arguments and terminate execution. + * + * @param mixed $args + * @return never + * @static + */ + public static function dd(...$args) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->dd(...$args); + } + + /** + * Determine if the data contains a given key. + * + * @param string|array $key + * @return bool + * @static + */ + public static function exists($key) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->exists($key); + } + + /** + * Determine if the data contains a given key. + * + * @param string|array $key + * @return bool + * @static + */ + public static function has($key) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->has($key); + } + + /** + * Determine if the instance contains any of the given keys. + * + * @param string|array $keys + * @return bool + * @static + */ + public static function hasAny($keys) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->hasAny($keys); + } + + /** + * Apply the callback if the instance contains the given key. + * + * @param string $key + * @param callable $callback + * @param callable|null $default + * @return $this|mixed + * @static + */ + public static function whenHas($key, $callback, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->whenHas($key, $callback, $default); + } + + /** + * Determine if the instance contains a non-empty value for the given key. + * + * @param string|array $key + * @return bool + * @static + */ + public static function filled($key) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->filled($key); + } + + /** + * Determine if the instance contains an empty value for the given key. + * + * @param string|array $key + * @return bool + * @static + */ + public static function isNotFilled($key) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->isNotFilled($key); + } + + /** + * Determine if the instance contains a non-empty value for any of the given keys. + * + * @param string|array $keys + * @return bool + * @static + */ + public static function anyFilled($keys) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->anyFilled($keys); + } + + /** + * Apply the callback if the instance contains a non-empty value for the given key. + * + * @param string $key + * @param callable $callback + * @param callable|null $default + * @return $this|mixed + * @static + */ + public static function whenFilled($key, $callback, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->whenFilled($key, $callback, $default); + } + + /** + * Determine if the instance is missing a given key. + * + * @param string|array $key + * @return bool + * @static + */ + public static function missing($key) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->missing($key); + } + + /** + * Apply the callback if the instance is missing the given key. + * + * @param string $key + * @param callable $callback + * @param callable|null $default + * @return $this|mixed + * @static + */ + public static function whenMissing($key, $callback, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->whenMissing($key, $callback, $default); + } + + /** + * Retrieve data from the instance as a Stringable instance. + * + * @param string $key + * @param mixed $default + * @return \Illuminate\Support\Stringable + * @static + */ + public static function str($key, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->str($key, $default); + } + + /** + * Retrieve data from the instance as a Stringable instance. + * + * @param string $key + * @param mixed $default + * @return \Illuminate\Support\Stringable + * @static + */ + public static function string($key, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->string($key, $default); + } + + /** + * Retrieve data as a boolean value. + * + * Returns true when value is "1", "true", "on", and "yes". Otherwise, returns false. + * + * @param string|null $key + * @param bool $default + * @return bool + * @static + */ + public static function boolean($key = null, $default = false) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->boolean($key, $default); + } + + /** + * Retrieve data as an integer value. + * + * @param string $key + * @param int $default + * @return int + * @static + */ + public static function integer($key, $default = 0) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->integer($key, $default); + } + + /** + * Retrieve data as a float value. + * + * @param string $key + * @param float $default + * @return float + * @static + */ + public static function float($key, $default = 0.0) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->float($key, $default); + } + + /** + * Retrieve data clamped between min and max values. + * + * @param string $key + * @param int|float $min + * @param int|float $max + * @param int|float $default + * @return float|int + * @static + */ + public static function clamp($key, $min, $max, $default = 0) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->clamp($key, $min, $max, $default); + } + + /** + * Retrieve data from the instance as a Carbon instance. + * + * @param string $key + * @param string|null $format + * @param \UnitEnum|string|null $tz + * @return \Illuminate\Support\Carbon|null + * @throws \Carbon\Exceptions\InvalidFormatException + * @static + */ + public static function date($key, $format = null, $tz = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->date($key, $format, $tz); + } + + /** + * Retrieve data from the instance as a CarbonInterval instance. + * + * @param string $key + * @param \Carbon\Unit|string|null $unit + * @return \Carbon\CarbonInterval|null + * @static + */ + public static function interval($key, $unit = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->interval($key, $unit); + } + + /** + * Retrieve data from the instance as an enum. + * + * @template TEnum of \BackedEnum + * @template TDefault of TEnum|null + * @param string $key + * @param class-string $enumClass + * @param TDefault $default + * @return TEnum|TDefault + * @static + */ + public static function enum($key, $enumClass, $default = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->enum($key, $enumClass, $default); + } + + /** + * Retrieve data from the instance as an array of enums. + * + * @template TEnum of \BackedEnum + * @param string $key + * @param class-string $enumClass + * @return TEnum[] + * @static + */ + public static function enums($key, $enumClass) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->enums($key, $enumClass); + } + + /** + * Retrieve data from the instance as an array. + * + * @param array|string|null $key + * @return array + * @static + */ + public static function array($key = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->array($key); + } + + /** + * Retrieve data from the instance as a collection. + * + * @param array|string|null $key + * @return \Illuminate\Support\Collection + * @static + */ + public static function collect($key = null) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->collect($key); + } + + /** + * Get a subset containing the provided keys with values from the instance data. + * + * @param mixed $keys + * @return array + * @static + */ + public static function only($keys) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->only($keys); + } + + /** + * Get all of the data except for a specified array of items. + * + * @param mixed $keys + * @return array + * @static + */ + public static function except($keys) + { + /** @var \Illuminate\Http\Request $instance */ + return $instance->except($keys); + } + + /** + * 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\Http\Request $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\Http\Request $instance */ + return $instance->unless($value, $callback, $default); + } + + /** + * 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\Http\Request::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\Http\Request::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Http\Request::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Http\Request::flushMacros(); + } + + /** + * Sets the parameters for this request. + * + * This method also re-initializes all properties. + * + * @param array $query The GET parameters + * @param array $request The POST parameters + * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) + * @param array $cookies The COOKIE parameters + * @param array $files The FILES parameters + * @param array $server The SERVER parameters + * @param string|resource|null $content The raw body data + * @static + */ + public static function initialize($query = [], $request = [], $attributes = [], $cookies = [], $files = [], $server = [], $content = null) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->initialize($query, $request, $attributes, $cookies, $files, $server, $content); + } + + /** + * Creates a new request with values from PHP's super globals. + * + * @static + */ + public static function createFromGlobals() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::createFromGlobals(); + } + + /** + * Creates a Request based on a given URI and configuration. + * + * The information contained in the URI always take precedence + * over the other information (server and parameters). + * + * @param string $uri The URI + * @param string $method The HTTP method + * @param array $parameters The query (GET) or request (POST) parameters + * @param array $cookies The request cookies ($_COOKIE) + * @param array $files The request files ($_FILES) + * @param array $server The server parameters ($_SERVER) + * @param string|resource|null $content The raw body data + * @throws BadRequestException When the URI is invalid + * @static + */ + public static function create($uri, $method = 'GET', $parameters = [], $cookies = [], $files = [], $server = [], $content = null) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::create($uri, $method, $parameters, $cookies, $files, $server, $content); + } + + /** + * Sets a callable able to create a Request instance. + * + * This is mainly useful when you need to override the Request class + * to keep BC with an existing system. It should not be used for any + * other purpose. + * + * @static + */ + public static function setFactory($callable) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::setFactory($callable); + } + + /** + * Overrides the PHP global variables according to this request instance. + * + * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE. + * $_FILES is never overridden, see rfc1867 + * + * @static + */ + public static function overrideGlobals() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->overrideGlobals(); + } + + /** + * Sets a list of trusted proxies. + * + * You should only list the reverse proxies that you manage directly. + * + * @param array $proxies A list of trusted proxies, the string 'REMOTE_ADDR' will be replaced with $_SERVER['REMOTE_ADDR'] and 'PRIVATE_SUBNETS' by IpUtils::PRIVATE_SUBNETS + * @param int-mask-of $trustedHeaderSet A bit field to set which headers to trust from your proxies + * @static + */ + public static function setTrustedProxies($proxies, $trustedHeaderSet) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::setTrustedProxies($proxies, $trustedHeaderSet); + } + + /** + * Gets the list of trusted proxies. + * + * @return string[] + * @static + */ + public static function getTrustedProxies() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::getTrustedProxies(); + } + + /** + * Gets the set of trusted headers from trusted proxies. + * + * @return int A bit field of Request::HEADER_* that defines which headers are trusted from your proxies + * @static + */ + public static function getTrustedHeaderSet() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::getTrustedHeaderSet(); + } + + /** + * Sets a list of trusted host patterns. + * + * You should only list the hosts you manage using regexs. + * + * @param array $hostPatterns A list of trusted host patterns + * @static + */ + public static function setTrustedHosts($hostPatterns) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::setTrustedHosts($hostPatterns); + } + + /** + * Gets the list of trusted host patterns. + * + * @return string[] + * @static + */ + public static function getTrustedHosts() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::getTrustedHosts(); + } + + /** + * Normalizes a query string. + * + * It builds a normalized query string, where keys/value pairs are alphabetized, + * have consistent escaping and unneeded delimiters are removed. + * + * @static + */ + public static function normalizeQueryString($qs) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::normalizeQueryString($qs); + } + + /** + * Enables support for the _method request parameter to determine the intended HTTP method. + * + * Be warned that enabling this feature might lead to CSRF issues in your code. + * Check that you are using CSRF tokens when required. + * If the HTTP method parameter override is enabled, an html-form with method "POST" can be altered + * and used to send a "PUT" or "DELETE" request via the _method request parameter. + * If these methods are not protected against CSRF, this presents a possible vulnerability. + * + * The HTTP method can only be overridden when the real HTTP method is POST. + * + * @static + */ + public static function enableHttpMethodParameterOverride() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::enableHttpMethodParameterOverride(); + } + + /** + * Checks whether support for the _method request parameter is enabled. + * + * @static + */ + public static function getHttpMethodParameterOverride() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::getHttpMethodParameterOverride(); + } + + /** + * Sets the list of HTTP methods that can be overridden. + * + * Set to null to allow all methods to be overridden (default). Set to an + * empty array to disallow overrides entirely. Otherwise, provide the list + * of uppercased method names that are allowed. + * + * @param \Symfony\Component\HttpFoundation\uppercase-string[]|null $methods + * @static + */ + public static function setAllowedHttpMethodOverride($methods) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::setAllowedHttpMethodOverride($methods); + } + + /** + * Gets the list of HTTP methods that can be overridden. + * + * @return \Symfony\Component\HttpFoundation\uppercase-string[]|null + * @static + */ + public static function getAllowedHttpMethodOverride() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::getAllowedHttpMethodOverride(); + } + + /** + * Whether the request contains a Session which was started in one of the + * previous requests. + * + * @static + */ + public static function hasPreviousSession() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->hasPreviousSession(); + } + + /** + * @static + */ + public static function setSession($session) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->setSession($session); + } + + /** + * @internal + * @param callable(): SessionInterface $factory + * @static + */ + public static function setSessionFactory($factory) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->setSessionFactory($factory); + } + + /** + * Returns the client IP addresses. + * + * In the returned array the most trusted IP address is first, and the + * least trusted one last. The "real" client IP address is the last one, + * but this is also the least trusted one. Trusted proxies are stripped. + * + * Use this method carefully; you should use getClientIp() instead. + * + * @see getClientIp() + * @static + */ + public static function getClientIps() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getClientIps(); + } + + /** + * Returns the client IP address. + * + * This method can read the client IP address from the "X-Forwarded-For" header + * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For" + * header value is a comma+space separated list of IP addresses, the left-most + * being the original client, and each successive proxy that passed the request + * adding the IP address where it received the request from. + * + * If your reverse proxy uses a different header name than "X-Forwarded-For", + * ("Client-Ip" for instance), configure it via the $trustedHeaderSet + * argument of the Request::setTrustedProxies() method instead. + * + * @see getClientIps() + * @see https://wikipedia.org/wiki/X-Forwarded-For + * @static + */ + public static function getClientIp() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getClientIp(); + } + + /** + * Returns current script name. + * + * @static + */ + public static function getScriptName() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getScriptName(); + } + + /** + * Returns the path being requested relative to the executed script. + * + * The path info always starts with a /. + * + * Suppose this request is instantiated from /mysite on localhost: + * + * * http://localhost/mysite returns '/' + * * http://localhost/mysite/about returns '/about' + * * http://localhost/mysite/enco%20ded returns '/enco%20ded' + * * http://localhost/mysite/about?var=1 returns '/about' + * + * @return string The raw path (i.e. not urldecoded) + * @static + */ + public static function getPathInfo() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getPathInfo(); + } + + /** + * Returns the root path from which this request is executed. + * + * Suppose that an index.php file instantiates this request object: + * + * * http://localhost/index.php returns an empty string + * * http://localhost/index.php/page returns an empty string + * * http://localhost/web/index.php returns '/web' + * * http://localhost/we%20b/index.php returns '/we%20b' + * + * @return string The raw path (i.e. not urldecoded) + * @static + */ + public static function getBasePath() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getBasePath(); + } + + /** + * Returns the root URL from which this request is executed. + * + * The base URL never ends with a /. + * + * This is similar to getBasePath(), except that it also includes the + * script filename (e.g. index.php) if one exists. + * + * @return string The raw URL (i.e. not urldecoded) + * @static + */ + public static function getBaseUrl() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getBaseUrl(); + } + + /** + * Gets the request's scheme. + * + * @static + */ + public static function getScheme() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getScheme(); + } + + /** + * Returns the port on which the request is made. + * + * This method can read the client port from the "X-Forwarded-Port" header + * when trusted proxies were set via "setTrustedProxies()". + * + * The "X-Forwarded-Port" header must contain the client port. + * + * @return int|string|null Can be a string if fetched from the server bag + * @static + */ + public static function getPort() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getPort(); + } + + /** + * Returns the user. + * + * @static + */ + public static function getUser() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getUser(); + } + + /** + * Returns the password. + * + * @static + */ + public static function getPassword() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getPassword(); + } + + /** + * Gets the user info. + * + * @return string|null A user name if any and, optionally, scheme-specific information about how to gain authorization to access the server + * @static + */ + public static function getUserInfo() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getUserInfo(); + } + + /** + * Returns the HTTP host being requested. + * + * The port name will be appended to the host if it's non-standard. + * + * @static + */ + public static function getHttpHost() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getHttpHost(); + } + + /** + * Returns the requested URI (path and query string). + * + * @return string The raw URI (i.e. not URI decoded) + * @static + */ + public static function getRequestUri() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getRequestUri(); + } + + /** + * Gets the scheme and HTTP host. + * + * If the URL was called with basic authentication, the user + * and the password are not added to the generated string. + * + * @static + */ + public static function getSchemeAndHttpHost() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getSchemeAndHttpHost(); + } + + /** + * Generates a normalized URI (URL) for the Request. + * + * @see getQueryString() + * @static + */ + public static function getUri() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getUri(); + } + + /** + * Generates a normalized URI for the given path. + * + * @param string $path A path to use instead of the current one + * @static + */ + public static function getUriForPath($path) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getUriForPath($path); + } + + /** + * Returns the path as relative reference from the current Request path. + * + * Only the URIs path component (no schema, host etc.) is relevant and must be given. + * Both paths must be absolute and not contain relative parts. + * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives. + * Furthermore, they can be used to reduce the link size in documents. + * + * Example target paths, given a base path of "/a/b/c/d": + * - "/a/b/c/d" -> "" + * - "/a/b/c/" -> "./" + * - "/a/b/" -> "../" + * - "/a/b/c/other" -> "other" + * - "/a/x/y" -> "../../x/y" + * + * @static + */ + public static function getRelativeUriForPath($path) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getRelativeUriForPath($path); + } + + /** + * Generates the normalized query string for the Request. + * + * It builds a normalized query string, where keys/value pairs are alphabetized + * and have consistent escaping. + * + * @static + */ + public static function getQueryString() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getQueryString(); + } + + /** + * Checks whether the request is secure or not. + * + * This method can read the client protocol from the "X-Forwarded-Proto" header + * when trusted proxies were set via "setTrustedProxies()". + * + * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http". + * + * @static + */ + public static function isSecure() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->isSecure(); + } + + /** + * Returns the host name. + * + * This method can read the client host name from the "X-Forwarded-Host" header + * when trusted proxies were set via "setTrustedProxies()". + * + * The "X-Forwarded-Host" header must contain the client host name. + * + * @throws SuspiciousOperationException when the host name is invalid or not trusted + * @static + */ + public static function getHost() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getHost(); + } + + /** + * Sets the request method. + * + * @static + */ + public static function setMethod($method) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->setMethod($method); + } + + /** + * Gets the request "intended" method. + * + * If the X-HTTP-Method-Override header is set, and if the method is a POST, + * then it is used to determine the "real" intended HTTP method. + * + * The _method request parameter can also be used to determine the HTTP method, + * but only if enableHttpMethodParameterOverride() has been called. + * + * The method is always an uppercased string. + * + * @see getRealMethod() + * @static + */ + public static function getMethod() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getMethod(); + } + + /** + * Gets the "real" request method. + * + * @see getMethod() + * @static + */ + public static function getRealMethod() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getRealMethod(); + } + + /** + * Gets the mime type associated with the format. + * + * @static + */ + public static function getMimeType($format) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getMimeType($format); + } + + /** + * Gets the mime types associated with the format. + * + * @return string[] + * @static + */ + public static function getMimeTypes($format) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + return \Illuminate\Http\Request::getMimeTypes($format); + } + + /** + * Gets the format associated with the mime type. + * + * Resolution order: + * 1) Exact match on the full MIME type (e.g. "application/json"). + * 2) Match on the canonical MIME type (i.e. before the first ";" parameter). + * 3) If the type is "application/*+suffix", use the structured syntax suffix + * mapping (e.g. "application/foo+json" → "json"), when available. + * 4) If $subtypeFallback is true and no match was found: + * - return the MIME subtype (without "x-" prefix), provided it does not + * contain a "+" (e.g. "application/x-yaml" → "yaml", "text/csv" → "csv"). + * + * @param string|null $mimeType The mime type to check + * @param bool $subtypeFallback Whether to fall back to the subtype if no exact match is found + * @static + */ + public static function getFormat($mimeType) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getFormat($mimeType); + } + + /** + * Associates a format with mime types. + * + * @param string $format The format to set + * @param string|string[] $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) + * @static + */ + public static function setFormat($format, $mimeTypes) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->setFormat($format, $mimeTypes); + } + + /** + * Gets the request format. + * + * Here is the process to determine the format: + * + * * format defined by the user (with setRequestFormat()) + * * _format request attribute + * * $default + * + * @see getPreferredFormat + * @static + */ + public static function getRequestFormat($default = 'html') + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getRequestFormat($default); + } + + /** + * Sets the request format. + * + * @static + */ + public static function setRequestFormat($format) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->setRequestFormat($format); + } + + /** + * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header). + * + * @see Request::$formats + * @static + */ + public static function getContentTypeFormat() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getContentTypeFormat(); + } + + /** + * Sets the default locale. + * + * @static + */ + public static function setDefaultLocale($locale) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->setDefaultLocale($locale); + } + + /** + * Get the default locale. + * + * @static + */ + public static function getDefaultLocale() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getDefaultLocale(); + } + + /** + * Sets the locale. + * + * @static + */ + public static function setLocale($locale) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->setLocale($locale); + } + + /** + * Get the locale. + * + * @static + */ + public static function getLocale() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getLocale(); + } + + /** + * Checks if the request method is of specified type. + * + * @param string $method Uppercase request method (GET, POST etc) + * @static + */ + public static function isMethod($method) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->isMethod($method); + } + + /** + * Checks whether or not the method is safe. + * + * @see https://tools.ietf.org/html/rfc7231#section-4.2.1 + * @static + */ + public static function isMethodSafe() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->isMethodSafe(); + } + + /** + * Checks whether or not the method is idempotent. + * + * @static + */ + public static function isMethodIdempotent() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->isMethodIdempotent(); + } + + /** + * Checks whether the method is cacheable or not. + * + * @see https://tools.ietf.org/html/rfc7231#section-4.2.3 + * @static + */ + public static function isMethodCacheable() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->isMethodCacheable(); + } + + /** + * Returns the protocol version. + * + * If the application is behind a proxy, the protocol version used in the + * requests between the client and the proxy and between the proxy and the + * server might be different. This returns the former (from the "Via" header) + * if the proxy is trusted (see "setTrustedProxies()"), otherwise it returns + * the latter (from the "SERVER_PROTOCOL" server parameter). + * + * @static + */ + public static function getProtocolVersion() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getProtocolVersion(); + } + + /** + * Returns the request body content. + * + * @param bool $asResource If true, a resource will be returned + * @return string|resource + * @psalm-return ($asResource is true ? resource : string) + * @static + */ + public static function getContent($asResource = false) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getContent($asResource); + } + + /** + * Gets the decoded form or json request body. + * + * @throws JsonException When the body cannot be decoded to an array + * @static + */ + public static function getPayload() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getPayload(); + } + + /** + * Gets the Etags. + * + * @static + */ + public static function getETags() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getETags(); + } + + /** + * @static + */ + public static function isNoCache() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->isNoCache(); + } + + /** + * Gets the preferred format for the response by inspecting, in the following order: + * * the request format set using setRequestFormat; + * * the values of the Accept HTTP header. + * + * Note that if you use this method, you should send the "Vary: Accept" header + * in the response to prevent any issues with intermediary HTTP caches. + * + * @static + */ + public static function getPreferredFormat($default = 'html') + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getPreferredFormat($default); + } + + /** + * Returns the preferred language. + * + * @param string[] $locales An array of ordered available locales + * @static + */ + public static function getPreferredLanguage($locales = null) + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getPreferredLanguage($locales); + } + + /** + * Gets a list of languages acceptable by the client browser ordered in the user browser preferences. + * + * @return string[] + * @static + */ + public static function getLanguages() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getLanguages(); + } + + /** + * Gets a list of charsets acceptable by the client browser in preferable order. + * + * @return string[] + * @static + */ + public static function getCharsets() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getCharsets(); + } + + /** + * Gets a list of encodings acceptable by the client browser in preferable order. + * + * @return string[] + * @static + */ + public static function getEncodings() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->getEncodings(); + } + + /** + * Returns true if the request is an XMLHttpRequest. + * + * It works if your JavaScript library sets an X-Requested-With HTTP header. + * It is known to work with common JavaScript frameworks: + * + * @see https://wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript + * @static + */ + public static function isXmlHttpRequest() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->isXmlHttpRequest(); + } + + /** + * Checks whether the client browser prefers safe content or not according to RFC8674. + * + * @see https://tools.ietf.org/html/rfc8674 + * @static + */ + public static function preferSafeContent() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->preferSafeContent(); + } + + /** + * Indicates whether this request originated from a trusted proxy. + * + * This can be useful to determine whether or not to trust the + * contents of a proxy-specific header. + * + * @static + */ + public static function isFromTrustedProxy() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->isFromTrustedProxy(); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestValidation() + * @param array $rules + * @param mixed $params + * @static + */ + public static function validate($rules, ...$params) + { + return \Illuminate\Http\Request::validate($rules, ...$params); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestValidation() + * @param string $errorBag + * @param array $rules + * @param mixed $params + * @static + */ + public static function validateWithBag($errorBag, $rules, ...$params) + { + return \Illuminate\Http\Request::validateWithBag($errorBag, $rules, ...$params); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @param mixed $absolute + * @static + */ + public static function hasValidSignature($absolute = true) + { + return \Illuminate\Http\Request::hasValidSignature($absolute); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @static + */ + public static function hasValidRelativeSignature() + { + return \Illuminate\Http\Request::hasValidRelativeSignature(); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @param mixed $ignoreQuery + * @param mixed $absolute + * @static + */ + public static function hasValidSignatureWhileIgnoring($ignoreQuery = [], $absolute = true) + { + return \Illuminate\Http\Request::hasValidSignatureWhileIgnoring($ignoreQuery, $absolute); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @param mixed $ignoreQuery + * @static + */ + public static function hasValidRelativeSignatureWhileIgnoring($ignoreQuery = []) + { + return \Illuminate\Http\Request::hasValidRelativeSignatureWhileIgnoring($ignoreQuery); + } + + /** + * @see \Inertia\ServiceProvider::registerRequestMacro() + * @static + */ + public static function inertia() + { + return \Illuminate\Http\Request::inertia(); + } + + } + /** + * @see \Illuminate\Routing\ResponseFactory + */ + class Response { + /** + * Create a new response instance. + * + * @param mixed $content + * @param int $status + * @param array $headers + * @return \Illuminate\Http\Response + * @static + */ + public static function make($content = '', $status = 200, $headers = []) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->make($content, $status, $headers); + } + + /** + * Create a new "no content" response. + * + * @param int $status + * @param array $headers + * @return \Illuminate\Http\Response + * @static + */ + public static function noContent($status = 204, $headers = []) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->noContent($status, $headers); + } + + /** + * Create a new response for a given view. + * + * @param string|array $view + * @param array $data + * @param int $status + * @param array $headers + * @return \Illuminate\Http\Response + * @static + */ + public static function view($view, $data = [], $status = 200, $headers = []) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->view($view, $data, $status, $headers); + } + + /** + * Create a new JSON response instance. + * + * @param mixed $data + * @param int $status + * @param array $headers + * @param int $options + * @return \Illuminate\Http\JsonResponse + * @static + */ + public static function json($data = [], $status = 200, $headers = [], $options = 0) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->json($data, $status, $headers, $options); + } + + /** + * Create a new JSONP response instance. + * + * @param string $callback + * @param mixed $data + * @param int $status + * @param array $headers + * @param int $options + * @return \Illuminate\Http\JsonResponse + * @static + */ + public static function jsonp($callback, $data = [], $status = 200, $headers = [], $options = 0) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->jsonp($callback, $data, $status, $headers, $options); + } + + /** + * Create a new event stream response. + * + * @param \Closure $callback + * @param array $headers + * @param \Illuminate\Http\StreamedEvent|string|null $endStreamWith + * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @static + */ + public static function eventStream($callback, $headers = [], $endStreamWith = '') + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->eventStream($callback, $headers, $endStreamWith); + } + + /** + * Create a new streamed response instance. + * + * @param callable|null $callback + * @param int $status + * @param array $headers + * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @static + */ + public static function stream($callback, $status = 200, $headers = []) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->stream($callback, $status, $headers); + } + + /** + * Create a new streamed JSON response instance. + * + * @param array $data + * @param int $status + * @param array $headers + * @param int $encodingOptions + * @return \Symfony\Component\HttpFoundation\StreamedJsonResponse + * @static + */ + public static function streamJson($data, $status = 200, $headers = [], $encodingOptions = 15) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->streamJson($data, $status, $headers, $encodingOptions); + } + + /** + * Create a new streamed response instance as a file download. + * + * @param callable $callback + * @param string|null $name + * @param array $headers + * @param string|null $disposition + * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @throws \Illuminate\Routing\Exceptions\StreamedResponseException + * @static + */ + public static function streamDownload($callback, $name = null, $headers = [], $disposition = 'attachment') + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->streamDownload($callback, $name, $headers, $disposition); + } + + /** + * Create a new file download response. + * + * @param \SplFileInfo|string $file + * @param string|null $name + * @param array $headers + * @param string|null $disposition + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + * @static + */ + public static function download($file, $name = null, $headers = [], $disposition = 'attachment') + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->download($file, $name, $headers, $disposition); + } + + /** + * Return the raw contents of a binary file. + * + * @param \SplFileInfo|string $file + * @param array $headers + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + * @static + */ + public static function file($file, $headers = []) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->file($file, $headers); + } + + /** + * Create a new redirect response to the given path. + * + * @param string $path + * @param int $status + * @param array $headers + * @param bool|null $secure + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function redirectTo($path, $status = 302, $headers = [], $secure = null) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->redirectTo($path, $status, $headers, $secure); + } + + /** + * Create a new redirect response to a named route. + * + * @param \BackedEnum|string $route + * @param mixed $parameters + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function redirectToRoute($route, $parameters = [], $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->redirectToRoute($route, $parameters, $status, $headers); + } + + /** + * Create a new redirect response to a controller action. + * + * @param array|string $action + * @param mixed $parameters + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function redirectToAction($action, $parameters = [], $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->redirectToAction($action, $parameters, $status, $headers); + } + + /** + * Create a new redirect response, while putting the current URL in the session. + * + * @param string $path + * @param int $status + * @param array $headers + * @param bool|null $secure + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function redirectGuest($path, $status = 302, $headers = [], $secure = null) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->redirectGuest($path, $status, $headers, $secure); + } + + /** + * Create a new redirect response to the previously intended location. + * + * @param string $default + * @param int $status + * @param array $headers + * @param bool|null $secure + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function redirectToIntended($default = '/', $status = 302, $headers = [], $secure = null) + { + /** @var \Illuminate\Routing\ResponseFactory $instance */ + return $instance->redirectToIntended($default, $status, $headers, $secure); + } + + /** + * 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\Routing\ResponseFactory::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\Routing\ResponseFactory::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Routing\ResponseFactory::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Routing\ResponseFactory::flushMacros(); + } + + } + /** + * @method static \Illuminate\Routing\RouteRegistrar attribute(string $key, mixed $value) + * @method static \Illuminate\Routing\RouteRegistrar whereAlpha(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereAlphaNumeric(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereNumber(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereUlid(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereUuid(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereIn(array|string $parameters, array $values) + * @method static \Illuminate\Routing\RouteRegistrar as(string $value) + * @method static \Illuminate\Routing\RouteRegistrar can(\UnitEnum|string $ability, array|string $models = []) + * @method static \Illuminate\Routing\RouteRegistrar controller(string $controller) + * @method static \Illuminate\Routing\RouteRegistrar domain(\BackedEnum|string $value) + * @method static \Illuminate\Routing\RouteRegistrar middleware(array|string|null $middleware) + * @method static \Illuminate\Routing\RouteRegistrar missing(\Closure $missing) + * @method static \Illuminate\Routing\RouteRegistrar name(\BackedEnum|string $value) + * @method static \Illuminate\Routing\RouteRegistrar namespace(string|null $value) + * @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix) + * @method static \Illuminate\Routing\RouteRegistrar scopeBindings() + * @method static \Illuminate\Routing\RouteRegistrar where(array $where) + * @method static \Illuminate\Routing\RouteRegistrar withoutMiddleware(array|string $middleware) + * @method static \Illuminate\Routing\RouteRegistrar withoutScopedBindings() + * @see \Illuminate\Routing\Router + */ + class Route { + /** + * Register a new GET route with the router. + * + * @param string $uri + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function get($uri, $action = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->get($uri, $action); + } + + /** + * Register a new POST route with the router. + * + * @param string $uri + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function post($uri, $action = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->post($uri, $action); + } + + /** + * Register a new PUT route with the router. + * + * @param string $uri + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function put($uri, $action = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->put($uri, $action); + } + + /** + * Register a new PATCH route with the router. + * + * @param string $uri + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function patch($uri, $action = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->patch($uri, $action); + } + + /** + * Register a new DELETE route with the router. + * + * @param string $uri + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function delete($uri, $action = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->delete($uri, $action); + } + + /** + * Register a new OPTIONS route with the router. + * + * @param string $uri + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function options($uri, $action = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->options($uri, $action); + } + + /** + * Register a new route responding to all verbs. + * + * @param string $uri + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function any($uri, $action = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->any($uri, $action); + } + + /** + * Register a new fallback route with the router. + * + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function fallback($action) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->fallback($action); + } + + /** + * Create a redirect from one URI to another. + * + * @param string $uri + * @param string $destination + * @param int $status + * @return \Illuminate\Routing\Route + * @static + */ + public static function redirect($uri, $destination, $status = 302) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->redirect($uri, $destination, $status); + } + + /** + * Create a permanent redirect from one URI to another. + * + * @param string $uri + * @param string $destination + * @return \Illuminate\Routing\Route + * @static + */ + public static function permanentRedirect($uri, $destination) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->permanentRedirect($uri, $destination); + } + + /** + * Register a new route that returns a view. + * + * @param string $uri + * @param string $view + * @param array $data + * @param int|array $status + * @param array $headers + * @return \Illuminate\Routing\Route + * @static + */ + public static function view($uri, $view, $data = [], $status = 200, $headers = []) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->view($uri, $view, $data, $status, $headers); + } + + /** + * Register a new route with the given verbs. + * + * @param array|string $methods + * @param string $uri + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function match($methods, $uri, $action = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->match($methods, $uri, $action); + } + + /** + * Register an array of resource controllers. + * + * @param array $resources + * @param array $options + * @return void + * @static + */ + public static function resources($resources, $options = []) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->resources($resources, $options); + } + + /** + * Register an array of resource controllers that can be soft deleted. + * + * @param array $resources + * @param array $options + * @return void + * @static + */ + public static function softDeletableResources($resources, $options = []) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->softDeletableResources($resources, $options); + } + + /** + * Route a resource to a controller. + * + * @param string $name + * @param string $controller + * @param array $options + * @return \Illuminate\Routing\PendingResourceRegistration + * @static + */ + public static function resource($name, $controller, $options = []) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->resource($name, $controller, $options); + } + + /** + * Register an array of API resource controllers. + * + * @param array $resources + * @param array $options + * @return void + * @static + */ + public static function apiResources($resources, $options = []) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->apiResources($resources, $options); + } + + /** + * Route an API resource to a controller. + * + * @param string $name + * @param string $controller + * @param array $options + * @return \Illuminate\Routing\PendingResourceRegistration + * @static + */ + public static function apiResource($name, $controller, $options = []) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->apiResource($name, $controller, $options); + } + + /** + * Register an array of singleton resource controllers. + * + * @param array $singletons + * @param array $options + * @return void + * @static + */ + public static function singletons($singletons, $options = []) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->singletons($singletons, $options); + } + + /** + * Route a singleton resource to a controller. + * + * @param string $name + * @param string $controller + * @param array $options + * @return \Illuminate\Routing\PendingSingletonResourceRegistration + * @static + */ + public static function singleton($name, $controller, $options = []) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->singleton($name, $controller, $options); + } + + /** + * Register an array of API singleton resource controllers. + * + * @param array $singletons + * @param array $options + * @return void + * @static + */ + public static function apiSingletons($singletons, $options = []) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->apiSingletons($singletons, $options); + } + + /** + * Route an API singleton resource to a controller. + * + * @param string $name + * @param string $controller + * @param array $options + * @return \Illuminate\Routing\PendingSingletonResourceRegistration + * @static + */ + public static function apiSingleton($name, $controller, $options = []) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->apiSingleton($name, $controller, $options); + } + + /** + * Create a route group with shared attributes. + * + * @param array $attributes + * @param \Closure|array|string $routes + * @return \Illuminate\Routing\Router + * @static + */ + public static function group($attributes, $routes) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->group($attributes, $routes); + } + + /** + * Merge the given array with the last group stack. + * + * @param array $new + * @param bool $prependExistingPrefix + * @return array + * @static + */ + public static function mergeWithLastGroup($new, $prependExistingPrefix = true) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->mergeWithLastGroup($new, $prependExistingPrefix); + } + + /** + * Get the prefix from the last group on the stack. + * + * @return string + * @static + */ + public static function getLastGroupPrefix() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->getLastGroupPrefix(); + } + + /** + * Add a route to the underlying route collection. + * + * @param array|string $methods + * @param string $uri + * @param array|string|callable|null $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function addRoute($methods, $uri, $action) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->addRoute($methods, $uri, $action); + } + + /** + * Create a new Route object. + * + * @param array|string $methods + * @param string $uri + * @param mixed $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function newRoute($methods, $uri, $action) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->newRoute($methods, $uri, $action); + } + + /** + * Return the response returned by the given route. + * + * @param string $name + * @return \Symfony\Component\HttpFoundation\Response + * @static + */ + public static function respondWithRoute($name) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->respondWithRoute($name); + } + + /** + * Dispatch the request to the application. + * + * @param \Illuminate\Http\Request $request + * @return \Symfony\Component\HttpFoundation\Response + * @static + */ + public static function dispatch($request) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->dispatch($request); + } + + /** + * Dispatch the request to a route and return the response. + * + * @param \Illuminate\Http\Request $request + * @return \Symfony\Component\HttpFoundation\Response + * @static + */ + public static function dispatchToRoute($request) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->dispatchToRoute($request); + } + + /** + * Gather the middleware for the given route with resolved class names. + * + * @param \Illuminate\Routing\Route $route + * @return array + * @static + */ + public static function gatherRouteMiddleware($route) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->gatherRouteMiddleware($route); + } + + /** + * Resolve a flat array of middleware classes from the provided array. + * + * @param array $middleware + * @param array $excluded + * @return array + * @static + */ + public static function resolveMiddleware($middleware, $excluded = []) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->resolveMiddleware($middleware, $excluded); + } + + /** + * Create a response instance from the given value. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * @param mixed $response + * @return \Symfony\Component\HttpFoundation\Response + * @static + */ + public static function prepareResponse($request, $response) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->prepareResponse($request, $response); + } + + /** + * Static version of prepareResponse. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * @param mixed $response + * @return \Symfony\Component\HttpFoundation\Response + * @static + */ + public static function toResponse($request, $response) + { + return \Illuminate\Routing\Router::toResponse($request, $response); + } + + /** + * Substitute the route bindings onto the route. + * + * @param \Illuminate\Routing\Route $route + * @return \Illuminate\Routing\Route + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model> + * @throws \Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException + * @static + */ + public static function substituteBindings($route) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->substituteBindings($route); + } + + /** + * Substitute the implicit route bindings for the given route. + * + * @param \Illuminate\Routing\Route $route + * @return void + * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model> + * @throws \Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException + * @static + */ + public static function substituteImplicitBindings($route) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->substituteImplicitBindings($route); + } + + /** + * Register a callback to run after implicit bindings are substituted. + * + * @param callable $callback + * @return \Illuminate\Routing\Router + * @static + */ + public static function substituteImplicitBindingsUsing($callback) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->substituteImplicitBindingsUsing($callback); + } + + /** + * Register a route matched event listener. + * + * @param string|callable $callback + * @return void + * @static + */ + public static function matched($callback) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->matched($callback); + } + + /** + * Get all of the defined middleware short-hand names. + * + * @return array + * @static + */ + public static function getMiddleware() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->getMiddleware(); + } + + /** + * Register a short-hand name for a middleware. + * + * @param string $name + * @param string $class + * @return \Illuminate\Routing\Router + * @static + */ + public static function aliasMiddleware($name, $class) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->aliasMiddleware($name, $class); + } + + /** + * Check if a middlewareGroup with the given name exists. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMiddlewareGroup($name) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->hasMiddlewareGroup($name); + } + + /** + * Get all of the defined middleware groups. + * + * @return array + * @static + */ + public static function getMiddlewareGroups() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->getMiddlewareGroups(); + } + + /** + * Register a group of middleware. + * + * @param string $name + * @param array $middleware + * @return \Illuminate\Routing\Router + * @static + */ + public static function middlewareGroup($name, $middleware) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->middlewareGroup($name, $middleware); + } + + /** + * Add a middleware to the beginning of a middleware group. + * + * If the middleware is already in the group, it will not be added again. + * + * @param string $group + * @param string $middleware + * @return \Illuminate\Routing\Router + * @static + */ + public static function prependMiddlewareToGroup($group, $middleware) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->prependMiddlewareToGroup($group, $middleware); + } + + /** + * Add a middleware to the end of a middleware group. + * + * If the middleware is already in the group, it will not be added again. + * + * @param string $group + * @param string $middleware + * @return \Illuminate\Routing\Router + * @static + */ + public static function pushMiddlewareToGroup($group, $middleware) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->pushMiddlewareToGroup($group, $middleware); + } + + /** + * Remove the given middleware from the specified group. + * + * @param string $group + * @param string $middleware + * @return \Illuminate\Routing\Router + * @static + */ + public static function removeMiddlewareFromGroup($group, $middleware) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->removeMiddlewareFromGroup($group, $middleware); + } + + /** + * Flush the router's middleware groups. + * + * @return \Illuminate\Routing\Router + * @static + */ + public static function flushMiddlewareGroups() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->flushMiddlewareGroups(); + } + + /** + * Add a new route parameter binder. + * + * @param string $key + * @param string|callable $binder + * @return void + * @static + */ + public static function bind($key, $binder) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->bind($key, $binder); + } + + /** + * Register a model binder for a wildcard. + * + * @param string $key + * @param string $class + * @param \Closure|null $callback + * @return void + * @static + */ + public static function model($key, $class, $callback = null) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->model($key, $class, $callback); + } + + /** + * Get the binding callback for a given binding. + * + * @param string $key + * @return \Closure|null + * @static + */ + public static function getBindingCallback($key) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->getBindingCallback($key); + } + + /** + * Get the global "where" patterns. + * + * @return array + * @static + */ + public static function getPatterns() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->getPatterns(); + } + + /** + * Set a global where pattern on all routes. + * + * @param string $key + * @param string $pattern + * @return void + * @static + */ + public static function pattern($key, $pattern) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->pattern($key, $pattern); + } + + /** + * Set a group of global where patterns on all routes. + * + * @param array $patterns + * @return void + * @static + */ + public static function patterns($patterns) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->patterns($patterns); + } + + /** + * Determine if the router currently has a group stack. + * + * @return bool + * @static + */ + public static function hasGroupStack() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->hasGroupStack(); + } + + /** + * Get the current group stack for the router. + * + * @return array + * @static + */ + public static function getGroupStack() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->getGroupStack(); + } + + /** + * Get a route parameter for the current route. + * + * @param string $key + * @param string|null $default + * @return mixed + * @static + */ + public static function input($key, $default = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->input($key, $default); + } + + /** + * Get the request currently being dispatched. + * + * @return \Illuminate\Http\Request + * @static + */ + public static function getCurrentRequest() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->getCurrentRequest(); + } + + /** + * Get the currently dispatched route instance. + * + * @return \Illuminate\Routing\Route|null + * @static + */ + public static function getCurrentRoute() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->getCurrentRoute(); + } + + /** + * Get the currently dispatched route instance. + * + * @return \Illuminate\Routing\Route|null + * @static + */ + public static function current() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->current(); + } + + /** + * Check if a route with the given name exists. + * + * @param string|array $name + * @return bool + * @static + */ + public static function has($name) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->has($name); + } + + /** + * Get the current route name. + * + * @return string|null + * @static + */ + public static function currentRouteName() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->currentRouteName(); + } + + /** + * Alias for the "currentRouteNamed" method. + * + * @param mixed $patterns + * @return bool + * @static + */ + public static function is(...$patterns) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->is(...$patterns); + } + + /** + * Determine if the current route matches a pattern. + * + * @param mixed $patterns + * @return bool + * @static + */ + public static function currentRouteNamed(...$patterns) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->currentRouteNamed(...$patterns); + } + + /** + * Get the current route action. + * + * @return string|null + * @static + */ + public static function currentRouteAction() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->currentRouteAction(); + } + + /** + * Alias for the "currentRouteUses" method. + * + * @param array|string $patterns + * @return bool + * @static + */ + public static function uses(...$patterns) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->uses(...$patterns); + } + + /** + * Determine if the current route action matches a given action. + * + * @param string $action + * @return bool + * @static + */ + public static function currentRouteUses($action) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->currentRouteUses($action); + } + + /** + * Set the unmapped global resource parameters to singular. + * + * @param bool $singular + * @return void + * @static + */ + public static function singularResourceParameters($singular = true) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->singularResourceParameters($singular); + } + + /** + * Set the global resource parameter mapping. + * + * @param array $parameters + * @return void + * @static + */ + public static function resourceParameters($parameters = []) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->resourceParameters($parameters); + } + + /** + * Get or set the verbs used in the resource URIs. + * + * @param array $verbs + * @return array|null + * @static + */ + public static function resourceVerbs($verbs = []) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->resourceVerbs($verbs); + } + + /** + * Get the underlying route collection. + * + * @return \Illuminate\Routing\RouteCollectionInterface + * @static + */ + public static function getRoutes() + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->getRoutes(); + } + + /** + * Set the route collection instance. + * + * @param \Illuminate\Routing\RouteCollection $routes + * @return void + * @static + */ + public static function setRoutes($routes) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->setRoutes($routes); + } + + /** + * Set the compiled route collection instance. + * + * @param array $routes + * @return void + * @static + */ + public static function setCompiledRoutes($routes) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->setCompiledRoutes($routes); + } + + /** + * Remove any duplicate middleware from the given array. + * + * @param array $middleware + * @return array + * @static + */ + public static function uniqueMiddleware($middleware) + { + return \Illuminate\Routing\Router::uniqueMiddleware($middleware); + } + + /** + * Set the container instance used by the router. + * + * @param \Illuminate\Container\Container $container + * @return \Illuminate\Routing\Router + * @static + */ + public static function setContainer($container) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->setContainer($container); + } + + /** + * 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\Routing\Router::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\Routing\Router::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Routing\Router::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Routing\Router::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\Routing\Router $instance */ + return $instance->macroCall($method, $parameters); + } + + /** + * Call the given Closure with this instance then return the instance. + * + * @param (callable($this): mixed)|null $callback + * @return ($callback is null ? \Illuminate\Support\HigherOrderTapProxy : $this) + * @static + */ + public static function tap($callback = null) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->tap($callback); + } + + /** + * @param array $props + * @see \Inertia\ServiceProvider::registerRouterMacro() + * @static + */ + public static function inertia($uri, $component, $props = []) + { + return \Illuminate\Routing\Router::inertia($uri, $component, $props); + } + + } + /** + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes withoutOverlapping(int $expiresAt = 1440) + * @method static void mergeAttributes(\Illuminate\Console\Scheduling\Event $event) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes user(string $user) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes environments(mixed $environments) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes evenInMaintenanceMode() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes onOneServer() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes runInBackground() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes when(\Closure|bool $callback) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes skip(\Closure|bool $callback) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes name(string $description) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes description(string $description) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes cron(string $expression) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes between(string $startTime, string $endTime) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes unlessBetween(string $startTime, string $endTime) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everySecond() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyTwoSeconds() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyFiveSeconds() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyTenSeconds() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyFifteenSeconds() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyTwentySeconds() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyThirtySeconds() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyMinute() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyTwoMinutes() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyThreeMinutes() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyFourMinutes() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyFiveMinutes() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyTenMinutes() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyFifteenMinutes() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyThirtyMinutes() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes hourly() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes hourlyAt(array|string|int|int[] $offset) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyOddHour(array|string|int $offset = 0) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyTwoHours(array|string|int $offset = 0) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyThreeHours(array|string|int $offset = 0) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everyFourHours(array|string|int $offset = 0) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes everySixHours(array|string|int $offset = 0) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes daily() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes at(string $time) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes dailyAt(string $time) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes twiceDaily(int $first = 1, int $second = 13) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes twiceDailyAt(int $first = 1, int $second = 13, int $offset = 0) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes weekdays() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes weekends() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes mondays() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes tuesdays() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes wednesdays() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes thursdays() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes fridays() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes saturdays() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes sundays() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes weekly() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes weeklyOn(mixed $dayOfWeek, string $time = '0:0') + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes monthly() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes monthlyOn(int $dayOfMonth = 1, string $time = '0:0') + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes twiceMonthly(int $first = 1, int $second = 16, string $time = '0:0') + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes lastDayOfMonth(string $time = '0:0') + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes daysOfMonth(array|int ...$days) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes quarterly() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes quarterlyOn(int $dayOfQuarter = 1, string $time = '0:0') + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes yearly() + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes yearlyOn(int $month = 1, int|string $dayOfMonth = 1, string $time = '0:0') + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes days(mixed $days) + * @method static \Illuminate\Console\Scheduling\PendingEventAttributes timezone(\UnitEnum|\DateTimeZone|string $timezone) + * @see \Illuminate\Console\Scheduling\Schedule + */ + class Schedule { + /** + * Add a new callback event to the schedule. + * + * @param string|callable $callback + * @param array $parameters + * @return \Illuminate\Console\Scheduling\CallbackEvent + * @static + */ + public static function call($callback, $parameters = []) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->call($callback, $parameters); + } + + /** + * Add a new Artisan command event to the schedule. + * + * @param \Symfony\Component\Console\Command\Command|string $command + * @param array $parameters + * @return \Illuminate\Console\Scheduling\Event + * @static + */ + public static function command($command, $parameters = []) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->command($command, $parameters); + } + + /** + * Add a new job callback event to the schedule. + * + * @param object|string $job + * @param \UnitEnum|string|null $queue + * @param \UnitEnum|string|null $connection + * @return \Illuminate\Console\Scheduling\CallbackEvent + * @static + */ + public static function job($job, $queue = null, $connection = null) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->job($job, $queue, $connection); + } + + /** + * Add a new command event to the schedule. + * + * @param string $command + * @param array $parameters + * @return \Illuminate\Console\Scheduling\Event + * @static + */ + public static function exec($command, $parameters = []) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->exec($command, $parameters); + } + + /** + * Create new schedule group. + * + * @param \Closure $events + * @return void + * @throws \RuntimeException + * @static + */ + public static function group($events) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + $instance->group($events); + } + + /** + * Compile array input for a command. + * + * @param string|int $key + * @param array $value + * @return string + * @static + */ + public static function compileArrayInput($key, $value) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->compileArrayInput($key, $value); + } + + /** + * Determine if the server is allowed to run this event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @param \DateTimeInterface $time + * @return bool + * @static + */ + public static function serverShouldRun($event, $time) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->serverShouldRun($event, $time); + } + + /** + * Get all of the events on the schedule that are due. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Support\Collection + * @static + */ + public static function dueEvents($app) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->dueEvents($app); + } + + /** + * Get all of the events on the schedule. + * + * @return \Illuminate\Console\Scheduling\Event[] + * @static + */ + public static function events() + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->events(); + } + + /** + * Specify the cache store that should be used to store mutexes. + * + * @param \UnitEnum|string $store + * @return \Illuminate\Console\Scheduling\Schedule + * @static + */ + public static function useCache($store) + { + /** @var \Illuminate\Console\Scheduling\Schedule $instance */ + return $instance->useCache($store); + } + + /** + * 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\Console\Scheduling\Schedule::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\Console\Scheduling\Schedule::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Console\Scheduling\Schedule::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Console\Scheduling\Schedule::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\Console\Scheduling\Schedule $instance */ + return $instance->macroCall($method, $parameters); + } + + } + /** + * @see \Illuminate\Database\Schema\Builder + */ + class Schema { + /** + * Drop all tables from the database. + * + * @return void + * @static + */ + public static function dropAllTables() + { + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->dropAllTables(); + } + + /** + * Drop all views from the database. + * + * @return void + * @static + */ + public static function dropAllViews() + { + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->dropAllViews(); + } + + /** + * Get the names of current schemas for the connection. + * + * @return string[]|null + * @static + */ + public static function getCurrentSchemaListing() + { + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getCurrentSchemaListing(); + } + + /** + * Set the default string length for migrations. + * + * @param non-negative-int $length + * @return void + * @static + */ + public static function defaultStringLength($length) + { + //Method inherited from \Illuminate\Database\Schema\Builder + \Illuminate\Database\Schema\MySqlBuilder::defaultStringLength($length); + } + + /** + * Set the default time precision for migrations. + * + * @static + */ + public static function defaultTimePrecision($precision) + { + //Method inherited from \Illuminate\Database\Schema\Builder + return \Illuminate\Database\Schema\MySqlBuilder::defaultTimePrecision($precision); + } + + /** + * Set the default morph key type for migrations. + * + * @param string $type + * @return void + * @throws \InvalidArgumentException + * @static + */ + public static function defaultMorphKeyType($type) + { + //Method inherited from \Illuminate\Database\Schema\Builder + \Illuminate\Database\Schema\MySqlBuilder::defaultMorphKeyType($type); + } + + /** + * Set the default morph key type for migrations to UUIDs. + * + * @return void + * @static + */ + public static function morphUsingUuids() + { + //Method inherited from \Illuminate\Database\Schema\Builder + \Illuminate\Database\Schema\MySqlBuilder::morphUsingUuids(); + } + + /** + * Set the default morph key type for migrations to ULIDs. + * + * @return void + * @static + */ + public static function morphUsingUlids() + { + //Method inherited from \Illuminate\Database\Schema\Builder + \Illuminate\Database\Schema\MySqlBuilder::morphUsingUlids(); + } + + /** + * Create a database in the schema. + * + * @param string $name + * @return bool + * @static + */ + public static function createDatabase($name) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->createDatabase($name); + } + + /** + * Drop a database from the schema if the database exists. + * + * @param string $name + * @return bool + * @static + */ + public static function dropDatabaseIfExists($name) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->dropDatabaseIfExists($name); + } + + /** + * Get the schemas that belong to the connection. + * + * @return \Illuminate\Database\Schema\list + * @static + */ + public static function getSchemas() + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getSchemas(); + } + + /** + * Determine if the given table exists. + * + * @param string $table + * @return bool + * @static + */ + public static function hasTable($table) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->hasTable($table); + } + + /** + * Determine if the given view exists. + * + * @param string $view + * @return bool + * @static + */ + public static function hasView($view) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->hasView($view); + } + + /** + * Get the tables that belong to the connection. + * + * @param string|string[]|null $schema + * @return \Illuminate\Database\Schema\list + * @static + */ + public static function getTables($schema = null) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getTables($schema); + } + + /** + * Get the names of the tables that belong to the connection. + * + * @param string|string[]|null $schema + * @param bool $schemaQualified + * @return list + * @static + */ + public static function getTableListing($schema = null, $schemaQualified = true) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getTableListing($schema, $schemaQualified); + } + + /** + * Get the views that belong to the connection. + * + * @param string|string[]|null $schema + * @return \Illuminate\Database\Schema\list + * @static + */ + public static function getViews($schema = null) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getViews($schema); + } + + /** + * Get the user-defined types that belong to the connection. + * + * @param string|string[]|null $schema + * @return \Illuminate\Database\Schema\list + * @static + */ + public static function getTypes($schema = null) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getTypes($schema); + } + + /** + * Determine if the given table has a given column. + * + * @param string $table + * @param string $column + * @return bool + * @static + */ + public static function hasColumn($table, $column) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->hasColumn($table, $column); + } + + /** + * Determine if the given table has given columns. + * + * @param string $table + * @param array $columns + * @return bool + * @static + */ + public static function hasColumns($table, $columns) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->hasColumns($table, $columns); + } + + /** + * Execute a table builder callback if the given table has a given column. + * + * @param string $table + * @param string $column + * @param \Closure $callback + * @return void + * @static + */ + public static function whenTableHasColumn($table, $column, $callback) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->whenTableHasColumn($table, $column, $callback); + } + + /** + * Execute a table builder callback if the given table doesn't have a given column. + * + * @param string $table + * @param string $column + * @param \Closure $callback + * @return void + * @static + */ + public static function whenTableDoesntHaveColumn($table, $column, $callback) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->whenTableDoesntHaveColumn($table, $column, $callback); + } + + /** + * Execute a table builder callback if the given table has a given index. + * + * @param string $table + * @param string|array $index + * @param \Closure $callback + * @param string|null $type + * @return void + * @static + */ + public static function whenTableHasIndex($table, $index, $callback, $type = null) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->whenTableHasIndex($table, $index, $callback, $type); + } + + /** + * Execute a table builder callback if the given table doesn't have a given index. + * + * @param string $table + * @param string|array $index + * @param \Closure $callback + * @param string|null $type + * @return void + * @static + */ + public static function whenTableDoesntHaveIndex($table, $index, $callback, $type = null) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->whenTableDoesntHaveIndex($table, $index, $callback, $type); + } + + /** + * Get the data type for the given column name. + * + * @param string $table + * @param string $column + * @param bool $fullDefinition + * @return string + * @static + */ + public static function getColumnType($table, $column, $fullDefinition = false) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getColumnType($table, $column, $fullDefinition); + } + + /** + * Get the column listing for a given table. + * + * @param string $table + * @return list + * @static + */ + public static function getColumnListing($table) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getColumnListing($table); + } + + /** + * Get the columns for a given table. + * + * @param string $table + * @return \Illuminate\Database\Schema\list + * @static + */ + public static function getColumns($table) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getColumns($table); + } + + /** + * Get the indexes for a given table. + * + * @param string $table + * @return \Illuminate\Database\Schema\list, type: string, unique: bool, primary: bool}> + * @static + */ + public static function getIndexes($table) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getIndexes($table); + } + + /** + * Get the names of the indexes for a given table. + * + * @param string $table + * @return list + * @static + */ + public static function getIndexListing($table) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getIndexListing($table); + } + + /** + * Determine if the given table has a given index. + * + * @param string $table + * @param string|array $index + * @param string|null $type + * @return bool + * @static + */ + public static function hasIndex($table, $index, $type = null) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->hasIndex($table, $index, $type); + } + + /** + * Get the foreign keys for a given table. + * + * @param string $table + * @return array + * @static + */ + public static function getForeignKeys($table) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getForeignKeys($table); + } + + /** + * Modify a table on the schema. + * + * @param string $table + * @param \Closure $callback + * @return void + * @static + */ + public static function table($table, $callback) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->table($table, $callback); + } + + /** + * Create a new table on the schema. + * + * @param string $table + * @param \Closure $callback + * @return void + * @static + */ + public static function create($table, $callback) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->create($table, $callback); + } + + /** + * Drop a table from the schema. + * + * @param string $table + * @return void + * @static + */ + public static function drop($table) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->drop($table); + } + + /** + * Drop a table from the schema if it exists. + * + * @param string $table + * @return void + * @static + */ + public static function dropIfExists($table) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->dropIfExists($table); + } + + /** + * Drop columns from a table schema. + * + * @param string $table + * @param string|array $columns + * @return void + * @static + */ + public static function dropColumns($table, $columns) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->dropColumns($table, $columns); + } + + /** + * Drop all types from the database. + * + * @return void + * @throws \LogicException + * @static + */ + public static function dropAllTypes() + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->dropAllTypes(); + } + + /** + * Rename a table on the schema. + * + * @param string $from + * @param string $to + * @return void + * @static + */ + public static function rename($from, $to) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->rename($from, $to); + } + + /** + * Enable foreign key constraints. + * + * @return bool + * @static + */ + public static function enableForeignKeyConstraints() + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->enableForeignKeyConstraints(); + } + + /** + * Disable foreign key constraints. + * + * @return bool + * @static + */ + public static function disableForeignKeyConstraints() + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->disableForeignKeyConstraints(); + } + + /** + * Disable foreign key constraints during the execution of a callback. + * + * @template TReturn + * @param (\Closure(): TReturn) $callback + * @return TReturn + * @static + */ + public static function withoutForeignKeyConstraints($callback) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->withoutForeignKeyConstraints($callback); + } + + /** + * Create the vector extension on the schema if it does not exist. + * + * @param string|null $schema + * @return void + * @static + */ + public static function ensureVectorExtensionExists($schema = null) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->ensureVectorExtensionExists($schema); + } + + /** + * Create a new extension on the schema if it does not exist. + * + * @param string $name + * @param string|null $schema + * @return void + * @static + */ + public static function ensureExtensionExists($name, $schema = null) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->ensureExtensionExists($name, $schema); + } + + /** + * Get the default schema name for the connection. + * + * @return string|null + * @static + */ + public static function getCurrentSchemaName() + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getCurrentSchemaName(); + } + + /** + * Parse the given database object reference and extract the schema and table. + * + * @param string $reference + * @param string|bool|null $withDefaultSchema + * @return array{string|null, string} + * @static + */ + public static function parseSchemaAndTable($reference, $withDefaultSchema = null) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->parseSchemaAndTable($reference, $withDefaultSchema); + } + + /** + * Get the database connection instance. + * + * @return \Illuminate\Database\Connection + * @static + */ + public static function getConnection() + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + return $instance->getConnection(); + } + + /** + * Set the Schema Blueprint resolver callback. + * + * @param \Closure(\Illuminate\Database\Connection, string, \Closure|null): \Illuminate\Database\Schema\Blueprint $resolver + * @return void + * @static + */ + public static function blueprintResolver($resolver) + { + //Method inherited from \Illuminate\Database\Schema\Builder + /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ + $instance->blueprintResolver($resolver); + } + + /** + * 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) + { + //Method inherited from \Illuminate\Database\Schema\Builder + \Illuminate\Database\Schema\MySqlBuilder::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) + { + //Method inherited from \Illuminate\Database\Schema\Builder + \Illuminate\Database\Schema\MySqlBuilder::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + //Method inherited from \Illuminate\Database\Schema\Builder + return \Illuminate\Database\Schema\MySqlBuilder::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + //Method inherited from \Illuminate\Database\Schema\Builder + \Illuminate\Database\Schema\MySqlBuilder::flushMacros(); + } + + } + /** + * @see \Illuminate\Session\SessionManager + */ + class Session { + /** + * Determine if requests for the same session should wait for each to finish before executing. + * + * @return bool + * @static + */ + public static function shouldBlock() + { + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->shouldBlock(); + } + + /** + * Get the name of the cache store / driver that should be used to acquire session locks. + * + * @return string|null + * @static + */ + public static function blockDriver() + { + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->blockDriver(); + } + + /** + * Get the maximum number of seconds the session lock should be held for. + * + * @return int + * @static + */ + public static function defaultRouteBlockLockSeconds() + { + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->defaultRouteBlockLockSeconds(); + } + + /** + * Get the maximum number of seconds to wait while attempting to acquire a route block session lock. + * + * @return int + * @static + */ + public static function defaultRouteBlockWaitSeconds() + { + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->defaultRouteBlockWaitSeconds(); + } + + /** + * Get the session configuration. + * + * @return array + * @static + */ + public static function getSessionConfig() + { + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->getSessionConfig(); + } + + /** + * Get the default session driver name. + * + * @return string|null + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Set the default session driver name. + * + * @param string $name + * @return void + * @static + */ + public static function setDefaultDriver($name) + { + /** @var \Illuminate\Session\SessionManager $instance */ + $instance->setDefaultDriver($name); + } + + /** + * Get a driver instance. + * + * @param string|null $driver + * @return mixed + * @throws \InvalidArgumentException + * @static + */ + public static function driver($driver = null) + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->driver($driver); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return \Illuminate\Session\SessionManager + * @static + */ + public static function extend($driver, $callback) + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->extend($driver, $callback); + } + + /** + * Get all of the created "drivers". + * + * @return array + * @static + */ + public static function getDrivers() + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->getDrivers(); + } + + /** + * Get the container instance used by the manager. + * + * @return \Illuminate\Contracts\Container\Container + * @static + */ + public static function getContainer() + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->getContainer(); + } + + /** + * Set the container instance used by the manager. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Session\SessionManager + * @static + */ + public static function setContainer($container) + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->setContainer($container); + } + + /** + * Forget all of the resolved driver instances. + * + * @return \Illuminate\Session\SessionManager + * @static + */ + public static function forgetDrivers() + { + //Method inherited from \Illuminate\Support\Manager + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->forgetDrivers(); + } + + /** + * Start the session, reading the data from a handler. + * + * @return bool + * @static + */ + public static function start() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->start(); + } + + /** + * Save the session data to storage. + * + * @return void + * @static + */ + public static function save() + { + /** @var \Illuminate\Session\Store $instance */ + $instance->save(); + } + + /** + * Age the flash data for the session. + * + * @return void + * @static + */ + public static function ageFlashData() + { + /** @var \Illuminate\Session\Store $instance */ + $instance->ageFlashData(); + } + + /** + * Get all of the session data. + * + * @return array + * @static + */ + public static function all() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->all(); + } + + /** + * Get a subset of the session data. + * + * @param array $keys + * @return array + * @static + */ + public static function only($keys) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->only($keys); + } + + /** + * Get all the session data except for a specified array of items. + * + * @param array $keys + * @return array + * @static + */ + public static function except($keys) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->except($keys); + } + + /** + * Checks if a key exists. + * + * @param \UnitEnum|string|array $key + * @return bool + * @static + */ + public static function exists($key) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->exists($key); + } + + /** + * Determine if the given key is missing from the session data. + * + * @param \UnitEnum|string|array $key + * @return bool + * @static + */ + public static function missing($key) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->missing($key); + } + + /** + * Determine if a key is present and not null. + * + * @param \UnitEnum|string|array $key + * @return bool + * @static + */ + public static function has($key) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->has($key); + } + + /** + * Determine if any of the given keys are present and not null. + * + * @param \UnitEnum|string|array $key + * @return bool + * @static + */ + public static function hasAny($key) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->hasAny($key); + } + + /** + * Get an item from the session. + * + * @param \UnitEnum|string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function get($key, $default = null) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->get($key, $default); + } + + /** + * Get the value of a given key and then forget it. + * + * @param \UnitEnum|string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function pull($key, $default = null) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->pull($key, $default); + } + + /** + * Determine if the session contains old input. + * + * @param string|null $key + * @return bool + * @static + */ + public static function hasOldInput($key = null) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->hasOldInput($key); + } + + /** + * Get the requested item from the flashed input array. + * + * @param string|null $key + * @param mixed $default + * @return mixed + * @static + */ + public static function getOldInput($key = null, $default = null) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->getOldInput($key, $default); + } + + /** + * Replace the given session attributes entirely. + * + * @param array $attributes + * @return void + * @static + */ + public static function replace($attributes) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->replace($attributes); + } + + /** + * Put a key / value pair or array of key / value pairs in the session. + * + * @param \UnitEnum|string|array $key + * @param mixed $value + * @return void + * @static + */ + public static function put($key, $value = null) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->put($key, $value); + } + + /** + * Get an item from the session, or store the default value. + * + * @param \UnitEnum|string $key + * @param \Closure $callback + * @return mixed + * @static + */ + public static function remember($key, $callback) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->remember($key, $callback); + } + + /** + * Push a value onto a session array. + * + * @param \UnitEnum|string $key + * @param mixed $value + * @return void + * @static + */ + public static function push($key, $value) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->push($key, $value); + } + + /** + * Increment the value of an item in the session. + * + * @param \UnitEnum|string $key + * @param int $amount + * @return mixed + * @static + */ + public static function increment($key, $amount = 1) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->increment($key, $amount); + } + + /** + * Decrement the value of an item in the session. + * + * @param \UnitEnum|string $key + * @param int $amount + * @return int + * @static + */ + public static function decrement($key, $amount = 1) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->decrement($key, $amount); + } + + /** + * Flash a key / value pair to the session. + * + * @param \UnitEnum|string $key + * @param mixed $value + * @return void + * @static + */ + public static function flash($key, $value = true) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->flash($key, $value); + } + + /** + * Flash a key / value pair to the session for immediate use. + * + * @param \UnitEnum|string $key + * @param mixed $value + * @return void + * @static + */ + public static function now($key, $value) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->now($key, $value); + } + + /** + * Reflash all of the session flash data. + * + * @return void + * @static + */ + public static function reflash() + { + /** @var \Illuminate\Session\Store $instance */ + $instance->reflash(); + } + + /** + * Reflash a subset of the current flash data. + * + * @param mixed $keys + * @return void + * @static + */ + public static function keep($keys = null) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->keep($keys); + } + + /** + * Flash an input array to the session. + * + * @param array $value + * @return void + * @static + */ + public static function flashInput($value) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->flashInput($value); + } + + /** + * Get the session cache instance. + * + * @return \Illuminate\Contracts\Cache\Repository + * @static + */ + public static function cache() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->cache(); + } + + /** + * Remove an item from the session, returning its value. + * + * @param \UnitEnum|string $key + * @return mixed + * @static + */ + public static function remove($key) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->remove($key); + } + + /** + * Remove one or many items from the session. + * + * @param \UnitEnum|string|array $keys + * @return void + * @static + */ + public static function forget($keys) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->forget($keys); + } + + /** + * Remove all of the items from the session. + * + * @return void + * @static + */ + public static function flush() + { + /** @var \Illuminate\Session\Store $instance */ + $instance->flush(); + } + + /** + * Flush the session data and regenerate the ID. + * + * @return bool + * @static + */ + public static function invalidate() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->invalidate(); + } + + /** + * Generate a new session identifier. + * + * @param bool $destroy + * @return bool + * @static + */ + public static function regenerate($destroy = false) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->regenerate($destroy); + } + + /** + * Generate a new session ID for the session. + * + * @param bool $destroy + * @return bool + * @static + */ + public static function migrate($destroy = false) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->migrate($destroy); + } + + /** + * Determine if the session has been started. + * + * @return bool + * @static + */ + public static function isStarted() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->isStarted(); + } + + /** + * Get the name of the session. + * + * @return string + * @static + */ + public static function getName() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->getName(); + } + + /** + * Set the name of the session. + * + * @param string $name + * @return void + * @static + */ + public static function setName($name) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->setName($name); + } + + /** + * Get the current session ID. + * + * @return string + * @static + */ + public static function id() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->id(); + } + + /** + * Get the current session ID. + * + * @return string + * @static + */ + public static function getId() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->getId(); + } + + /** + * Set the session ID. + * + * @param string|null $id + * @return void + * @static + */ + public static function setId($id) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->setId($id); + } + + /** + * Determine if this is a valid session ID. + * + * @param string|null $id + * @return bool + * @static + */ + public static function isValidId($id) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->isValidId($id); + } + + /** + * Set the existence of the session on the handler if applicable. + * + * @param bool $value + * @return void + * @static + */ + public static function setExists($value) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->setExists($value); + } + + /** + * Get the CSRF token value. + * + * @return string + * @static + */ + public static function token() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->token(); + } + + /** + * Regenerate the CSRF token value. + * + * @return void + * @static + */ + public static function regenerateToken() + { + /** @var \Illuminate\Session\Store $instance */ + $instance->regenerateToken(); + } + + /** + * Determine if the previous URI is available. + * + * @return bool + * @static + */ + public static function hasPreviousUri() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->hasPreviousUri(); + } + + /** + * Get the previous URL from the session as a URI instance. + * + * @return \Illuminate\Support\Uri + * @throws \RuntimeException + * @static + */ + public static function previousUri() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->previousUri(); + } + + /** + * Get the previous URL from the session. + * + * @return string|null + * @static + */ + public static function previousUrl() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->previousUrl(); + } + + /** + * Set the "previous" URL in the session. + * + * @param string $url + * @return void + * @static + */ + public static function setPreviousUrl($url) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->setPreviousUrl($url); + } + + /** + * Get the previous route name from the session. + * + * @return string|null + * @static + */ + public static function previousRoute() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->previousRoute(); + } + + /** + * Set the "previous" route name in the session. + * + * @param string|null $route + * @return void + * @static + */ + public static function setPreviousRoute($route) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->setPreviousRoute($route); + } + + /** + * Specify that the user has confirmed their password. + * + * @return void + * @static + */ + public static function passwordConfirmed() + { + /** @var \Illuminate\Session\Store $instance */ + $instance->passwordConfirmed(); + } + + /** + * Get the underlying session handler implementation. + * + * @return \SessionHandlerInterface + * @static + */ + public static function getHandler() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->getHandler(); + } + + /** + * Set the underlying session handler implementation. + * + * @param \SessionHandlerInterface $handler + * @return \SessionHandlerInterface + * @static + */ + public static function setHandler($handler) + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->setHandler($handler); + } + + /** + * Determine if the session handler needs a request. + * + * @return bool + * @static + */ + public static function handlerNeedsRequest() + { + /** @var \Illuminate\Session\Store $instance */ + return $instance->handlerNeedsRequest(); + } + + /** + * Set the request on the handler instance. + * + * @param \Illuminate\Http\Request $request + * @return void + * @static + */ + public static function setRequestOnHandler($request) + { + /** @var \Illuminate\Session\Store $instance */ + $instance->setRequestOnHandler($request); + } + + /** + * 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\Session\Store::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\Session\Store::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Session\Store::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Session\Store::flushMacros(); + } + + } + /** + * @method static bool has(string $location) + * @method static string read(string $location) + * @method static \League\Flysystem\DirectoryListing listContents(string $location, bool $deep = false) + * @method static int fileSize(string $path) + * @method static string visibility(string $path) + * @method static void write(string $location, string $contents, array $config = []) + * @method static void createDirectory(string $location, array $config = []) + * @see \Illuminate\Filesystem\FilesystemManager + */ + class Storage { + /** + * Get a filesystem instance. + * + * @param string|null $name + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function drive($name = null) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->drive($name); + } + + /** + * Get a filesystem instance. + * + * @param \UnitEnum|string|null $name + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function disk($name = null) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->disk($name); + } + + /** + * Get a default cloud filesystem instance. + * + * @return \Illuminate\Contracts\Filesystem\Cloud + * @static + */ + public static function cloud() + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->cloud(); + } + + /** + * Build an on-demand disk. + * + * @param string|array $config + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function build($config) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->build($config); + } + + /** + * Create an instance of the local driver. + * + * @param array $config + * @param string $name + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function createLocalDriver($config, $name = 'local') + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->createLocalDriver($config, $name); + } + + /** + * Create an instance of the ftp driver. + * + * @param array $config + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function createFtpDriver($config) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->createFtpDriver($config); + } + + /** + * Create an instance of the sftp driver. + * + * @param array $config + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function createSftpDriver($config) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->createSftpDriver($config); + } + + /** + * Create an instance of the Amazon S3 driver. + * + * @param array $config + * @return \Illuminate\Contracts\Filesystem\Cloud + * @static + */ + public static function createS3Driver($config) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->createS3Driver($config); + } + + /** + * Create a scoped driver. + * + * @param array $config + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @throws \InvalidArgumentException + * @static + */ + public static function createScopedDriver($config) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->createScopedDriver($config); + } + + /** + * Set the given disk instance. + * + * @param string $name + * @param mixed $disk + * @return \Illuminate\Filesystem\FilesystemManager + * @static + */ + public static function set($name, $disk) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->set($name, $disk); + } + + /** + * Get the default driver name. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Get the default cloud driver name. + * + * @return string + * @static + */ + public static function getDefaultCloudDriver() + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->getDefaultCloudDriver(); + } + + /** + * Unset the given disk instances. + * + * @param array|string $disk + * @return \Illuminate\Filesystem\FilesystemManager + * @static + */ + public static function forgetDisk($disk) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->forgetDisk($disk); + } + + /** + * Disconnect the given disk and remove from local cache. + * + * @param string|null $name + * @return void + * @static + */ + public static function purge($name = null) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + $instance->purge($name); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return \Illuminate\Filesystem\FilesystemManager + * @static + */ + public static function extend($driver, $callback) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->extend($driver, $callback); + } + + /** + * Set the application instance used by the manager. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return \Illuminate\Filesystem\FilesystemManager + * @static + */ + public static function setApplication($app) + { + /** @var \Illuminate\Filesystem\FilesystemManager $instance */ + return $instance->setApplication($app); + } + + /** + * Determine if temporary URLs can be generated. + * + * @return bool + * @static + */ + public static function providesTemporaryUrls() + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->providesTemporaryUrls(); + } + + /** + * Determine if temporary upload URLs can be generated. + * + * @return bool + * @static + */ + public static function providesTemporaryUploadUrls() + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->providesTemporaryUploadUrls(); + } + + /** + * Get a temporary URL for the file at the given path. + * + * @param string $path + * @param \DateTimeInterface $expiration + * @param array $options + * @return string + * @static + */ + public static function temporaryUrl($path, $expiration, $options = []) + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->temporaryUrl($path, $expiration, $options); + } + + /** + * Get a temporary upload URL for the file at the given path. + * + * @param string $path + * @param \DateTimeInterface $expiration + * @param array $options + * @return array + * @static + */ + public static function temporaryUploadUrl($path, $expiration, $options = []) + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->temporaryUploadUrl($path, $expiration, $options); + } + + /** + * Specify the name of the disk the adapter is managing. + * + * @param string $disk + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function diskName($disk) + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->diskName($disk); + } + + /** + * Indicate that signed URLs should serve the corresponding files. + * + * @param bool $serve + * @param \Closure|null $urlGeneratorResolver + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function shouldServeSignedUrls($serve = true, $urlGeneratorResolver = null) + { + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->shouldServeSignedUrls($serve, $urlGeneratorResolver); + } + + /** + * 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\Filesystem\LocalFilesystemAdapter $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\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->unless($value, $callback, $default); + } + + /** + * Assert that the given file or directory exists. + * + * @param string|array $path + * @param string|null $content + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function assertExists($path, $content = null) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->assertExists($path, $content); + } + + /** + * Assert that the number of files in path equals the expected count. + * + * @param string $path + * @param int $count + * @param bool $recursive + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function assertCount($path, $count, $recursive = false) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->assertCount($path, $count, $recursive); + } + + /** + * Assert that the given file or directory does not exist. + * + * @param string|array $path + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function assertMissing($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->assertMissing($path); + } + + /** + * Assert that the given directory is empty. + * + * @param string $path + * @return \Illuminate\Filesystem\LocalFilesystemAdapter + * @static + */ + public static function assertDirectoryEmpty($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->assertDirectoryEmpty($path); + } + + /** + * Determine if a file or directory exists. + * + * @param string $path + * @return bool + * @static + */ + public static function exists($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->exists($path); + } + + /** + * Determine if a file or directory is missing. + * + * @param string $path + * @return bool + * @static + */ + public static function missing($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->missing($path); + } + + /** + * Determine if a file exists. + * + * @param string $path + * @return bool + * @static + */ + public static function fileExists($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->fileExists($path); + } + + /** + * Determine if a file is missing. + * + * @param string $path + * @return bool + * @static + */ + public static function fileMissing($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->fileMissing($path); + } + + /** + * Determine if a directory exists. + * + * @param string $path + * @return bool + * @static + */ + public static function directoryExists($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->directoryExists($path); + } + + /** + * Determine if a directory is missing. + * + * @param string $path + * @return bool + * @static + */ + public static function directoryMissing($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->directoryMissing($path); + } + + /** + * Get the full path to the file that exists at the given relative path. + * + * @param string $path + * @return string + * @static + */ + public static function path($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->path($path); + } + + /** + * Get the contents of a file. + * + * @param string $path + * @return string|null + * @static + */ + public static function get($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->get($path); + } + + /** + * Get the contents of a file as decoded JSON. + * + * @param string $path + * @param int $flags + * @return array|null + * @static + */ + public static function json($path, $flags = 0) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->json($path, $flags); + } + + /** + * Create a streamed response for a given file. + * + * @param string $path + * @param string|null $name + * @param array $headers + * @param string|null $disposition + * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @throws UnableToRetrieveMetadata + * @static + */ + public static function response($path, $name = null, $headers = [], $disposition = 'inline') + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->response($path, $name, $headers, $disposition); + } + + /** + * Create a streamed download response for a given file. + * + * @param \Illuminate\Http\Request $request + * @param string $path + * @param string|null $name + * @param array $headers + * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @throws UnableToRetrieveMetadata + * @static + */ + public static function serve($request, $path, $name = null, $headers = []) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->serve($request, $path, $name, $headers); + } + + /** + * Create a streamed download response for a given file. + * + * @param string $path + * @param string|null $name + * @param array $headers + * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @throws UnableToRetrieveMetadata + * @static + */ + public static function download($path, $name = null, $headers = []) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->download($path, $name, $headers); + } + + /** + * Write the contents of a file. + * + * @param string $path + * @param \Psr\Http\Message\StreamInterface|\Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|resource $contents + * @param mixed $options + * @return string|bool + * @static + */ + public static function put($path, $contents, $options = []) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->put($path, $contents, $options); + } + + /** + * Store the uploaded file on the disk. + * + * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string $path + * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|array|null $file + * @param mixed $options + * @return string|false + * @static + */ + public static function putFile($path, $file = null, $options = []) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->putFile($path, $file, $options); + } + + /** + * Store the uploaded file on the disk with a given name. + * + * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string $path + * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|array|null $file + * @param string|array|null $name + * @param mixed $options + * @return string|false + * @static + */ + public static function putFileAs($path, $file, $name = null, $options = []) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->putFileAs($path, $file, $name, $options); + } + + /** + * Get the visibility for the given path. + * + * @param string $path + * @return string + * @static + */ + public static function getVisibility($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->getVisibility($path); + } + + /** + * Set the visibility for the given path. + * + * @param string $path + * @param string $visibility + * @return bool + * @static + */ + public static function setVisibility($path, $visibility) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->setVisibility($path, $visibility); + } + + /** + * Prepend to a file. + * + * @param string $path + * @param string $data + * @param string $separator + * @return bool + * @static + */ + public static function prepend($path, $data, $separator = ' +') + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->prepend($path, $data, $separator); + } + + /** + * Append to a file. + * + * @param string $path + * @param string $data + * @param string $separator + * @return bool + * @static + */ + public static function append($path, $data, $separator = ' +') + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->append($path, $data, $separator); + } + + /** + * Delete the file at a given path. + * + * @param string|array $paths + * @return bool + * @static + */ + public static function delete($paths) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->delete($paths); + } + + /** + * Copy a file to a new location. + * + * @param string $from + * @param string $to + * @return bool + * @static + */ + public static function copy($from, $to) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->copy($from, $to); + } + + /** + * Move a file to a new location. + * + * @param string $from + * @param string $to + * @return bool + * @static + */ + public static function move($from, $to) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->move($from, $to); + } + + /** + * Get the file size of a given file. + * + * @param string $path + * @return int + * @static + */ + public static function size($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->size($path); + } + + /** + * Get the checksum for a file. + * + * @return string|false + * @throws UnableToProvideChecksum + * @static + */ + public static function checksum($path, $options = []) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->checksum($path, $options); + } + + /** + * Get the mime-type of a given file. + * + * @param string $path + * @return string|false + * @throws UnableToRetrieveMetadata + * @static + */ + public static function mimeType($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->mimeType($path); + } + + /** + * Get the file's last modification time. + * + * @param string $path + * @return int + * @static + */ + public static function lastModified($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->lastModified($path); + } + + /** + * Get a resource to read the file. + * + * @param string $path + * @return resource|null The path resource or null on failure. + * @static + */ + public static function readStream($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->readStream($path); + } + + /** + * Write a new file using a stream. + * + * @param string $path + * @param resource $resource + * @param array $options + * @return bool + * @static + */ + public static function writeStream($path, $resource, $options = []) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->writeStream($path, $resource, $options); + } + + /** + * Get the URL for the file at the given path. + * + * @param string $path + * @return string + * @throws \RuntimeException + * @static + */ + public static function url($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->url($path); + } + + /** + * Get an array of all files in a directory. + * + * @param string|null $directory + * @param bool $recursive + * @return array + * @static + */ + public static function files($directory = null, $recursive = false) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->files($directory, $recursive); + } + + /** + * Get all of the files from the given directory (recursive). + * + * @param string|null $directory + * @return array + * @static + */ + public static function allFiles($directory = null) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->allFiles($directory); + } + + /** + * Get all of the directories within a given directory. + * + * @param string|null $directory + * @param bool $recursive + * @return array + * @static + */ + public static function directories($directory = null, $recursive = false) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->directories($directory, $recursive); + } + + /** + * Get all the directories within a given directory (recursive). + * + * @param string|null $directory + * @return array + * @static + */ + public static function allDirectories($directory = null) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->allDirectories($directory); + } + + /** + * Create a directory. + * + * @param string $path + * @return bool + * @static + */ + public static function makeDirectory($path) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->makeDirectory($path); + } + + /** + * Recursively delete a directory. + * + * @param string $directory + * @return bool + * @static + */ + public static function deleteDirectory($directory) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->deleteDirectory($directory); + } + + /** + * Get the Flysystem driver. + * + * @return \League\Flysystem\FilesystemOperator + * @static + */ + public static function getDriver() + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->getDriver(); + } + + /** + * Get the Flysystem adapter. + * + * @return \League\Flysystem\FilesystemAdapter + * @static + */ + public static function getAdapter() + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->getAdapter(); + } + + /** + * Get the configuration values. + * + * @return array + * @static + */ + public static function getConfig() + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->getConfig(); + } + + /** + * Define a custom callback that generates file download responses. + * + * @param \Closure $callback + * @return void + * @static + */ + public static function serveUsing($callback) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + $instance->serveUsing($callback); + } + + /** + * Define a custom temporary URL builder callback. + * + * @param \Closure $callback + * @return void + * @static + */ + public static function buildTemporaryUrlsUsing($callback) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + $instance->buildTemporaryUrlsUsing($callback); + } + + /** + * Define a custom temporary upload URL builder callback. + * + * @param \Closure $callback + * @return void + * @static + */ + public static function buildTemporaryUploadUrlsUsing($callback) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + $instance->buildTemporaryUploadUrlsUsing($callback); + } + + /** + * 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) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + \Illuminate\Filesystem\LocalFilesystemAdapter::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) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + \Illuminate\Filesystem\LocalFilesystemAdapter::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + return \Illuminate\Filesystem\LocalFilesystemAdapter::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + \Illuminate\Filesystem\LocalFilesystemAdapter::flushMacros(); + } + + /** + * Dynamically handle calls to the class. + * + * @param string $method + * @param array $parameters + * @return mixed + * @throws \BadMethodCallException + * @static + */ + public static function macroCall($method, $parameters) + { + //Method inherited from \Illuminate\Filesystem\FilesystemAdapter + /** @var \Illuminate\Filesystem\LocalFilesystemAdapter $instance */ + return $instance->macroCall($method, $parameters); + } + + } + /** + * @see \Illuminate\Routing\UrlGenerator + */ + class URL { + /** + * Get the full URL for the current request. + * + * @return string + * @static + */ + public static function full() + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->full(); + } + + /** + * Get the current URL for the request. + * + * @return string + * @static + */ + public static function current() + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->current(); + } + + /** + * Get the URL for the previous request. + * + * @param mixed $fallback + * @return string + * @static + */ + public static function previous($fallback = false) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->previous($fallback); + } + + /** + * Get the previous path info for the request. + * + * @param mixed $fallback + * @return string + * @static + */ + public static function previousPath($fallback = false) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->previousPath($fallback); + } + + /** + * Generate an absolute URL to the given path. + * + * @param string $path + * @param mixed $extra + * @param bool|null $secure + * @return string + * @static + */ + public static function to($path, $extra = [], $secure = null) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->to($path, $extra, $secure); + } + + /** + * Generate an absolute URL with the given query parameters. + * + * @param string $path + * @param array $query + * @param mixed $extra + * @param bool|null $secure + * @return string + * @static + */ + public static function query($path, $query = [], $extra = [], $secure = null) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->query($path, $query, $extra, $secure); + } + + /** + * Generate a secure, absolute URL to the given path. + * + * @param string $path + * @param array $parameters + * @return string + * @static + */ + public static function secure($path, $parameters = []) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->secure($path, $parameters); + } + + /** + * Generate the URL to an application asset. + * + * @param string $path + * @param bool|null $secure + * @return string + * @static + */ + public static function asset($path, $secure = null) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->asset($path, $secure); + } + + /** + * Generate the URL to a secure asset. + * + * @param string $path + * @return string + * @static + */ + public static function secureAsset($path) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->secureAsset($path); + } + + /** + * Generate the URL to an asset from a custom root domain such as CDN, etc. + * + * @param string $root + * @param string $path + * @param bool|null $secure + * @return string + * @static + */ + public static function assetFrom($root, $path, $secure = null) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->assetFrom($root, $path, $secure); + } + + /** + * Get the default scheme for a raw URL. + * + * @param bool|null $secure + * @return string + * @static + */ + public static function formatScheme($secure = null) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->formatScheme($secure); + } + + /** + * Create a signed route URL for a named route. + * + * @param \BackedEnum|string $name + * @param mixed $parameters + * @param \DateTimeInterface|\DateInterval|int|null $expiration + * @param bool $absolute + * @return string + * @throws \InvalidArgumentException + * @static + */ + public static function signedRoute($name, $parameters = [], $expiration = null, $absolute = true) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->signedRoute($name, $parameters, $expiration, $absolute); + } + + /** + * Create a temporary signed route URL for a named route. + * + * @param \BackedEnum|string $name + * @param \DateTimeInterface|\DateInterval|int $expiration + * @param array $parameters + * @param bool $absolute + * @return string + * @static + */ + public static function temporarySignedRoute($name, $expiration, $parameters = [], $absolute = true) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->temporarySignedRoute($name, $expiration, $parameters, $absolute); + } + + /** + * Determine if the given request has a valid signature. + * + * @param \Illuminate\Http\Request $request + * @param bool $absolute + * @param \Closure|array $ignoreQuery + * @return bool + * @static + */ + public static function hasValidSignature($request, $absolute = true, $ignoreQuery = []) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->hasValidSignature($request, $absolute, $ignoreQuery); + } + + /** + * Determine if the given request has a valid signature for a relative URL. + * + * @param \Illuminate\Http\Request $request + * @param \Closure|array $ignoreQuery + * @return bool + * @static + */ + public static function hasValidRelativeSignature($request, $ignoreQuery = []) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->hasValidRelativeSignature($request, $ignoreQuery); + } + + /** + * Determine if the signature from the given request matches the URL. + * + * @param \Illuminate\Http\Request $request + * @param bool $absolute + * @param \Closure|array $ignoreQuery + * @return bool + * @static + */ + public static function hasCorrectSignature($request, $absolute = true, $ignoreQuery = []) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->hasCorrectSignature($request, $absolute, $ignoreQuery); + } + + /** + * Determine if the expires timestamp from the given request is not from the past. + * + * @param \Illuminate\Http\Request $request + * @return bool + * @static + */ + public static function signatureHasNotExpired($request) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->signatureHasNotExpired($request); + } + + /** + * Get the URL to a named route. + * + * @param \BackedEnum|string $name + * @param mixed $parameters + * @param bool $absolute + * @return string + * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException|\InvalidArgumentException + * @static + */ + public static function route($name, $parameters = [], $absolute = true) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->route($name, $parameters, $absolute); + } + + /** + * Get the URL for a given route instance. + * + * @param \Illuminate\Routing\Route $route + * @param mixed $parameters + * @param bool $absolute + * @return string + * @throws \Illuminate\Routing\Exceptions\UrlGenerationException + * @static + */ + public static function toRoute($route, $parameters, $absolute) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->toRoute($route, $parameters, $absolute); + } + + /** + * Get the URL to a controller action. + * + * @param string|array $action + * @param mixed $parameters + * @param bool $absolute + * @return string + * @throws \InvalidArgumentException + * @static + */ + public static function action($action, $parameters = [], $absolute = true) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->action($action, $parameters, $absolute); + } + + /** + * Format the array of URL parameters. + * + * @param mixed $parameters + * @return array + * @static + */ + public static function formatParameters($parameters) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->formatParameters($parameters); + } + + /** + * Get the base URL for the request. + * + * @param string $scheme + * @param string|null $root + * @return string + * @static + */ + public static function formatRoot($scheme, $root = null) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->formatRoot($scheme, $root); + } + + /** + * Format the given URL segments into a single URL. + * + * @param string $root + * @param string $path + * @param \Illuminate\Routing\Route|null $route + * @return string + * @static + */ + public static function format($root, $path, $route = null) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->format($root, $path, $route); + } + + /** + * Determine if the given path is a valid URL. + * + * @param string $path + * @return bool + * @static + */ + public static function isValidUrl($path) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->isValidUrl($path); + } + + /** + * Set the default named parameters used by the URL generator. + * + * @param array $defaults + * @return void + * @static + */ + public static function defaults($defaults) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + $instance->defaults($defaults); + } + + /** + * Get the default named parameters used by the URL generator. + * + * @return array + * @static + */ + public static function getDefaultParameters() + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->getDefaultParameters(); + } + + /** + * Force the scheme for URLs. + * + * @param string|null $scheme + * @return void + * @static + */ + public static function forceScheme($scheme) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + $instance->forceScheme($scheme); + } + + /** + * Force the use of the HTTPS scheme for all generated URLs. + * + * @param bool $force + * @return void + * @static + */ + public static function forceHttps($force = true) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + $instance->forceHttps($force); + } + + /** + * Set the URL origin for all generated URLs. + * + * @param string|null $root + * @return void + * @static + */ + public static function useOrigin($root) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + $instance->useOrigin($root); + } + + /** + * Set the forced root URL. + * + * @param string|null $root + * @return void + * @deprecated Use useOrigin + * @static + */ + public static function forceRootUrl($root) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + $instance->forceRootUrl($root); + } + + /** + * Set the URL origin for all generated asset URLs. + * + * @param string|null $root + * @return void + * @static + */ + public static function useAssetOrigin($root) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + $instance->useAssetOrigin($root); + } + + /** + * Set a callback to be used to format the host of generated URLs. + * + * @param \Closure $callback + * @return \Illuminate\Routing\UrlGenerator + * @static + */ + public static function formatHostUsing($callback) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->formatHostUsing($callback); + } + + /** + * Set a callback to be used to format the path of generated URLs. + * + * @param \Closure $callback + * @return \Illuminate\Routing\UrlGenerator + * @static + */ + public static function formatPathUsing($callback) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->formatPathUsing($callback); + } + + /** + * Get the path formatter being used by the URL generator. + * + * @return \Closure + * @static + */ + public static function pathFormatter() + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->pathFormatter(); + } + + /** + * Get the request instance. + * + * @return \Illuminate\Http\Request + * @static + */ + public static function getRequest() + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->getRequest(); + } + + /** + * Set the current request instance. + * + * @param \Illuminate\Http\Request $request + * @return void + * @static + */ + public static function setRequest($request) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + $instance->setRequest($request); + } + + /** + * Set the route collection. + * + * @param \Illuminate\Routing\RouteCollectionInterface $routes + * @return \Illuminate\Routing\UrlGenerator + * @static + */ + public static function setRoutes($routes) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->setRoutes($routes); + } + + /** + * Set the session resolver for the generator. + * + * @param callable $sessionResolver + * @return \Illuminate\Routing\UrlGenerator + * @static + */ + public static function setSessionResolver($sessionResolver) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->setSessionResolver($sessionResolver); + } + + /** + * Set the encryption key resolver. + * + * @param callable $keyResolver + * @return \Illuminate\Routing\UrlGenerator + * @static + */ + public static function setKeyResolver($keyResolver) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->setKeyResolver($keyResolver); + } + + /** + * Clone a new instance of the URL generator with a different encryption key resolver. + * + * @param callable $keyResolver + * @return \Illuminate\Routing\UrlGenerator + * @static + */ + public static function withKeyResolver($keyResolver) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->withKeyResolver($keyResolver); + } + + /** + * Set the callback that should be used to attempt to resolve missing named routes. + * + * @param callable $missingNamedRouteResolver + * @return \Illuminate\Routing\UrlGenerator + * @static + */ + public static function resolveMissingNamedRoutesUsing($missingNamedRouteResolver) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->resolveMissingNamedRoutesUsing($missingNamedRouteResolver); + } + + /** + * Get the root controller namespace. + * + * @return string + * @static + */ + public static function getRootControllerNamespace() + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->getRootControllerNamespace(); + } + + /** + * Set the root controller namespace. + * + * @param string $rootNamespace + * @return \Illuminate\Routing\UrlGenerator + * @static + */ + public static function setRootControllerNamespace($rootNamespace) + { + /** @var \Illuminate\Routing\UrlGenerator $instance */ + return $instance->setRootControllerNamespace($rootNamespace); + } + + /** + * 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\Routing\UrlGenerator::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\Routing\UrlGenerator::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Routing\UrlGenerator::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Routing\UrlGenerator::flushMacros(); + } + + } + /** + * @see \Illuminate\Validation\Factory + */ + class Validator { + /** + * Create a new Validator instance. + * + * @param array $data + * @param array $rules + * @param array $messages + * @param array $attributes + * @return \Illuminate\Validation\Validator + * @static + */ + public static function make($data, $rules, $messages = [], $attributes = []) + { + /** @var \Illuminate\Validation\Factory $instance */ + return $instance->make($data, $rules, $messages, $attributes); + } + + /** + * Validate the given data against the provided rules. + * + * @param array $data + * @param array $rules + * @param array $messages + * @param array $attributes + * @return array + * @throws \Illuminate\Validation\ValidationException + * @static + */ + public static function validate($data, $rules, $messages = [], $attributes = []) + { + /** @var \Illuminate\Validation\Factory $instance */ + return $instance->validate($data, $rules, $messages, $attributes); + } + + /** + * Register a custom validator extension. + * + * @param string $rule + * @param \Closure|string $extension + * @param string|null $message + * @return void + * @static + */ + public static function extend($rule, $extension, $message = null) + { + /** @var \Illuminate\Validation\Factory $instance */ + $instance->extend($rule, $extension, $message); + } + + /** + * Register a custom implicit validator extension. + * + * @param string $rule + * @param \Closure|string $extension + * @param string|null $message + * @return void + * @static + */ + public static function extendImplicit($rule, $extension, $message = null) + { + /** @var \Illuminate\Validation\Factory $instance */ + $instance->extendImplicit($rule, $extension, $message); + } + + /** + * Register a custom dependent validator extension. + * + * @param string $rule + * @param \Closure|string $extension + * @param string|null $message + * @return void + * @static + */ + public static function extendDependent($rule, $extension, $message = null) + { + /** @var \Illuminate\Validation\Factory $instance */ + $instance->extendDependent($rule, $extension, $message); + } + + /** + * Register a custom validator message replacer. + * + * @param string $rule + * @param \Closure|string $replacer + * @return void + * @static + */ + public static function replacer($rule, $replacer) + { + /** @var \Illuminate\Validation\Factory $instance */ + $instance->replacer($rule, $replacer); + } + + /** + * Indicate that unvalidated array keys should be included in validated data when the parent array is validated. + * + * @return void + * @static + */ + public static function includeUnvalidatedArrayKeys() + { + /** @var \Illuminate\Validation\Factory $instance */ + $instance->includeUnvalidatedArrayKeys(); + } + + /** + * Indicate that unvalidated array keys should be excluded from the validated data, even if the parent array was validated. + * + * @return void + * @static + */ + public static function excludeUnvalidatedArrayKeys() + { + /** @var \Illuminate\Validation\Factory $instance */ + $instance->excludeUnvalidatedArrayKeys(); + } + + /** + * Set the Validator instance resolver. + * + * @param \Closure $resolver + * @return void + * @static + */ + public static function resolver($resolver) + { + /** @var \Illuminate\Validation\Factory $instance */ + $instance->resolver($resolver); + } + + /** + * Get the Translator implementation. + * + * @return \Illuminate\Contracts\Translation\Translator + * @static + */ + public static function getTranslator() + { + /** @var \Illuminate\Validation\Factory $instance */ + return $instance->getTranslator(); + } + + /** + * Get the Presence Verifier implementation. + * + * @return \Illuminate\Validation\PresenceVerifierInterface + * @static + */ + public static function getPresenceVerifier() + { + /** @var \Illuminate\Validation\Factory $instance */ + return $instance->getPresenceVerifier(); + } + + /** + * Set the Presence Verifier implementation. + * + * @param \Illuminate\Validation\PresenceVerifierInterface $presenceVerifier + * @return void + * @static + */ + public static function setPresenceVerifier($presenceVerifier) + { + /** @var \Illuminate\Validation\Factory $instance */ + $instance->setPresenceVerifier($presenceVerifier); + } + + /** + * Get the container instance used by the validation factory. + * + * @return \Illuminate\Contracts\Container\Container|null + * @static + */ + public static function getContainer() + { + /** @var \Illuminate\Validation\Factory $instance */ + return $instance->getContainer(); + } + + /** + * Set the container instance used by the validation factory. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return \Illuminate\Validation\Factory + * @static + */ + public static function setContainer($container) + { + /** @var \Illuminate\Validation\Factory $instance */ + return $instance->setContainer($container); + } + + } + /** + * @see \Illuminate\View\Factory + */ + class View { + /** + * Get the evaluated view contents for the given view. + * + * @param string $path + * @param \Illuminate\Contracts\Support\Arrayable|array $data + * @param array $mergeData + * @return \Illuminate\Contracts\View\View + * @static + */ + public static function file($path, $data = [], $mergeData = []) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->file($path, $data, $mergeData); + } + + /** + * Get the evaluated view contents for the given view. + * + * @param string $view + * @param \Illuminate\Contracts\Support\Arrayable|array $data + * @param array $mergeData + * @return \Illuminate\Contracts\View\View + * @static + */ + public static function make($view, $data = [], $mergeData = []) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->make($view, $data, $mergeData); + } + + /** + * Get the first view that actually exists from the given list. + * + * @param array $views + * @param \Illuminate\Contracts\Support\Arrayable|array $data + * @param array $mergeData + * @return \Illuminate\Contracts\View\View + * @throws \InvalidArgumentException + * @static + */ + public static function first($views, $data = [], $mergeData = []) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->first($views, $data, $mergeData); + } + + /** + * Get the rendered content of the view based on a given condition. + * + * @param bool $condition + * @param string $view + * @param \Illuminate\Contracts\Support\Arrayable|array $data + * @param array $mergeData + * @return string + * @static + */ + public static function renderWhen($condition, $view, $data = [], $mergeData = []) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->renderWhen($condition, $view, $data, $mergeData); + } + + /** + * Get the rendered content of the view based on the negation of a given condition. + * + * @param bool $condition + * @param string $view + * @param \Illuminate\Contracts\Support\Arrayable|array $data + * @param array $mergeData + * @return string + * @static + */ + public static function renderUnless($condition, $view, $data = [], $mergeData = []) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->renderUnless($condition, $view, $data, $mergeData); + } + + /** + * Get the rendered contents of a partial from a loop. + * + * @param string $view + * @param array $data + * @param string $iterator + * @param string $empty + * @return string + * @static + */ + public static function renderEach($view, $data, $iterator, $empty = 'raw|') + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->renderEach($view, $data, $iterator, $empty); + } + + /** + * Determine if a given view exists. + * + * @param string $view + * @return bool + * @static + */ + public static function exists($view) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->exists($view); + } + + /** + * Get the appropriate view engine for the given path. + * + * @param string $path + * @return \Illuminate\Contracts\View\Engine + * @throws \InvalidArgumentException + * @static + */ + public static function getEngineFromPath($path) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getEngineFromPath($path); + } + + /** + * Add a piece of shared data to the environment. + * + * @param array|string $key + * @param mixed $value + * @return mixed + * @static + */ + public static function share($key, $value = null) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->share($key, $value); + } + + /** + * Increment the rendering counter. + * + * @return void + * @static + */ + public static function incrementRender() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->incrementRender(); + } + + /** + * Decrement the rendering counter. + * + * @return void + * @static + */ + public static function decrementRender() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->decrementRender(); + } + + /** + * Check if there are no active render operations. + * + * @return bool + * @static + */ + public static function doneRendering() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->doneRendering(); + } + + /** + * Determine if the given once token has been rendered. + * + * @param string $id + * @return bool + * @static + */ + public static function hasRenderedOnce($id) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->hasRenderedOnce($id); + } + + /** + * Mark the given once token as having been rendered. + * + * @param string $id + * @return void + * @static + */ + public static function markAsRenderedOnce($id) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->markAsRenderedOnce($id); + } + + /** + * Add a location to the array of view locations. + * + * @param string $location + * @return void + * @static + */ + public static function addLocation($location) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->addLocation($location); + } + + /** + * Prepend a location to the array of view locations. + * + * @param string $location + * @return void + * @static + */ + public static function prependLocation($location) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->prependLocation($location); + } + + /** + * Add a new namespace to the loader. + * + * @param string $namespace + * @param string|array $hints + * @return \Illuminate\View\Factory + * @static + */ + public static function addNamespace($namespace, $hints) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->addNamespace($namespace, $hints); + } + + /** + * Prepend a new namespace to the loader. + * + * @param string $namespace + * @param string|array $hints + * @return \Illuminate\View\Factory + * @static + */ + public static function prependNamespace($namespace, $hints) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->prependNamespace($namespace, $hints); + } + + /** + * Replace the namespace hints for the given namespace. + * + * @param string $namespace + * @param string|array $hints + * @return \Illuminate\View\Factory + * @static + */ + public static function replaceNamespace($namespace, $hints) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->replaceNamespace($namespace, $hints); + } + + /** + * Register a valid view extension and its engine. + * + * @param string $extension + * @param string $engine + * @param \Closure|null $resolver + * @return void + * @static + */ + public static function addExtension($extension, $engine, $resolver = null) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->addExtension($extension, $engine, $resolver); + } + + /** + * Flush all of the factory state like sections and stacks. + * + * @return void + * @static + */ + public static function flushState() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->flushState(); + } + + /** + * Flush all of the section contents if done rendering. + * + * @return void + * @static + */ + public static function flushStateIfDoneRendering() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->flushStateIfDoneRendering(); + } + + /** + * Get the extension to engine bindings. + * + * @return array + * @static + */ + public static function getExtensions() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getExtensions(); + } + + /** + * Get the engine resolver instance. + * + * @return \Illuminate\View\Engines\EngineResolver + * @static + */ + public static function getEngineResolver() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getEngineResolver(); + } + + /** + * Get the view finder instance. + * + * @return \Illuminate\View\ViewFinderInterface + * @static + */ + public static function getFinder() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getFinder(); + } + + /** + * Set the view finder instance. + * + * @param \Illuminate\View\ViewFinderInterface $finder + * @return void + * @static + */ + public static function setFinder($finder) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->setFinder($finder); + } + + /** + * Flush the cache of views located by the finder. + * + * @return void + * @static + */ + public static function flushFinderCache() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->flushFinderCache(); + } + + /** + * Get the event dispatcher instance. + * + * @return \Illuminate\Contracts\Events\Dispatcher + * @static + */ + public static function getDispatcher() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getDispatcher(); + } + + /** + * Set the event dispatcher instance. + * + * @param \Illuminate\Contracts\Events\Dispatcher $events + * @return void + * @static + */ + public static function setDispatcher($events) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->setDispatcher($events); + } + + /** + * Get the IoC container instance. + * + * @return \Illuminate\Contracts\Container\Container + * @static + */ + public static function getContainer() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getContainer(); + } + + /** + * Set the IoC container instance. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return void + * @static + */ + public static function setContainer($container) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->setContainer($container); + } + + /** + * Get an item from the shared data. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function shared($key, $default = null) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->shared($key, $default); + } + + /** + * Get all of the shared data for the environment. + * + * @return array + * @static + */ + public static function getShared() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getShared(); + } + + /** + * 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\View\Factory::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\View\Factory::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\View\Factory::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\View\Factory::flushMacros(); + } + + /** + * Start a component rendering process. + * + * @param \Illuminate\Contracts\View\View|\Illuminate\Contracts\Support\Htmlable|\Closure|string $view + * @param array $data + * @return void + * @static + */ + public static function startComponent($view, $data = []) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->startComponent($view, $data); + } + + /** + * Get the first view that actually exists from the given list, and start a component. + * + * @param array $names + * @param array $data + * @return void + * @static + */ + public static function startComponentFirst($names, $data = []) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->startComponentFirst($names, $data); + } + + /** + * Render the current component. + * + * @return string + * @static + */ + public static function renderComponent() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->renderComponent(); + } + + /** + * Get an item from the component data that exists above the current component. + * + * @param string $key + * @param mixed $default + * @return mixed + * @static + */ + public static function getConsumableComponentData($key, $default = null) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getConsumableComponentData($key, $default); + } + + /** + * Start the slot rendering process. + * + * @param string $name + * @param string|null $content + * @param array $attributes + * @return void + * @static + */ + public static function slot($name, $content = null, $attributes = []) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->slot($name, $content, $attributes); + } + + /** + * Save the slot content for rendering. + * + * @return void + * @static + */ + public static function endSlot() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->endSlot(); + } + + /** + * Register a view creator event. + * + * @param array|string $views + * @param \Closure|string $callback + * @return array + * @static + */ + public static function creator($views, $callback) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->creator($views, $callback); + } + + /** + * Register multiple view composers via an array. + * + * @param array $composers + * @return array + * @static + */ + public static function composers($composers) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->composers($composers); + } + + /** + * Register a view composer event. + * + * @param array|string $views + * @param \Closure|string $callback + * @return array + * @static + */ + public static function composer($views, $callback) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->composer($views, $callback); + } + + /** + * Call the composer for a given view. + * + * @param \Illuminate\Contracts\View\View $view + * @return void + * @static + */ + public static function callComposer($view) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->callComposer($view); + } + + /** + * Call the creator for a given view. + * + * @param \Illuminate\Contracts\View\View $view + * @return void + * @static + */ + public static function callCreator($view) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->callCreator($view); + } + + /** + * Start injecting content into a fragment. + * + * @param string $fragment + * @return void + * @static + */ + public static function startFragment($fragment) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->startFragment($fragment); + } + + /** + * Stop injecting content into a fragment. + * + * @return string + * @throws \InvalidArgumentException + * @static + */ + public static function stopFragment() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->stopFragment(); + } + + /** + * Get the contents of a fragment. + * + * @param string $name + * @param string|null $default + * @return mixed + * @static + */ + public static function getFragment($name, $default = null) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getFragment($name, $default); + } + + /** + * Get the entire array of rendered fragments. + * + * @return array + * @static + */ + public static function getFragments() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getFragments(); + } + + /** + * Flush all of the fragments. + * + * @return void + * @static + */ + public static function flushFragments() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->flushFragments(); + } + + /** + * Start injecting content into a section. + * + * @param string $section + * @param string|null $content + * @return void + * @static + */ + public static function startSection($section, $content = null) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->startSection($section, $content); + } + + /** + * Inject inline content into a section. + * + * @param string $section + * @param string $content + * @return void + * @static + */ + public static function inject($section, $content) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->inject($section, $content); + } + + /** + * Stop injecting content into a section and return its contents. + * + * @return string + * @static + */ + public static function yieldSection() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->yieldSection(); + } + + /** + * Stop injecting content into a section. + * + * @param bool $overwrite + * @return string + * @throws \InvalidArgumentException + * @static + */ + public static function stopSection($overwrite = false) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->stopSection($overwrite); + } + + /** + * Stop injecting content into a section and append it. + * + * @return string + * @throws \InvalidArgumentException + * @static + */ + public static function appendSection() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->appendSection(); + } + + /** + * Get the string contents of a section. + * + * @param string $section + * @param string $default + * @return string + * @static + */ + public static function yieldContent($section, $default = '') + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->yieldContent($section, $default); + } + + /** + * Get the parent placeholder for the current request. + * + * @param string $section + * @return string + * @static + */ + public static function parentPlaceholder($section = '') + { + return \Illuminate\View\Factory::parentPlaceholder($section); + } + + /** + * Check if section exists. + * + * @param string $name + * @return bool + * @static + */ + public static function hasSection($name) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->hasSection($name); + } + + /** + * Check if section does not exist. + * + * @param string $name + * @return bool + * @static + */ + public static function sectionMissing($name) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->sectionMissing($name); + } + + /** + * Get the contents of a section. + * + * @param string $name + * @param string|null $default + * @return mixed + * @static + */ + public static function getSection($name, $default = null) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getSection($name, $default); + } + + /** + * Get the entire array of sections. + * + * @return array + * @static + */ + public static function getSections() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getSections(); + } + + /** + * Flush all of the sections. + * + * @return void + * @static + */ + public static function flushSections() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->flushSections(); + } + + /** + * Add new loop to the stack. + * + * @param \Countable|array $data + * @return void + * @static + */ + public static function addLoop($data) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->addLoop($data); + } + + /** + * Increment the top loop's indices. + * + * @return void + * @static + */ + public static function incrementLoopIndices() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->incrementLoopIndices(); + } + + /** + * Pop a loop from the top of the loop stack. + * + * @return void + * @static + */ + public static function popLoop() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->popLoop(); + } + + /** + * Get an instance of the last loop in the stack. + * + * @return \stdClass|null + * @static + */ + public static function getLastLoop() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getLastLoop(); + } + + /** + * Get the entire loop stack. + * + * @return array + * @static + */ + public static function getLoopStack() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->getLoopStack(); + } + + /** + * Start injecting content into a push section. + * + * @param string $section + * @param string $content + * @return void + * @static + */ + public static function startPush($section, $content = '') + { + /** @var \Illuminate\View\Factory $instance */ + $instance->startPush($section, $content); + } + + /** + * Stop injecting content into a push section. + * + * @return string + * @throws \InvalidArgumentException + * @static + */ + public static function stopPush() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->stopPush(); + } + + /** + * Start prepending content into a push section. + * + * @param string $section + * @param string $content + * @return void + * @static + */ + public static function startPrepend($section, $content = '') + { + /** @var \Illuminate\View\Factory $instance */ + $instance->startPrepend($section, $content); + } + + /** + * Stop prepending content into a push section. + * + * @return string + * @throws \InvalidArgumentException + * @static + */ + public static function stopPrepend() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->stopPrepend(); + } + + /** + * Get the string contents of a push section. + * + * @param string $section + * @param string $default + * @return string + * @static + */ + public static function yieldPushContent($section, $default = '') + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->yieldPushContent($section, $default); + } + + /** + * Determine if the stack has any content in it. + * + * @static + */ + public static function isStackEmpty($section) + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->isStackEmpty($section); + } + + /** + * Flush all of the stacks. + * + * @return void + * @static + */ + public static function flushStacks() + { + /** @var \Illuminate\View\Factory $instance */ + $instance->flushStacks(); + } + + /** + * Start a translation block. + * + * @param array $replacements + * @return void + * @static + */ + public static function startTranslation($replacements = []) + { + /** @var \Illuminate\View\Factory $instance */ + $instance->startTranslation($replacements); + } + + /** + * Render the current translation. + * + * @return string + * @static + */ + public static function renderTranslation() + { + /** @var \Illuminate\View\Factory $instance */ + return $instance->renderTranslation(); + } + + } + /** + * @see \Illuminate\Foundation\Vite + */ + class Vite { + /** + * Get the preloaded assets. + * + * @return array + * @static + */ + public static function preloadedAssets() + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->preloadedAssets(); + } + + /** + * Get the Content Security Policy nonce applied to all generated tags. + * + * @return string|null + * @static + */ + public static function cspNonce() + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->cspNonce(); + } + + /** + * Generate or set a Content Security Policy nonce to apply to all generated tags. + * + * @param string|null $nonce + * @return string + * @static + */ + public static function useCspNonce($nonce = null) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->useCspNonce($nonce); + } + + /** + * Use the given key to detect integrity hashes in the manifest. + * + * @param string|false $key + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function useIntegrityKey($key) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->useIntegrityKey($key); + } + + /** + * Set the Vite entry points. + * + * @param array $entryPoints + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function withEntryPoints($entryPoints) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->withEntryPoints($entryPoints); + } + + /** + * Merge additional Vite entry points with the current set. + * + * @param array $entryPoints + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function mergeEntryPoints($entryPoints) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->mergeEntryPoints($entryPoints); + } + + /** + * Set the filename for the manifest file. + * + * @param string $filename + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function useManifestFilename($filename) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->useManifestFilename($filename); + } + + /** + * Resolve asset paths using the provided resolver. + * + * @param callable|null $resolver + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function createAssetPathsUsing($resolver) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->createAssetPathsUsing($resolver); + } + + /** + * Get the Vite "hot" file path. + * + * @return string + * @static + */ + public static function hotFile() + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->hotFile(); + } + + /** + * Set the Vite "hot" file path. + * + * @param string $path + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function useHotFile($path) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->useHotFile($path); + } + + /** + * Set the Vite build directory. + * + * @param string $path + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function useBuildDirectory($path) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->useBuildDirectory($path); + } + + /** + * Use the given callback to resolve attributes for script tags. + * + * @param (callable(string, string, ?array, ?array): array)|array $attributes + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function useScriptTagAttributes($attributes) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->useScriptTagAttributes($attributes); + } + + /** + * Use the given callback to resolve attributes for style tags. + * + * @param (callable(string, string, ?array, ?array): array)|array $attributes + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function useStyleTagAttributes($attributes) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->useStyleTagAttributes($attributes); + } + + /** + * Use the given callback to resolve attributes for preload tags. + * + * @param (callable(string, string, ?array, ?array): (array|false))|array|false $attributes + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function usePreloadTagAttributes($attributes) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->usePreloadTagAttributes($attributes); + } + + /** + * Eagerly prefetch assets. + * + * @param int|null $concurrency + * @param string $event + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function prefetch($concurrency = null, $event = 'load') + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->prefetch($concurrency, $event); + } + + /** + * Use the "waterfall" prefetching strategy. + * + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function useWaterfallPrefetching($concurrency = null) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->useWaterfallPrefetching($concurrency); + } + + /** + * Use the "aggressive" prefetching strategy. + * + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function useAggressivePrefetching() + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->useAggressivePrefetching(); + } + + /** + * Set the prefetching strategy. + * + * @param 'waterfall'|'aggressive'|null $strategy + * @param array $config + * @return \Illuminate\Foundation\Vite + * @static + */ + public static function usePrefetchStrategy($strategy, $config = []) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->usePrefetchStrategy($strategy, $config); + } + + /** + * Generate React refresh runtime script. + * + * @return \Illuminate\Support\HtmlString|void + * @static + */ + public static function reactRefresh() + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->reactRefresh(); + } + + /** + * Get the URL for an asset. + * + * @param string $asset + * @param string|null $buildDirectory + * @return string + * @static + */ + public static function asset($asset, $buildDirectory = null) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->asset($asset, $buildDirectory); + } + + /** + * Get the content of a given asset. + * + * @param string $asset + * @param string|null $buildDirectory + * @return string + * @throws \Illuminate\Foundation\ViteException + * @static + */ + public static function content($asset, $buildDirectory = null) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->content($asset, $buildDirectory); + } + + /** + * Get a unique hash representing the current manifest, or null if there is no manifest. + * + * @param string|null $buildDirectory + * @return string|null + * @static + */ + public static function manifestHash($buildDirectory = null) + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->manifestHash($buildDirectory); + } + + /** + * Determine if the HMR server is running. + * + * @return bool + * @static + */ + public static function isRunningHot() + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->isRunningHot(); + } + + /** + * Get the Vite tag content as a string of HTML. + * + * @return string + * @static + */ + public static function toHtml() + { + /** @var \Illuminate\Foundation\Vite $instance */ + return $instance->toHtml(); + } + + /** + * Flush state. + * + * @return void + * @static + */ + public static function flush() + { + /** @var \Illuminate\Foundation\Vite $instance */ + $instance->flush(); + } + + /** + * 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\Foundation\Vite::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\Foundation\Vite::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Illuminate\Foundation\Vite::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Illuminate\Foundation\Vite::flushMacros(); + } + + } + } + +namespace SimpleSoftwareIO\QrCode\Facades { + /** + */ + class QrCode { + /** + * Generates the QrCode. + * + * @param string $text + * @param string|null $filename + * @return void|\Illuminate\Support\HtmlString|string + * @throws WriterException + * @throws InvalidArgumentException + * @static + */ + public static function generate($text, $filename = null) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->generate($text, $filename); + } + + /** + * Merges an image over the QrCode. + * + * @param string $filepath + * @param float $percentage + * @param \SimpleSoftwareIO\QrCode\SimpleSoftwareIO\QrCode\boolean|bool $absolute + * @return \Generator + * @static + */ + public static function merge($filepath, $percentage = 0.2, $absolute = false) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->merge($filepath, $percentage, $absolute); + } + + /** + * Merges an image string with the center of the QrCode. + * + * @param string $content + * @param float $percentage + * @return \Generator + * @static + */ + public static function mergeString($content, $percentage = 0.2) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->mergeString($content, $percentage); + } + + /** + * Sets the size of the QrCode. + * + * @param int $pixels + * @return \Generator + * @static + */ + public static function size($pixels) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->size($pixels); + } + + /** + * Sets the format of the QrCode. + * + * @param string $format + * @return \Generator + * @throws InvalidArgumentException + * @static + */ + public static function format($format) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->format($format); + } + + /** + * Sets the foreground color of the QrCode. + * + * @param int $red + * @param int $green + * @param int $blue + * @param null|int $alpha + * @return \Generator + * @static + */ + public static function color($red, $green, $blue, $alpha = null) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->color($red, $green, $blue, $alpha); + } + + /** + * Sets the background color of the QrCode. + * + * @param int $red + * @param int $green + * @param int $blue + * @param null|int $alpha + * @return \Generator + * @static + */ + public static function backgroundColor($red, $green, $blue, $alpha = null) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->backgroundColor($red, $green, $blue, $alpha); + } + + /** + * Sets the eye color for the provided eye index. + * + * @param int $eyeNumber + * @param int $innerRed + * @param int $innerGreen + * @param int $innerBlue + * @param int $outterRed + * @param int $outterGreen + * @param int $outterBlue + * @return \Generator + * @throws InvalidArgumentException + * @static + */ + public static function eyeColor($eyeNumber, $innerRed, $innerGreen, $innerBlue, $outterRed = 0, $outterGreen = 0, $outterBlue = 0) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->eyeColor($eyeNumber, $innerRed, $innerGreen, $innerBlue, $outterRed, $outterGreen, $outterBlue); + } + + /** + * @static + */ + public static function gradient($startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, $type) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->gradient($startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, $type); + } + + /** + * Sets the eye style. + * + * @param string $style + * @return \Generator + * @throws InvalidArgumentException + * @static + */ + public static function eye($style) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->eye($style); + } + + /** + * Sets the style of the blocks for the QrCode. + * + * @param string $style + * @param float $size + * @return \Generator + * @throws InvalidArgumentException + * @static + */ + public static function style($style, $size = 0.5) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->style($style, $size); + } + + /** + * Sets the encoding for the QrCode. + * + * Possible values are + * ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, + * ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10, ISO-8859-11, + * ISO-8859-12, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16, + * SHIFT-JIS, WINDOWS-1250, WINDOWS-1251, WINDOWS-1252, WINDOWS-1256, + * UTF-16BE, UTF-8, ASCII, GBK, EUC-KR. + * + * @param string $encoding + * @return \Generator + * @static + */ + public static function encoding($encoding) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->encoding($encoding); + } + + /** + * Sets the error correction for the QrCode. + * + * L: 7% loss. + * M: 15% loss. + * Q: 25% loss. + * H: 30% loss. + * + * @param string $errorCorrection + * @return \Generator + * @static + */ + public static function errorCorrection($errorCorrection) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->errorCorrection($errorCorrection); + } + + /** + * Sets the margin of the QrCode. + * + * @param int $margin + * @return \Generator + * @static + */ + public static function margin($margin) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->margin($margin); + } + + /** + * Fetches the Writer. + * + * @param \BaconQrCode\Renderer\ImageRenderer $renderer + * @return \BaconQrCode\Writer + * @static + */ + public static function getWriter($renderer) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->getWriter($renderer); + } + + /** + * Fetches the Image Renderer. + * + * @return \BaconQrCode\Renderer\ImageRenderer + * @static + */ + public static function getRenderer() + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->getRenderer(); + } + + /** + * Returns the Renderer Style. + * + * @return \BaconQrCode\Renderer\RendererStyle\RendererStyle + * @static + */ + public static function getRendererStyle() + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->getRendererStyle(); + } + + /** + * Fetches the formatter. + * + * @return \BaconQrCode\Renderer\Image\ImageBackEndInterface + * @static + */ + public static function getFormatter() + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->getFormatter(); + } + + /** + * Fetches the module. + * + * @return \BaconQrCode\Renderer\Module\ModuleInterface + * @static + */ + public static function getModule() + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->getModule(); + } + + /** + * Fetches the eye style. + * + * @return \BaconQrCode\Renderer\Eye\EyeInterface + * @static + */ + public static function getEye() + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->getEye(); + } + + /** + * Fetches the color fill. + * + * @return \BaconQrCode\Renderer\RendererStyle\Fill + * @static + */ + public static function getFill() + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->getFill(); + } + + /** + * Creates a RGB or Alpha channel color. + * + * @param int $red + * @param int $green + * @param int $blue + * @param null|int $alpha + * @return \BaconQrCode\Renderer\Color\ColorInterface + * @static + */ + public static function createColor($red, $green, $blue, $alpha = null) + { + /** @var \SimpleSoftwareIO\QrCode\Generator $instance */ + return $instance->createColor($red, $green, $blue, $alpha); + } + + } + } + +namespace Illuminate\Http { + /** + */ + class Request extends \Symfony\Component\HttpFoundation\Request { + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestValidation() + * @param array $rules + * @param mixed $params + * @static + */ + public static function validate($rules, ...$params) + { + return \Illuminate\Http\Request::validate($rules, ...$params); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestValidation() + * @param string $errorBag + * @param array $rules + * @param mixed $params + * @static + */ + public static function validateWithBag($errorBag, $rules, ...$params) + { + return \Illuminate\Http\Request::validateWithBag($errorBag, $rules, ...$params); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @param mixed $absolute + * @static + */ + public static function hasValidSignature($absolute = true) + { + return \Illuminate\Http\Request::hasValidSignature($absolute); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @static + */ + public static function hasValidRelativeSignature() + { + return \Illuminate\Http\Request::hasValidRelativeSignature(); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @param mixed $ignoreQuery + * @param mixed $absolute + * @static + */ + public static function hasValidSignatureWhileIgnoring($ignoreQuery = [], $absolute = true) + { + return \Illuminate\Http\Request::hasValidSignatureWhileIgnoring($ignoreQuery, $absolute); + } + + /** + * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() + * @param mixed $ignoreQuery + * @static + */ + public static function hasValidRelativeSignatureWhileIgnoring($ignoreQuery = []) + { + return \Illuminate\Http\Request::hasValidRelativeSignatureWhileIgnoring($ignoreQuery); + } + + /** + * @see \Inertia\ServiceProvider::registerRequestMacro() + * @static + */ + public static function inertia() + { + return \Illuminate\Http\Request::inertia(); + } + + } + } + +namespace Illuminate\Routing { + /** + * @mixin \Illuminate\Routing\RouteRegistrar + */ + class Router { + /** + * @param array $props + * @see \Inertia\ServiceProvider::registerRouterMacro() + * @static + */ + public static function inertia($uri, $component, $props = []) + { + return \Illuminate\Routing\Router::inertia($uri, $component, $props); + } + + } + } + +namespace Illuminate\Testing { + /** + * @template TResponse of \Symfony\Component\HttpFoundation\Response + * @mixin \Illuminate\Http\Response + */ + class TestResponse { + /** + * @see \Inertia\Testing\TestResponseMacros::assertInertia() + * @param \Closure|null $callback + * @static + */ + public static function assertInertia($callback = null) + { + return \Illuminate\Testing\TestResponse::assertInertia($callback); + } + + /** + * @see \Inertia\Testing\TestResponseMacros::inertiaPage() + * @static + */ + public static function inertiaPage() + { + return \Illuminate\Testing\TestResponse::inertiaPage(); + } + + /** + * @see \Inertia\Testing\TestResponseMacros::inertiaProps() + * @param string|null $propName + * @static + */ + public static function inertiaProps($propName = null) + { + return \Illuminate\Testing\TestResponse::inertiaProps($propName); + } + + /** + * @see \Inertia\Testing\TestResponseMacros::assertInertiaFlash() + * @param string $key + * @param mixed|null $expected + * @static + */ + public static function assertInertiaFlash($key, $expected = null) + { + return \Illuminate\Testing\TestResponse::assertInertiaFlash($key, $expected); + } + + /** + * @see \Inertia\Testing\TestResponseMacros::assertInertiaFlashMissing() + * @param string $key + * @static + */ + public static function assertInertiaFlashMissing($key) + { + return \Illuminate\Testing\TestResponse::assertInertiaFlashMissing($key); + } + + } + } + + +namespace { + class App extends \Illuminate\Support\Facades\App {} + class Arr extends \Illuminate\Support\Arr {} + class Artisan extends \Illuminate\Support\Facades\Artisan {} + class Auth extends \Illuminate\Support\Facades\Auth {} + class Benchmark extends \Illuminate\Support\Benchmark {} + class Blade extends \Illuminate\Support\Facades\Blade {} + class Broadcast extends \Illuminate\Support\Facades\Broadcast {} + class Bus extends \Illuminate\Support\Facades\Bus {} + class Cache extends \Illuminate\Support\Facades\Cache {} + class Concurrency extends \Illuminate\Support\Facades\Concurrency {} + class Config extends \Illuminate\Support\Facades\Config {} + class Context extends \Illuminate\Support\Facades\Context {} + class Cookie extends \Illuminate\Support\Facades\Cookie {} + class Crypt extends \Illuminate\Support\Facades\Crypt {} + class Date extends \Illuminate\Support\Facades\Date {} + class DB extends \Illuminate\Support\Facades\DB {} + + /** + * @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); + } + + /** + * Remove all global scopes except the given scopes. + * + * @param array $scopes + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withoutGlobalScopesExcept($scopes = []) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withoutGlobalScopesExcept($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); + } + + /** + * Insert into the database after merging the model's default attributes, setting timestamps, and casting values. + * + * @param array> $values + * @return bool + * @static + */ + public static function fillAndInsert($values) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->fillAndInsert($values); + } + + /** + * Insert (ignoring errors) into the database after merging the model's default attributes, setting timestamps, and casting values. + * + * @param array> $values + * @return int + * @static + */ + public static function fillAndInsertOrIgnore($values) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->fillAndInsertOrIgnore($values); + } + + /** + * Insert a record into the database and get its ID after merging the model's default attributes, setting timestamps, and casting values. + * + * @param array $values + * @return int + * @static + */ + public static function fillAndInsertGetId($values) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->fillAndInsertGetId($values); + } + + /** + * Enrich the given values by merging in the model's default attributes, adding timestamps, and casting values. + * + * @param array> $values + * @return array> + * @static + */ + public static function fillForInsert($values) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->fillForInsert($values); + } + + /** + * 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 (\Closure(): array)|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 (\Closure(): array)|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 + * @param bool $asConditions + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withAttributes($attributes, $value = null, $asConditions = true) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withAttributes($attributes, $value, $asConditions); + } + + /** + * 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 "limit" value from the query or null if it's not set. + * + * @return mixed + * @static + */ + public static function getLimit() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->getLimit(); + } + + /** + * Get the "offset" value from the query or null if it's not set. + * + * @return mixed + * @static + */ + public static function getOffset() + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->getOffset(); + } + + /** + * 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 and then return it. + * + * @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); + } + + /** + * Pass the query to a given callback and return the result. + * + * @template TReturn + * @param (callable($this): TReturn) $callback + * @return (TReturn is null|void ? $this : TReturn) + * @static + */ + public static function pipe($callback) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->pipe($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 \Illuminate\Contracts\Database\Query\Expression|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 \Illuminate\Contracts\Database\Query\Expression|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 \Illuminate\Contracts\Database\Query\Expression|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 \Illuminate\Contracts\Database\Query\Expression|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 \Illuminate\Contracts\Database\Query\Expression|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 \Illuminate\Contracts\Database\Query\Expression|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 \Illuminate\Contracts\Database\Query\Expression|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 \Illuminate\Contracts\Database\Query\Expression|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 \Illuminate\Contracts\Database\Query\Expression|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 + * @throws \InvalidArgumentException + * @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 + * @throws \InvalidArgumentException + * @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 a "belongs to many" 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 whereAttachedTo($related, $relationshipName = null, $boolean = 'and') + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->whereAttachedTo($related, $relationshipName, $boolean); + } + + /** + * Add a "belongs to many" 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 orWhereAttachedTo($related, $relationshipName = null) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->orWhereAttachedTo($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|null $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 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 select expression to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $expression + * @param string $as + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function selectExpression($expression, $as) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->selectExpression($expression, $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 mixed $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function addSelect($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->addSelect($column); + } + + /** + * Add a vector-similarity selection to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \Illuminate\Support\Collection|\Illuminate\Contracts\Support\Arrayable|array|string $vector + * @param string|null $as + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function selectVectorDistance($column, $vector, $as = null) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->selectVectorDistance($column, $vector, $as); + } + + /** + * 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 vector similarity clause to the query, filtering by minimum similarity and ordering by similarity. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \Illuminate\Support\Collection|\Illuminate\Contracts\Support\Arrayable|array|string $vector + * @param float $minSimilarity A value between 0.0 and 1.0, where 1.0 is identical. + * @param bool $order + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereVectorSimilarTo($column, $vector, $minSimilarity = 0.6, $order = true) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereVectorSimilarTo($column, $vector, $minSimilarity, $order); + } + + /** + * Add a vector distance "where" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \Illuminate\Support\Collection|\Illuminate\Contracts\Support\Arrayable|array|string $vector + * @param float $maxDistance + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereVectorDistanceLessThan($column, $vector, $maxDistance, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereVectorDistanceLessThan($column, $vector, $maxDistance, $boolean); + } + + /** + * Add a vector distance "or where" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \Illuminate\Support\Collection|\Illuminate\Contracts\Support\Arrayable|array|string $vector + * @param float $maxDistance + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereVectorDistanceLessThan($column, $vector, $maxDistance) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereVectorDistanceLessThan($column, $vector, $maxDistance); + } + + /** + * Add a raw "where" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|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 null safe equals" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param mixed $value + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereNullSafeEquals($column, $value, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereNullSafeEquals($column, $value, $boolean); + } + + /** + * Add an "or where null safe equals" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereNullSafeEquals($column, $value) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereNullSafeEquals($column, $value); + } + + /** + * 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\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\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\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\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\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\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\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\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 a "where between columns" statement using a value to the query. + * + * @param mixed $value + * @param array{\Illuminate\Contracts\Database\Query\Expression|string, \Illuminate\Contracts\Database\Query\Expression|string} $columns + * @param string $boolean + * @param bool $not + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereValueBetween($value, $columns, $boolean = 'and', $not = false) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereValueBetween($value, $columns, $boolean, $not); + } + + /** + * Add an "or where between columns" statement using a value to the query. + * + * @param mixed $value + * @param array{\Illuminate\Contracts\Database\Query\Expression|string, \Illuminate\Contracts\Database\Query\Expression|string} $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereValueBetween($value, $columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereValueBetween($value, $columns); + } + + /** + * Add a "where not between columns" statement using a value to the query. + * + * @param mixed $value + * @param array{\Illuminate\Contracts\Database\Query\Expression|string, \Illuminate\Contracts\Database\Query\Expression|string} $columns + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function whereValueNotBetween($value, $columns, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->whereValueNotBetween($value, $columns, $boolean); + } + + /** + * Add an "or where not between columns" statement using a value to the query. + * + * @param mixed $value + * @param array{\Illuminate\Contracts\Database\Query\Expression|string, \Illuminate\Contracts\Database\Query\Expression|string} $columns + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orWhereValueNotBetween($value, $columns) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereValueNotBetween($value, $columns); + } + + /** + * 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 where 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 an "or 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 an "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 \DateTimeInterface|string|int|float|null $operator + * @param \Illuminate\Contracts\Database\Query\Expression|\DateTimeInterface|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 \DateTimeInterface|string|int|float|null $operator + * @param \Illuminate\Contracts\Database\Query\Expression|\DateTimeInterface|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 "having not between" clause to the query. + * + * @param string $column + * @param iterable $values + * @param string $boolean + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function havingNotBetween($column, $values, $boolean = 'and') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->havingNotBetween($column, $values, $boolean); + } + + /** + * Add an "or having between" clause to the query. + * + * @param string $column + * @param iterable $values + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orHavingBetween($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orHavingBetween($column, $values); + } + + /** + * Add an "or having not between" clause to the query. + * + * @param string $column + * @param iterable $values + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orHavingNotBetween($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orHavingNotBetween($column, $values); + } + + /** + * 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); + } + + /** + * Add a vector-distance "order by" clause to the query. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \Illuminate\Support\Collection|\Illuminate\Contracts\Support\Arrayable|array $vector + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function orderByVectorDistance($column, $vector) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orderByVectorDistance($column, $vector); + } + + /** + * 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 an "order by" clause to order results by a given sequence of values. + * + * @param \Illuminate\Contracts\Database\Query\Expression|string $column + * @param \Illuminate\Contracts\Support\Arrayable|array $values + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function inOrderOf($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->inOrderOf($column, $values); + } + + /** + * 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 descending "reorder" clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Contracts\Database\Query\Expression|string|null $column + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function reorderDesc($column) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->reorderDesc($column); + } + + /** + * 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(); + } + + /** + * Set a query execution timeout in seconds. + * + * @param int|null $seconds + * @return \Illuminate\Database\Eloquent\Builder + * @throws InvalidArgumentException + * @static + */ + public static function timeout($seconds) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->timeout($seconds); + } + + /** + * 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<0, max> + * @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<0, max> + * @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<0, max> + * @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<0, max> + * @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<0, max> + * @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 list + * @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 list + * @static + */ + public static function getBindings() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->getBindings(); + } + + /** + * Get the raw array of bindings. + * + * @return \Illuminate\Database\Query\array{ select: list, + * from: list, + * join: list, + * where: list, + * groupBy: list, + * having: list, + * order: list, + * union: list, + * unionOrder: list, + * } + * @static + */ + public static function getRawBindings() + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->getRawBindings(); + } + + /** + * Set the bindings on the query builder. + * + * @param list $bindings + * @param "select"|"from"|"join"|"where"|"groupBy"|"having"|"order"|"union"|"unionOrder" $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 "select"|"from"|"join"|"where"|"groupBy"|"having"|"order"|"union"|"unionOrder" $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. + * + * @param self $query + * @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. + * + * @param array $bindings + * @return list + * @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 + * @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 + * @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 + * @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); + } + +} + class Event extends \Illuminate\Support\Facades\Event {} + class File extends \Illuminate\Support\Facades\File {} + class Gate extends \Illuminate\Support\Facades\Gate {} + class Hash extends \Illuminate\Support\Facades\Hash {} + class Http extends \Illuminate\Support\Facades\Http {} + class Js extends \Illuminate\Support\Js {} + class Lang extends \Illuminate\Support\Facades\Lang {} + class Log extends \Illuminate\Support\Facades\Log {} + class Mail extends \Illuminate\Support\Facades\Mail {} + class Notification extends \Illuminate\Support\Facades\Notification {} + class Number extends \Illuminate\Support\Number {} + class Password extends \Illuminate\Support\Facades\Password {} + class Process extends \Illuminate\Support\Facades\Process {} + class Queue extends \Illuminate\Support\Facades\Queue {} + class RateLimiter extends \Illuminate\Support\Facades\RateLimiter {} + class Redirect extends \Illuminate\Support\Facades\Redirect {} + class Request extends \Illuminate\Support\Facades\Request {} + class Response extends \Illuminate\Support\Facades\Response {} + class Route extends \Illuminate\Support\Facades\Route {} + class Schedule extends \Illuminate\Support\Facades\Schedule {} + class Schema extends \Illuminate\Support\Facades\Schema {} + class Session extends \Illuminate\Support\Facades\Session {} + class Storage extends \Illuminate\Support\Facades\Storage {} + class Str extends \Illuminate\Support\Str {} + class Uri extends \Illuminate\Support\Uri {} + class URL extends \Illuminate\Support\Facades\URL {} + class Validator extends \Illuminate\Support\Facades\Validator {} + class View extends \Illuminate\Support\Facades\View {} + class Vite extends \Illuminate\Support\Facades\Vite {} + class QrCode extends \SimpleSoftwareIO\QrCode\Facades\QrCode {} +} + + + + + diff --git a/_ide_helper_models.php b/_ide_helper_models.php new file mode 100644 index 0000000..edf0fc1 --- /dev/null +++ b/_ide_helper_models.php @@ -0,0 +1,1271 @@ + + */ + + +namespace App\Enumerations{ +/** + * @property string $slug + * @property string $name + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitType newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitType newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitType query() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitType whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitType whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitType whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitType whereUpdatedAt($value) + */ + class CostUnitType extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property string $slug + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|CronTaskType newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CronTaskType newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CronTaskType query() + * @method static \Illuminate\Database\Eloquent\Builder|CronTaskType whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|CronTaskType whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|CronTaskType whereUpdatedAt($value) + */ + class CronTaskType extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property int $id + * @property string $slug + * @property string $name + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|EatingHabit newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EatingHabit newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EatingHabit query() + * @method static \Illuminate\Database\Eloquent\Builder|EatingHabit whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EatingHabit whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EatingHabit whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|EatingHabit whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|EatingHabit whereUpdatedAt($value) + */ + class EatingHabit extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property string $slug + * @property string $name + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|EfzStatus newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EfzStatus newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EfzStatus query() + * @method static \Illuminate\Database\Eloquent\Builder|EfzStatus whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EfzStatus whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|EfzStatus whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|EfzStatus whereUpdatedAt($value) + */ + class EfzStatus extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property string $slug + * @property string $name + * @property string $description + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|FirstAidPermission newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|FirstAidPermission newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|FirstAidPermission query() + * @method static \Illuminate\Database\Eloquent\Builder|FirstAidPermission whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|FirstAidPermission whereDescription($value) + * @method static \Illuminate\Database\Eloquent\Builder|FirstAidPermission whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|FirstAidPermission whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|FirstAidPermission whereUpdatedAt($value) + */ + class FirstAidPermission extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property string $slug + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceStatus newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceStatus newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceStatus query() + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceStatus whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceStatus whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceStatus whereUpdatedAt($value) + */ + class InvoiceStatus extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property string $slug + * @property string $name + * @property string|null $purchase_example + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property int $sort_order + * @property bool $selectable + * @property bool $counts_as_expense + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType query() + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType whereCountsAsExpense($value) + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType wherePurchaseExample($value) + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType whereSelectable($value) + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType whereSortOrder($value) + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceType whereUpdatedAt($value) + */ + class InvoiceType extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property string $slug + * @property string $name + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationFeeType newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationFeeType newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationFeeType query() + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationFeeType whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationFeeType whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationFeeType whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationFeeType whereUpdatedAt($value) + */ + class ParticipationFeeType extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property string $slug + * @property string $name + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationType newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationType newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationType query() + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationType whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationType whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationType whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipationType whereUpdatedAt($value) + */ + class ParticipationType extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * Lebenszyklus-Status einer Zahlung -- DB-gestützt, analog zu {@see InvoiceStatus}. + * + * Reine Steuersignale (z.B. Redirect) gehören NICHT hierher, sondern bleiben transiente + * Felder auf {@see \App\EventPaymentModules\DTO\DoPaymentResponse}. + * + * @property string $slug + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|PaymentStatus newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|PaymentStatus newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|PaymentStatus query() + * @method static \Illuminate\Database\Eloquent\Builder|PaymentStatus whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|PaymentStatus whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|PaymentStatus whereUpdatedAt($value) + */ + class PaymentStatus extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * Gründe für die Erstattung eines Teilnahmebeitrags -- DB-gestützt (analog {@see TaxExemptionReason}), + * damit Label und der auf dem Beleg ausgewiesene Text zentral pflegbar sind. + * + * @property string $slug + * @property string $name + * @property string|null $document_text + * @property bool $requires_note + * @property int $sort_order + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason query() + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason whereDocumentText($value) + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason whereRequiresNote($value) + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason whereSortOrder($value) + * @method static \Illuminate\Database\Eloquent\Builder|RefundReason whereUpdatedAt($value) + */ + class RefundReason extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * Gründe, aus denen ein Teil des gezahlten Teilnahmebeitrags beim Verband bleibt. + * + * Gegenstück zu {@see RefundReason}: Jener sagt, warum erstattet wird, dieser, warum nicht alles. + * + * @property string $slug + * @property string $name + * @property string|null $document_text + * @property bool $requires_note + * @property int $sort_order + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason query() + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason whereDocumentText($value) + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason whereRequiresNote($value) + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason whereSortOrder($value) + * @method static \Illuminate\Database\Eloquent\Builder|RetentionReason whereUpdatedAt($value) + */ + class RetentionReason extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property string $slug + * @property string $name + * @property string $short + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|SwimmingPermission newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|SwimmingPermission newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|SwimmingPermission query() + * @method static \Illuminate\Database\Eloquent\Builder|SwimmingPermission whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|SwimmingPermission whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|SwimmingPermission whereShort($value) + * @method static \Illuminate\Database\Eloquent\Builder|SwimmingPermission whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|SwimmingPermission whereUpdatedAt($value) + */ + class SwimmingPermission extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * Gründe für eine Umsatzsteuerbefreiung -- DB-gestützt (analog {@see PaymentStatus}), damit Label und + * der auf der Rechnung verpflichtende Hinweis nach § 14 Abs. 4 Nr. 8 UStG zentral pflegbar sind. + * + * Gemeinnützigkeit allein befreit nicht; die Befreiung braucht immer einen konkreten Rechtsgrund + * (Vereins-Fälle über § 4 Nr. 22a / Nr. 25). + * + * @property string $slug + * @property string $name + * @property string|null $invoice_text + * @property bool $requires_note + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property int $sort_order + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason query() + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason whereInvoiceText($value) + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason whereRequiresNote($value) + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason whereSortOrder($value) + * @method static \Illuminate\Database\Eloquent\Builder|TaxExemptionReason whereUpdatedAt($value) + */ + class TaxExemptionReason extends \Eloquent {} +} + +namespace App\Enumerations{ +/** + * @property string $slug + * @property string $name + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|UserRole newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|UserRole newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|UserRole query() + * @method static \Illuminate\Database\Eloquent\Builder|UserRole whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserRole whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserRole whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|UserRole whereUpdatedAt($value) + */ + class UserRole extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $tenant + * @property string $slug + * @property string $name + * @property string|null $description + * @property bool $active + * @property array|null $configuration + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $events + * @property-read int|null $events_count + * @property-read \App\Models\PaymentMethod $paymentMethod + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod query() + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod whereActive($value) + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod whereConfiguration($value) + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod whereDescription($value) + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|AvailablePaymentMethod whereUpdatedAt($value) + */ + class AvailablePaymentMethod extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property \App\Models\Tenant $tenant + * @property string $name + * @property string $type + * @property string|null $billing_deadline + * @property float $distance_allowance + * @property int $mail_on_new + * @property int $allow_new + * @property int $archived + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $estimates + * @property-read int|null $estimates_count + * @property-read \App\Models\Event|null $event + * @property-read \Illuminate\Database\Eloquent\Collection $invoices + * @property-read int|null $invoices_count + * @property-read \Illuminate\Database\Eloquent\Collection $treasurers + * @property-read int|null $treasurers_count + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit query() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereAllowNew($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereArchived($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereBillingDeadline($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereDistanceAllowance($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereMailOnNew($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereType($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnit whereUpdatedAt($value) + */ + class CostUnit extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $tenant + * @property int $cost_unit_id + * @property string $type + * @property string $description + * @property \App\ValueObjects\Amount|null $flat_amount + * @property \App\ValueObjects\Amount|null $amount_by_user + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\CostUnit $costUnit + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate query() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate whereAmountByUser($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate whereCostUnitId($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate whereDescription($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate whereFlatAmount($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate whereType($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitEstimate whereUpdatedAt($value) + */ + class CostUnitEstimate extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $name + * @property string $execution_type + * @property string|null $schedule_time + * @property \Illuminate\Database\Eloquent\Casts\ArrayObject|null $last_run + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|CronTask newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CronTask newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CronTask query() + * @method static \Illuminate\Database\Eloquent\Builder|CronTask whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|CronTask whereExecutionType($value) + * @method static \Illuminate\Database\Eloquent\Builder|CronTask whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|CronTask whereLastRun($value) + * @method static \Illuminate\Database\Eloquent\Builder|CronTask whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|CronTask whereScheduleTime($value) + * @method static \Illuminate\Database\Eloquent\Builder|CronTask whereUpdatedAt($value) + */ + class CronTask extends \Eloquent {} +} + +namespace App\Models{ +/** + * Ein Bild für die Dokumentvorlagen, referenziert als `{asset:name}`. + * + * Liegt in der Datenbank und nicht im Dateisystem, damit ein Release es nicht überschreibt und es mit + * jedem Dump mitwandert. `data` hält den base64-Payload, der für das PDF ohnehin als Data-URI gebraucht + * wird. + * + * Die Namen vergibt die verwaltende Person selbst -- es gibt keine fachlich vorbelegten Slots. + * + * @property int $id + * @property string $name + * @property string|null $label + * @property string $mime + * @property string $data + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset query() + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset whereData($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset whereLabel($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset whereMime($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentAsset whereUpdatedAt($value) + */ + class DocumentAsset extends \Eloquent {} +} + +namespace App\Models{ +/** + * Ein Block einer Dokumentvorlage. Bewusst `CommonModel` (kein `SiteScope`): die Vorlage gilt app-weit, + * tenant-spezifisch sind nur die eingesetzten Werte. + * + * @property int $id + * @property string $document_type + * @property string $block + * @property string|null $content + * @property int $sort_order + * @property bool $editable + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate query() + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate whereBlock($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate whereContent($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate whereDocumentType($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate whereEditable($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate whereSortOrder($value) + * @method static \Illuminate\Database\Eloquent\Builder|DocumentTemplate whereUpdatedAt($value) + */ + class DocumentTemplate extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property \App\Models\Tenant $tenant + * @property int|null $cost_unit_id + * @property string $name + * @property string $identifier + * @property string $location + * @property string $postal_code + * @property string $email + * @property \Illuminate\Support\Carbon $start_date + * @property \Illuminate\Support\Carbon $end_date + * @property \Illuminate\Support\Carbon $early_bird_end + * @property \Illuminate\Support\Carbon $registration_final_end + * @property int $early_bird_end_amount_increase + * @property string $account_owner + * @property string $account_iban + * @property bool $registration_allowed + * @property string $participation_fee_type + * @property \App\ValueObjects\Amount $total_max_amount + * @property string|null $registration_link + * @property bool $pay_per_day + * @property bool $pay_direct + * @property bool $sibling_reduction + * @property bool $send_weekly_report + * @property int|null $participation_fee_1 + * @property int|null $participation_fee_2 + * @property int|null $participation_fee_3 + * @property int|null $participation_fee_4 + * @property \App\ValueObjects\Amount $support_per_person + * @property \App\ValueObjects\Amount $support_flat + * @property int $alcoholics_age + * @property bool $archived + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property bool $tax_liable + * @property int $vat_rate + * @property string $vat_pricing_mode + * @property string|null $tax_exemption_reason + * @property string|null $tax_exemption_note + * @property array|null $participation_options + * @property array|null $addons + * @property string|null $invoice_key + * @property-read \App\Models\CostUnit|null $costUnit + * @property-read \Illuminate\Database\Eloquent\Collection $eatingHabits + * @property-read int|null $eating_habits_count + * @property-read \Illuminate\Database\Eloquent\Collection $eventManagers + * @property-read int|null $event_managers_count + * @property-read \Illuminate\Database\Eloquent\Collection $localGroups + * @property-read int|null $local_groups_count + * @property-read \Illuminate\Database\Eloquent\Collection $participants + * @property-read int|null $participants_count + * @property-read \App\RelationModels\EventParticipationFee|null $participationFee1 + * @property-read \App\RelationModels\EventParticipationFee|null $participationFee2 + * @property-read \App\RelationModels\EventParticipationFee|null $participationFee3 + * @property-read \App\RelationModels\EventParticipationFee|null $participationFee4 + * @property-read \App\Enumerations\ParticipationFeeType $participationFeeType + * @property-read \App\RelationModels\EventPaymentMethods|null $pivot + * @property-read \Illuminate\Database\Eloquent\Collection $paymentMethods + * @property-read int|null $payment_methods_count + * @method static \Illuminate\Database\Eloquent\Builder|Event newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Event newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Event query() + * @method static \Illuminate\Database\Eloquent\Builder|Event whereAccountIban($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereAccountOwner($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereAddons($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereAlcoholicsAge($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereArchived($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereCostUnitId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereEarlyBirdEnd($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereEarlyBirdEndAmountIncrease($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereEmail($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereEndDate($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereIdentifier($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereInvoiceKey($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereLocation($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereParticipationFee1($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereParticipationFee2($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereParticipationFee3($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereParticipationFee4($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereParticipationFeeType($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereParticipationOptions($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event wherePayDirect($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event wherePayPerDay($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event wherePostalCode($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereRegistrationAllowed($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereRegistrationFinalEnd($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereRegistrationLink($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereSendWeeklyReport($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereSiblingReduction($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereStartDate($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereSupportFlat($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereSupportPerPerson($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereTaxExemptionNote($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereTaxExemptionReason($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereTaxLiable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereTotalMaxAmount($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereVatPricingMode($value) + * @method static \Illuminate\Database\Eloquent\Builder|Event whereVatRate($value) + */ + class Event extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $tenant + * @property int $event_id + * @property int|null $user_id + * @property string $identifier + * @property int|null $invoice_sequence + * @property string $firstname + * @property string $lastname + * @property string|null $nickname + * @property string $participation_type + * @property string|null $fee_type + * @property bool $sibling_reduction + * @property string $local_group + * @property \Illuminate\Support\Carbon $birthday + * @property string $address_1 + * @property string|null $address_2 + * @property string $postcode + * @property string $city + * @property string $email_1 + * @property string $phone_1 + * @property string|null $email_2 + * @property string|null $phone_2 + * @property string|null $contact_person + * @property string|null $allergies + * @property string|null $intolerances + * @property string|null $medications + * @property \Illuminate\Support\Carbon|null $tetanus_vaccination + * @property string|null $eating_habit + * @property string|null $swimming_permission + * @property string|null $first_aid_permission + * @property bool $foto_socialmedia + * @property bool $foto_print + * @property bool $foto_webseite + * @property bool $foto_partner + * @property bool $foto_intern + * @property \Illuminate\Support\Carbon $arrival_date + * @property \Illuminate\Support\Carbon $departure_date + * @property int $arrival_eating + * @property int $departure_eating + * @property string|null $notes + * @property \App\ValueObjects\Amount $amount + * @property \App\ValueObjects\Amount $amount_paid + * @property string $payment_purpose + * @property string|null $payment_method + * @property array|null $payment_options + * @property string $efz_status + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property \Illuminate\Support\Carbon|null $unregistered_at + * @property-read \App\Enumerations\EatingHabit|null $eatingHabit + * @property-read \App\Enumerations\EfzStatus $efzStatus + * @property-read \App\Models\Event $event + * @property-read \App\Enumerations\FirstAidPermission|null $firstAidPermission + * @property-read \App\Models\Tenant $localGroup + * @property-read \App\Enumerations\ParticipationType $participationType + * @property-read \App\Models\PaymentMethod|null $paymentMethod + * @property-read \Illuminate\Database\Eloquent\Collection $selectedAddons + * @property-read int|null $selected_addons_count + * @property-read \Illuminate\Database\Eloquent\Collection $selectedOptions + * @property-read int|null $selected_options_count + * @property-read \App\Enumerations\SwimmingPermission|null $swimmingPermission + * @property-read \App\Models\Tenant $tenantRelation + * @property-read \App\Models\User|null $user + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant query() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereAddress1($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereAddress2($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereAllergies($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereAmount($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereAmountPaid($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereArrivalDate($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereArrivalEating($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereBirthday($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereCity($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereContactPerson($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereDepartureDate($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereDepartureEating($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereEatingHabit($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereEfzStatus($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereEmail1($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereEmail2($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereEventId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereFeeType($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereFirstAidPermission($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereFirstname($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereFotoIntern($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereFotoPartner($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereFotoPrint($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereFotoSocialmedia($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereFotoWebseite($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereIdentifier($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereIntolerances($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereInvoiceSequence($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereLastname($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereLocalGroup($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereMedications($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereNickname($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereNotes($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereParticipationType($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant wherePaymentMethod($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant wherePaymentOptions($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant wherePaymentPurpose($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant wherePhone1($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant wherePhone2($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant wherePostcode($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereSiblingReduction($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereSwimmingPermission($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereTetanusVaccination($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereUnregisteredAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipant whereUserId($value) + */ + class EventParticipant extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $tenant + * @property int $event_id + * @property int $event_participant_id + * @property string $addon_key + * @property string $title + * @property \App\ValueObjects\Amount $price + * @property bool $flat + * @property int $days + * @property \App\ValueObjects\Amount $amount + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\Event $event + * @property-read \App\Models\EventParticipant $participant + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon query() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereAddonKey($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereAmount($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereDays($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereEventId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereEventParticipantId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereFlat($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon wherePrice($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereTitle($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantAddon whereUpdatedAt($value) + */ + class EventParticipantAddon extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $tenant + * @property int $event_id + * @property int $event_participant_id + * @property string $question_key + * @property string $question_label + * @property string $value + * @property string $value_label + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\Event $event + * @property-read \App\Models\EventParticipant $participant + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption query() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereEventId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereEventParticipantId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereQuestionKey($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereQuestionLabel($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereValue($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipantOption whereValueLabel($value) + */ + class EventParticipantOption extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $tenant + * @property int $cost_unit_id + * @property int|null $user_id + * @property string $invoice_number + * @property string $status + * @property string $type + * @property string|null $type_other + * @property int $donation + * @property string $contact_name + * @property string|null $contact_email + * @property string|null $contact_phone + * @property string|null $notices + * @property string|null $contact_bank_owner + * @property string|null $contact_bank_iban + * @property string|null $payment_purpose + * @property float $amount + * @property int|null $distance + * @property string|null $comment + * @property string|null $changes + * @property string|null $travel_direction + * @property string|null $travel_reason + * @property int|null $passengers + * @property int|null $transportation + * @property string|null $document_filename + * @property int|null $approved_by + * @property string|null $approved_at + * @property int $upload_required + * @property int|null $denied_by + * @property string|null $denied_at + * @property string|null $denied_reason + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\CostUnit $costUnit + * @method static \Illuminate\Database\Eloquent\Builder|Invoice newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Invoice newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Invoice query() + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereAmount($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereApprovedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereApprovedBy($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereChanges($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereComment($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereContactBankIban($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereContactBankOwner($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereContactEmail($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereContactName($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereContactPhone($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereCostUnitId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereDeniedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereDeniedBy($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereDeniedReason($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereDistance($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereDocumentFilename($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereDonation($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereInvoiceNumber($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereNotices($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice wherePassengers($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice wherePaymentPurpose($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereStatus($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereTransportation($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereTravelDirection($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereTravelReason($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereType($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereTypeOther($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereUploadRequired($value) + * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereUserId($value) + */ + class Invoice extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $name + * @property string $content + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|PageText newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|PageText newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|PageText query() + * @method static \Illuminate\Database\Eloquent\Builder|PageText whereContent($value) + * @method static \Illuminate\Database\Eloquent\Builder|PageText whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|PageText whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|PageText whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|PageText whereUpdatedAt($value) + */ + class PageText extends \Eloquent {} +} + +namespace App\Models{ +/** + * Ein Erstattungsvorgang zu einer Anmeldung. + * + * @property int $id + * @property string $tenant + * @property int $event_id + * @property int $event_participant_id + * @property string $token + * @property string $status + * @property \App\ValueObjects\Amount $amount + * @property string|null $reason + * @property string|null $reason_note + * @property string|null $retention_reason + * @property string|null $retention_reason_note + * @property \App\ValueObjects\Amount $retained_amount + * @property string|null $account_owner + * @property string|null $account_iban + * @property int|null $captured_by + * @property int|null $invoice_id + * @property int|null $released_by + * @property \Illuminate\Support\Carbon|null $released_at + * @property \Illuminate\Support\Carbon|null $accepted_at + * @property \Illuminate\Support\Carbon|null $cancelled_at + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\User|null $capturedBy + * @property-read \App\Models\Event $event + * @property-read \App\Models\Invoice|null $invoice + * @property-read \App\Models\EventParticipant $participant + * @property-read \App\Enumerations\RefundReason|null $reasonRelation + * @property-read \App\Enumerations\RetentionReason|null $retentionReasonRelation + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund query() + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereAcceptedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereAccountIban($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereAccountOwner($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereAmount($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereCancelledAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereCapturedBy($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereEventId($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereEventParticipantId($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereInvoiceId($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereReason($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereReasonNote($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereReleasedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereReleasedBy($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereRetainedAmount($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereRetentionReason($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereRetentionReasonNote($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereStatus($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereToken($value) + * @method static \Illuminate\Database\Eloquent\Builder|ParticipantRefund whereUpdatedAt($value) + */ + class ParticipantRefund extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property string $id + * @property string $slug + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|PaymentMethod newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|PaymentMethod newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|PaymentMethod query() + * @method static \Illuminate\Database\Eloquent\Builder|PaymentMethod whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|PaymentMethod whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|PaymentMethod whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|PaymentMethod whereUpdatedAt($value) + */ + class PaymentMethod extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property string $id + * @property string $tenant + * @property int $invoice_id + * @property int $cost_unit_id + * @property float $amount + * @property string $recipient_name + * @property string $recipient_iban + * @property string $payment_purpose + * @property bool $exported + * @property \Illuminate\Support\Carbon|null $exported_at + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\CostUnit $costUnit + * @property-read \App\Models\Invoice $invoice + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement query() + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereAmount($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereCostUnitId($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereExported($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereExportedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereInvoiceId($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement wherePaymentPurpose($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereRecipientIban($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereRecipientName($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|SepaPaymentElement whereUpdatedAt($value) + */ + class SepaPaymentElement extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $slug + * @property string $name + * @property string|null $invoice_sender_name + * @property string|null $address_1 + * @property string|null $address_2 + * @property string|null $address_3 + * @property string $email + * @property string $email_finance + * @property string|null $phone + * @property string $url + * @property string $account_name + * @property string $account_iban + * @property string $account_bic + * @property string $city + * @property string $postcode + * @property int $download_exports + * @property int $upload_exports + * @property string|null $gdpr_text + * @property string|null $impress_text + * @property string|null $url_participation_rules + * @property int $has_active_instance + * @property int $is_active_local_group + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property bool $tax_liable + * @property int $vat_rate + * @property string|null $tax_exemption_reason + * @property string|null $tax_exemption_note + * @property string $vat_pricing_mode + * @property string|null $tax_number + * @property string|null $vat_id + * @property string|null $invoice_prefix + * @method static \Illuminate\Database\Eloquent\Builder|Tenant newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Tenant newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Tenant query() + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereAccountBic($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereAccountIban($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereAccountName($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereAddress1($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereAddress2($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereAddress3($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereCity($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereDownloadExports($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereEmail($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereEmailFinance($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereGdprText($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereHasActiveInstance($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereImpressText($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereInvoicePrefix($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereInvoiceSenderName($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereIsActiveLocalGroup($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant wherePhone($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant wherePostcode($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereTaxExemptionNote($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereTaxExemptionReason($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereTaxLiable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereTaxNumber($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereUploadExports($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereUrl($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereUrlParticipationRules($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereVatId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereVatPricingMode($value) + * @method static \Illuminate\Database\Eloquent\Builder|Tenant whereVatRate($value) + */ + class Tenant extends \Eloquent {} +} + +namespace App\Models{ +/** + * @property int $id + * @property string $user_role_main + * @property string $user_role_local_group + * @property string $username + * @property string|null $password + * @property string $local_group + * @property string $firstname + * @property string|null $nickname + * @property string $lastname + * @property string|null $membership_id + * @property string|null $address_1 + * @property string|null $address_2 + * @property string|null $postcode + * @property string|null $city + * @property string|null $email + * @property string|null $phone + * @property string|null $birthday + * @property string|null $medications + * @property string|null $allergies + * @property string|null $intolerances + * @property string|null $tetanus_vaccination + * @property string|null $eating_habits + * @property string|null $swimming_permission + * @property string|null $first_aid_permission + * @property string|null $bank_account_owner + * @property string|null $bank_account_iban + * @property string|null $activation_token + * @property string|null $activation_token_expires_at + * @property int $active + * @property string|null $remember_token + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $costUnits + * @property-read int|null $cost_units_count + * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications + * @property-read int|null $notifications_count + * @method static \Illuminate\Database\Eloquent\Builder|User newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|User newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|User query() + * @method static \Illuminate\Database\Eloquent\Builder|User whereActivationToken($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereActivationTokenExpiresAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereActive($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereAddress1($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereAddress2($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereAllergies($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereBankAccountIban($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereBankAccountOwner($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereBirthday($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereCity($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereEatingHabits($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereEmail($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereFirstAidPermission($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereFirstname($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereIntolerances($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereLastname($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereLocalGroup($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereMedications($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereMembershipId($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereNickname($value) + * @method static \Illuminate\Database\Eloquent\Builder|User wherePassword($value) + * @method static \Illuminate\Database\Eloquent\Builder|User wherePhone($value) + * @method static \Illuminate\Database\Eloquent\Builder|User wherePostcode($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereRememberToken($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereSwimmingPermission($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereTetanusVaccination($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereUserRoleLocalGroup($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereUserRoleMain($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereUsername($value) + */ + class User extends \Eloquent {} +} + +namespace App\RelationModels{ +/** + * @property int $id + * @property int $cost_unit_id + * @property int $user_id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitTreasures newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitTreasures newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitTreasures query() + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitTreasures whereCostUnitId($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitTreasures whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitTreasures whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitTreasures whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|CostUnitTreasures whereUserId($value) + */ + class CostUnitTreasures extends \Eloquent {} +} + +namespace App\RelationModels{ +/** + * @property int $id + * @property int $event_id + * @property int $eating_habit_id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|EventEatingHabits newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventEatingHabits newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventEatingHabits query() + * @method static \Illuminate\Database\Eloquent\Builder|EventEatingHabits whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventEatingHabits whereEatingHabitId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventEatingHabits whereEventId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventEatingHabits whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventEatingHabits whereUpdatedAt($value) + */ + class EventEatingHabits extends \Eloquent {} +} + +namespace App\RelationModels{ +/** + * @property int $id + * @property int $event_id + * @property int $local_group_id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|EventLocalGroups newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventLocalGroups newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventLocalGroups query() + * @method static \Illuminate\Database\Eloquent\Builder|EventLocalGroups whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventLocalGroups whereEventId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventLocalGroups whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventLocalGroups whereLocalGroupId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventLocalGroups whereUpdatedAt($value) + */ + class EventLocalGroups extends \Eloquent {} +} + +namespace App\RelationModels{ +/** + * @property int $id + * @property int $event_id + * @property string $user_id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|EventManagers newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventManagers newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventManagers query() + * @method static \Illuminate\Database\Eloquent\Builder|EventManagers whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventManagers whereEventId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventManagers whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventManagers whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventManagers whereUserId($value) + */ + class EventManagers extends \Eloquent {} +} + +namespace App\RelationModels{ +/** + * @property int $id + * @property \App\Models\Tenant $tenant + * @property \App\Enumerations\ParticipationType $type + * @property string $name + * @property string|null $description + * @property \App\ValueObjects\Amount $amount_standard + * @property \App\ValueObjects\Amount|null $amount_reduced + * @property \App\ValueObjects\Amount|null $amount_solidarity + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee query() + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereAmountReduced($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereAmountSolidarity($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereAmountStandard($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereDescription($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereTenant($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereType($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventParticipationFee whereUpdatedAt($value) + */ + class EventParticipationFee extends \Eloquent {} +} + +namespace App\RelationModels{ +/** + * @property int $id + * @property int $event_id + * @property string $slug + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property array|null $configuration + * @method static \Illuminate\Database\Eloquent\Builder|EventPaymentMethods newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventPaymentMethods newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EventPaymentMethods query() + * @method static \Illuminate\Database\Eloquent\Builder|EventPaymentMethods whereConfiguration($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventPaymentMethods whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventPaymentMethods whereEventId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventPaymentMethods whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventPaymentMethods whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|EventPaymentMethods whereUpdatedAt($value) + */ + class EventPaymentMethods extends \Eloquent {} +} + diff --git a/app/Domains/Admin/Actions/UpdateDocumentAsset/UpdateDocumentAssetAction.php b/app/Domains/Admin/Actions/UpdateDocumentAsset/UpdateDocumentAssetAction.php new file mode 100644 index 0000000..2de5e39 --- /dev/null +++ b/app/Domains/Admin/Actions/UpdateDocumentAsset/UpdateDocumentAssetAction.php @@ -0,0 +1,87 @@ + */ + private const array ALLOWED_MIME_TYPES = [ + 'image/png' => 'png', + 'image/jpeg' => 'jpg', + 'image/gif' => 'gif', + 'image/svg+xml' => 'svg', + ]; + + public function __construct(private readonly UpdateDocumentAssetRequest $request) + { + } + + public function execute(): UpdateDocumentAssetResponse + { + $response = new UpdateDocumentAssetResponse(); + + $name = $this->normalizeName($this->request->name); + + if ($name === null) { + $response->message = 'Bitte einen Namen aus Kleinbuchstaben, Ziffern, Bindestrich oder Unterstrich angeben.'; + + return $response; + } + + $asset = DocumentAsset::where('name', $name)->first(); + $file = $this->request->file; + + if ($file === null && $asset === null) { + $response->message = 'Für ein neues Bild wird eine Datei benötigt.'; + + return $response; + } + + $attributes = ['name' => $name, 'label' => $this->request->label]; + + if ($file !== null) { + if (!array_key_exists($file->getMimeType(), self::ALLOWED_MIME_TYPES)) { + $response->message = 'Nur PNG, JPEG, GIF oder SVG sind zulässig.'; + + return $response; + } + + if ($file->getSize() > self::MAX_BYTES) { + $response->message = 'Das Bild darf höchstens 2 MB groß sein.'; + + return $response; + } + + $attributes['mime'] = $file->getMimeType(); + $attributes['data'] = base64_encode(file_get_contents($file->getRealPath())); + } + + $response->asset = $asset === null + ? DocumentAsset::create($attributes) + : tap($asset)->update($attributes); + + $response->success = true; + $response->message = 'Das Bild wurde gespeichert.'; + + return $response; + } + + /** Namen sind Slugs, damit `{asset:name}` eindeutig erkennbar bleibt. */ + private function normalizeName(string $name): ?string + { + $name = strtolower(trim($name)); + + return preg_match('/^[a-z0-9_-]+$/', $name) === 1 ? $name : null; + } +} diff --git a/app/Domains/Admin/Actions/UpdateDocumentAsset/UpdateDocumentAssetRequest.php b/app/Domains/Admin/Actions/UpdateDocumentAsset/UpdateDocumentAssetRequest.php new file mode 100644 index 0000000..016e307 --- /dev/null +++ b/app/Domains/Admin/Actions/UpdateDocumentAsset/UpdateDocumentAssetRequest.php @@ -0,0 +1,16 @@ +request->documentType); + + // Erst prüfen, dann schreiben -- sonst bliebe bei einem Fehler ein halb gespeicherter Stand übrig. + $rejection = $this->rejectBareAssetInStyle(); + if ($rejection !== null) { + $response->message = $rejection; + + return $response; + } + + foreach ($this->request->blocks as $block => $content) { + $template = $existing->get($block); + + if ($template === null || !$template->editable) { + $response->skipped[] = $block; + continue; + } + + $template->update(['content' => (string) $content]); + } + + $response->success = true; + $response->message = $response->skipped === [] + ? 'Die Vorlage wurde gespeichert.' + : 'Die Vorlage wurde gespeichert; nicht editierbare Blöcke blieben unverändert.'; + + return $response; + } + + /** + * Ein Bild-Platzhalter, der im CSS nicht in `url(...)` steht, expandiert zu einem Data-URI, das + * dompdf nicht auslagern kann -- der Parser läuft dann minutenlang und der FPM-Worker stirbt am + * Zeitlimit (502). Solches CSS wird gar nicht erst gespeichert. + * + * @return string|null Fehlermeldung, oder null wenn nichts zu beanstanden ist. + */ + private function rejectBareAssetInStyle(): ?string + { + $style = $this->request->blocks[DocumentTemplate::BLOCK_STYLE] ?? null; + + if ($style === null || preg_match('/(? $blocks Blockinhalte, adressiert über den Block-Slug. + */ + public function __construct( + public readonly string $documentType, + public readonly array $blocks, + ) { + } +} diff --git a/app/Domains/Admin/Actions/UpdateDocumentTemplate/UpdateDocumentTemplateResponse.php b/app/Domains/Admin/Actions/UpdateDocumentTemplate/UpdateDocumentTemplateResponse.php new file mode 100644 index 0000000..4a55c3f --- /dev/null +++ b/app/Domains/Admin/Actions/UpdateDocumentTemplate/UpdateDocumentTemplateResponse.php @@ -0,0 +1,13 @@ + Blöcke, die nicht gespeichert wurden (unbekannt oder nicht editierbar). */ + public array $skipped = []; +} diff --git a/app/Domains/Admin/Actions/UpdateTenantContact/UpdateTenantContactAction.php b/app/Domains/Admin/Actions/UpdateTenantContact/UpdateTenantContactAction.php index 3ffab8a..43834c0 100644 --- a/app/Domains/Admin/Actions/UpdateTenantContact/UpdateTenantContactAction.php +++ b/app/Domains/Admin/Actions/UpdateTenantContact/UpdateTenantContactAction.php @@ -2,6 +2,8 @@ namespace App\Domains\Admin\Actions\UpdateTenantContact; +use App\Support\Text; + class UpdateTenantContactAction { public function __construct(private UpdateTenantContactRequest $request) @@ -15,8 +17,14 @@ class UpdateTenantContactAction $this->request->tenant->update([ 'email' => $this->request->email, 'email_finance' => $this->request->emailFinance, + 'invoice_sender_name' => Text::nullIfBlank($this->request->invoiceSenderName), + // Leergelassene optionale Felder als NULL, damit sie im Briefkopf sauber wegfallen. + 'address_1' => Text::nullIfBlank($this->request->address1), + 'address_2' => Text::nullIfBlank($this->request->address2), + 'address_3' => Text::nullIfBlank($this->request->address3), 'postcode' => $this->request->postcode, 'city' => $this->request->city, + 'phone' => Text::nullIfBlank($this->request->phone), ]); $response->success = true; diff --git a/app/Domains/Admin/Actions/UpdateTenantContact/UpdateTenantContactRequest.php b/app/Domains/Admin/Actions/UpdateTenantContact/UpdateTenantContactRequest.php index f9135ea..8fef4be 100644 --- a/app/Domains/Admin/Actions/UpdateTenantContact/UpdateTenantContactRequest.php +++ b/app/Domains/Admin/Actions/UpdateTenantContact/UpdateTenantContactRequest.php @@ -12,6 +12,14 @@ class UpdateTenantContactRequest public string $emailFinance, public string $postcode, public string $city, + /** Bezeichnung des Rechnungsstellers; leer bedeutet "Name des Mandanten verwenden". */ + public ?string $invoiceSenderName = null, + /** Straße und Hausnummer -- Pflichtangabe auf Rechnungen nach § 14 Abs. 4 UStG. */ + public ?string $address1 = null, + /** Optionale Zusatzzeile, z.B. "c/o ...". */ + public ?string $address2 = null, + public ?string $address3 = null, + public ?string $phone = null, ) { } } diff --git a/app/Domains/Admin/Actions/UpdateTenantTax/UpdateTenantTaxAction.php b/app/Domains/Admin/Actions/UpdateTenantTax/UpdateTenantTaxAction.php index bb9fad7..2aaaed3 100644 --- a/app/Domains/Admin/Actions/UpdateTenantTax/UpdateTenantTaxAction.php +++ b/app/Domains/Admin/Actions/UpdateTenantTax/UpdateTenantTaxAction.php @@ -3,6 +3,8 @@ namespace App\Domains\Admin\Actions\UpdateTenantTax; use App\Enumerations\VatPricingMode; +use App\Models\Tenant; +use App\Support\Text; class UpdateTenantTaxAction { @@ -14,14 +16,23 @@ class UpdateTenantTaxAction { $response = new UpdateTenantTaxResponse(); + // Präfixe sind großgeschrieben; null heißt "nicht mitgeschickt" und damit "unverändert". + $prefix = Text::nullIfBlank(strtoupper((string) $this->request->invoicePrefix)); + + if ($prefix !== null && $this->prefixTakenByAnotherTenant($prefix)) { + $response->message = sprintf('Das Rechnungs-Präfix "%s" wird bereits von einem anderen Mandanten genutzt.', $prefix); + + return $response; + } + if ($this->request->taxLiable) { - $this->request->tenant->update([ + $this->request->tenant->update($this->withInvoiceDetails([ 'tax_liable' => true, 'vat_rate' => $this->clampVatRate($this->request->vatRate), 'vat_pricing_mode' => $this->request->vatPricingMode->value, 'tax_exemption_reason' => null, 'tax_exemption_note' => null, - ]); + ], $prefix)); $response->success = true; $response->message = 'Steuerinformationen wurden gespeichert.'; @@ -45,13 +56,13 @@ class UpdateTenantTaxAction return $response; } - $this->request->tenant->update([ + $this->request->tenant->update($this->withInvoiceDetails([ 'tax_liable' => false, 'vat_rate' => 0, 'vat_pricing_mode' => VatPricingMode::Inclusive->value, 'tax_exemption_reason' => $reason->slug, 'tax_exemption_note' => $reason->requires_note ? $note : null, - ]); + ], $prefix)); $response->success = true; $response->message = 'Steuerinformationen wurden gespeichert.'; @@ -63,4 +74,31 @@ class UpdateTenantTaxAction { return max(0, min(100, $vatRate)); } + + /** + * Ergänzt die Rechnungsstellerangaben. Sie gelten unabhängig davon, ob Steuerpflicht besteht -- eine + * Steuernummer gehört auch auf eine steuerfreie Rechnung. + * + * @param array $attributes + * @return array + */ + private function withInvoiceDetails(array $attributes, ?string $prefix): array + { + $attributes['tax_number'] = Text::nullIfBlank($this->request->taxNumber); + $attributes['vat_id'] = Text::nullIfBlank($this->request->vatId); + + // Nicht mitgeschickt heißt "unverändert", nicht "leeren". + if ($prefix !== null) { + $attributes['invoice_prefix'] = $prefix; + } + + return $attributes; + } + + private function prefixTakenByAnotherTenant(string $prefix): bool + { + return Tenant::where('invoice_prefix', $prefix) + ->where('id', '!=', $this->request->tenant->id) + ->exists(); + } } diff --git a/app/Domains/Admin/Actions/UpdateTenantTax/UpdateTenantTaxRequest.php b/app/Domains/Admin/Actions/UpdateTenantTax/UpdateTenantTaxRequest.php index e02187b..ac2247b 100644 --- a/app/Domains/Admin/Actions/UpdateTenantTax/UpdateTenantTaxRequest.php +++ b/app/Domains/Admin/Actions/UpdateTenantTax/UpdateTenantTaxRequest.php @@ -15,6 +15,14 @@ class UpdateTenantTaxRequest public ?TaxExemptionReason $exemptionReason, public ?string $exemptionNote, public VatPricingMode $vatPricingMode, + /** Steuernummer bzw. USt-IdNr. -- Pflichtangabe auf Rechnungen (§ 14 Abs. 4 Nr. 2 UStG). */ + public ?string $taxNumber = null, + public ?string $vatId = null, + /** + * Erster Block der Rechnungsnummer. `null` heißt "unverändert lassen" -- im Self-Service wird das + * Feld gar nicht erst mitgeschickt, damit ein bestehender Nummernkreis nicht bricht. + */ + public ?string $invoicePrefix = null, ) { } diff --git a/app/Domains/Admin/Controllers/DocumentAssetDeleteController.php b/app/Domains/Admin/Controllers/DocumentAssetDeleteController.php new file mode 100644 index 0000000..373009f --- /dev/null +++ b/app/Domains/Admin/Controllers/DocumentAssetDeleteController.php @@ -0,0 +1,42 @@ +first(); + + // Durchweg 200 mit Status im Body -- wie die übrigen Admin-Endpunkte, damit der Grund im Frontend + // ankommt (der Ajax-Helfer verwirft den Body bei Fehler-Statuscodes). + if ($asset === null) { + return response()->json(['status' => 'error', 'message' => 'Das Bild existiert nicht.']); + } + + // Ein noch referenziertes Bild zu löschen würde stillschweigend eine Lücke in jede künftige + // Rechnung reißen -- der Platzhalter löst dann zu einem Leerstring auf. + if ($this->isReferenced($asset->name)) { + return response()->json([ + 'status' => 'error', + 'message' => sprintf('Das Bild wird noch als {asset:%s} in der Vorlage verwendet.', $asset->name), + ]); + } + + $asset->delete(); + + return response()->json(['status' => 'success', 'message' => 'Das Bild wurde gelöscht.']); + } + + private function isReferenced(string $name): bool + { + return DocumentTemplate::query() + ->where('content', 'like', '%{asset:' . $name . '}%') + ->exists(); + } +} diff --git a/app/Domains/Admin/Controllers/DocumentAssetUpdateController.php b/app/Domains/Admin/Controllers/DocumentAssetUpdateController.php new file mode 100644 index 0000000..1f91d0a --- /dev/null +++ b/app/Domains/Admin/Controllers/DocumentAssetUpdateController.php @@ -0,0 +1,29 @@ +input('name'), + label: $request->input('label'), + file: $request->file('file'), + )); + + $response = $action->execute(); + + return response()->json([ + 'status' => $response->success ? 'success' : 'error', + 'message' => $response->message, + 'token' => $response->asset !== null ? '{asset:' . $response->asset->name . '}' : null, + ]); + } +} diff --git a/app/Domains/Admin/Controllers/DocumentTemplatesGetController.php b/app/Domains/Admin/Controllers/DocumentTemplatesGetController.php new file mode 100644 index 0000000..9b4b437 --- /dev/null +++ b/app/Domains/Admin/Controllers/DocumentTemplatesGetController.php @@ -0,0 +1,47 @@ +input('type', DocumentTypeCatalog::default()); + + if (!DocumentTypeCatalog::has($documentType)) { + abort(422, 'Unbekannte Dokumentart.'); + } + + $blocks = DocumentTemplate::forType($documentType) + ->values() + ->map(fn(DocumentTemplate $block): array => [ + 'block' => $block->block, + 'label' => DocumentTypeCatalog::blockLabel($documentType, $block->block), + 'content' => (string) $block->content, + 'editable' => $block->editable, + 'source' => in_array($block->block, DocumentTypeCatalog::SOURCE_BLOCKS, true), + ]); + + return response()->json([ + 'documentType' => $documentType, + 'documentTypes' => DocumentTypeCatalog::options(), + 'blocks' => $blocks, + // Die Bilder gelten für alle Dokumentarten -- sie hängen nicht am Typ. + 'assets' => DocumentAsset::orderBy('name')->get()->map(fn(DocumentAsset $asset): array => [ + 'name' => $asset->name, + 'label' => $asset->label, + 'mime' => $asset->mime, + 'token' => '{asset:' . $asset->name . '}', + 'preview' => $asset->toDataUri(), + ]), + 'tokenGroups' => DocumentTypeCatalog::tokenGroups($documentType), + ]); + } +} diff --git a/app/Domains/Admin/Controllers/DocumentTemplatesPageController.php b/app/Domains/Admin/Controllers/DocumentTemplatesPageController.php new file mode 100644 index 0000000..e114ed2 --- /dev/null +++ b/app/Domains/Admin/Controllers/DocumentTemplatesPageController.php @@ -0,0 +1,15 @@ +render(); + } +} diff --git a/app/Domains/Admin/Controllers/DocumentTemplatesPreviewController.php b/app/Domains/Admin/Controllers/DocumentTemplatesPreviewController.php new file mode 100644 index 0000000..e03071d --- /dev/null +++ b/app/Domains/Admin/Controllers/DocumentTemplatesPreviewController.php @@ -0,0 +1,35 @@ +input('type', DocumentTypeCatalog::default()); + + if (!DocumentTypeCatalog::has($documentType)) { + abort(422, 'Unbekannte Dokumentart.'); + } + + $html = new DocumentTemplateRenderProvider( + $documentType, + (array) $request->input('blocks', []), + )->render(DocumentTypeCatalog::sampleTokens($documentType)); + + return response(PdfGenerateAndDownloadProvider::fromHtml($html, 'portrait'), 200, [ + 'Content-Type' => 'application/pdf', + 'Content-Disposition' => 'inline; filename="vorschau.pdf"', + ]); + } +} diff --git a/app/Domains/Admin/Controllers/DocumentTemplatesUpdateController.php b/app/Domains/Admin/Controllers/DocumentTemplatesUpdateController.php new file mode 100644 index 0000000..876734d --- /dev/null +++ b/app/Domains/Admin/Controllers/DocumentTemplatesUpdateController.php @@ -0,0 +1,36 @@ +input('type', DocumentTypeCatalog::default()); + + // Die Dokumentart bestimmt, welche Zeilen geschrieben werden -- ungeprüft weitergereicht wäre + // sie ein Weg, in beliebige Vorlagen zu schreiben. + if (!DocumentTypeCatalog::has($documentType)) { + abort(422, 'Unbekannte Dokumentart.'); + } + + $action = new UpdateDocumentTemplateAction(new UpdateDocumentTemplateRequest( + documentType: $documentType, + blocks: (array) $request->input('blocks', []), + )); + + $response = $action->execute(); + + return response()->json([ + 'status' => $response->success ? 'success' : 'error', + 'message' => $response->message, + ]); + } +} diff --git a/app/Domains/Admin/Controllers/ManagedTenantContactGetController.php b/app/Domains/Admin/Controllers/ManagedTenantContactGetController.php index cb35234..fd9f4a9 100644 --- a/app/Domains/Admin/Controllers/ManagedTenantContactGetController.php +++ b/app/Domains/Admin/Controllers/ManagedTenantContactGetController.php @@ -15,6 +15,13 @@ class ManagedTenantContactGetController extends CommonController return response()->json([ 'email' => $tenant->email, 'email_finance' => $tenant->email_finance, + 'invoice_sender_name' => $tenant->invoice_sender_name, + // Als Platzhalter im Formular: so heisst der Absender, solange nichts eingetragen ist. + 'name' => $tenant->name, + 'phone' => $tenant->phone, + 'address_1' => $tenant->address_1, + 'address_2' => $tenant->address_2, + 'address_3' => $tenant->address_3, 'postcode' => $tenant->postcode, 'city' => $tenant->city, 'saveEndpoint' => '/api/v1/admin/tenants/' . $slug . '/contact', diff --git a/app/Domains/Admin/Controllers/ManagedTenantContactUpdateController.php b/app/Domains/Admin/Controllers/ManagedTenantContactUpdateController.php index dce1996..7c1cdb6 100644 --- a/app/Domains/Admin/Controllers/ManagedTenantContactUpdateController.php +++ b/app/Domains/Admin/Controllers/ManagedTenantContactUpdateController.php @@ -20,6 +20,11 @@ class ManagedTenantContactUpdateController extends CommonController emailFinance: $request->input('email_finance'), postcode: $request->input('postcode'), city: $request->input('city'), + invoiceSenderName: $request->input('invoice_sender_name'), + address1: $request->input('address_1'), + address2: $request->input('address_2'), + address3: $request->input('address_3'), + phone: $request->input('phone'), )); $response = $action->execute(); diff --git a/app/Domains/Admin/Controllers/ManagedTenantTaxGetController.php b/app/Domains/Admin/Controllers/ManagedTenantTaxGetController.php index e0137e0..6dd301c 100644 --- a/app/Domains/Admin/Controllers/ManagedTenantTaxGetController.php +++ b/app/Domains/Admin/Controllers/ManagedTenantTaxGetController.php @@ -20,6 +20,11 @@ class ManagedTenantTaxGetController extends CommonController 'tax_exemption_reason' => $tenant->tax_exemption_reason, 'tax_exemption_note' => $tenant->tax_exemption_note, 'vat_pricing_mode' => $tenant->vat_pricing_mode, + 'tax_number' => $tenant->tax_number, + 'vat_id' => $tenant->vat_id, + 'invoice_prefix' => $tenant->invoice_prefix, + // In der Mandanten-Verwaltung ist der Nummernkreis änderbar. + 'can_edit_invoice_prefix' => true, 'exemption_reasons' => TaxExemptionReason::options(), 'pricing_modes' => VatPricingMode::options(), 'saveEndpoint' => '/api/v1/admin/tenants/' . $slug . '/tax', diff --git a/app/Domains/Admin/Controllers/ManagedTenantTaxUpdateController.php b/app/Domains/Admin/Controllers/ManagedTenantTaxUpdateController.php index 5d6af6e..003a706 100644 --- a/app/Domains/Admin/Controllers/ManagedTenantTaxUpdateController.php +++ b/app/Domains/Admin/Controllers/ManagedTenantTaxUpdateController.php @@ -23,6 +23,9 @@ class ManagedTenantTaxUpdateController extends CommonController exemptionReason: TaxExemptionReason::where('slug', $request->input('tax_exemption_reason'))->first(), exemptionNote: $request->input('tax_exemption_note'), vatPricingMode: VatPricingMode::tryFrom((string) $request->input('vat_pricing_mode', 'inclusive')) ?? VatPricingMode::Inclusive, + taxNumber: $request->input('tax_number'), + vatId: $request->input('vat_id'), + invoicePrefix: $request->input('invoice_prefix'), )); $response = $action->execute(); diff --git a/app/Domains/Admin/Controllers/TenantContactGetController.php b/app/Domains/Admin/Controllers/TenantContactGetController.php index b660d45..07428a0 100644 --- a/app/Domains/Admin/Controllers/TenantContactGetController.php +++ b/app/Domains/Admin/Controllers/TenantContactGetController.php @@ -13,6 +13,13 @@ class TenantContactGetController extends CommonController return response()->json([ 'email' => $this->tenant->email, 'email_finance' => $this->tenant->email_finance, + 'invoice_sender_name' => $this->tenant->invoice_sender_name, + // Als Platzhalter im Formular: so heisst der Absender, solange nichts eingetragen ist. + 'name' => $this->tenant->name, + 'phone' => $this->tenant->phone, + 'address_1' => $this->tenant->address_1, + 'address_2' => $this->tenant->address_2, + 'address_3' => $this->tenant->address_3, 'postcode' => $this->tenant->postcode, 'city' => $this->tenant->city, 'saveEndpoint' => '/api/v1/admin/tenant/contact', diff --git a/app/Domains/Admin/Controllers/TenantContactUpdateController.php b/app/Domains/Admin/Controllers/TenantContactUpdateController.php index bc38a23..76f68d2 100644 --- a/app/Domains/Admin/Controllers/TenantContactUpdateController.php +++ b/app/Domains/Admin/Controllers/TenantContactUpdateController.php @@ -18,6 +18,11 @@ class TenantContactUpdateController extends CommonController emailFinance: $request->input('email_finance'), postcode: $request->input('postcode'), city: $request->input('city'), + invoiceSenderName: $request->input('invoice_sender_name'), + address1: $request->input('address_1'), + address2: $request->input('address_2'), + address3: $request->input('address_3'), + phone: $request->input('phone'), )); $response = $action->execute(); diff --git a/app/Domains/Admin/Controllers/TenantTaxGetController.php b/app/Domains/Admin/Controllers/TenantTaxGetController.php index d8cce22..ff36710 100644 --- a/app/Domains/Admin/Controllers/TenantTaxGetController.php +++ b/app/Domains/Admin/Controllers/TenantTaxGetController.php @@ -18,6 +18,11 @@ class TenantTaxGetController extends CommonController 'tax_exemption_reason' => $this->tenant->tax_exemption_reason, 'tax_exemption_note' => $this->tenant->tax_exemption_note, 'vat_pricing_mode' => $this->tenant->vat_pricing_mode, + 'tax_number' => $this->tenant->tax_number, + 'vat_id' => $this->tenant->vat_id, + 'invoice_prefix' => $this->tenant->invoice_prefix, + // Im Self-Service nicht änderbar: das Präfix bestimmt den Nummernkreis. + 'can_edit_invoice_prefix' => false, 'exemption_reasons' => TaxExemptionReason::options(), 'pricing_modes' => VatPricingMode::options(), 'saveEndpoint' => '/api/v1/admin/tenant/tax', diff --git a/app/Domains/Admin/Controllers/TenantTaxUpdateController.php b/app/Domains/Admin/Controllers/TenantTaxUpdateController.php index f8b17b8..9a37274 100644 --- a/app/Domains/Admin/Controllers/TenantTaxUpdateController.php +++ b/app/Domains/Admin/Controllers/TenantTaxUpdateController.php @@ -21,6 +21,10 @@ class TenantTaxUpdateController extends CommonController exemptionReason: TaxExemptionReason::where('slug', $request->input('tax_exemption_reason'))->first(), exemptionNote: $request->input('tax_exemption_note'), vatPricingMode: VatPricingMode::tryFrom((string) $request->input('vat_pricing_mode', 'inclusive')) ?? VatPricingMode::Inclusive, + taxNumber: $request->input('tax_number'), + vatId: $request->input('vat_id'), + // invoice_prefix wird hier bewusst nicht durchgereicht -- der Nummernkreis ist nur in der + // Mandanten-Verwaltung änderbar. )); $response = $action->execute(); diff --git a/app/Domains/Admin/Controllers/UserDetailGetController.php b/app/Domains/Admin/Controllers/UserDetailGetController.php index a093c0d..50f1364 100644 --- a/app/Domains/Admin/Controllers/UserDetailGetController.php +++ b/app/Domains/Admin/Controllers/UserDetailGetController.php @@ -23,7 +23,7 @@ class UserDetailGetController extends CommonController return response()->json([ 'user' => $userData, - 'isOwnUser' => auth()->id() === $user->id, + 'isOwnUser' => currentUser()?->id === $user->id, 'isLvTenant' => $this->tenant->slug === 'lv', 'userRoles' => UserRole::all()->map(fn($role) => ['slug' => $role->slug, 'name' => $role->name]), 'localGroups' => $this->adminTenants->getActiveLocalGroups()->map(fn($t) => ['slug' => $t->slug, 'name' => $t->name]), diff --git a/app/Domains/Admin/Controllers/UserToggleActiveController.php b/app/Domains/Admin/Controllers/UserToggleActiveController.php index 005d7bc..8546a4a 100644 --- a/app/Domains/Admin/Controllers/UserToggleActiveController.php +++ b/app/Domains/Admin/Controllers/UserToggleActiveController.php @@ -16,7 +16,7 @@ class UserToggleActiveController extends CommonController $action = new ToggleUserActiveAction(new ToggleUserActiveRequest( user: $user, - currentUserId: auth()->id(), + currentUserId: currentUser()?->id, )); $response = $action->execute(); diff --git a/app/Domains/Admin/Controllers/UserUpdateController.php b/app/Domains/Admin/Controllers/UserUpdateController.php index 6878692..a9ebb9d 100644 --- a/app/Domains/Admin/Controllers/UserUpdateController.php +++ b/app/Domains/Admin/Controllers/UserUpdateController.php @@ -17,7 +17,7 @@ class UserUpdateController extends CommonController $action = new UpdateUserAction(new UpdateUserRequest( user: $user, data: $request->all(), - isOwnUser: auth()->id() === $user->id, + isOwnUser: currentUser()?->id === $user->id, isLvTenant: $this->tenant->slug === 'lv', )); diff --git a/app/Domains/Admin/Routes/api.php b/app/Domains/Admin/Routes/api.php index 6bf9597..f3f94b2 100644 --- a/app/Domains/Admin/Routes/api.php +++ b/app/Domains/Admin/Routes/api.php @@ -1,5 +1,10 @@ group(function () { @@ -60,6 +66,18 @@ Route::middleware([IdentifyTenant::class, 'auth', AdminRoleMiddleware::class])-> Route::post('/{id}/reset-password', UserResetPasswordController::class); }); + // Dokumentvorlagen gelten app-weit für alle Mandanten -- deshalb nur für Hauptadministrator*innen, + // AdminRoleMiddleware allein ließe auch Gruppenleitungen durch. + Route::middleware(MainAdminRoleMiddleware::class)->group(function () { + Route::prefix('api/v1/admin/document-templates')->group(function () { + Route::get('/', DocumentTemplatesGetController::class); + Route::post('/', DocumentTemplatesUpdateController::class); + Route::post('/preview', DocumentTemplatesPreviewController::class); + Route::post('/assets', DocumentAssetUpdateController::class); + Route::delete('/assets/{name}', DocumentAssetDeleteController::class); + }); + }); + Route::middleware(LvOnlyMiddleware::class)->group(function () { Route::prefix('api/v1/admin/tenants')->group(function () { Route::get('/list', TenantListApiController::class); diff --git a/app/Domains/Admin/Routes/web.php b/app/Domains/Admin/Routes/web.php index 793962f..73ca343 100644 --- a/app/Domains/Admin/Routes/web.php +++ b/app/Domains/Admin/Routes/web.php @@ -1,6 +1,7 @@ group(function () { @@ -16,6 +18,11 @@ Route::middleware([IdentifyTenant::class, 'auth', AdminRoleMiddleware::class])-> Route::get('/tenant', TenantPageController::class); Route::get('/users', UserListPageController::class); + // App-weit gültige Dokumentvorlagen -- nur für Hauptadministrator*innen. + Route::middleware(MainAdminRoleMiddleware::class)->group(function () { + Route::get('/document-templates', DocumentTemplatesPageController::class); + }); + Route::middleware(LvOnlyMiddleware::class)->group(function () { Route::get('/tenants', TenantListPageController::class); Route::get('/tenants/{slug}', TenantEditPageController::class); diff --git a/app/Domains/Admin/Views/DocumentTemplates.vue b/app/Domains/Admin/Views/DocumentTemplates.vue new file mode 100644 index 0000000..2bd66e3 --- /dev/null +++ b/app/Domains/Admin/Views/DocumentTemplates.vue @@ -0,0 +1,666 @@ + + + + + diff --git a/app/Domains/Admin/Views/Partials/TenantContact.vue b/app/Domains/Admin/Views/Partials/TenantContact.vue index 11843a5..ee73fa6 100644 --- a/app/Domains/Admin/Views/Partials/TenantContact.vue +++ b/app/Domains/Admin/Views/Partials/TenantContact.vue @@ -13,9 +13,17 @@ const props = defineProps({ const { request } = useAjax() const editing = ref(false) +// Solange kein eigener Absender eingetragen ist, steht auf der Rechnung der Name des Mandanten. +const senderFallback = props.data.name ?? '' + const form = ref({ + invoice_sender_name: props.data.invoice_sender_name ?? '', email: props.data.email ?? '', email_finance: props.data.email_finance ?? '', + phone: props.data.phone ?? '', + address_1: props.data.address_1 ?? '', + address_2: props.data.address_2 ?? '', + address_3: props.data.address_3 ?? '', postcode: props.data.postcode ?? '', city: props.data.city ?? '', }) @@ -39,16 +47,49 @@ async function save() { diff --git a/artisan b/artisan old mode 100644 new mode 100755 diff --git a/composer.json b/composer.json index 989a38e..1f9be20 100644 --- a/composer.json +++ b/composer.json @@ -20,6 +20,7 @@ "maennchen/zipstream-php": "^3.1" }, "require-dev": { + "barryvdh/laravel-ide-helper": "^3.7", "fakerphp/faker": "^1.23", "laravel/pail": "^1.2.2", "laravel/pint": "^1.24", @@ -29,6 +30,9 @@ "phpunit/phpunit": "^11.5.3" }, "autoload": { + "files": [ + "app/Support/helpers.php" + ], "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", @@ -57,6 +61,10 @@ "@php artisan config:clear --ansi", "@php artisan test" ], + "test:coverage": [ + "@php artisan config:clear --ansi", + "@php -d pcov.enabled=1 vendor/bin/phpunit --coverage-html storage/coverage --coverage-text" + ], "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" diff --git a/composer.lock b/composer.lock index 35cb0aa..c734619 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": "9fb8095137a8e9d664e44b9fca5f1f5a", + "content-hash": "6e38fe16a000f12f5fff089b08b49780", "packages": [ { "name": "bacon/bacon-qr-code", @@ -6934,6 +6934,298 @@ } ], "packages-dev": [ + { + "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": "fakerphp/faker", "version": "v1.24.1", diff --git a/database/migrations/2026_08_06_170030_default_tax_exemption_reason_jugendhilfe.php b/database/migrations/2026_08_06_170030_default_tax_exemption_reason_jugendhilfe.php index 10cce5b..2c33a83 100644 --- a/database/migrations/2026_08_06_170030_default_tax_exemption_reason_jugendhilfe.php +++ b/database/migrations/2026_08_06_170030_default_tax_exemption_reason_jugendhilfe.php @@ -1,20 +1,28 @@ string('tax_exemption_reason')->nullable()->default('ustg_4_25a')->change(); + }); } public function down(): void { - DB::statement('ALTER TABLE tenants ALTER COLUMN tax_exemption_reason DROP DEFAULT'); + Schema::table('tenants', function (Blueprint $table) { + $table->string('tax_exemption_reason')->nullable()->default(null)->change(); + }); } }; diff --git a/database/migrations/2026_08_27_140010_add_invoice_fields_to_tenants.php b/database/migrations/2026_08_27_140010_add_invoice_fields_to_tenants.php new file mode 100644 index 0000000..e702e00 --- /dev/null +++ b/database/migrations/2026_08_27_140010_add_invoice_fields_to_tenants.php @@ -0,0 +1,55 @@ +string('address_1')->nullable()->after('name'); + $table->string('address_2')->nullable()->after('address_1'); + $table->string('address_3')->nullable()->after('address_2'); + $table->string('phone')->nullable()->after('email_finance'); + $table->string('tax_number')->nullable()->after('vat_pricing_mode'); + $table->string('vat_id')->nullable()->after('tax_number'); + $table->string('invoice_prefix')->nullable()->after('vat_id'); + }); + + // Bestands-Tenants bekommen den großgeschriebenen Slug als Default-Präfix (wm -> WM). + foreach (DB::table('tenants')->select('id', 'slug')->get() as $tenant) { + DB::table('tenants') + ->where('id', $tenant->id) + ->update(['invoice_prefix' => strtoupper($tenant->slug)]); + } + + Schema::table('tenants', function (Blueprint $table) { + $table->unique('invoice_prefix'); + }); + } + + public function down(): void + { + Schema::table('tenants', function (Blueprint $table) { + $table->dropUnique(['invoice_prefix']); + $table->dropColumn([ + 'address_1', + 'address_2', + 'address_3', + 'phone', + 'tax_number', + 'vat_id', + 'invoice_prefix', + ]); + }); + } +}; diff --git a/database/migrations/2026_08_27_140020_add_invoice_snapshot_to_events.php b/database/migrations/2026_08_27_140020_add_invoice_snapshot_to_events.php new file mode 100644 index 0000000..6101fa2 --- /dev/null +++ b/database/migrations/2026_08_27_140020_add_invoice_snapshot_to_events.php @@ -0,0 +1,108 @@ +string('invoice_key')->nullable()->unique(); + + $table->string('invoice_sender_name')->nullable(); + $table->string('invoice_sender_address_1')->nullable(); + $table->string('invoice_sender_address_2')->nullable(); + $table->string('invoice_sender_address_3')->nullable(); + $table->string('invoice_sender_postcode')->nullable(); + $table->string('invoice_sender_city')->nullable(); + $table->string('invoice_sender_email')->nullable(); + $table->string('invoice_sender_phone')->nullable(); + $table->string('invoice_sender_tax_number')->nullable(); + $table->string('invoice_sender_vat_id')->nullable(); + }); + + $this->backfill(); + } + + /** + * Bestandsevents nachträglich bestücken: Absenderdaten aus dem heutigen Tenant, `invoice_key` je + * Tenant und Monat nach `start_date`, dann `id` durchnummeriert. + */ + private function backfill(): void + { + $tenants = DB::table('tenants')->get()->keyBy('slug'); + $counters = []; + + $events = DB::table('events') + ->select('id', 'tenant', 'start_date') + ->orderBy('start_date') + ->orderBy('id') + ->get(); + + foreach ($events as $event) { + $tenant = $tenants->get($event->tenant); + if ($tenant === null || $event->start_date === null) { + continue; + } + + $month = date('Y-m', strtotime($event->start_date)); + $bucket = $event->tenant . '|' . $month; + $counters[$bucket] = ($counters[$bucket] ?? 0) + 1; + + DB::table('events')->where('id', $event->id)->update([ + // $month ist bereits "2026-07" -> ergibt "WM-V-2026-07-01" + 'invoice_key' => sprintf( + '%s-V-%s-%s', + $tenant->invoice_prefix, + $month, + str_pad((string) $counters[$bucket], 2, '0', STR_PAD_LEFT) + ), + 'invoice_sender_name' => $tenant->name, + 'invoice_sender_address_1' => $tenant->address_1, + 'invoice_sender_address_2' => $tenant->address_2, + 'invoice_sender_address_3' => $tenant->address_3, + 'invoice_sender_postcode' => $tenant->postcode, + 'invoice_sender_city' => $tenant->city, + 'invoice_sender_email' => $tenant->email, + 'invoice_sender_phone' => $tenant->phone, + 'invoice_sender_tax_number' => $tenant->tax_number, + 'invoice_sender_vat_id' => $tenant->vat_id, + ]); + } + } + + public function down(): void + { + Schema::table('events', function (Blueprint $table) { + $table->dropUnique(['invoice_key']); + $table->dropColumn([ + 'invoice_key', + 'invoice_sender_name', + 'invoice_sender_address_1', + 'invoice_sender_address_2', + 'invoice_sender_address_3', + 'invoice_sender_postcode', + 'invoice_sender_city', + 'invoice_sender_email', + 'invoice_sender_phone', + 'invoice_sender_tax_number', + 'invoice_sender_vat_id', + ]); + }); + } +}; diff --git a/database/migrations/2026_08_27_140030_add_invoice_fields_to_event_participants.php b/database/migrations/2026_08_27_140030_add_invoice_fields_to_event_participants.php new file mode 100644 index 0000000..fae3797 --- /dev/null +++ b/database/migrations/2026_08_27_140030_add_invoice_fields_to_event_participants.php @@ -0,0 +1,61 @@ +unsignedInteger('invoice_sequence')->nullable()->after('identifier'); + $table->string('fee_type')->nullable()->after('participation_type'); + $table->boolean('sibling_reduction')->default(false)->after('fee_type'); + }); + + $this->backfillSequences(); + + Schema::table('event_participants', function (Blueprint $table) { + $table->unique(['event_id', 'invoice_sequence']); + }); + } + + /** Bestandsanmeldungen je Event nach `id` durchnummerieren. */ + private function backfillSequences(): void + { + $counters = []; + + $participants = DB::table('event_participants') + ->select('id', 'event_id') + ->orderBy('event_id') + ->orderBy('id') + ->get(); + + foreach ($participants as $participant) { + $counters[$participant->event_id] = ($counters[$participant->event_id] ?? 0) + 1; + + DB::table('event_participants') + ->where('id', $participant->id) + ->update(['invoice_sequence' => $counters[$participant->event_id]]); + } + } + + public function down(): void + { + Schema::table('event_participants', function (Blueprint $table) { + $table->dropUnique(['event_id', 'invoice_sequence']); + $table->dropColumn(['invoice_sequence', 'fee_type', 'sibling_reduction']); + }); + } +}; diff --git a/database/migrations/2026_08_27_150010_create_document_templates.php b/database/migrations/2026_08_27_150010_create_document_templates.php new file mode 100644 index 0000000..6f2f8bd --- /dev/null +++ b/database/migrations/2026_08_27_150010_create_document_templates.php @@ -0,0 +1,36 @@ +id(); + $table->string('document_type'); + $table->string('block'); + $table->longText('content')->nullable(); + $table->integer('sort_order')->default(1); + $table->boolean('editable')->default(true); + $table->timestamps(); + + $table->unique(['document_type', 'block']); + }); + } + + public function down(): void + { + Schema::dropIfExists('document_templates'); + } +}; diff --git a/database/migrations/2026_08_27_150020_create_document_assets.php b/database/migrations/2026_08_27_150020_create_document_assets.php new file mode 100644 index 0000000..caadc26 --- /dev/null +++ b/database/migrations/2026_08_27_150020_create_document_assets.php @@ -0,0 +1,34 @@ +id(); + $table->string('name')->unique(); + $table->string('label')->nullable(); + $table->string('mime'); + $table->longText('data'); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('document_assets'); + } +}; diff --git a/database/migrations/2026_09_02_140010_add_invoice_sender_name_to_tenants.php b/database/migrations/2026_09_02_140010_add_invoice_sender_name_to_tenants.php new file mode 100644 index 0000000..8410ef1 --- /dev/null +++ b/database/migrations/2026_09_02_140010_add_invoice_sender_name_to_tenants.php @@ -0,0 +1,28 @@ +string('invoice_sender_name')->nullable()->after('name'); + }); + } + + public function down(): void + { + Schema::table('tenants', function (Blueprint $table) { + $table->dropColumn('invoice_sender_name'); + }); + } +}; diff --git a/database/migrations/2026_09_02_140020_drop_invoice_sender_snapshot_from_events.php b/database/migrations/2026_09_02_140020_drop_invoice_sender_snapshot_from_events.php new file mode 100644 index 0000000..6e33886 --- /dev/null +++ b/database/migrations/2026_09_02_140020_drop_invoice_sender_snapshot_from_events.php @@ -0,0 +1,51 @@ + */ + private const array COLUMNS = [ + 'invoice_sender_name', + 'invoice_sender_address_1', + 'invoice_sender_address_2', + 'invoice_sender_address_3', + 'invoice_sender_postcode', + 'invoice_sender_city', + 'invoice_sender_email', + 'invoice_sender_phone', + 'invoice_sender_tax_number', + 'invoice_sender_vat_id', + ]; + + public function up(): void + { + Schema::table('events', function (Blueprint $table) { + $table->dropColumn(self::COLUMNS); + }); + } + + public function down(): void + { + Schema::table('events', function (Blueprint $table) { + foreach (self::COLUMNS as $column) { + $table->string($column)->nullable(); + } + }); + } +}; diff --git a/database/migrations/2026_09_02_140030_compact_invoice_key_format.php b/database/migrations/2026_09_02_140030_compact_invoice_key_format.php new file mode 100644 index 0000000..dfbd093 --- /dev/null +++ b/database/migrations/2026_09_02_140030_compact_invoice_key_format.php @@ -0,0 +1,42 @@ + Rechnungsnummer WM-V-2026-07-01-0005 + * nachher WM-V-20260701 -> Rechnungsnummer WM-V-20260701-0005 + * + * Die Rechnungsnummer selbst wird nirgends gespeichert, sondern bei jedem Abruf aus `invoice_key` + * und `event_participants.invoice_sequence` zusammengesetzt. Die Umstellung hier wirkt daher + * unmittelbar auf alle Rechnungen; alte und neue Veranstaltungen bleiben im selben Format. + */ +return new class extends Migration { + public function up(): void + { + $this->rewrite('/^(.*-V-)(\d{4})-(\d{2})-(\d{2})$/', '$1$2$3$4'); + } + + public function down(): void + { + $this->rewrite('/^(.*-V-)(\d{4})(\d{2})(\d{2})$/', '$1$2-$3-$4'); + } + + private function rewrite(string $pattern, string $replacement): void + { + $events = DB::table('events') + ->select('id', 'invoice_key') + ->whereNotNull('invoice_key') + ->get(); + + foreach ($events as $event) { + $rewritten = preg_replace($pattern, $replacement, (string) $event->invoice_key); + + if ($rewritten !== null && $rewritten !== $event->invoice_key) { + DB::table('events')->where('id', $event->id)->update(['invoice_key' => $rewritten]); + } + } + } +}; diff --git a/database/migrations/2026_09_03_140010_create_refund_reasons.php b/database/migrations/2026_09_03_140010_create_refund_reasons.php new file mode 100644 index 0000000..4587505 --- /dev/null +++ b/database/migrations/2026_09_03_140010_create_refund_reasons.php @@ -0,0 +1,63 @@ +string('slug')->primary(); + $table->string('name'); + $table->text('document_text')->nullable(); + $table->boolean('requires_note')->default(false); + $table->integer('sort_order')->default(0); + $table->timestamps(); + }); + + DB::table('refund_reasons')->insert([ + [ + 'slug' => 'sickness', + 'name' => 'Krankheitsbedingte Absage', + 'document_text' => 'Die Teilnahme konnte krankheitsbedingt nicht angetreten werden.', + 'requires_note' => false, + 'sort_order' => 10, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'slug' => 'event_cancelled', + 'name' => 'Ausfall der Veranstaltung', + 'document_text' => 'Die Veranstaltung wurde abgesagt und konnte nicht stattfinden.', + 'requires_note' => false, + 'sort_order' => 20, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + // Der Text entsteht erst aus dem Freitext der Aktionsleitung -- deshalb hier leer. + 'slug' => 'other', + 'name' => 'Sonstiger Grund', + 'document_text' => null, + 'requires_note' => true, + 'sort_order' => 30, + 'created_at' => now(), + 'updated_at' => now(), + ], + ]); + } + + public function down(): void + { + Schema::dropIfExists('refund_reasons'); + } +}; diff --git a/database/migrations/2026_09_03_140020_create_participant_refunds.php b/database/migrations/2026_09_03_140020_create_participant_refunds.php new file mode 100644 index 0000000..fbacd1c --- /dev/null +++ b/database/migrations/2026_09_03_140020_create_participant_refunds.php @@ -0,0 +1,60 @@ +id(); + $table->string('tenant'); + + $table->foreignId('event_id')->constrained('events', 'id')->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('event_participant_id')->constrained('event_participants', 'id')->cascadeOnDelete()->cascadeOnUpdate(); + + // Der öffentliche Link. Eigener Token statt des Teilnehmer-Identifiers, damit ein Abbruch den + // Link tötet, ohne andere per Identifier erreichbare Funktionen (GiroCode) mitzunehmen. + $table->string('token', 32)->unique(); + $table->string('status'); + + $table->float('amount', 2)->default(0); + $table->string('reason')->nullable(); + $table->text('reason_note')->nullable(); + + $table->string('account_owner')->nullable(); + $table->string('account_iban')->nullable(); + + $table->foreignId('released_by')->nullable()->constrained('users', 'id')->nullOnDelete(); + $table->dateTime('released_at')->nullable(); + $table->dateTime('accepted_at')->nullable(); + $table->dateTime('cancelled_at')->nullable(); + + $table->timestamps(); + + $table->foreign('tenant')->references('slug')->on('tenants')->restrictOnDelete()->cascadeOnUpdate(); + $table->foreign('reason')->references('slug')->on('refund_reasons')->restrictOnDelete()->cascadeOnUpdate(); + }); + } + + public function down(): void + { + Schema::dropIfExists('participant_refunds'); + } +}; diff --git a/database/migrations/2026_09_04_140010_add_participant_refund_confirmation_text.php b/database/migrations/2026_09_04_140010_add_participant_refund_confirmation_text.php new file mode 100644 index 0000000..f632ebd --- /dev/null +++ b/database/migrations/2026_09_04_140010_add_participant_refund_confirmation_text.php @@ -0,0 +1,43 @@ +where('name', self::NAME)->first(); + + if ($existing !== null) { + return; + } + + DB::table('page_texts')->insert([ + 'name' => self::NAME, + 'content' => 'Ich versichere, dass ich den genannten Betrag beglichen habe und nicht ' + . 'anderweitig zurückerstattet bekomme.', + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + + public function down(): void + { + DB::table('page_texts')->where('name', self::NAME)->delete(); + } +}; diff --git a/database/migrations/2026_09_05_140010_add_participation_refund_invoice_type.php b/database/migrations/2026_09_05_140010_add_participation_refund_invoice_type.php new file mode 100644 index 0000000..28b072c --- /dev/null +++ b/database/migrations/2026_09_05_140010_add_participation_refund_invoice_type.php @@ -0,0 +1,57 @@ +boolean('selectable')->default(true)->after('sort_order'); + }); + + if (DB::table('invoice_types')->where('slug', self::SLUG)->exists()) { + return; + } + + DB::table('invoice_types')->insert([ + 'slug' => self::SLUG, + 'name' => 'Beitragserstattung', + // Hinter "Verwaltung" (2) und vor "Sonstige Kosten" (3) wäre die Reihenfolge unklar; der Typ + // taucht ohnehin nur in Summen und Auswertungen auf. + 'sort_order' => 4, + 'selectable' => false, + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + + public function down(): void + { + // Nur löschen, wenn keine Abrechnung daran hängt -- der Fremdschlüssel würde es sonst verhindern, + // und ein Rollback soll nicht an fremden Daten scheitern. + if (!DB::table('invoices')->where('type', self::SLUG)->exists()) { + DB::table('invoice_types')->where('slug', self::SLUG)->delete(); + } + + Schema::table('invoice_types', function (Blueprint $table) { + $table->dropColumn('selectable'); + }); + } +}; diff --git a/database/migrations/2026_09_05_140020_add_invoice_id_to_participant_refunds.php b/database/migrations/2026_09_05_140020_add_invoice_id_to_participant_refunds.php new file mode 100644 index 0000000..7108180 --- /dev/null +++ b/database/migrations/2026_09_05_140020_add_invoice_id_to_participant_refunds.php @@ -0,0 +1,32 @@ +foreignId('invoice_id')->nullable()->after('account_iban') + ->constrained('invoices', 'id')->nullOnDelete()->cascadeOnUpdate(); + }); + } + + public function down(): void + { + Schema::table('participant_refunds', function (Blueprint $table) { + $table->dropForeign(['invoice_id']); + $table->dropColumn('invoice_id'); + }); + } +}; diff --git a/database/migrations/2026_09_06_140010_add_captured_by_to_participant_refunds.php b/database/migrations/2026_09_06_140010_add_captured_by_to_participant_refunds.php new file mode 100644 index 0000000..f6f2303 --- /dev/null +++ b/database/migrations/2026_09_06_140010_add_captured_by_to_participant_refunds.php @@ -0,0 +1,34 @@ +foreignId('captured_by')->nullable()->after('account_iban') + ->constrained('users', 'id')->nullOnDelete()->cascadeOnUpdate(); + }); + } + + public function down(): void + { + Schema::table('participant_refunds', function (Blueprint $table) { + $table->dropForeign(['captured_by']); + $table->dropColumn('captured_by'); + }); + } +}; diff --git a/database/migrations/2026_09_07_140010_add_counts_as_expense_to_invoice_types.php b/database/migrations/2026_09_07_140010_add_counts_as_expense_to_invoice_types.php new file mode 100644 index 0000000..086b539 --- /dev/null +++ b/database/migrations/2026_09_07_140010_add_counts_as_expense_to_invoice_types.php @@ -0,0 +1,38 @@ +boolean('counts_as_expense')->default(true)->after('selectable'); + }); + + DB::table('invoice_types') + ->where('slug', 'participation_refund') + ->update(['counts_as_expense' => false]); + } + + public function down(): void + { + Schema::table('invoice_types', function (Blueprint $table) { + $table->dropColumn('counts_as_expense'); + }); + } +}; diff --git a/database/migrations/2026_09_08_140010_create_retention_reasons.php b/database/migrations/2026_09_08_140010_create_retention_reasons.php new file mode 100644 index 0000000..d867f6e --- /dev/null +++ b/database/migrations/2026_09_08_140010_create_retention_reasons.php @@ -0,0 +1,72 @@ +string('slug')->primary(); + $table->string('name'); + $table->text('document_text')->nullable(); + $table->boolean('requires_note')->default(false); + $table->integer('sort_order')->default(0); + $table->timestamps(); + }); + + DB::table('retention_reasons')->insert([ + [ + 'slug' => 'cancellation_fee', + 'name' => 'Stornogebühr laut Ausschreibung', + 'document_text' => 'Einbehalten wurde die in der Ausschreibung genannte Stornogebühr.', + 'requires_note' => false, + 'sort_order' => 10, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'slug' => 'incurred_costs', + 'name' => 'Bereits entstandene Kosten', + 'document_text' => 'Einbehalten wurden Kosten, die zum Zeitpunkt der Abmeldung bereits entstanden waren.', + 'requires_note' => false, + 'sort_order' => 20, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'slug' => 'material', + 'name' => 'Bereits beschafftes Material', + 'document_text' => 'Einbehalten wurden Kosten für Material, das bereits beschafft wurde.', + 'requires_note' => false, + 'sort_order' => 30, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + // Der Text entsteht erst aus dem Freitext der Aktionsleitung -- deshalb hier leer. + 'slug' => 'custom', + 'name' => 'Sonstiger Grund', + 'document_text' => null, + 'requires_note' => true, + 'sort_order' => 40, + 'created_at' => now(), + 'updated_at' => now(), + ], + ]); + } + + public function down(): void + { + Schema::dropIfExists('retention_reasons'); + } +}; diff --git a/database/migrations/2026_09_08_140020_add_retention_reason_to_participant_refunds.php b/database/migrations/2026_09_08_140020_add_retention_reason_to_participant_refunds.php new file mode 100644 index 0000000..8110785 --- /dev/null +++ b/database/migrations/2026_09_08_140020_add_retention_reason_to_participant_refunds.php @@ -0,0 +1,40 @@ +string('retention_reason')->nullable()->after('reason_note'); + $table->text('retention_reason_note')->nullable()->after('retention_reason'); + $table->float('retained_amount', 2)->default(0)->after('retention_reason_note'); + }); + + // Der Fremdschlüssel in einem eigenen Aufruf: zusammen mit dem Anlegen der Spalte hat MariaDB ihn + // hier stillschweigend übergangen, und ein `down()` lief anschließend ins Leere. + Schema::table('participant_refunds', function (Blueprint $table) { + $table->foreign('retention_reason')->references('slug')->on('retention_reasons') + ->restrictOnDelete()->cascadeOnUpdate(); + }); + } + + public function down(): void + { + Schema::table('participant_refunds', function (Blueprint $table) { + $table->dropForeign(['retention_reason']); + $table->dropColumn(['retention_reason', 'retention_reason_note', 'retained_amount']); + }); + } +}; diff --git a/database/migrations/2026_09_09_140010_add_purchase_example_to_invoice_types.php b/database/migrations/2026_09_09_140010_add_purchase_example_to_invoice_types.php new file mode 100644 index 0000000..ffb573d --- /dev/null +++ b/database/migrations/2026_09_09_140010_add_purchase_example_to_invoice_types.php @@ -0,0 +1,53 @@ + 'z. B. Bahnfahrt Halle–Leipzig', + 'program' => 'z. B. Bastelmaterial für den Workshop', + 'accommodation' => 'z. B. zwei Nächte Jugendherberge', + 'catering' => 'z. B. Wocheneinkauf für das Frühstück', + 'logistic' => 'z. B. Miete für den Transporter', + 'technical' => 'z. B. Verlängerungskabel und Mehrfachstecker', + 'management' => 'z. B. Porto und Kopien', + 'other' => 'z. B. Erste-Hilfe-Set', + ]; + + public function up(): void + { + Schema::table('invoice_types', function (Blueprint $table) { + $table->string('purchase_example')->nullable()->after('name'); + }); + + foreach (self::EXAMPLES as $slug => $example) { + DB::table('invoice_types') + ->where('slug', $slug) + ->update(['purchase_example' => $example]); + } + } + + public function down(): void + { + Schema::table('invoice_types', function (Blueprint $table) { + $table->dropColumn('purchase_example'); + }); + } +}; diff --git a/database/seed-scripts/participant-invoice-template.sql b/database/seed-scripts/participant-invoice-template.sql new file mode 100644 index 0000000..8bd9fd2 --- /dev/null +++ b/database/seed-scripts/participant-invoice-template.sql @@ -0,0 +1,160 @@ +-- Standard-Vorlage für die Teilnehmer-Rechnung. +-- +-- Bewusst ein manuelles Skript und keine Migration: der Vorlageninhalt wird über die Admin-Oberfläche +-- gepflegt und soll von einem Release nicht überschrieben werden. Einspielen also nur bei der +-- Erstinstallation oder wenn die Vorlage bewusst zurückgesetzt werden soll. +-- +-- docker exec -i mareike-mareike-db mysql -u -p < database/seed-scripts/participant-invoice-template.sql +-- +-- Die Bilder liegen als base64 in der Datenbank, damit ein Release sie nicht überschreibt und sie mit +-- jedem Dump mitwandern. Referenziert werden sie in der Vorlage als {asset:name}. +-- +-- Zum Asset "edge": der gelbe Randstreifen mit Knick aus dem BdP-Erscheinungsbild. Mit GD gezeichnet +-- (16 mm breit, volle Seitenhöhe, Innenkante von 10 mm oben auf 3 mm bei 198 mm, dann auf 16 mm +-- auslaufend). Als PNG und nicht als SVG, weil ohne svg-lib von dompdf kommentarlos ignoriert. + +DELETE FROM document_templates WHERE document_type = 'participant_invoice'; + +INSERT INTO document_templates (document_type, block, content, sort_order, editable, created_at, updated_at) VALUES + ('participant_invoice', 'layout', ' + +
+ + + + + + + +
+ {block:header_sender_return} + {block:header_recipient} + + {block:emblem} + + {block:logo} + {block:sender_data} +
+ + {block:subject} + {block:body} + {block:footer} + +
', 10, 1, NOW(), NOW()), + ('participant_invoice', 'style', '@page { size: A4 portrait; margin: 0; } +* { margin: 0; padding: 0; box-sizing: border-box; } +body { font-family: \'DejaVu Sans\', sans-serif; font-size: 9.5pt; color: #1a1a1a; background: white; } + +.page { padding: 10mm 18mm 20mm 22mm; } + +/* Kopfbereich */ +.header-table { width: 100%; border-collapse: collapse; margin-bottom: 6mm; } +.header-table td { vertical-align: top; padding: 0; } +.absender-rueck { font-size: 6pt; color: #555; border-bottom: 0.3pt solid #888; padding-bottom: 1.5mm; margin-bottom: 3.5mm; } +.empfaenger { font-size: 10pt; line-height: 1.65; } +.empfaenger-bold { font-weight: bold; } +.logo-img { width: 36mm; display: block; margin-bottom: 4mm; } +.emblem-img { width: 22mm; display: block; margin: 0 auto; } +.absender-block { font-size: 7.5pt; color: #1a4799; line-height: 1.7; } +.absender-name { font-weight: bold; font-size: 8pt; } + +/* Betreff und Referenzdaten */ +.betreff { font-size: 14pt; color: #1a4799; margin-bottom: 5mm; } +.ref-table { border-collapse: collapse; font-size: 8.5pt; margin-bottom: 7mm; } +.ref-table td { padding: 0.9mm 7mm 0.9mm 0; vertical-align: top; } +.ref-key { color: #666; white-space: nowrap; } + +/* Anrede und Einleitung */ +.salutation { font-size: 9.5pt; margin-bottom: 3mm; } +.intro-text { font-size: 9pt; line-height: 1.6; margin-bottom: 7mm; color: #333; } + +/* Positionstabelle */ +.pos-table { width: 100%; border-collapse: collapse; font-size: 8.5pt; } +.pos-table th { background-color: #1a4799; color: white; padding: 2.5mm 3mm; text-align: left; font-size: 7.5pt; letter-spacing: 0.03em; } +.pos-table th.r, .pos-table td.r { text-align: right; } +.pos-table td { padding: 2mm 3mm; border-bottom: 0.3pt solid #d8dde6; vertical-align: top; } +.pos-table tr:nth-child(even) td { background-color: #f7f8fb; } +.pos-table tr:last-child td { border-bottom: none; } + +/* Summen */ +.sum-outer { width: 100%; border-collapse: collapse; margin-top: 1mm; margin-bottom: 5mm; } +.sum-outer td { padding: 0; } +.sum-spacer { width: 55%; } +.sum-inner { width: 100%; border-collapse: collapse; font-size: 8.5pt; } +.sum-inner td { padding: 1.2mm 0; } +.sum-key { color: #555; padding-right: 6mm; white-space: nowrap; } +.sum-val { text-align: right; white-space: nowrap; } +.sum-line td { border-top: 0.4pt solid #bbb; padding-top: 2mm; } +.sum-total td { font-weight: bold; font-size: 11pt; color: #1a4799; border-top: 1.5pt solid #1a4799; padding-top: 2mm; } + +/* Pflichthinweis bei Steuerbefreiung */ +.tax-note { font-size: 8pt; color: #555; line-height: 1.5; margin-bottom: 5mm; } + +/* Zahlungshinweis -- der gelbe Streifen */ +.payment-box { border-left: 3pt solid #f5c400; padding: 3mm 5mm; background-color: #fffef5; font-size: 8.5pt; line-height: 1.6; margin-bottom: 6mm; } +.payment-head { font-size: 7pt; font-weight: bold; color: #888; text-transform: uppercase; letter-spacing: 0.07em; margin-bottom: 2mm; } + +/* Grußformel und Fußnote */ +.closing { font-size: 9.5pt; line-height: 1.5; } +.gut-pfad { font-size: 13pt; color: #1a4799; margin-top: 1mm; margin-bottom: 1mm; } +.footer-note { margin-top: 4mm; font-size: 7.5pt; color: #888; } + +/* Gelber Randstreifen mit Knick -- position:fixed, damit er auf jeder Seite steht. */ +.edge { position: fixed; top: 0; left: 0; width: 16mm; height: 297mm; }', 20, 1, NOW(), NOW()), + ('participant_invoice', 'header_sender_return', '
{sender_name}{if:sender_address_1} · {sender_address_1}{/if:sender_address_1} · {sender_postcode} {sender_city}
', 30, 1, NOW(), NOW()), + ('participant_invoice', 'header_recipient', '
+
{recipient_name}
+
{recipient_address_1}
+ {if:recipient_address_2}
{recipient_address_2}
{/if:recipient_address_2} +
{recipient_postcode} {recipient_city}
+
', 40, 1, NOW(), NOW()), + ('participant_invoice', 'emblem', '', 50, 1, NOW(), NOW()), + ('participant_invoice', 'logo', '', 60, 1, NOW(), NOW()), + ('participant_invoice', 'sender_data', '
+
{sender_name}
+ {if:sender_address_2}
{sender_address_2}
{/if:sender_address_2} + {if:sender_address_3}
{sender_address_3}
{/if:sender_address_3} + {if:sender_address_1}
{sender_address_1}
{/if:sender_address_1} +
{sender_postcode} {sender_city}
+ {if:sender_email}
{sender_email}
{/if:sender_email} + {if:sender_phone}
{sender_phone}
{/if:sender_phone} + {if:sender_tax_number}
Steuernummer: {sender_tax_number}
{/if:sender_tax_number} + {if:sender_vat_id}
USt-IdNr.: {sender_vat_id}
{/if:sender_vat_id} +
', 70, 1, NOW(), NOW()), + ('participant_invoice', 'subject', '
Rechnung Nr. {invoice_number}
+ + + + + + + + + + +
Rechnungsdatum:{invoice_date}
Leistungszeitraum:{service_period}
', 80, 1, NOW(), NOW()), + ('participant_invoice', 'body', '
Hallo {recipient_name},
+
anbei erhältst du die Rechnung über deinen Teilnahmebeitrag.
+ +{positions_table} +{summary_table} + +
+
Zahlung
+ {closing_statement} +
', 90, 0, NOW(), NOW()), + ('participant_invoice', 'footer', '
+
Herzlichst Gut Pfad,
+
{sender_name}
+ +
', 100, 1, NOW(), NOW()); + +DELETE FROM document_assets WHERE name = 'edge'; +INSERT INTO document_assets (name, label, mime, data, created_at, updated_at) VALUES ('edge', 'Gelber Randstreifen mit Knick (BdP-Anschnitt)', 'image/png', 'iVBORw0KGgoAAAANSUhEUgAAAMAAAA3sCAYAAABDZciKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR42u3dS2okW5ZAUa/qGgjXBIRrAsLVN4Rr5HJE9OVoAjI0gSgCXruqlZAkrzLfJz7S2WvNII7F5ppdN9n9r9++7P53x2SPy7o7G8Pv+28jQAAgAIb6HyMQQNay7i6mIAAQAAgABAACAAEMZwtUAGm2QAUAAgABgABAACCAAtugAkh7MQIBgABAACAAEAAIAAQw27MRCAAEAAIAAYAAQAAggMGcCyAAEAAIAAQAAgABgABmOxuBAEAAIAAQAAgABAACmO3JCAQAAgABgABAACAAEMBsr0YggDIH5AkABAACAAGAAEAABRcjEEDWstoGFQAIAAQAAgABgADGswUqgDRboAIAAYAAQAAgABBAwWYEAih7MwIBgABAACAAEAAIIODdCARQthmBAEAAIAAQAAgABBCwGYEAspZVAAIAAYAAQAAgABDAeJsRCEAACAAEAAIAAYAAQACzOR1GAGkvRiAAEAAIAAQAAgABBHwzAgGUXYxAACAAEAAIAAQAAgjwNqgAupbVNqgAQAAgABAACAAEAAKY7GwEAgABgABAACAAEAAIYLYnIxAACAAEAAIAAYAAQACzPRuBAEAAIAAQAAgABAACGGxZ/VG8AEAAIAAQAAgABAACmMzRSAJIczieAEAAIAAQAAgABFBgG1QAaV+NQAAgABAACAAEAAIIeDUCAZR5G1QAIAAQAAgABAACKNiMQABZyyoAAYAAQAAgABAACGC8zQgEIAAEAAIAAYAAQAAggNk2IxBA2ZsRCAAEAAIAAYAAQAAB70YggLLNCAQAAgABgABAACCAAKfDCKBrWXcXUxAACAAEAAIAAYAAhrMFKoA0W6ACAAGAAEAAIAAQQIFtUAGkvRiBAEAAIAAQAAgABAACmO3ZCAQAAgABgABAACAAEMBgy7o7m4IAQAAgABAACAAEAAKY62wEAgABgABAACAAEAAIYLYnIxAACAAEAAIAAYAAQACzvRqBAMockCcAEAAIAAQAAgABFFyMQABZy2obVAAgABAACAAEAAIYzxaoANJsgQoABAACAAGAAEAABZsRCKDszQgEAAIAAYAAQAAggIB3IxBA2WYEAgABgABAACAAEEDAZgQCyFpWAQgABAACAAGAAEAA421GIAABIAAQAAgABAACAAHM5nQYAaS9GIEAQAAgABAACAAEEPDNCARQdjECAYAAQAAgABAACCDA26AC6FpW26ACAAGAAEAAIAAQAAhgsrMRCAAEAAIAAYAAQAAggNmejEAAIAAQAAgABAACAAHM9mwEAgABgABAACAAEAAIYLBl9UfxAgABgABAACAAEAAIYDJHIwkgzeF4AgABgABAACAAEECBbVABpH01AgGAAEAAIAAQAAgg4NUIBFDmbVABgABAACAAEAAIoGAzAgFkLasABAACAAGAAEAAIIDxNiMQgAAQAAgABAACAAGAAGbbjEAAZW9GIAAQAAgABAACAAEEvBuBAMo2IxAACAAEAAIAAYAAApwOI4CuZd1dTEEAIAAQAAgABAACGM4WqADSbIEKAAQAAgABgABAAAW2QQWQ9mIEAgABgABAACAAEAAIYLZnIxAACAAEAAIAAYAAQACDLevubAoCAAGAAEAAIAAQAAhgrrMRCAAEAAIAAYAAQAAggNmejEAAIAAQAAgABAACAAHM9moEAihzQJ4AQAAgABAACAAEUHAxAgFkLattUAGAAEAAIAAQAAhgPFugAkizBSoAEAAIAAQAAgABFGxGIICyNyMQAAgABAACAAGAAALejUAAZZsRCAAEAAIAAYAAQAABmxEIIGtZBSAAEAAIAAQAAgABjLcZgQAEgABAACAAEAAIAAQwm9NhBJD2YgQCAAGAAEAAIAAQQMA3IxBA2cUIBAACAAGAAEAAIIAAb4MKoGtZbYMKAAQAAgABgABAACCAyc5GIAAQAAgABAACAAGAAGZ7MgIBgABAACAAEAAIAAQw27MRCAAEAAIAAYAAQAAggMGW1R/FCwAEAAIAAYAAQAAggMkcjSSANIfjCQAEAAIAAYAAQAAFtkEFkPbVCAQAAgABgABAACCAgFcjEECZt0EFAAIAAYAAQAAggILNCASQtawCEAAIAAQAAgABgADG24xAAAJAACAAEAAIAAQAAphtMwIBlL0ZgQBAACAAEAAIAAQQ8G4EAijbjEAAIAAQAAgABAACCHA6jAC6lnV3MQUBgABAACAAEAAIYDhboAJIswUqABAACAAEAAIAARTYBhVA2osRCAAEAAIAAYAAQAAggNmejUAAIAAQAAgABAACAAEMtqy7sykIAAQAAgABgABAACCAuc5GIAAQAAgABAACAAGAAGZ7MgIBgABAACAAEAAIAAQw26sRCKDMAXkCAAGAAEAAIAAQQMHFCASQtay2QQUAAgABgABAACCA8WyBCiDNFqgAQAAgABAACAAEULAZgQDK3oxAACAAEAAIAAQAAgh4NwIBlG1GIAAQAAgABAACAAEEbEYggKxlFYAAQAAgABAACAAEMN5mBAIQAAIAAYAAQAAgABDAbE6HEUDaixEIAAQAAgABgABAAAHfjEAAZRcjEAAIAAQAAgABgAACvA0qgK5ltQ0qABAACAAEAAIAAYAAJjsbgQBAACAAEAAIAAQAApjtyQgEAAIAAYAAQAAgABDAbM9GIAAQAAgABAACAAGAAAZbVn8ULwAQAAgABAACAAGAACZzNJIA0hyOJwAQAAgABAACAAEU2AYVQNpXIxAACAAEAAIAAYAAAl6NQABl3gYVAAgABAACAAGAAAo2IxBA1rIKQAAgABAACAAEAAIYbzMCAQgAAYAAQAAgABAACGC2zQgEUPZmBAIAAYAAQAAgABBAwLsRCKBsMwIBgABAACAAEAAIIMDpMALoWtbdxRQEAAIAAYAAQAAggOFsgQogzRaoAEAAIAAQAAgABFBgG1QAaS9GIAAQAAgABAACAAGAAGZ7NgIBgABAACAAEAAIAAQw2LLuzqYgABAACAAEAAIAAYAA5jobgQBAACAAEAAIAAQAApjtyQgEAAIAAYAAQAAgABDAbK9GIIAyB+QJAAQAAgABgABAAAUXIxBA1rLaBhUACAAEAAIAAYAAxrMFKoA0W6ACAAGAAEAAIAAQQMFmBAIoezMCAYAAQAAgABAACCDg3QgEULYZgQBAACAAEAAIAAQQsBmBALKWVQACAAGAAEAAIAAQwHibEQhAAAgABAACAAGAAEAAszkdRgBpL0YgABAACAAEAAIAAQR8MwIBlF2MQAAgABAACAAEAAII8DaoALqW1TaoAEAAIAAQAAgABAACmOxsBAIAAYAAQAAgABAACGC2JyMQAAgABAACAAGAAEAAsz0bgQBAACAAEAAIAAQAAhhsWf1RvABAACAAEAAIAAQAApjM0UgCSHM4ngBAACAAEAAIAARQYBtUAGlfjUAAIAAQAAgABAACCHg1AgGUeRtUACAAEAAIAAQAAijYjEAAWcsqAAGAAEAAIAAQAAhgvM0IBCAABAACAAGAAEAAIIDZNiMQQNmbEQgABAACAAGAAEAAAe9GIICyzQgEAAIAAYAAQAAggACnwwiga1l3F1MQAAgABAACAAGAAIazBSqANFugAgABgABAACAAEECBbVABpL0YgQBAACAAEAAIAAQAApjt2QgEAAIAAYAAQAAgABDAYMu6O5uCAEAAIAAQAAgABAACmOtsBAIAAYAAQAAgABAACGC2JyMQAAgABAACAAGAAEAAs70agQDKHJAnABAACAAEAAIAARRcjEAAWctqG1QAIAAQAAgABAACGM8WqADSbIEKAAQAAgABgABAAAWbEQig7M0IBAACAAGAAEAAIICAdyMQQNlmBAIAAYAAQAAgABBAwGYEAshaVgEIAAQAAgABgABAAONtRiAAASAAEAAIAAQAAgABzOZ0GAGkvRiBAEAAIAAQAAgABBDwzQgEUHYxAgGAAEAAIAAQAAggwNugAuhaVtugAgABgABAACAAEAAIYLKzEQgABAACAAGAAEAAIIDZnoxAACAAEAAIAAQAAgABzPZsBAIAAYAAQAAgABAACGCwZfVH8QIAAYAAQAAgABAACGAyRyMJIM3heAIAAYAAQAAgABBAgW1QAaR9NQIBgABAACAAEAAIIODVCARQ5m1QAYAAQAAgABAACKBgMwIBZC2rAAQAAgABgABAACCA8TYjEIAAEAAIAAQAAgABgABm24xAAGVvRiAAEAAIAAQAAgABBLwbgQDKNiMQAAgABAACAAGAAAKcDiOArmXdXUxBACAAEAAIAAQAAhjOFqgA0myBCgAEAAIAAYAAQAAFtkEFkPZiBAIAAYAAQAAgABAACGC2ZyMQAAgABAACAAGAAEAAgy3r7mwKAgABgABAACAAEAAIYK6zEQgABAACAAGAAEAAIIDZnoxAACAAEAAIAAQAAgABzPZqBAIoc0CeAEAAIAAQAAgABFBwMQIBZC2rbVABgABAACAAEAAIYDxboAJIswUqABAACAAEAAIAARRsRiCAsjcjEAAIAAQAAgABgAAC3o1AAGWbEQgABAACAAGAAEAAAZsRCCBrWQUgABAACAAEAAIAAYy3GYEABIAAQAAgABAACAAEMJvTYQSQ9mIEAgABgABAACAAEEDANyMQQNnFCAQAAgABgABAACCAAG+DCqBrWW2DCgAEAAIAAYAAQAAggMnORiAAEAAIAAQAAgABgABmezICAYAAQAAgABAACAAEMNuzEQgABAACAAGAAEAAIIDBltUfxQsABAACAAGAAEAAIIDJHI0kgDSH4wkABAACAAGAAEAABbZBBZD21QgEAAIAAYAAQAAggIBXIxBAmbdBBQACAAGAAEAAIICCzQgEkLWsAhAACAAEAAIAAYAAxtuMQAACQAAgABAACAAEAAKYbTMCAZS9GYEAQAAgABAACAAEEPBuBAIo24xAACAAEAAIAAQAAghwOowAupZ1dzEFAYAAQAAgABAACGA4W6ACSLMFKgAQAAgABAACAAEU2AYVQNqLEQgABAACAAGAAEAAIIDZno1AACAAEAAIAAQAAgABDLasu7MpCAAEAAIAAYAAQAAggLnORiAAEAAIAAQAAgABgABmezICAYAAQAAgABAACAAEMNurEQigzAF5AgABgABAACAAEEDBxQgEkLWstkEFAAIAAYAAQAAggPFsgQogzRaoAEAAIAAQAAgABFCwGYEAyt6MQAAgABAACAAEAAIIeDcCAZRtRiAAEAAIAAQAAgABBGxGIICsZRWAAEAAIAAQAAgABDDeZgQCEAACAAGAAEAAIAAQwGxOhxFA2osRCAAEAAIAAYAAQAAB34xAAGUXIxAACAAEAAIAAYAAArwNKoCuZbUNKgAQAAgABAACAAGAACY7G4EAQAAgABAACAAEAAKY7ckIBAACAAGAAEAAIAAQwGzPRiAAEAAIAAQAAgABgAAGW1Z/FC8AEAAIAAQAAgABgAAmczSSANIcjicAEAAIAAQAAgABFNgGFUDaVyMQAAgABAACAAGAAAJejUAAZd4GFQAIAAQAAgABgAAKNiMQQNayCkAAIAAQAAgABAACGG8zAgEIAAGAAEAAIAAQAAhgts0IBFD2ZgQCAAGAAEAAIAAQQMC7EQigbDMCAYAAQAAgABAACCDA6TAC6FrW3cV/AwGAAEAAIAAQAAhgOFugAkizBSoAEAAIAAQAAgABFNgGFUDai/8CAgABgABAACAAEAAIYLZn/wUEAAIAAYAAQAAgABDAYMu6O/svIAAQAAgABAACAAGAAOY6u/xYARAACAAEAAIAAYAAZnty+bECIAAQAAgABAACAAHM9uryUw7AAXm4BUIAIAAQAAgABFBwcfnJBrCstkFxC4QAQAAgABAACGA8W6CkA7AFilsgEAACAAGAAEAABZtLTzmAN5cet0AIwAgQAAgABAACCHh36SkHsLn0uAVCAEaAAEAAIAAQQMDm0pMNYFkFgFsgEAACAAGAAEAA420uOwIAt0AIAAQAAgABgABmczoM6QBeXHbcAoEAEAAIAAQAAgj45rJTDuDisuMWCASAAEAAIAAQQIC3QekGsKy2QXELBAIAASAAEAAIAAQw2dklxwoAAgABIAAQAAgABDDbk0uOFQAEAAJAACAAEAAIYLZnlxwrAAgABIAAQAAgABDAYMvqj+KxAoAAQAAIwAgQAAgABDCZo5FIB+BwPNwCgQBAACAABAACKLANSjqAry43boFAACAAEAACAAEEvLrclAPwNihugUAAIAAQAAIAARRsLjfZAJZVALgFAgGAAEAACAAEMN7mUiMAcAsEAgABgAAQAAhgts2lphzAm0uNWyAQAAgABAACQAAB7y415QA2lxq3QCAAEAAIAASAAAKcDkM3gGXdXVxq3AKBAEAAIAAQAAIYzhYo6QBsgeIWCAQAAgABgADANigCGO7FZcYtEAgABAACAAEgACNAALM9u8xYAUAAIAAQAAgAARgBAhhsWXdnlxkrAAgABAACAAEgACNAAHOdXWKsACAAEAAIAAQAAkAAsz25xFgBQAAgABAACAAEgABme3WJKQfggDzcAoEAQAAgABAAFAK4uMRkA1hW26C4BQIBgABAACAAGB+ALVDSAdgCxS0QCAAEAAIAAUAhgM3lpRzAm8uLWyAQAAgABAACgEAA7y4v5QA2lxe3QCAAEAAIAAQAgQA2l5dsAMsqANwCgQBAACAAEACMD2BzaREAuAUCAYAAQAAgAJgdgNNhSAfw4tLiFggEAAIAAYAAIBDAN5eWcgAXlxa3QCAAEAAIAAQAgQC8DUo3gGW1DYpbIBAACAAEAAIAAcDkAM4uK1YAEAAIAAQAAgABwOwAnlxWrAAgABAACAAEAAKA2QE8u6xYAUAAIAAQAAgABACDA1hWfxSPFQAEAAIAAYAAQAAwOQBHI5EOwOF4uAUCAYAAQAAgACgEYBuUdABfXVLcAoEAQAAgABAABAJ4dUkpB+BtUNwCgQBAACAAEAAUAthcUrIBLKsAcAsEAgABgABAADA+gM3lRADgFggEAAIAAYAAYHYAm8tJOYA3lxO3QCAAEAAIAAQAgQDeXU7KAWwuJ26BQAAgABAACAACATgdhm4Ay7q7uJy4BQIBgABAACAAGB6ALVDSAdgCxS0QCAAEAAIAAUAhANugpAN4cSlxCwQCAAGAAEAAIACYHcCzS4kVAAQAAgABgABAADA4gGXdnV1KrAAgABAACAAEAAKAuQGcXUasACAAEAAIAAQAAoDZATy5jFgBQAAgABAACAAEALMDeHUZKQfggDzcAoEAQAAgABAAFAK4uIxkA1hW26C4BQIBgABAACAAGB+ALVDSAdgCxS0QCAAEAAIAAUAhgM0lpBzAm0uIWyAQAAgABAACgEAA7y4h5QA2lxC3QCAAEAAIAAQAgQA2l5BsAMsqANwCgQBAACAAEACMD2Bz+RAAuAUCAYAAQAAgAJgdgNNhSAfw4vLhFggEAAIAAYAAIBDAN5ePcgAXlw+3QCAAEAAIAAQAgQC8DUo3gGW1DYpbIBAACAAEAAIAAcDkAM4uHVYAEAAIAAQAAgABwOwAnlw6rAAgABAACAAEAAKA2QE8u3RYAUAAIAAQAAgABACDA1hWfxSPFQAEAAIAAYAAQAAwOQBHI5EOwOF4uAUCAYAAQAAgACgEYBuUdABfXTbcAoEAQAAgABAABAJ4ddkoB+BtUNwCgQBAACAAEAAUAthcNrIBLKsAcAsEAgABgABAADA+gM0lQwDgFggEAAIAAYAAYHYAm0tGOYA3lwy3QCAAEAAIAAQAgQDeXTLKAWwuGW6BQAAgABAACAACATgdhm4Ay7q7uGS4BQIBgABAACAAGB6ALVDSAdgCxS0QCAAEAAIAAUAhANugpAN4cblwCwQCAAGAAEAAIACYHcCzy4UVAAQAAgABgABAADA4gGXdnV0urAAgABAACAAEAAKAuQGcXSqsACAAEAAIAAQAAoDZATy5VFgBQAAgABAACAAEALMDeHWpKAfggDzcAoEAQAAgABAAFAK4uFRkA1hW26C4BQIBgABAACAAGB+ALVDSAdgCxS0QCAAEAAIAAUAhgM1lohzAm8uEWyAQAAgABAACgEAA7y4T5QA2lwm3QCAAEAAIAAQAgQA2l4lsAMsqANwCgQBAACAAEACMD2BziRAAuAUCAYAAQAAgAJgdgNNhSAfw4hLhFggEAAIAAYAAIBDAN5eIcgAXlwi3QCAAEAAIAAQAgQC8DUo3gGW1DYpbIBAACAAEAAIAAcDkAM4uD1YAEAAIAAQAAgABwOwAnlwerAAgABAACAAEAAKA2QE8uzxYAUAAIAAQAAgABACDA1hWfxSPFQAEAAIAAYAAQAAwOQBHI5EOwOF4uAUCAYAAQAAgACgEYBuUdABfXRrcAoEAQAAgABAABAJ4dWkoB+BtUNwCgQBAACAAEAAUAthcGrIBLKsAcAsEAgABgABAADA+gM1lQQDgFggEAAIAAYAAYHYAm8tCOYA3lwW3QCAAEAAIAAQAgQDeXRbKAWwuC26BQAAgAEgF8OCyYAWAaACPLgtWAIgGcHJZSK8Av33Z7V0ayrdAR5eGcgBWANIB3Lk0lAO4dWkoB3BwaRAACAB6Aex++yICwgFYBagH4Mcw0gFcuTyUA7h3eSgH4HUI0gGcXB7KAUA7gN++WAWwAkA2AJ9IIR3AtUtEOQC/BpMOwG8BWAGgGoBPpNAOwCpAPYCDy0Q5gBuXiXIAPpGCWyDwEAzBAGyDkg5g99sXqwDhAKwC1AOwApAOwCdSSAfg5EjSAUA6gJNLRXoF8Fo09VsgO0GkA7ACkA7AyZGkA/CJFDwDQDWAg8uFACAagJMjaQdgFUAAEA7AJ1JIB+DkSNIBeB2CdAB+DMMKANUAnBxJOwCoB+DkSKwAUA3AJ1JIB2AniHQAfgug/QzgEynUH4KtAqQDOLh0lAPwWjTpAJwciVsgEAAIAFoBODmSdgA7r0QQD8AKQDoAJ0eSDsAnUvAMANUATi4f5QCgHYBPpFBfATwHkA7AyZGkA3ByJOkA/BqMZwCwAkAwACdH0g5g549jEAB0A/CJFNIBeC2adAC2QkkHYCsUKwBUA/CJFNoBWAWoB+DkSNIBQDoAJ0diBYBqACeXkvQK4ORI6rdAfgsgHYAVgHQAPpFCOgAnR5IO4OByIgAQAPQC8IkU2gFYBagH4Mcw0gE4OZJ0AD6RQjoAr0OQDuDkklIOANoBODkSKwCEA/CJFNIBODmSdAB+DSYdgN8CsAJANQCfSKEdgFWAegAHl5ZyAE6OJB2AT6TgFgg8BEMwANugpANwciTtAKwC1AOwApAOwCdSSAfg5EjSAUA6gJPLS3oF8Fo09VsgO0GkA7ACkA7AyZGkA/CJFDwDQDWAg0uMACAagJMjaQdgFUAAEA7AJ1JIB+DkSNIBeB2CdAB+DMMKANUAnBxJOwCoB+DkSKwAUA3AJ1JIB2AniHQAfgug/QzgEynUH4KtAqQDOLjclAPwWjTpAJwciVsgEAAIAGLvAjk5knQAO69EEA/ACkA6ACdHkg7AJ1LwDADVAE4uOeUAoB2AT6RQXwE8B5AOwMmRpANwciTpAPwajGcAsAIggOI/2smRpAPY+eMYBADdAHwihXQAXosmHYCtUNIB2ArFCgDZvwfwiRTSAVgFqAfg5Ej8SSQCqHJyJFYABFB1cvlJrwBOjqR+C+S3AAGkWQEEkOYTKQJIc3KkANIO/gsIQAAIQAAIIMgnUgRQJwABpPkxTABpTo4UQJpPpAggzesQAkg7GYEAQABVTo4UAAggzCdSBJDm5EgBpPk1WABpfgsQgBUAAWT5RIoArAIIIOxgBAIoc3KkANJ8IkUAboEQgIdgBBBkG1QAbU6OFIBVAAF4DkAATT6RIoA0J0cKAARQdTICAaR5LVoAdXaCBJBmBRBAmpMjBZDmEykC8AyAAKoORiAAASCAKidHCsAqgAAEgACafCJFAGlOjhRAmtchBJDmxzABWAEQQJaTIwUAAghzcqQAQABVPpEigDQ7QQJI81uAANp8IkUAVgEEEHYwAgGUeS1aAGlOjhSAWyAEIAAEIAAEEOPkSAHU+TFMAGlWAAGkOTlSAGk+kSIAzwAIoOpkBAIAAVT5RIoAPAcggDAnRwogzcmRAkjza7AAPAMgACsAAihycqQA6gQgAAEggCqfSBFAmteiBZBmK1QAabZCBWAFQABZPpEiAKsAAghzcqQAQABVTo4UAAig6mQEAkhzcqQA6vwWIIA0K4AA0nwiRQBpTo4UQNrBCAQgAAQgAAQQ5BMpArAKIIAwP4YJIM3JkQJI84kUAaR5HUIAaScjEAAIoMrJkQIAAYT5RIoA0pwcKYA0vwYLIM1vAQKwAiCALJ9IEYBVAAGEHYxAAGVOjhRAmk+kCMAtEALwEIwAgmyDCqDNyZECsAogAM8BCKDJJ1IEkObkSAGAAKpORiCANK9FC6DOTpAA0qwAAkhzcqQA0nwiRQCeARBA1cEIBCAABFDl5EgBWAUQgAAQQJNPpAggzcmRAkjzOoQA0vwYJgArAALIcnKkAEAAYU6OFAAIoMonUgSQZidIAGl+CxBAm0+kCMAqgADCDkYggDKvRQsgzcmRAnALhAAEgAAEgABinBwpgDo/hgkgzQoggDQnRwogzSdSBOAZAAFUnYxAACCAKp9IEYDnAAQQ5uRIAaQ5OVIAaX4NFoBnAARgBUAARU6OFECdAAQgAARQ5RMpAkjzWrQA0myFCiDNVqgArAAIIMsnUgRgFUAAYU6OFAAIoMrJkQIAAVSdjEAAaU6OFECd3wIEkGYFEECaT6QIIM3JkQJIOxiBAASAAASAAIJ8IkUAVgEEEObHMAGkOTlSAGk+kSKANK9DCCDtZAQCAAFUOTlSACCAMJ9IEUCakyMFkObXYAGk+XZVKp4AAAv0SURBVC1AAFYABJDlEykCsAoggLCDEQigzMmRAkjziRQBuAVCAB6CEUCQbVABtDk5UgBWAQTgOQABNPlEigDSnBwpABBA1ckIBJDmtWgB1NkJEkCaFUAAaU6OFECaT6QIwDMAAqg6GIEABIAAqpwcKQCrAAIQAAJo8okUAaQ5OVIAaV6HEECaH8MEYAVAAFlOjhQACCDMyZECAAFU+USKANLsBAkgzW8BAmjziRQBWAUQQNjBCARQ5rVoAaQ5OVIAboEQgAAQgAAQQIyTIwVQ58cwAaRZAQSQ5uRIAaT5RIoAPAMggKqTEQgABFDlEykC8ByAAMKcHCmANCdHCiDNr8EC8AyAAKwACKDIyZECqBOAAASAAKp8IkUAaV6LFkCarVABpNkKFYAVAAFk+USKAKwCCCDMyZECAAFUOTlSACCAqpMRCCDNyZECqPNbgADSrAACSPOJFAGkOTlSAGkHIxCAABCAABBAkE+kCMAqgADC/BgmgDQnRwogzSdSBJDmdQgBpJ2MQAAggConRwoABBDmEykCSHNypADS/BosgDS/BQjACoAAsnwiRQBWAQQQdjACAZQ5OVIAaT6RIgC3QAjAQzACCLINKoA2J0cKwCqAADwHIIAmn0gRQJqTIwUAAqg6GYEA0rwWLYA6O0ECSLMCCCDNyZECSPOJFAF4BkAAVQcjEIAAEECVkyMFYBVAAAJAAE0+kSKANCdHCiDN6xACSPNjmACsAAggy8mRAgABhDk5UgAggCqfSBFAmp0gAaT5LUAAbT6RIgCrAAIIOxiBAMq8Fi2ANCdHCsAtEAIQAAIQAAKIcXKkAOr8GCaANCuAANKcHCmANJ9IEYBnAARQdTICAYAAqnwiRQCeAxBAmJMjBZDm5EgBpPk1WACeARCAFQABFDk5UgB1AhCAABBAlU+kCCDNa9ECSLMVKoA0W6ECsAIggCyfSBGAVQABhDk5UgAggConRwoABFB1MgIBpDk5UgB1fgsQQJoVQABpPpEigDQnRwog7WAEAhAAAhAAAgjyiRQBWAUQQJgfwwSQ5uRIAaT5RIoA0rwOIYC0kxEIAARQ5eRIAYAAwnwiRQBpTo4UQJpfgwWQ5rcAAVgBEECWT6QIwCqAAMIORiCAMidHCiDNJ1IE4BYIAXgIRgBBtkEF0ObkSAFYBRCA5wAE0OQTKQJIc3KkAEAAVScjEECa16IFUGcnSABpVgABpDk5UgBpPpEiAM8ACKDqYAQCEAACqHJypACsAghAAAigySdSBJDm5EgBpHkdQgBpfgwTgBUAAWQ5OVIAIIAwJ0cKAARQ5RMpAkizEySANL8FCKDNJ1IEYBVAAGEHIxBAmdeiBZDm5EgBuAVCAAJAAAJAADFOjhRAnR/DBJBmBRBAmpMjBZDmEykC8AyAAKpORiAAEECVT6QIwHMAAghzcqQA0pwcKYA0vwYLwDMAArACCIAiJ0cKoE4AAhCAAKjyiRQBpHktWgBptkIFkGYrVABWAAGQ5RMpArAKCICwBwGAAIh6FAAIgKiTAEirnxwpAI4CoMwKQNqdACi7FQBlBwEgAAEgAAEQVP5EigBIrwICYLcL/xgmAHa78MmRAmC3C38iRQDsduHXIQTAbhd+LVoApAmA3W7XPTlSAFgBYBf9RIoA+IdrAVB2FABlewFgBRAAVcVPpAiA9CogAP7ZQQCU3QiAslsB4BZIAHgIFgA9tkFpq50cKQDSq4AASD8HCIB/dSUAyh4FAAIg6iQA0kqvRQuA33MUAGVWANLuBEDZtQDwDCAAog4CQAACoKpycqQASK8CAkAA8DtuBEDZvQAo2wuAsqMAsAIIgKrCyZECIE0A/DsPAgABEPUoAMr2AqDsKADSpn8iRQCkVwEB8J8cBEDZjQAouxUAboEEgAAEgAAEQMvkkyMFwB+xFwBlVgDSrgRA2b0A8AwgAKJOAgABUDX1EykCIP0cIAD+qDsBUHYtAMqOAsAzgACwAgiAoIknRwqAP0MACEAAVN0IgLJ7AVC2FwBlRwFgBRAAVdM+kSIA0quAAPizHgQAAiDqUQAgAKJOAiBt0smRAuCvOAqAMisAaXcCoOxWAJQdBIAABIAABEDQlE+kCID0KiAA/qqjACi7EgBl9wKgbC8Ayk4CAAFQNeHkSAFgBYC/6EEAlF0LgLKjACjbCwArgACo+uyfSBEA6VVAAPxdBwFQdiMAym4FgFsgAeAhWAD02Aal7TOfHCkA0quAAEg/BwiA7+FKAJQ9CgAEQNRJAKR91teiBcD3chQAZVYA0u4EQNm1APAMIACiDgJAAAKg6jOeHCkA0quAABAAfCc3AqDsXgCU7QVA2VEAWAEEQNVnOzlSAKQJgO/tQQAgAKIeBUDZXgCUHQVA2mf6RIoASK8CAuBHOAiAshsBUHYrANwCCQABCAABCICWz3JypAD4UfYCoMwKQNqVACi7FwCeAQRA1EkAIACqPsMnUgRA+jlAAPxIdwKg7FoAlB0FgGcAAWAFEABBH/3kSAHwowkAAQiAqhsBUHYvAMr2AqDsKACsAAKg6iN/IkUApFcBAfAzPAgABEDUowBAAESdBEDaRz05UgD8LEcBUGYFIO1OAJTdCoCygwAQgAAQgAAI+oifSBEA6VVAAPxMRwFQdiUAyu4FQNleAJSdBAACoOqjnRwpAKwA8BM9CICyawFQdhQAZXsBYAUQAFUf6RMpAiC9CgiAX+EgAMpuBEDZrQBwCyQAPAQLgB7boLR9lJMjBUB6FRAA6ecAAfCrXAmAskcBgACIOgmAtI/wWrQA+JWOAqDMCkDanQAouxYAngEEQNRBAAhAAFT96pMjBUB6FRAAAoBf6EYAlN0LgLK9ACg7CgArgACo+pUnRwqANAHwETwIAARA1KMAKNsLgLKjAEj7VZ9IEQDpVUAAfBQHAVB2IwDKbgWAWyABIAABIAAB0PIrTo4UAB/JXgCUWQFIuxIAZfcCwDOAAIg6CQAEQNXP/kSKAEg/BwiAj+ZOAJRdC4CyowDwDCAArAACIOhnnhwpAD4iASAAAVB1IwDK7gVA2V4AlB0FgBVAAFT9rE+kCID0KiAAPqoHAYAAiHoUAAiAqJMASPsZJ0cKgI/sKADKrACk3QmAslsBUHYQAAIQAAIQAEE/+hMpAiC9CgiAj+4oAMquBEDZvQAo2wuAspMAQABU/ciTIwWAFQA+uAcBUHYtAMqOAqBsLwCsAAKg6kd9IkUApFcBAfBZHARA2Y0AKLsVAG6BBICHYAHQYxuUth9xcqQASK8CAiD9HCAAPpMrAVD2KAAQAFEnAZD2vV+LFgCfzVEAlFkBSLsTAGXXAsAzgACIOggAAQiAqu95cqQASK8CAkAA8MncCICyewFQthcAZUcBYAUQAFXf6+RIAZAmAD6rBwGAAIh6FABlewFQdhQAad/jEykCIL0KCIDP7CAAym4EQNmtAHALJAAEIAAEIABa/u7JkQLgs9sLgDIrAGlXAqDsXgB4BhAAUScBgACo+jufSBEA6ecAATDBnQAouxYAZUcB4BlAAFgBBEDQXz05UgBMIQAEIACqbgRA2b0AKNsLgLKjALACCICqv/KJFAGQXgUEwCQPAgABEPUoABAAUScBkPZnT44UANMcBUCZFYC0OwFQdisAyg4CQAACQAACIOjPfCJFAKRXAQEw0VEAlF0JgLJ7AVC2FwBlJwGAAKj6oydHCgArAAz0IADKrgVA2VEAlO0FgBVAAFT9kU+kCID0KiAAJjsIgLIbAVB2KwDcAgkAD8ECoMc2KG3/6eRIAZBeBQRA+jlAAEx3JQDKHgUAAiDqJADS/t1r0QKg4CgAyqwApN0JgLJrAeAZQABEHQSAAARA1f93cqQASK8CAkAAEHAjAMruBUDZXgCUHQWAFUAAVP3eyZECIE0AlDwIAARA1KMAKNsLgLKjAEj710+kCID0KiAAag4CoOxGAJTdCgC3QAJAAAJAANDyzydHCoCivQAoswKQdiUAyu4FgGcAARB1EgAIgKp/fCJFAKSfAwRA1Z0AKLsWAGVHAeAZwBywAkDQb192BwFQJgAEAFU3AqDsXgCU7QVA2VEAWAGg6v8ABW3JzPmtEDcAAAAASUVORK5CYII=', NOW(), NOW()); + +DELETE FROM document_assets WHERE name = 'emblem'; +INSERT INTO document_assets (name, label, mime, data, created_at, updated_at) VALUES ('emblem', 'Emblem zwischen Empfänger und Absender', 'image/png', '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', NOW(), NOW()); + +DELETE FROM document_assets WHERE name = 'logo'; +INSERT INTO document_assets (name, label, mime, data, created_at, updated_at) VALUES ('logo', 'Logo im Briefkopf', 'image/png', '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', NOW(), NOW()); + diff --git a/database/seed-scripts/participant-refund-template.sql b/database/seed-scripts/participant-refund-template.sql new file mode 100644 index 0000000..1e0a4e1 --- /dev/null +++ b/database/seed-scripts/participant-refund-template.sql @@ -0,0 +1,138 @@ +-- Standard-Vorlage für den Erstattungsbeleg. +-- +-- Bewusst ein manuelles Skript und keine Migration: der Vorlageninhalt wird über die Admin-Oberfläche +-- gepflegt und soll von einem Release nicht überschrieben werden. Einspielen also nur bei der +-- Erstinstallation oder wenn die Vorlage bewusst zurückgesetzt werden soll. +-- +-- docker exec -i mareike-mareike-db mysql -u -p < database/seed-scripts/participant-refund-template.sql +-- +-- Setzt participant-invoice-template.sql voraus: die Bilder ({asset:emblem}, {asset:logo}, +-- {asset:edge}) liegen in `document_assets` und werden von beiden Dokumentarten gemeinsam genutzt. +-- +-- Der Beleg ist kein Schreiben des Verbands, sondern die Erklärung des Teilis ("Ich bitte um …", "Ich +-- versichere …") -- ein Eigenbeleg. +-- +-- Briefkopf samt Anschriftenfeld ist der der Rechnung: die Anschrift der erklärenden Person steht dort +-- und nicht noch einmal im Körper. In der Angabentabelle steht ihr Name, weil dort alles zusammensteht, +-- was sie erklärt -- Kontoinhaber*in kann eine andere Person sein (etwa ein Elternteil). +-- +-- Der Erklärungssatz kommt aus dem Seitentext CONFIRMATION_PARTICIPANT_REFUND, denselben, den der Teili +-- vor dem Absenden ankreuzt. Er steht hier deshalb als Platzhalter und nicht als fester Text. + +DELETE FROM document_templates WHERE document_type = 'participant_refund'; + +INSERT INTO document_templates (document_type, block, content, sort_order, editable, created_at, updated_at) VALUES + ('participant_refund', 'layout', ' + +
+ + + + + + + +
+ {block:header_sender_return} + {block:header_recipient} + + {block:emblem} + + {block:logo} + {block:sender_data} +
+ + {block:subject} + {block:body} + {block:footer} + +
', 10, 1, NOW(), NOW()), + ('participant_refund', 'style', '@page { size: A4 portrait; margin: 0; } +* { margin: 0; padding: 0; box-sizing: border-box; } +body { font-family: \'DejaVu Sans\', sans-serif; font-size: 9.5pt; color: #1a1a1a; background: white; } + +.page { padding: 10mm 18mm 20mm 22mm; } + +/* Kopfbereich */ +.header-table { width: 100%; border-collapse: collapse; margin-bottom: 6mm; } +.header-table td { vertical-align: top; padding: 0; } +.absender-rueck { font-size: 6pt; color: #555; border-bottom: 0.3pt solid #888; padding-bottom: 1.5mm; margin-bottom: 3.5mm; } +.empfaenger { font-size: 10pt; line-height: 1.65; } +.empfaenger-bold { font-weight: bold; } +.logo-img { width: 36mm; display: block; margin-bottom: 4mm; } +.emblem-img { width: 22mm; display: block; margin: 0 auto; } +.absender-block { font-size: 7.5pt; color: #1a4799; line-height: 1.7; } +.absender-name { font-weight: bold; font-size: 8pt; } + +/* Betreff und Referenzdaten */ +.betreff { font-size: 14pt; color: #1a4799; margin-bottom: 5mm; } +.ref-table { border-collapse: collapse; font-size: 8.5pt; margin-bottom: 7mm; } +.ref-table td { padding: 0.9mm 7mm 0.9mm 0; vertical-align: top; } +.ref-key { color: #666; white-space: nowrap; } + +/* Einleitender Satz */ +.intro-text { font-size: 9.5pt; line-height: 1.6; margin-bottom: 5mm; color: #1a1a1a; } + +/* Angaben zur Erstattung */ +.detail-table { width: 100%; border-collapse: collapse; font-size: 9pt; margin-bottom: 5mm; } +.detail-table td { padding: 2.2mm 3mm; border-bottom: 0.3pt solid #d8dde6; vertical-align: top; } +.detail-table tr:nth-child(even) td { background-color: #f7f8fb; } +.detail-table tr:last-child td { border-bottom: none; } +.detail-key { width: 42%; color: #555; } +.detail-val { font-weight: bold; } + +/* Die Versicherung des Teilis unter den Angaben */ +.declaration { font-size: 9.5pt; line-height: 1.6; margin-top: 7mm; } + +/* Vermerk, wenn die Aktionsleitung die Angaben aufgenommen hat -- steht sonst nicht auf dem Beleg. */ +.capture-note { font-size: 8pt; color: #555; line-height: 1.55; margin-top: 3mm; } + +/* Gelber Randstreifen mit Knick -- position:fixed, damit er auf jeder Seite steht. */ +.edge { position: fixed; top: 0; left: 0; width: 16mm; height: 297mm; }', 20, 1, NOW(), NOW()), + ('participant_refund', 'header_sender_return', '
{sender_name}{if:sender_address_1} · {sender_address_1}{/if:sender_address_1} · {sender_postcode} {sender_city}
', 30, 1, NOW(), NOW()), + ('participant_refund', 'header_recipient', '
+
{recipient_name}
+
{recipient_address_1}
+ {if:recipient_address_2}
{recipient_address_2}
{/if:recipient_address_2} +
{recipient_postcode} {recipient_city}
+
', 40, 1, NOW(), NOW()), + ('participant_refund', 'emblem', '', 50, 1, NOW(), NOW()), + ('participant_refund', 'logo', '', 60, 1, NOW(), NOW()), + ('participant_refund', 'sender_data', '
+
{sender_name}
+ {if:sender_address_2}
{sender_address_2}
{/if:sender_address_2} + {if:sender_address_3}
{sender_address_3}
{/if:sender_address_3} + {if:sender_address_1}
{sender_address_1}
{/if:sender_address_1} +
{sender_postcode} {sender_city}
+ {if:sender_email}
{sender_email}
{/if:sender_email} + {if:sender_phone}
{sender_phone}
{/if:sender_phone} + {if:sender_tax_number}
Steuernummer: {sender_tax_number}
{/if:sender_tax_number} + {if:sender_vat_id}
USt-IdNr.: {sender_vat_id}
{/if:sender_vat_id} +
', 70, 1, NOW(), NOW()), + ('participant_refund', 'subject', '
Rückerstattung Nr. {document_number}
+ + + + + + + + + + + + + + + {if:unregistered_at} + + + {/if:unregistered_at} +
Belegdatum:{document_date}
Veranstaltung:{event_name}
Zeitraum:{service_period}
Abgemeldet am:{unregistered_at}
', 80, 1, NOW(), NOW()), + ('participant_refund', 'body', '
Ich konnte an der Veranstaltung nicht oder nur teilweise teilnehmen und bitte um die Rückerstattung wie folgt:
+ +{details_table} + +
{declaration_text}
+{if:capture_note}
{capture_note}
{/if:capture_note}', 90, 1, NOW(), NOW()), + ('participant_refund', 'footer', '', 100, 1, NOW(), NOW()); diff --git a/docker/Dockerfile b/docker/Dockerfile index 8ce4ac6..659801a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -22,10 +22,14 @@ RUN apt-get install -y nginx \ libxml2-dev \ libmagickwand-dev \ imagemagick \ - && pecl install imagick \ - && docker-php-ext-enable imagick + && pecl install imagick pcov \ + && docker-php-ext-enable imagick pcov #&& rm -rf /var/lib/apt/lists/* \ +# PCOV misst die Testabdeckung. Dauerhaft aktiv kostet es jede Anfrage Laufzeit, deshalb ist es hier +# ausgeschaltet und wird nur beim Testlauf zugeschaltet (composer test:coverage). +RUN echo "pcov.enabled=0" > /usr/local/etc/php/conf.d/zz-pcov.ini + RUN mkdir -p /run/nginx RUN docker-php-ext-install mysqli pdo pdo_mysql mbstring zip exif pcntl gd diff --git a/docker/php/composer.phar b/docker/php/composer.phar old mode 100644 new mode 100755 diff --git a/resources/js/layouts/AdminAppLayout.vue b/resources/js/layouts/AdminAppLayout.vue index f0e4370..0734222 100644 --- a/resources/js/layouts/AdminAppLayout.vue +++ b/resources/js/layouts/AdminAppLayout.vue @@ -113,6 +113,11 @@ const props = defineProps({ Benutzer*innen + diff --git a/resources/views/emails/events/refund_accepted.blade.php b/resources/views/emails/events/refund_accepted.blade.php new file mode 100644 index 0000000..e051076 --- /dev/null +++ b/resources/views/emails/events/refund_accepted.blade.php @@ -0,0 +1,77 @@ + + + +

Hallo {{$name}}!

+@if ($capturedByManagement) +

+ die Aktionsleitung hat deine Bankverbindung für die Rückerstattung deines Teilnahmebeitrags zur + Veranstaltung "{{$eventTitle}}" erfasst. Du musst nichts weiter tun: Die + Erstattung ist bereits als Abrechnung eingereicht und wird nun bearbeitet. +

+

+ Bitte prüfe die unten stehenden Angaben – besonders die IBAN. +

+@else +

+ vielen Dank – deine Angaben zur Rückerstattung für die Veranstaltung "{{$eventTitle}}" liegen + uns vor. Du musst nichts weiter tun: Die Erstattung ist bereits als Abrechnung + eingereicht und wird nun bearbeitet. +

+@endif + + + + + + + + + + + @if ($invoiceNumber) + + + + + @endif + + + + + + + + +
Betrag:{{$amount}}
Grund:{{$reason}}
Abrechnungsnummer:{{$invoiceNumber}}
Kontoinhaber*in:{{$accountOwner}}
IBAN:{{$accountIban}}
+ +@if ($hasRetention) +

+ Von deinem gezahlten Beitrag verbleiben {{$retainedAmount}} beim Verband.
+ Grund: {{$retentionReason}}@if ($retentionReasonNote) – {{$retentionReasonNote}}@endif +

+@endif + +@if ($hasDocument) +

+ Im Anhang findest du deinen Beleg über die Rückerstattung als PDF – nur zu deiner + Information, eingereicht ist er bereits. +

+@endif + +@if ($myInvoicesUrl) +

+ Den Stand deiner Abrechnung kannst du jederzeit selbst nachsehen: Melde dich in mareike an und + öffne Meine Abrechnungen. +

+@endif + +

+ Sobald die Abrechnung bearbeitet wurde, wird der Betrag auf das oben genannte Konto überwiesen. + Stimmt etwas an den Angaben nicht, melde dich bitte umgehend bei der Aktionsleitung. +

+ +

+ @include('emails.subparts.disclaimer') +

+ + diff --git a/resources/views/emails/events/refund_released.blade.php b/resources/views/emails/events/refund_released.blade.php new file mode 100644 index 0000000..7abcf04 --- /dev/null +++ b/resources/views/emails/events/refund_released.blade.php @@ -0,0 +1,51 @@ + + + +

Hallo {{$name}}!

+

+ du hast dich von der Veranstaltung "{{$eventTitle}}" abgemeldet. Die Aktionsleitung hat dir daraufhin + eine Rückerstattung deines Teilnahmebeitrags freigegeben. +

+ + + + + + + + + + + @if (!empty($reasonNote)) + + + + + @endif +
Betrag:{{$amount}}
Grund:{{$reason}}
Anmerkung:{{$reasonNote}}
+ +

+ Damit wir überweisen können, brauchen wir noch deine Bankverbindung. Bitte trage sie über den + folgenden Link ein: +

+ +

+ Bankverbindung eintragen +

+ +

+ Falls der Knopf nicht funktioniert, kopiere bitte diese Adresse in deinen Browser:
+ {{$link}} +

+ +

+ Solange uns deine Bankverbindung nicht vorliegt, können wir den Betrag nicht auszahlen. Der Betrag + selbst steht fest und lässt sich über den Link nicht ändern – wenn du dazu Fragen hast, wende + dich bitte an die Aktionsleitung. +

+ +

+ @include('emails.subparts.disclaimer') +

+ + diff --git a/resources/views/pdfs/document.blade.php b/resources/views/pdfs/document.blade.php new file mode 100644 index 0000000..a196e22 --- /dev/null +++ b/resources/views/pdfs/document.blade.php @@ -0,0 +1,18 @@ +{{-- + Dünnes Gerüst für aus der Datenbank zusammengesetzte Dokumente. Enthält bewusst kein Layout -- + das steckt in den Vorlagenblöcken (`document_templates`), damit ein Release es nicht überschreibt. + + $style und $content sind bereits fertig ersetztes HTML aus dem DocumentTemplateRenderProvider und + werden hier nur ausgegeben, nicht als Blade ausgewertet. +--}} + + + + + {{ $title }} + + + +{!! $content !!} + + diff --git a/resources/views/pdfs/income-surplus-statement.blade.php b/resources/views/pdfs/income-surplus-statement.blade.php new file mode 100644 index 0000000..802910f --- /dev/null +++ b/resources/views/pdfs/income-surplus-statement.blade.php @@ -0,0 +1,236 @@ + + + + + + + + +

Einnahmen-Überschuss-Rechnung

+
+ {{ $event->name }} + · {{ $event->start_date->format('d.m.Y') }}–{{ $event->end_date->format('d.m.Y') }} + @if($event->location)· {{ $event->location }}@endif + · Stand: {{ $createdAt }} +
+ +

Einnahmen

+ + @foreach($income['categories'] as $category) + + + + + @foreach($category['entries'] as $entry) + + + + + @endforeach + @endforeach + + + + +
{{ $category['name'] }}{{ $money($category['total']) }} €
{{ $entry['name'] }}{{ $money($entry['amount']) }} €
Summe Einnahmen{{ $money($income['total']) }} €
+ +

Ausgaben

+ + @foreach($expenses['groups'] as $group) + + + + + @endforeach + + + + +
{{ $group['name'] }}{{ $money($group['sum']) }} €
Summe Ausgaben{{ $money($expenses['total']) }} €
+ + + + + + +
+ {{ $result->getAmount() >= 0 ? 'Überschuss' : 'Fehlbetrag' }} + + {{ $money($result) }} € +
+ +
+ Berücksichtigt sind nur tatsächlich vereinnahmte Beiträge und erfasste Belege. Nicht enthalten sind + offene Beiträge, Budget- und Schätzwerte, erstattete Beiträge sowie Auslagen, auf deren Auszahlung + verzichtet wurde. + @if($event->tax_liable) +
Alle Beträge sind Bruttobeträge inklusive {{ $event->vat_rate }} % Umsatzsteuer. + @endif +
+ +@php + $documentedGroups = array_filter($expenses['groups'], fn ($group) => count($group['rows']) > 0); +@endphp + +@if(count($documentedGroups) > 0) +
+ +

Anlage: Belege

+
{{ $event->name }} · Stand: {{ $createdAt }}
+ + @foreach($documentedGroups as $group) +

{{ $group['name'] }}

+ + + + + + + + + + + @foreach($group['rows'] as $row) + + + + + + + @endforeach + + + + + +
Beleg-Nr.DatumZweckBetrag
{{ $row['number'] }}{{ $row['date'] }}{{ $row['purpose'] }}{{ $money($row['amount']) }} €
Zwischensumme {{ $group['name'] }}{{ $money($group['sum']) }} €
+ @endforeach +@endif + + + diff --git a/routes/web.php b/routes/web.php index 8d17ed8..915b2e7 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,21 +11,28 @@ use App\Providers\GlobalDataProvider; use Illuminate\Support\Facades\Route; -require_once __DIR__ . '/../app/Domains/Dashboard/Routes/web.php'; -require_once __DIR__ . '/../app/Domains/Dashboard/Routes/api.php'; -require_once __DIR__ . '/../app/Domains/UserManagement/Routes/web.php'; -require_once __DIR__ . '/../app/Domains/UserManagement/Routes/api.php'; -require_once __DIR__ . '/../app/Domains/CostUnit/Routes/web.php'; -require_once __DIR__ . '/../app/Domains/CostUnit/Routes/api.php'; -require_once __DIR__ . '/../app/Domains/Invoice/Routes/web.php'; -require_once __DIR__ . '/../app/Domains/Invoice/Routes/api.php'; -require_once __DIR__ . '/../app/Domains/Event/Routes/web.php'; -require_once __DIR__ . '/../app/Domains/Event/Routes/api.php'; -require_once __DIR__ . '/../app/Domains/Budget/Routes/web.php'; -require_once __DIR__ . '/../app/Domains/Budget/Routes/api.php'; -require_once __DIR__ . '/../app/Domains/Legal/Routes/web.php'; -require_once __DIR__ . '/../app/Domains/Admin/Routes/web.php'; -require_once __DIR__ . '/../app/Domains/Admin/Routes/api.php'; +// Bewusst `require` und nicht `require_once`: Diese Datei wird einmal pro Anfrage geladen, in der +// Testsuite aber einmal je Test (die Anwendung wird zwischen Tests neu aufgebaut). Mit `require_once` +// wäre die zweite Registrierung ein No-op und ab dem zweiten Test einer Klasse fehlten sämtliche +// Domain-Routen -- jeder HTTP-Test liefe dann in einen 404. +require __DIR__ . '/../app/Domains/Dashboard/Routes/web.php'; +require __DIR__ . '/../app/Domains/Dashboard/Routes/api.php'; +require __DIR__ . '/../app/Domains/UserManagement/Routes/web.php'; +require __DIR__ . '/../app/Domains/UserManagement/Routes/api.php'; +require __DIR__ . '/../app/Domains/CostUnit/Routes/web.php'; +require __DIR__ . '/../app/Domains/CostUnit/Routes/api.php'; +require __DIR__ . '/../app/Domains/Invoice/Routes/web.php'; +require __DIR__ . '/../app/Domains/Invoice/Routes/api.php'; +require __DIR__ . '/../app/Domains/Event/Routes/web.php'; +require __DIR__ . '/../app/Domains/Event/Routes/api.php'; +require __DIR__ . '/../app/Domains/ParticipantInvoice/Routes/api.php'; +require __DIR__ . '/../app/Domains/ParticipantRefund/Routes/web.php'; +require __DIR__ . '/../app/Domains/ParticipantRefund/Routes/api.php'; +require __DIR__ . '/../app/Domains/Budget/Routes/web.php'; +require __DIR__ . '/../app/Domains/Budget/Routes/api.php'; +require __DIR__ . '/../app/Domains/Legal/Routes/web.php'; +require __DIR__ . '/../app/Domains/Admin/Routes/web.php'; +require __DIR__ . '/../app/Domains/Admin/Routes/api.php'; Route::get('/LKvDUqWl', function () { @@ -49,6 +56,8 @@ Route::middleware(IdentifyTenant::class)->group(function () { Route::get('/retrieve-invoice-types', [GlobalDataProvider::class, 'getInvoiceTypes']); Route::get('/retrieve-invoice-types-all', [GlobalDataProvider::class, 'getAllInvoiceTypes']); Route::get('/retrieve-event-setting-data', [GlobalDataProvider::class, 'getEventSettingData']); + Route::get('/retrieve-refund-reasons', [GlobalDataProvider::class, 'getRefundReasons']); + Route::get('/retrieve-retention-reasons', [GlobalDataProvider::class, 'getRetentionReasons']); }); }); diff --git a/storage/temp/Eigenbeleg.pdf b/storage/temp/Eigenbeleg.pdf new file mode 100644 index 0000000..aeb7e01 Binary files /dev/null and b/storage/temp/Eigenbeleg.pdf differ diff --git a/storage/temp/Erstattungsbeleg-Vorschau.pdf b/storage/temp/Erstattungsbeleg-Vorschau.pdf new file mode 100644 index 0000000..3472bda Binary files /dev/null and b/storage/temp/Erstattungsbeleg-Vorschau.pdf differ diff --git a/storage/temp/Erstattungsbeleg-mit-vermerk.pdf b/storage/temp/Erstattungsbeleg-mit-vermerk.pdf new file mode 100644 index 0000000..56f7dc9 Binary files /dev/null and b/storage/temp/Erstattungsbeleg-mit-vermerk.pdf differ diff --git a/storage/temp/Erstattungsbeleg-ohne-vermerk.pdf b/storage/temp/Erstattungsbeleg-ohne-vermerk.pdf new file mode 100644 index 0000000..244b527 Binary files /dev/null and b/storage/temp/Erstattungsbeleg-ohne-vermerk.pdf differ diff --git a/tests/Feature/DocumentTemplateAdminTest.php b/tests/Feature/DocumentTemplateAdminTest.php new file mode 100644 index 0000000..ac3b485 --- /dev/null +++ b/tests/Feature/DocumentTemplateAdminTest.php @@ -0,0 +1,321 @@ +tenant = Tenant::create([ + 'slug' => 'wm', + 'name' => 'Wilde Möhre', + 'email' => 'wm@example.com', + 'email_finance' => 'wm-f@example.com', + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Wilde Möhre e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $this->tenant); + + // `users.user_role_main` und `user_role_local_group` sind Fremdschlüssel auf `user_roles`. + foreach ([UserRole::USER_ROLE_ADMIN, UserRole::USER_ROLE_GROUP_LEADER, UserRole::USER_ROLE_USER] as $role) { + UserRole::create(['slug' => $role, 'name' => $role]); + } + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_INVOICE, + 'block' => DocumentTemplate::BLOCK_LAYOUT, + 'content' => '
{block:footer}
', + 'sort_order' => 10, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_INVOICE, + 'block' => 'footer', + 'content' => 'alt', + 'sort_order' => 20, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_INVOICE, + 'block' => DocumentTemplate::BLOCK_BODY, + 'content' => '{positions_table}', + 'sort_order' => 30, + 'editable' => false, + ]); + } + + private function makeUser(string $mainRole, string $localRole = UserRole::USER_ROLE_USER): User + { + return User::create([ + 'username' => $mainRole . '-' . uniqid() . '@example.com', + 'email' => $mainRole . '-' . uniqid() . '@example.com', + 'firstname' => 'Test', + 'lastname' => 'Person', + 'password' => bcrypt('secret'), + 'local_group' => $this->tenant->slug, + 'user_role_main' => $mainRole, + 'user_role_local_group' => $localRole, + 'active' => true, + ]); + } + + public function test_group_leaders_cannot_reach_the_templates(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_USER, UserRole::USER_ROLE_GROUP_LEADER)); + + $this->get('/admin/document-templates')->assertRedirect('/admin'); + $this->getJson('/api/v1/admin/document-templates')->assertRedirect('/admin'); + } + + public function test_main_administrators_can_read_the_templates(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + $response = $this->getJson('/api/v1/admin/document-templates'); + + $response->assertOk(); + $response->assertJsonPath('blocks.1.block', 'footer'); + $response->assertJsonPath('blocks.1.editable', true); + // Der generierte Block wird angezeigt, aber als nicht editierbar gekennzeichnet. + $response->assertJsonPath('blocks.2.editable', false); + } + + public function test_saving_leaves_generated_blocks_untouched(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + $this->postJson('/api/v1/admin/document-templates', [ + 'blocks' => [ + 'footer' => 'neu', + DocumentTemplate::BLOCK_BODY => 'manipuliert', + 'gibtesnicht' => 'egal', + ], + ])->assertOk()->assertJsonPath('status', 'success'); + + $blocks = DocumentTemplate::forType(DocumentTemplate::TYPE_PARTICIPANT_INVOICE); + + $this->assertSame('neu', $blocks['footer']->content); + $this->assertSame('{positions_table}', $blocks[DocumentTemplate::BLOCK_BODY]->content); + } + + public function test_a_bare_asset_placeholder_in_the_css_is_refused(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_INVOICE, + 'block' => DocumentTemplate::BLOCK_STYLE, + 'content' => '.a { color: red; }', + 'sort_order' => 15, + ]); + + $response = $this->postJson('/api/v1/admin/document-templates', [ + 'blocks' => [ + DocumentTemplate::BLOCK_STYLE => '.a { color: red; }{asset:logo}', + 'footer' => 'neu', + ], + ]); + + $response->assertOk()->assertJsonPath('status', 'error'); + $this->assertStringContainsString('url("{asset:logo}")', $response->json('message')); + + // Nichts gespeichert -- auch nicht der unbedenkliche Block. + $blocks = DocumentTemplate::forType(DocumentTemplate::TYPE_PARTICIPANT_INVOICE); + $this->assertSame('.a { color: red; }', $blocks[DocumentTemplate::BLOCK_STYLE]->content); + $this->assertSame('alt', $blocks['footer']->content); + } + + public function test_an_asset_inside_url_is_accepted_in_the_css(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_INVOICE, + 'block' => DocumentTemplate::BLOCK_STYLE, + 'content' => '', + 'sort_order' => 15, + ]); + + $this->postJson('/api/v1/admin/document-templates', [ + 'blocks' => [DocumentTemplate::BLOCK_STYLE => '.a { background: url("{asset:logo}"); }'], + ])->assertOk()->assertJsonPath('status', 'success'); + + $this->assertStringContainsString( + 'url("{asset:logo}")', + DocumentTemplate::where('block', DocumentTemplate::BLOCK_STYLE)->first()->content + ); + } + + public function test_preview_renders_unsaved_content(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + $response = $this->post('/api/v1/admin/document-templates/preview', [ + 'blocks' => ['footer' => 'noch nicht gespeichert'], + ]); + + $response->assertOk(); + $response->assertHeader('Content-Type', 'application/pdf'); + // Der gespeicherte Stand bleibt unberührt. + $this->assertSame('alt', DocumentTemplate::where('block', 'footer')->first()->content); + } + + public function test_assets_still_used_in_the_template_are_kept(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + DocumentAsset::create(['name' => 'logo', 'mime' => 'image/png', 'data' => 'QUJD']); + DocumentTemplate::where('block', 'footer')->update(['content' => '']); + + $this->deleteJson('/api/v1/admin/document-templates/assets/logo') + ->assertOk() + ->assertJsonPath('status', 'error'); + + $this->assertNotNull(DocumentAsset::where('name', 'logo')->first()); + } + + public function test_unused_assets_can_be_deleted(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + DocumentAsset::create(['name' => 'altbestand', 'mime' => 'image/png', 'data' => 'QUJD']); + + $this->deleteJson('/api/v1/admin/document-templates/assets/altbestand') + ->assertOk() + ->assertJsonPath('status', 'success'); + + $this->assertNull(DocumentAsset::where('name', 'altbestand')->first()); + } + + /* + |-------------------------------------------------------------------------- + | Mehrere Dokumentarten + |-------------------------------------------------------------------------- + */ + + public function test_the_default_document_type_is_the_invoice(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + $this->getJson('/api/v1/admin/document-templates') + ->assertOk() + ->assertJsonPath('documentType', DocumentTemplate::TYPE_PARTICIPANT_INVOICE) + ->assertJsonPath('documentTypes.0.value', DocumentTemplate::TYPE_PARTICIPANT_INVOICE) + ->assertJsonPath('documentTypes.1.value', DocumentTemplate::TYPE_PARTICIPANT_REFUND); + } + + public function test_the_refund_type_returns_its_own_blocks_and_tokens(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => 'subject', + 'content' => 'Rückerstattung {document_number}', + 'sort_order' => 10, + ]); + + $response = $this->getJson('/api/v1/admin/document-templates?type=participant_refund'); + + $response->assertOk(); + $response->assertJsonPath('documentType', DocumentTemplate::TYPE_PARTICIPANT_REFUND); + $response->assertJsonCount(1, 'blocks'); + $response->assertJsonPath('blocks.0.block', 'subject'); + // Die Platzhalter sind die des Belegs, nicht die der Rechnung. + $response->assertJsonPath('tokenGroups.refund.tokens.refund_amount.description', 'Erstattungsbetrag'); + $response->assertJsonMissingPath('tokenGroups.body.tokens.positions_table'); + } + + public function test_saving_writes_only_into_the_selected_type(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => 'footer', + 'content' => 'Beleg-Fuß', + 'sort_order' => 20, + ]); + + $this->postJson('/api/v1/admin/document-templates', [ + 'type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'blocks' => ['footer' => 'neuer Beleg-Fuß'], + ])->assertOk()->assertJsonPath('status', 'success'); + + $this->assertSame('neuer Beleg-Fuß', DocumentTemplate::where('document_type', DocumentTemplate::TYPE_PARTICIPANT_REFUND) + ->where('block', 'footer')->first()->content); + + // Der gleichnamige Block der Rechnung bleibt unberührt. + $this->assertSame('alt', DocumentTemplate::where('document_type', DocumentTemplate::TYPE_PARTICIPANT_INVOICE) + ->where('block', 'footer')->first()->content); + } + + public function test_an_unknown_document_type_is_refused(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + $this->getJson('/api/v1/admin/document-templates?type=erfunden')->assertStatus(422); + + $this->postJson('/api/v1/admin/document-templates', [ + 'type' => 'erfunden', + 'blocks' => ['footer' => 'egal'], + ])->assertStatus(422); + + $this->post('/api/v1/admin/document-templates/preview', [ + 'type' => 'erfunden', + 'blocks' => [], + ])->assertStatus(422); + + // Die Rechnungsvorlage darf davon nichts abbekommen haben. + $this->assertSame('alt', DocumentTemplate::where('document_type', DocumentTemplate::TYPE_PARTICIPANT_INVOICE) + ->where('block', 'footer')->first()->content); + } + + public function test_preview_renders_the_refund_with_its_sample_data(): void + { + $this->actingAs($this->makeUser(UserRole::USER_ROLE_ADMIN)); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_LAYOUT, + 'content' => '
{document_number}
', + 'sort_order' => 10, + ]); + + $response = $this->post('/api/v1/admin/document-templates/preview', [ + 'type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'blocks' => [], + ]); + + $response->assertOk(); + $response->assertHeader('Content-Type', 'application/pdf'); + $this->assertStringStartsWith('%PDF', $response->getContent()); + } +} + diff --git a/tests/Feature/EventBudgetTest.php b/tests/Feature/EventBudgetTest.php new file mode 100644 index 0000000..c48adfa --- /dev/null +++ b/tests/Feature/EventBudgetTest.php @@ -0,0 +1,324 @@ +tenant = Tenant::create([ + 'slug' => 'wm', + 'name' => 'Wilde Möhre', + 'email' => 't@example.com', + 'email_finance' => 'finance@example.com', + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Test e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'invoice_prefix' => 'WM', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $this->tenant); + + DB::table('participation_types')->insert(['slug' => 'participant', 'name' => 'Teilnehmer']); + DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']); + DB::table('cost_unit_types')->insert(['slug' => CostUnitType::COST_UNIT_TYPE_EVENT, 'name' => 'Veranstaltung']); + DB::table('invoice_status')->insert(['slug' => InvoiceStatus::INVOICE_STATUS_NEW]); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION]); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, 'name' => 'Nicht erforderlich']); + + // Ein gewöhnlicher Aufwandstyp zum Vergleich; die Beitragserstattung bringt die Migration mit. + DB::table('invoice_types')->insert([ + 'slug' => InvoiceType::INVOICE_TYPE_PROGRAM, + 'name' => 'Programmkosten', + 'sort_order' => 1, + 'selectable' => true, + 'counts_as_expense' => true, + ]); + + $this->costUnit = CostUnit::create([ + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'type' => CostUnitType::COST_UNIT_TYPE_EVENT, + 'distance_allowance' => 0.25, + 'mail_on_new' => false, + 'allow_new' => true, + 'archived' => false, + ]); + } + + private function makeEvent(): Event + { + $fee = EventParticipationFee::create([ + 'tenant' => $this->tenant->slug, + 'type' => 'participant', + 'name' => 'Sippe', + 'description' => null, + 'amount_standard' => 60.0, + 'amount_reduced' => null, + 'amount_solidarity' => null, + ]); + + return Event::create([ + 'cost_unit_id' => $this->costUnit->id, + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'identifier' => 'evt-' . uniqid(), + 'location' => 'Ort', + 'postal_code' => '00000', + 'email' => 'e@example.com', + 'start_date' => '2026-07-16', + 'end_date' => '2026-07-20', + 'early_bird_end' => '2026-06-20', + 'registration_final_end' => '2026-07-01', + 'early_bird_end_amount_increase' => 0, + 'account_owner' => 'Owner', + 'account_iban' => 'DE00', + 'participation_fee_type' => 'fixed', + 'participation_fee_1' => $fee->id, + 'pay_per_day' => true, + 'pay_direct' => false, + 'tax_liable' => false, + 'vat_rate' => 0, + 'vat_pricing_mode' => 'inclusive', + 'invoice_key' => 'WM-V-20260701', + ]); + } + + private function makeInvoice(string $type, float $amount): Invoice + { + return Invoice::create([ + 'tenant' => $this->tenant->slug, + 'cost_unit_id' => $this->costUnit->id, + 'invoice_number' => '2026-' . str_pad((string) Invoice::count() + 1, 4, '0', STR_PAD_LEFT), + 'status' => InvoiceStatus::INVOICE_STATUS_NEW, + 'type' => $type, + 'donation' => false, + 'contact_name' => 'Mika Muster', + 'amount' => $amount, + ]); + } + + /** @return array */ + private function costUnitData(): array + { + return new CostUnitResource($this->costUnit->fresh())->toArray(true); + } + + /* + |-------------------------------------------------------------------------- + | Die Ausgabenliste + |-------------------------------------------------------------------------- + */ + + public function test_a_refund_does_not_appear_as_an_expense_row(): void + { + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND, 220.0); + + $amounts = $this->costUnitData()['amounts']; + + $this->assertArrayNotHasKey(InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND, $amounts); + $this->assertArrayHasKey(InvoiceType::INVOICE_TYPE_PROGRAM, $amounts); + } + + public function test_a_refund_is_not_part_of_the_expense_total(): void + { + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND, 220.0); + + $this->assertEqualsWithDelta(0.0, $this->costUnitData()['overAllAmount']['value']->getAmount(), 0.001); + } + + public function test_an_ordinary_invoice_of_the_same_amount_does_count(): void + { + // Gegenprobe: Es liegt am Typ, nicht am Betrag. + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 220.0); + + $this->assertEqualsWithDelta(220.0, $this->costUnitData()['overAllAmount']['value']->getAmount(), 0.001); + } + + public function test_the_cash_view_still_shows_the_refund(): void + { + // `totalAmount` speist Kostenstellen-Liste und Dashboard -- dort fließt das Geld tatsächlich ab. + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND, 220.0); + + $this->assertStringContainsString('220,00', $this->costUnitData()['totalAmount']); + } + + /* + |-------------------------------------------------------------------------- + | Die Bilanz der Veranstaltung + |-------------------------------------------------------------------------- + */ + + public function test_the_balance_is_not_reduced_by_a_refund(): void + { + // `fresh()`, weil die DB-Vorgaben (Förderung, Höchstbetrag) im frisch erzeugten Model noch nicht + // geladen sind und EventResource sie als Amount erwartet. + $event = $this->makeEvent()->fresh(); + $before = new EventResource($event)->toArray(new Request())['totalBalance']['real']['value']; + + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND, 220.0); + + $after = new EventResource($event->fresh())->toArray(new Request())['totalBalance']['real']['value']; + + $this->assertEqualsWithDelta($before, $after, 0.001); + } + + public function test_the_balance_is_reduced_by_an_ordinary_invoice(): void + { + // `fresh()`, weil die DB-Vorgaben (Förderung, Höchstbetrag) im frisch erzeugten Model noch nicht + // geladen sind und EventResource sie als Amount erwartet. + $event = $this->makeEvent()->fresh(); + $before = new EventResource($event)->toArray(new Request())['totalBalance']['real']['value']; + + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 220.0); + + $after = new EventResource($event->fresh())->toArray(new Request())['totalBalance']['real']['value']; + + $this->assertEqualsWithDelta($before - 220.0, $after, 0.001); + } + + /* + |-------------------------------------------------------------------------- + | Beiträge abgemeldeter Teilis + |-------------------------------------------------------------------------- + */ + + public function test_money_left_by_unregistered_participants_counts_as_income(): void + { + $event = $this->makeEvent(); + $before = new EventResource($event->fresh())->toArray(new Request()); + + // 80 € sind nach einer Teilerstattung beim Verband geblieben. + $this->makeUnregisteredParticipant($event, 80.0); + + $after = new EventResource($event->fresh())->toArray(new Request()); + + $this->assertEqualsWithDelta(80.0, $after['retainedFromUnregistered']['value'], 0.001); + + // In beide Spalten: Das Geld ist da (real) und fließt nicht mehr ab (erwartet). + $this->assertEqualsWithDelta( + $before['income']['real']['amount']->getAmount() + 80.0, + $after['income']['real']['amount']->getAmount(), + 0.001 + ); + $this->assertEqualsWithDelta( + $before['income']['expected']['amount']->getAmount() + 80.0, + $after['income']['expected']['amount']->getAmount(), + 0.001 + ); + $this->assertEqualsWithDelta( + $before['totalBalance']['real']['value'] + 80.0, + $after['totalBalance']['real']['value'], + 0.001 + ); + } + + public function test_unregistered_participants_stay_out_of_lists_and_counts(): void + { + $event = $this->makeEvent(); + $this->makeUnregisteredParticipant($event, 80.0); + + $participantData = new EventResource($event->fresh()) + ->toArray(new Request())['participants']['participant']; + + // Nur die Geldsumme kommt hinzu -- in Listen und Zahlen bleiben Abgemeldete außen vor. + $this->assertSame(0, $participantData['count']); + $this->assertArrayNotHasKey('participants', $participantData); + $this->assertEqualsWithDelta(0.0, $participantData['amount']['paid']['value'], 0.001); + } + + public function test_the_funding_does_not_grow_with_unregistered_participants(): void + { + $event = $this->makeEvent(); + $before = new EventResource($event->fresh())->toArray(new Request())['supportPerson']['amount']->getAmount(); + + $this->makeUnregisteredParticipant($event, 80.0); + + $after = new EventResource($event->fresh())->toArray(new Request())['supportPerson']['amount']->getAmount(); + + // Die wichtigste Gegenprobe: Wer nicht da war, bringt keine Förderung. + $this->assertEqualsWithDelta($before, $after, 0.001); + } + + public function test_the_row_is_hidden_when_nothing_was_retained(): void + { + $event = $this->makeEvent(); + $this->makeUnregisteredParticipant($event, 0.0); + + // Die Zeile in der Übersicht hängt an diesem Wert -- bei 0 soll sie nicht erscheinen. + $this->assertEqualsWithDelta( + 0.0, + new EventResource($event->fresh())->toArray(new Request())['retainedFromUnregistered']['value'], + 0.001 + ); + } + + /** Ein abgemeldeter Teili, bei dem der übergebene Betrag beim Verband geblieben ist. */ + private function makeUnregisteredParticipant(Event $event, float $remaining): void + { + $event->participants()->create([ + 'tenant' => $this->tenant->slug, + 'identifier' => 'p-' . uniqid(), + 'invoice_sequence' => $event->participants()->count() + 1, + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'participation_type' => 'participant', + 'fee_type' => 'standard', + 'sibling_reduction' => false, + 'local_group' => $this->tenant->slug, + 'birthday' => '2000-01-01', + 'address_1' => 'Beispielstraße 3', + 'postcode' => '11111', + 'city' => 'Beispielstadt', + 'email_1' => 'mika@example.com', + 'phone_1' => '0170 0000000', + 'arrival_date' => '2026-07-16', + 'departure_date' => '2026-07-20', + 'arrival_eating' => 1, + 'departure_eating' => 1, + 'amount' => 300.0, + 'amount_paid' => $remaining, + 'unregistered_at' => '2026-06-12', + 'payment_purpose' => 'Sommerlager', + 'payment_method' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, + 'efz_status' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, + ]); + } +} diff --git a/tests/Feature/EventIncomeSurplusStatementTest.php b/tests/Feature/EventIncomeSurplusStatementTest.php new file mode 100644 index 0000000..033b639 --- /dev/null +++ b/tests/Feature/EventIncomeSurplusStatementTest.php @@ -0,0 +1,504 @@ +tenant = Tenant::create([ + 'slug' => 'wm', + 'name' => 'Wilde Möhre', + 'email' => 't@example.com', + 'email_finance' => 'finance@example.com', + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Test e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'invoice_prefix' => 'WM', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $this->tenant); + + DB::table('participation_types')->insert(['slug' => 'participant', 'name' => 'Teilnehmer']); + DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']); + DB::table('cost_unit_types')->insert(['slug' => CostUnitType::COST_UNIT_TYPE_EVENT, 'name' => 'Veranstaltung']); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION]); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, 'name' => 'Nicht erforderlich']); + + // Aktive Anmeldungen laufen für die Fördertage durch `EventParticipantResource`, und die liest + // Erlaubnisse und Essgewohnheit ohne Null-Prüfung. + EatingHabit::create([ + 'slug' => EatingHabit::EATING_HABIT_OMNIVOR, + 'name' => 'Alles', + ]); + SwimmingPermission::create([ + 'slug' => SwimmingPermission::SWIMMING_PERMISSION_ALLOWED, + 'name' => 'Erlaubt', + 'short' => 'ja', + ]); + FirstAidPermission::create([ + 'slug' => FirstAidPermission::FIRST_AID_PERMISSION_ALLOWED, + 'name' => 'Erlaubt', + 'description' => 'Erlaubt', + ]); + + foreach ([ + InvoiceStatus::INVOICE_STATUS_NEW, + InvoiceStatus::INVOICE_STATUS_APPROVED, + InvoiceStatus::INVOICE_STATUS_EXPORTED, + InvoiceStatus::INVOICE_STATUS_DENIED, + InvoiceStatus::INVOICE_STATUS_DELETED, + ] as $status) { + DB::table('invoice_status')->insert(['slug' => $status]); + } + + foreach ([UserRole::USER_ROLE_ADMIN, UserRole::USER_ROLE_GROUP_LEADER, UserRole::USER_ROLE_USER] as $role) { + UserRole::create(['slug' => $role, 'name' => $role]); + } + + // Zwei gewöhnliche Aufwandstypen plus einer, der leer bleibt; die Beitragserstattung bringt die + // Migration mit. + foreach ([ + [InvoiceType::INVOICE_TYPE_PROGRAM, 'Programmkosten', 1], + [InvoiceType::INVOICE_TYPE_CATERING, 'Verpflegungskosten', 1], + [InvoiceType::INVOICE_TYPE_OTHER, 'Sonstige Kosten', 3], + ] as [$slug, $name, $sortOrder]) { + DB::table('invoice_types')->insert([ + 'slug' => $slug, + 'name' => $name, + 'sort_order' => $sortOrder, + 'selectable' => true, + 'counts_as_expense' => true, + ]); + } + + $this->costUnit = CostUnit::create([ + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'type' => CostUnitType::COST_UNIT_TYPE_EVENT, + 'distance_allowance' => 0.25, + 'mail_on_new' => false, + 'allow_new' => true, + 'archived' => false, + ]); + } + + /* + |-------------------------------------------------------------------------- + | Einnahmen + |-------------------------------------------------------------------------- + */ + + public function test_only_paid_contributions_count(): void + { + $event = $this->makeEvent(); + $this->makeParticipant($event, amount: 300.0, amountPaid: 300.0); + $this->makeParticipant($event, amount: 300.0, amountPaid: 0.0); + + // 600 € wurden erwartet, 300 € sind angekommen -- die EÜR kennt nur die 300. + $this->assertEqualsWithDelta(300.0, $this->entry('Teilnahmebeiträge')->getAmount(), 0.001); + } + + public function test_money_retained_from_unregistered_participants_is_its_own_line(): void + { + $event = $this->makeEvent(); + $this->makeParticipant($event, amount: 300.0, amountPaid: 300.0); + $this->makeParticipant($event, amount: 300.0, amountPaid: 80.0, unregistered: true); + + // Der Rest einer Teilerstattung liegt beim Verband, gehört aber nicht zu den Beiträgen: Dort + // stehen nur aktive Anmeldungen. + $this->assertEqualsWithDelta(300.0, $this->entry('Teilnahmebeiträge')->getAmount(), 0.001); + $this->assertEqualsWithDelta(80.0, $this->entry('Einbehaltene Einnahmen aus Abmeldungen')->getAmount(), 0.001); + } + + public function test_the_two_income_categories_add_up(): void + { + $event = $this->makeEvent(); + $this->makeParticipant($event, amount: 300.0, amountPaid: 300.0); + $this->makeParticipant($event, amount: 300.0, amountPaid: 80.0, unregistered: true); + + $income = $this->statement()->income; + + // Eigenmittel: 300 Beiträge + 1000 weitere Einnahmen + 80 einbehalten. + $this->assertSame('Eigenmittel', $income['categories'][0]['name']); + $this->assertEqualsWithDelta(1000.0, $this->entry('Weitere Einnahmen')->getAmount(), 0.001); + $this->assertEqualsWithDelta(1380.0, $income['categories'][0]['total']->getAmount(), 0.001); + + // Förderungen: 2,00 € p.P./Tag über 4 Fördertage der einen aktiven Anmeldung. + $this->assertSame('Förderungen', $income['categories'][1]['name']); + $this->assertEqualsWithDelta(8.0, $income['categories'][1]['total']->getAmount(), 0.001); + + $this->assertEqualsWithDelta(1388.0, $income['total']->getAmount(), 0.001); + } + + public function test_the_funding_line_names_the_rate(): void + { + $this->makeEvent(); + + $funding = $this->statement()->income['categories'][1]['entries'][0]; + + $this->assertSame('Fördermittel (2,00 € p.P./Tag)', $funding['name']); + } + + /* + |-------------------------------------------------------------------------- + | Ausgaben + |-------------------------------------------------------------------------- + */ + + public function test_only_receipts_representing_real_money_count(): void + { + $this->makeEvent(); + + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 100.0, InvoiceStatus::INVOICE_STATUS_NEW); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 50.0, InvoiceStatus::INVOICE_STATUS_APPROVED); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_CATERING, 30.0, InvoiceStatus::INVOICE_STATUS_EXPORTED); + + // Kein Geldfluss, also keine Ausgabe: + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 999.0, InvoiceStatus::INVOICE_STATUS_DENIED); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 888.0, InvoiceStatus::INVOICE_STATUS_DELETED); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 777.0, InvoiceStatus::INVOICE_STATUS_NEW, donation: true); + + $this->assertEqualsWithDelta(150.0, $this->group('Programmkosten')['sum']->getAmount(), 0.001); + $this->assertEqualsWithDelta(30.0, $this->group('Verpflegungskosten')['sum']->getAmount(), 0.001); + $this->assertEqualsWithDelta(180.0, $this->statement()->expenses['total']->getAmount(), 0.001); + } + + public function test_a_refund_is_no_expense(): void + { + $this->makeEvent(); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND, 220.0, InvoiceStatus::INVOICE_STATUS_EXPORTED); + + $expenses = $this->statement()->expenses; + + $this->assertEqualsWithDelta(0.0, $expenses['total']->getAmount(), 0.001); + $this->assertSame( + [], + array_values(array_filter($expenses['groups'], fn ($group) => $group['name'] === 'Beitragserstattung')) + ); + } + + public function test_every_expense_type_gets_a_row_even_without_receipts(): void + { + $this->makeEvent(); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 100.0, InvoiceStatus::INVOICE_STATUS_NEW); + + $groups = $this->statement()->expenses['groups']; + + // Die Gliederung bleibt vollständig -- eine fehlende Zeile ließe sich sonst mit einer vergessenen + // verwechseln. + $this->assertSame( + ['Programmkosten', 'Verpflegungskosten', 'Sonstige Kosten'], + array_column($groups, 'name') + ); + $this->assertEqualsWithDelta(0.0, $this->group('Verpflegungskosten')['sum']->getAmount(), 0.001); + } + + public function test_a_type_without_receipts_has_no_attachment_rows(): void + { + $this->makeEvent(); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 100.0, InvoiceStatus::INVOICE_STATUS_NEW); + + $this->assertCount(1, $this->group('Programmkosten')['rows']); + $this->assertCount(0, $this->group('Verpflegungskosten')['rows']); + } + + public function test_the_attachment_names_the_purpose_for_every_type(): void + { + // "Was wurde eingekauft" wird zu jeder Abrechnung erfasst, nicht nur zu "Sonstige Kosten" -- + // dadurch trägt die Zweck-Spalte auch bei Programmkosten eine Aussage. + $this->makeEvent(); + $this->makeInvoice( + InvoiceType::INVOICE_TYPE_PROGRAM, + 100.0, + InvoiceStatus::INVOICE_STATUS_EXPORTED, + typeOther: 'Bastelmaterial' + ); + + $this->assertSame('Bastelmaterial — Materialkauf', $this->group('Programmkosten')['rows'][0]['purpose']); + } + + public function test_an_older_receipt_without_the_purchase_note_falls_back_to_the_comment(): void + { + // Belege von vor der Pflichtangabe haben `type_other` leer. + $this->makeEvent(); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 100.0, InvoiceStatus::INVOICE_STATUS_NEW); + + $this->assertSame('Materialkauf', $this->group('Programmkosten')['rows'][0]['purpose']); + } + + /* + |-------------------------------------------------------------------------- + | Ergebnis und Auslieferung + |-------------------------------------------------------------------------- + */ + + public function test_the_result_is_income_minus_expenses(): void + { + $event = $this->makeEvent(); + $this->makeParticipant($event, amount: 300.0, amountPaid: 300.0); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 100.0, InvoiceStatus::INVOICE_STATUS_NEW); + + $statement = $this->statement(); + + $this->assertEqualsWithDelta( + $statement->income['total']->getAmount() - $statement->expenses['total']->getAmount(), + $statement->result->getAmount(), + 0.001 + ); + } + + public function test_amounts_are_printed_in_german_notation(): void + { + // `Amount::getFormattedAmount()` ersetzt jeden Punkt durch ein Komma und macht aus 1.487,50 ein + // "1,487,50". Auf einer Aufstellung mit vierstelligen Beträgen wäre das nicht lesbar. + $this->assertSame('1.487,50', CreateIncomeSurplusStatementCommand::money(new Amount(1487.5, 'Euro'))); + $this->assertSame('0,00', CreateIncomeSurplusStatementCommand::money(new Amount(0.0, 'Euro'))); + $this->assertSame('-320,00', CreateIncomeSurplusStatementCommand::money(new Amount(-320.0, 'Euro'))); + } + + public function test_the_route_delivers_a_pdf_and_does_not_hit_the_list_wildcard(): void + { + $event = $this->makeEvent(); + $this->actingAs($this->makeAdmin()); + + $response = $this->get('/event/details/' . $event->identifier . '/pdf/income-surplus-statement'); + + $response->assertOk(); + $response->assertHeader('Content-Type', 'application/pdf'); + $this->assertStringContainsString('EUER-' . $event->identifier . '.pdf', $response->headers->get('Content-Disposition')); + $this->assertStringStartsWith('%PDF', $response->getContent()); + } + + /* + |-------------------------------------------------------------------------- + | Rückwirkung auf die Ausgabenübersicht + |-------------------------------------------------------------------------- + */ + + public function test_a_deleted_receipt_no_longer_counts_in_the_expense_overview(): void + { + // Dieselbe Regel wie in der EÜR: Ein gelöschter Beleg ist keine Ausgabe. Vor dem Fix zählte er in + // `sumupByInvoiceType()` weiter und verfälschte damit Ausgabenübersicht und Bilanz. + $this->makeEvent(); + $this->makeInvoice(InvoiceType::INVOICE_TYPE_PROGRAM, 888.0, InvoiceStatus::INVOICE_STATUS_DELETED); + + $amount = new CostUnitRepository()->sumupByInvoiceType( + $this->costUnit->fresh(), + InvoiceType::where('slug', InvoiceType::INVOICE_TYPE_PROGRAM)->first() + ); + + $this->assertEqualsWithDelta(0.0, $amount->getAmount(), 0.001); + $this->assertEqualsWithDelta( + 0.0, + new CostUnitResource($this->costUnit->fresh())->toArray(true)['overAllAmount']['value']->getAmount(), + 0.001 + ); + } + + /* + |-------------------------------------------------------------------------- + | Helfer + |-------------------------------------------------------------------------- + */ + + private function statement(): CreateIncomeSurplusStatementResponse + { + // `fresh()`, weil die DB-Vorgaben (Höchstbetrag) im frisch erzeugten Model noch nicht geladen sind + // und EventResource sie als Amount erwartet. + $event = Event::where('cost_unit_id', $this->costUnit->id)->first()->fresh(); + + $response = new CreateIncomeSurplusStatementCommand( + new CreateIncomeSurplusStatementRequest($event) + )->execute(); + + $this->assertTrue($response->success, $response->message ?? ''); + + return $response; + } + + /** Der Betrag einer Unterzeile der Einnahmenseite, über alle Kategorien gesucht. */ + private function entry(string $name): Amount + { + foreach ($this->statement()->income['categories'] as $category) { + foreach ($category['entries'] as $entry) { + if ($entry['name'] === $name) { + return $entry['amount']; + } + } + } + + $this->fail('Einnahmen-Zeile "' . $name . '" fehlt.'); + } + + /** @return array{name: string, sum: Amount, rows: array>} */ + private function group(string $name): array + { + foreach ($this->statement()->expenses['groups'] as $group) { + if ($group['name'] === $name) { + return $group; + } + } + + $this->fail('Ausgaben-Gruppe "' . $name . '" fehlt.'); + } + + private function makeEvent(): Event + { + $fee = EventParticipationFee::create([ + 'tenant' => $this->tenant->slug, + 'type' => 'participant', + 'name' => 'Sippe', + 'description' => null, + 'amount_standard' => 60.0, + 'amount_reduced' => null, + 'amount_solidarity' => null, + ]); + + return Event::create([ + 'cost_unit_id' => $this->costUnit->id, + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'identifier' => 'evt-' . uniqid(), + 'location' => 'Ort', + 'postal_code' => '00000', + 'email' => 'e@example.com', + 'start_date' => '2026-07-16', + 'end_date' => '2026-07-20', + 'early_bird_end' => '2026-06-20', + 'registration_final_end' => '2026-07-01', + 'early_bird_end_amount_increase' => 0, + 'account_owner' => 'Owner', + 'account_iban' => 'DE00', + 'participation_fee_type' => 'fixed', + 'participation_fee_1' => $fee->id, + 'pay_per_day' => true, + 'pay_direct' => false, + 'support_flat' => 1000.0, + 'support_per_person' => 2.0, + 'tax_liable' => false, + 'vat_rate' => 0, + 'vat_pricing_mode' => 'inclusive', + 'invoice_key' => 'WM-V-20260701', + ]); + } + + private function makeParticipant( + Event $event, + float $amount, + float $amountPaid, + bool $unregistered = false + ): void { + $event->participants()->create([ + 'tenant' => $this->tenant->slug, + 'identifier' => 'p-' . uniqid(), + 'invoice_sequence' => $event->participants()->count() + 1, + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'participation_type' => 'participant', + 'fee_type' => 'standard', + 'sibling_reduction' => false, + 'local_group' => $this->tenant->slug, + 'birthday' => '2000-01-01', + 'address_1' => 'Beispielstraße 3', + 'postcode' => '11111', + 'city' => 'Beispielstadt', + 'email_1' => 'mika@example.com', + 'phone_1' => '0170 0000000', + 'arrival_date' => '2026-07-16', + 'departure_date' => '2026-07-20', + 'eating_habit' => EatingHabit::EATING_HABIT_OMNIVOR, + 'arrival_eating' => 1, + 'departure_eating' => 1, + 'amount' => $amount, + 'amount_paid' => $amountPaid, + 'unregistered_at' => $unregistered ? '2026-06-12' : null, + 'swimming_permission' => SwimmingPermission::SWIMMING_PERMISSION_ALLOWED, + 'first_aid_permission' => FirstAidPermission::FIRST_AID_PERMISSION_ALLOWED, + 'payment_purpose' => 'Sommerlager', + 'payment_method' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, + 'efz_status' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, + ]); + } + + private function makeInvoice( + string $type, + float $amount, + string $status, + bool $donation = false, + ?string $typeOther = null + ): Invoice { + return Invoice::create([ + 'tenant' => $this->tenant->slug, + 'cost_unit_id' => $this->costUnit->id, + 'invoice_number' => '2026-' . str_pad((string) (Invoice::count() + 1), 4, '0', STR_PAD_LEFT), + 'status' => $status, + 'type' => $type, + 'type_other' => $typeOther, + 'donation' => $donation, + 'contact_name' => 'Mika Muster', + 'comment' => 'Materialkauf', + 'amount' => $amount, + ]); + } + + private function makeAdmin(): User + { + return User::create([ + 'username' => 'admin-' . uniqid() . '@example.com', + 'email' => 'admin-' . uniqid() . '@example.com', + 'firstname' => 'Test', + 'lastname' => 'Person', + 'password' => bcrypt('secret'), + 'local_group' => $this->tenant->slug, + 'user_role_main' => UserRole::USER_ROLE_USER, + 'user_role_local_group' => UserRole::USER_ROLE_ADMIN, + 'active' => true, + ]); + } +} diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php index 8364a84..4c61ba7 100644 --- a/tests/Feature/ExampleTest.php +++ b/tests/Feature/ExampleTest.php @@ -2,18 +2,36 @@ namespace Tests\Feature; -// use Illuminate\Foundation\Testing\RefreshDatabase; +use App\Models\Tenant; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ExampleTest extends TestCase { - /** - * A basic test example. - */ - public function test_the_application_returns_a_successful_response(): void - { - $response = $this->get('/'); + use RefreshDatabase; - $response->assertStatus(200); + /** + * Rauchtest über den Anfrage-Stack: die Anwendung ist mandantenfähig, ohne passenden Tenant zum Host + * beantwortet {@see \App\Middleware\IdentifyTenant} jede Anfrage mit 404. Mit passendem Tenant kommt + * die Anfrage durch und wird als Gast erwartungsgemäß zum Login geleitet. + */ + public function test_the_application_redirects_guests_to_the_login(): void + { + Tenant::create([ + 'slug' => 'tv', + 'name' => 'Test', + 'email' => 't@example.com', + 'email_finance' => 'finance@example.com', + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Test e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + $this->get('/')->assertRedirect('/login'); } } diff --git a/tests/Feature/InvoiceNumberingTest.php b/tests/Feature/InvoiceNumberingTest.php new file mode 100644 index 0000000..9dd7b14 --- /dev/null +++ b/tests/Feature/InvoiceNumberingTest.php @@ -0,0 +1,215 @@ +wildeMoehre = $this->makeTenant('wm', 'Wilde Möhre'); + + DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']); + EatingHabit::create(['slug' => EatingHabit::EATING_HABIT_VEGAN, 'name' => 'Vegan']); + EatingHabit::create(['slug' => EatingHabit::EATING_HABIT_VEGETARIAN, 'name' => 'Vegetarisch']); + ParticipationType::create(['slug' => ParticipationType::PARTICIPATION_TYPE_PARTICIPANT, 'name' => 'Teilnehmende']); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION]); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_CHECKED, 'name' => 'Nicht geprüft']); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, 'name' => 'Nicht erforderlich']); + SwimmingPermission::create(['slug' => SwimmingPermission::SWIMMING_PERMISSION_ALLOWED, 'name' => 'Darf baden', 'short' => 'Erteilt']); + FirstAidPermission::create(['slug' => FirstAidPermission::FIRST_AID_PERMISSION_ALLOWED, 'name' => 'Zugestimmt', 'description' => '']); + + app()->instance('tenant', $this->wildeMoehre); + } + + /** + * `create()` liefert nur die übergebenen Attribute zurück; die DB-Defaults (u.a. `tax_liable`) stehen + * erst nach dem Neuladen bereit -- so, wie der Tenant im Betrieb aus der IdentifyTenant-Middleware kommt. + */ + private function makeTenant(string $slug, string $name): Tenant + { + return Tenant::create([ + 'slug' => $slug, + 'name' => $name, + 'address_1' => 'Musterweg 1', + 'email' => $slug . '@example.com', + 'email_finance' => $slug . '-f@example.com', + 'url' => $slug . '.test.local', + 'account_name' => $name, + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'invoice_prefix' => strtoupper($slug), + 'is_active_local_group' => true, + 'has_active_instance' => true, + ])->fresh(); + } + + private function createEvent(string $begin, string $name = 'Lager'): Event + { + $response = new CreateEventCommand(new CreateEventRequest( + name: $name, + location: 'Ort', + postalCode: '00000', + email: 'e@example.com', + begin: new DateTime($begin), + end: new DateTime($begin), + earlyBirdEnd: new DateTime('2026-01-01'), + registrationFinalEnd: new DateTime('2026-01-02'), + earlyBirdEndAmountIncrease: 0, + participationFeeType: ParticipationFeeType::where('slug', 'fixed')->first(), + accountOwner: 'Owner', + accountIban: 'DE00', + payPerDay: false, + ))->execute(); + + $this->assertTrue($response->success); + + return $response->event->fresh(); + } + + /* + |-------------------------------------------------------------------------- + | Event-Teil der Nummer + |-------------------------------------------------------------------------- + */ + + public function test_events_of_the_same_month_are_numbered_consecutively(): void + { + $this->assertSame('WM-V-20260701', $this->createEvent('2026-07-16')->invoice_key); + $this->assertSame('WM-V-20260702', $this->createEvent('2026-07-24')->invoice_key); + // Anderer Monat, eigene Zählung. + $this->assertSame('WM-V-20260801', $this->createEvent('2026-08-03')->invoice_key); + } + + public function test_each_tenant_counts_for_itself(): void + { + $this->createEvent('2026-07-16'); + + app()->instance('tenant', $this->makeTenant('sn', 'Sachsen')); + + $this->assertSame('SN-V-20260701', $this->createEvent('2026-07-18')->invoice_key); + } + + public function test_invoice_key_survives_moving_the_event_to_another_month(): void + { + $event = $this->createEvent('2026-07-16'); + + $event->update(['start_date' => '2026-11-05', 'end_date' => '2026-11-07']); + + // Eingefroren: eine bereits herausgegebene Rechnung gehört sonst plötzlich zu einer anderen Nummer. + $this->assertSame('WM-V-20260701', $event->fresh()->invoice_key); + } + + public function test_new_tenants_default_to_their_uppercased_slug(): void + { + $tenant = Tenant::create([ + 'slug' => 'fen', + 'name' => 'Fen', + 'email' => 'fen@example.com', + 'email_finance' => 'fen-f@example.com', + 'url' => 'fen.test.local', + 'account_name' => 'Fen', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ])->fresh(); + + // Ohne gesetztes Präfix greift der Migrations-Default: der großgeschriebene Slug. + $this->assertSame('FEN', $tenant->invoice_prefix); + + app()->instance('tenant', $tenant); + + $this->assertSame('FEN-V-20260701', $this->createEvent('2026-07-16')->invoice_key); + } + + /* + |-------------------------------------------------------------------------- + | Teilnehmer-Teil der Nummer + |-------------------------------------------------------------------------- + */ + + private function signUp(Event $event, string $firstname): void + { + $response = new SignUpCommand(new SignUpRequest( + $event, null, $firstname, 'Muster', null, ParticipationType::PARTICIPATION_TYPE_PARTICIPANT, + $this->wildeMoehre, new DateTime('2000-01-01'), 'Weg 1', null, '00000', 'Stadt', + strtolower($firstname) . '@example.com', '123', null, null, null, null, null, null, null, + 'vegan', null, null, false, false, false, false, false, + new DateTime('2026-07-16'), new DateTime('2026-07-16'), 0, 0, null, + new Amount(50.0, 'Euro'), PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, + ))->execute(); + + $this->assertTrue($response->success, $response->message ?? ''); + } + + public function test_sequences_are_handed_out_in_order(): void + { + $event = $this->createEvent('2026-07-16'); + + $this->signUp($event, 'Ada'); + $this->signUp($event, 'Bo'); + $this->signUp($event, 'Cem'); + + $this->assertSame([1, 2, 3], $event->participants()->orderBy('id')->pluck('invoice_sequence')->all()); + } + + public function test_signing_off_does_not_shift_later_sequences(): void + { + $event = $this->createEvent('2026-07-16'); + + $this->signUp($event, 'Ada'); + $this->signUp($event, 'Bo'); + + // Abmeldung: der Datensatz bleibt bestehen, die Nummer damit vergeben. + $event->participants()->orderBy('id')->first()->update(['unregistered_at' => '2026-07-01']); + + $this->signUp($event, 'Cem'); + + $this->assertSame(3, $event->participants()->orderBy('id')->get()->last()->invoice_sequence); + } + + public function test_sequences_are_per_event(): void + { + $first = $this->createEvent('2026-07-16', 'Erstes'); + $second = $this->createEvent('2026-07-24', 'Zweites'); + + $this->signUp($first, 'Ada'); + $this->signUp($second, 'Bo'); + + $this->assertSame(1, $first->participants()->first()->invoice_sequence); + $this->assertSame(1, $second->participants()->first()->invoice_sequence); + } +} diff --git a/tests/Feature/InvoiceTypeSelectionTest.php b/tests/Feature/InvoiceTypeSelectionTest.php new file mode 100644 index 0000000..882205f --- /dev/null +++ b/tests/Feature/InvoiceTypeSelectionTest.php @@ -0,0 +1,133 @@ + 'wm', + 'name' => 'Wilde Möhre', + 'email' => 'wm@example.com', + 'email_finance' => 'wm-f@example.com', + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Wilde Möhre e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $tenant); + + // Zwei wählbare Typen neben der Beitragserstattung, die aus der Migration kommt. Nur einer trägt + // ein Einkaufsbeispiel -- der andere prüft den Fall einer ungepflegten Spalte. + DB::table('invoice_types')->insert([ + [ + 'slug' => InvoiceType::INVOICE_TYPE_PROGRAM, + 'name' => 'Programmkosten', + 'purchase_example' => 'z. B. Bastelmaterial für den Workshop', + 'sort_order' => 1, + 'selectable' => true, + ], + [ + 'slug' => InvoiceType::INVOICE_TYPE_OTHER, + 'name' => 'Sonstige Kosten', + 'purchase_example' => null, + 'sort_order' => 3, + 'selectable' => true, + ], + ]); + } + + public function test_the_form_receives_the_purchase_example_of_each_type(): void + { + // Das Beispiel im Feld "Was wurde eingekauft" wird in der Tabelle gepflegt, nicht im Formular -- + // sonst bräuchte jede Textänderung ein Deployment. + $response = $this->getJson('/api/v1/core/retrieve-invoice-types'); + + $response->assertOk(); + $examples = array_column($response->json('invoiceTypes'), 'purchaseExample', 'slug'); + + $this->assertSame('z. B. Bastelmaterial für den Workshop', $examples[InvoiceType::INVOICE_TYPE_PROGRAM]); + + // Ungepflegt: Das Formular setzt dann seinen eigenen allgemeinen Text ein. + $this->assertNull($examples[InvoiceType::INVOICE_TYPE_OTHER]); + } + + public function test_the_refund_type_exists_but_is_not_selectable(): void + { + // `where` und nicht `find`: InvoiceType deklariert keinen Primärschlüssel, `find` suchte nach `id`. + $type = InvoiceType::where('slug', InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND)->first(); + + $this->assertNotNull($type, 'Der Typ muss existieren -- invoices.type ist ein Fremdschlüssel darauf.'); + $this->assertFalse($type->selectable); + } + + public function test_it_is_missing_from_the_new_invoice_form(): void + { + $response = $this->getJson('/api/v1/core/retrieve-invoice-types'); + + $response->assertOk(); + $slugs = array_column($response->json('invoiceTypes'), 'slug'); + + $this->assertNotContains(InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND, $slugs); + $this->assertContains(InvoiceType::INVOICE_TYPE_PROGRAM, $slugs); + $this->assertContains(InvoiceType::INVOICE_TYPE_OTHER, $slugs); + } + + public function test_it_is_missing_when_a_treasurer_rebooks(): void + { + // Ohne diese Sperre ließe sich jede beliebige Abrechnung nachträglich zu einer + // Beitragserstattung machen, ohne dass ein Erstattungsvorgang dahinterstünde. + $response = $this->getJson('/api/v1/core/retrieve-invoice-types-all'); + + $response->assertOk(); + $slugs = array_column($response->json('invoiceTypes'), 'slug'); + + $this->assertNotContains(InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND, $slugs); + $this->assertContains(InvoiceType::INVOICE_TYPE_PROGRAM, $slugs); + // "Sonstige Kosten" steht dort bewusst am Ende. + $this->assertSame(InvoiceType::INVOICE_TYPE_OTHER, end($slugs)); + } + + public function test_selectable_returns_only_choosable_types_in_order(): void + { + $this->assertSame( + [InvoiceType::INVOICE_TYPE_PROGRAM, InvoiceType::INVOICE_TYPE_OTHER], + InvoiceType::selectable()->pluck('slug')->all() + ); + } + + public function test_the_refund_type_does_not_count_as_an_expense(): void + { + // Sie mindert die Einnahmenseite bereits -- als Ausgabe gezählt, stünde sie zweimal in der Bilanz. + $this->assertSame( + [InvoiceType::INVOICE_TYPE_PROGRAM, InvoiceType::INVOICE_TYPE_OTHER], + InvoiceType::countingAsExpense()->pluck('slug')->all() + ); + + $type = InvoiceType::where('slug', InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND)->first(); + $this->assertFalse($type->counts_as_expense); + } +} diff --git a/tests/Feature/ParticipantInvoiceTest.php b/tests/Feature/ParticipantInvoiceTest.php new file mode 100644 index 0000000..36b86a6 --- /dev/null +++ b/tests/Feature/ParticipantInvoiceTest.php @@ -0,0 +1,630 @@ +tenant = Tenant::create([ + 'slug' => 'wm', + 'name' => 'Wilde Möhre', + 'address_1' => 'Musterweg 1', + 'email' => 't@example.com', + 'email_finance' => 'finance@example.com', + // Muss dem Host der Testanfragen entsprechen, sonst weist IdentifyTenant sie mit 404 ab. + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Test e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'invoice_prefix' => 'WM', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $this->tenant); + + DB::table('participation_types')->insert(['slug' => 'participant', 'name' => 'Teilnehmer']); + DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION]); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_NOT_DEFINED]); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, 'name' => 'Nicht erforderlich']); + + $this->seedTemplate(); + } + + /** Minimale Vorlage: alles, was die Tests brauchen, in einem Block. */ + private function seedTemplate(): void + { + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_INVOICE, + 'block' => DocumentTemplate::BLOCK_LAYOUT, + 'content' => '
{block:subject}{block:body}
', + 'sort_order' => 10, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_INVOICE, + 'block' => DocumentTemplate::BLOCK_STYLE, + 'content' => 'body { font-size: 10pt; }', + 'sort_order' => 20, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_INVOICE, + 'block' => 'subject', + 'content' => '

Rechnung {invoice_number}

{invoice_date} / {service_period}

', + 'sort_order' => 30, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_INVOICE, + 'block' => DocumentTemplate::BLOCK_BODY, + 'content' => '{positions_table}{summary_table}
{closing_statement}
', + 'sort_order' => 40, + 'editable' => false, + ]); + } + + private function makeEvent(array $attributes = []): Event + { + $fee = EventParticipationFee::create([ + 'tenant' => $this->tenant->slug, + 'type' => 'participant', + 'name' => 'Sippe', + 'description' => null, + 'amount_standard' => 60.0, + 'amount_reduced' => null, + 'amount_solidarity' => null, + ]); + + return Event::create(array_merge([ + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'identifier' => 'evt-' . uniqid(), + 'location' => 'Ort', + 'postal_code' => '00000', + 'email' => 'e@example.com', + 'start_date' => '2026-07-16', + 'end_date' => '2026-07-20', + 'early_bird_end' => '2026-06-20', + 'registration_final_end' => '2026-07-01', + 'early_bird_end_amount_increase' => 0, + 'account_owner' => 'Owner', + 'account_iban' => 'DE00', + 'participation_fee_type' => 'fixed', + 'participation_fee_1' => $fee->id, + 'pay_per_day' => true, + 'pay_direct' => false, + 'tax_liable' => false, + 'vat_rate' => 0, + 'vat_pricing_mode' => 'inclusive', + 'invoice_key' => 'WM-V-20260701', + ], $attributes)); + } + + private function makeParticipant(Event $event, array $attributes = []): EventParticipant + { + return $event->participants()->create(array_merge([ + 'tenant' => $this->tenant->slug, + 'identifier' => 'p-' . uniqid(), + 'invoice_sequence' => 5, + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'participation_type' => 'participant', + 'fee_type' => 'standard', + 'sibling_reduction' => false, + 'local_group' => $this->tenant->slug, + 'birthday' => '2000-01-01', + 'address_1' => 'Beispielstraße 3', + 'postcode' => '11111', + 'city' => 'Beispielstadt', + 'email_1' => 'mika@example.com', + 'phone_1' => '0170 0000000', + 'arrival_date' => '2026-07-16', + 'departure_date' => '2026-07-20', + 'arrival_eating' => 1, + 'departure_eating' => 1, + 'amount' => 300.0, + 'payment_purpose' => 'Sommerlager', + 'payment_method' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, + 'efz_status' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, + ], $attributes)); + } + + /** @return array> */ + private function lines(EventParticipant $participant): array + { + $command = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($participant)); + + return new ReflectionMethod($command, 'buildLines')->invoke($command); + } + + /* + |-------------------------------------------------------------------------- + | Positionen + |-------------------------------------------------------------------------- + */ + + public function test_fee_line_is_derived_from_amount_and_split_per_day(): void + { + $lines = $this->lines($this->makeParticipant($this->makeEvent())); + + $this->assertCount(1, $lines); + $this->assertSame('Teilnahme Sommerlager in Gruppe Sippe (Standardbeitrag)', $lines[0]['description']); + $this->assertSame(5.0, $lines[0]['quantity']); + $this->assertEqualsWithDelta(60.0, $lines[0]['unitPrice'], 0.001); + $this->assertEqualsWithDelta(300.0, $lines[0]['amount'], 0.001); + } + + public function test_addons_are_own_lines_and_reduce_the_fee_share(): void + { + $event = $this->makeEvent(); + $participant = $this->makeParticipant($event, ['amount' => 345.0]); + + $participant->selectedAddons()->create([ + 'tenant' => $this->tenant->slug, + 'event_id' => $event->id, + 'addon_key' => 'shirt', + 'title' => 'T-Shirt', + 'price' => 45.0, + 'flat' => true, + 'days' => 1, + 'amount' => 45.0, + ]); + + $lines = $this->lines($participant->fresh()); + + $this->assertCount(2, $lines); + // Beitragsanteil = amount - Zusätze, nicht neu berechnet. + $this->assertEqualsWithDelta(300.0, $lines[0]['amount'], 0.001); + $this->assertSame('T-Shirt', $lines[1]['description']); + $this->assertEqualsWithDelta(45.0, $lines[1]['amount'], 0.001); + $this->assertEqualsWithDelta(345.0, array_sum(array_column($lines, 'amount')), 0.001); + } + + public function test_sibling_reduction_shows_full_day_rate_and_a_discount_line(): void + { + $participant = $this->makeParticipant($this->makeEvent(), [ + 'sibling_reduction' => true, + 'amount' => 150.0, + ]); + + $lines = $this->lines($participant); + + $this->assertCount(2, $lines); + // Der ausgewiesene Tagessatz ist der echte (60 €), nicht der halbierte. + $this->assertEqualsWithDelta(60.0, $lines[0]['unitPrice'], 0.001); + $this->assertEqualsWithDelta(300.0, $lines[0]['amount'], 0.001); + $this->assertSame('Geschwisterermäßigung 50 %', $lines[1]['description']); + $this->assertEqualsWithDelta(-150.0, $lines[1]['amount'], 0.001); + // Die Summe bleibt der tatsächlich zu zahlende Betrag. + $this->assertEqualsWithDelta(150.0, array_sum(array_column($lines, 'amount')), 0.001); + } + + public function test_legacy_registration_without_fee_type_still_adds_up(): void + { + $participant = $this->makeParticipant($this->makeEvent(), [ + 'fee_type' => null, + 'sibling_reduction' => false, + ]); + + $lines = $this->lines($participant); + + $this->assertSame('Teilnahme Sommerlager in Gruppe Sippe', $lines[0]['description']); + $this->assertEqualsWithDelta(300.0, array_sum(array_column($lines, 'amount')), 0.001); + } + + public function test_uneven_day_rate_falls_back_to_a_single_line(): void + { + // 637,50 auf 4 Tage ergibt 159,375 -- gerundet würde 4 x 159,38 = 637,52 ergeben. Eine Rechnung, + // die sich nicht nachrechnen lässt, wäre unbrauchbar, also entfällt die Aufteilung. + $participant = $this->makeParticipant($this->makeEvent(), [ + 'amount' => 637.5, + 'departure_date' => '2026-07-19', + ]); + + $lines = $this->lines($participant); + + $this->assertSame(1.0, $lines[0]['quantity']); + $this->assertEqualsWithDelta(637.5, $lines[0]['unitPrice'], 0.001); + $this->assertEqualsWithDelta(637.5, $lines[0]['amount'], 0.001); + } + + /* + |-------------------------------------------------------------------------- + | Umsatzsteuer + |-------------------------------------------------------------------------- + */ + + /** @return array{net: float, vat: float} */ + private function splitVat(EventParticipant $participant, float $gross): array + { + $command = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($participant)); + + return new ReflectionMethod($command, 'splitVat')->invoke($command, $gross); + } + + public function test_vat_is_extracted_identically_in_both_pricing_modes(): void + { + $inclusive = $this->makeParticipant($this->makeEvent([ + 'tax_liable' => true, + 'vat_rate' => 19, + 'vat_pricing_mode' => 'inclusive', + ])); + + $addOn = $this->makeParticipant($this->makeEvent([ + 'tax_liable' => true, + 'vat_rate' => 19, + 'vat_pricing_mode' => 'add_on', + 'invoice_key' => 'WM-V-20260702', + ])); + + // Gespeichert ist immer der finale Brutto-Betrag -- für die Rechnung spielt der Preismodus + // deshalb keine Rolle mehr. + $this->assertEquals($this->splitVat($inclusive, 119.0), $this->splitVat($addOn, 119.0)); + $this->assertEqualsWithDelta(19.0, $this->splitVat($inclusive, 119.0)['vat'], 0.001); + $this->assertEqualsWithDelta(100.0, $this->splitVat($inclusive, 119.0)['net'], 0.001); + } + + public function test_without_tax_liability_no_vat_is_shown_but_the_legal_note_is(): void + { + // Die Befreiungsgründe kommen bereits aus der Migration, inklusive ihres Pflichthinweises. + $reason = TaxExemptionReason::find(TaxExemptionReason::USTG_4_25A); + + $participant = $this->makeParticipant($this->makeEvent([ + 'tax_liable' => false, + 'tax_exemption_reason' => $reason->slug, + ])); + + $command = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($participant)); + $summary = new ReflectionMethod($command, 'renderSummary')->invoke($command, 300.0); + + $this->assertStringNotContainsString('USt.', $summary); + $this->assertStringContainsString($reason->invoice_text, $summary); + } + + /* + |-------------------------------------------------------------------------- + | Zahlungs-Schlusssatz + |-------------------------------------------------------------------------- + */ + + private function closingStatement(EventParticipant $participant): string + { + $command = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($participant)); + + return new ReflectionMethod($command, 'closingStatement')->invoke($command); + } + + public function test_open_amount_is_requested_by_transfer(): void + { + $statement = $this->closingStatement($this->makeParticipant($this->makeEvent())); + + $this->assertStringContainsString('Bitte überweise', $statement); + } + + public function test_cash_payment_asks_for_the_amount_on_site(): void + { + $participant = $this->makeParticipant($this->makeEvent(), [ + 'payment_method' => PaymentMethod::PAYMENT_NOT_DEFINED, + ]); + + $this->assertStringContainsString( + 'in bar am ersten Tag der Veranstaltung bereit', + $this->closingStatement($participant) + ); + } + + public function test_fully_paid_participant_is_not_asked_to_pay_again(): void + { + $participant = $this->makeParticipant($this->makeEvent(), ['amount_paid' => 300.0]); + + $statement = $this->closingStatement($participant); + + $this->assertStringContainsString('bereits vollständig beglichen', $statement); + $this->assertStringNotContainsString('Bitte überweise', $statement); + } + + /* + |-------------------------------------------------------------------------- + | Rechnungsnummer und Dokument + |-------------------------------------------------------------------------- + */ + + public function test_invoice_number_is_deterministic(): void + { + $participant = $this->makeParticipant($this->makeEvent(), ['invoice_sequence' => 5]); + + $first = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($participant))->execute(); + $second = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($participant->fresh()))->execute(); + + $this->assertTrue($first->success); + $this->assertSame('WM-V-20260701-0005', $first->invoiceNumber); + $this->assertSame($first->invoiceNumber, $second->invoiceNumber); + $this->assertSame('Rechnung-WM-V-20260701-0005.pdf', $first->filename); + $this->assertStringStartsWith('%PDF', $first->pdfContent); + } + + public function test_the_endpoint_delivers_the_pdf_as_a_download(): void + { + $participant = $this->makeParticipant($this->makeEvent(), ['invoice_sequence' => 5]); + + $this->actingAs($this->makeLeader()); + + $response = $this->get('/api/v1/participant-invoice/' . $participant->identifier); + + $response->assertOk(); + $response->assertHeader('Content-Type', 'application/pdf'); + $response->assertHeader('Content-Disposition', 'attachment; filename="Rechnung-WM-V-20260701-0005.pdf"'); + } + + public function test_the_endpoint_is_closed_to_guests(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + + $this->get('/api/v1/participant-invoice/' . $participant->identifier)->assertRedirect('/login'); + } + + private function makeLeader(): User + { + foreach ([UserRole::USER_ROLE_ADMIN, UserRole::USER_ROLE_GROUP_LEADER, UserRole::USER_ROLE_USER] as $role) { + UserRole::firstOrCreate(['slug' => $role], ['name' => $role]); + } + + return User::create([ + 'username' => 'leitung@example.com', + 'email' => 'leitung@example.com', + 'firstname' => 'Leitung', + 'lastname' => 'Person', + 'password' => bcrypt('secret'), + 'local_group' => $this->tenant->slug, + 'user_role_main' => UserRole::USER_ROLE_USER, + 'user_role_local_group' => UserRole::USER_ROLE_GROUP_LEADER, + 'active' => true, + ]); + } + + public function test_service_period_collapses_for_single_day_events(): void + { + $singleDay = $this->makeParticipant($this->makeEvent([ + 'start_date' => '2027-01-01', + 'end_date' => '2027-01-01', + ])); + + $multiDay = $this->makeParticipant($this->makeEvent([ + 'start_date' => '2027-01-06', + 'end_date' => '2027-01-08', + 'invoice_key' => 'WM-V-20270102', + ])); + + $period = static fn(EventParticipant $p): string => new ReflectionMethod( + $command = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($p)), + 'servicePeriod' + )->invoke($command); + + $this->assertSame('01.01.2027', $period($singleDay)); + $this->assertSame('06.01.2027 – 08.01.2027', $period($multiDay)); + } + + /* + |-------------------------------------------------------------------------- + | Vorlage + |-------------------------------------------------------------------------- + */ + + public function test_empty_blocks_disappear(): void + { + DocumentTemplate::where('block', 'subject')->update(['content' => '']); + + $html = new DocumentTemplateRenderProvider(DocumentTemplate::TYPE_PARTICIPANT_INVOICE) + ->render(['positions_table' => 'POS', 'summary_table' => '', 'closing_statement' => '']); + + $this->assertStringNotContainsString('Rechnung', $html); + $this->assertStringNotContainsString('{block:', $html); + $this->assertStringContainsString('POS', $html); + } + + public function test_template_content_is_never_evaluated_as_blade(): void + { + // Der Inhalt kommt aus einem Admin-Formular. Würde er durch Blade laufen, wäre das Formular ein + // Weg zur Codeausführung auf dem Server. + DocumentTemplate::where('block', 'subject')->update([ + 'content' => '

{{ 7*7 }} @php echo "ausgefuehrt"; @endphp

', + ]); + + $html = new DocumentTemplateRenderProvider(DocumentTemplate::TYPE_PARTICIPANT_INVOICE)->render([]); + + // Beides bleibt wörtlich stehen -- nichts davon wird ausgewertet. + $this->assertStringContainsString('{{ 7*7 }}', $html); + $this->assertStringContainsString('@php echo "ausgefuehrt"; @endphp', $html); + $this->assertStringNotContainsString('49', $html); + $this->assertStringNotContainsString('>ausgefuehrt<', $html); + } + + public function test_a_bare_data_uri_is_stripped_from_the_css(): void + { + // dompdf lagert Data-URIs im CSS nur aus, wenn ihnen ( " oder ' vorausgeht. Ein bar stehendes + // bleibt liegen und treibt seinen Parser in quadratische Laufzeit -- unter FPM stirbt der + // Worker am Zeitlimit und die Anfrage endet in einem 502. + DocumentAsset::create(['name' => 'logo', 'mime' => 'image/png', 'data' => 'RUlORFJVQ0s']); + + DocumentTemplate::where('block', DocumentTemplate::BLOCK_STYLE)->update([ + 'content' => '.a { color: red; }{asset:logo}{asset:logo}', + ]); + + $html = new DocumentTemplateRenderProvider(DocumentTemplate::TYPE_PARTICIPANT_INVOICE)->render([]); + + $this->assertStringContainsString('.a { color: red; }', $html); + $this->assertStringNotContainsString('data:image/png', $html); + // Entscheidend ist der Rumpf: das Semikolon gehört zum Data-URI. Eine Begrenzung, die dort + // aufhört, entfernt nur den Präfix und lässt das Base64 stehen -- der Parser bremst weiter. + $this->assertStringNotContainsString('RUlORFJVQ0s', $html); + $this->assertStringNotContainsString('base64', $html); + } + + public function test_a_data_uri_inside_url_is_kept_in_the_css(): void + { + DocumentAsset::create(['name' => 'logo', 'mime' => 'image/png', 'data' => 'QUJD']); + + DocumentTemplate::where('block', DocumentTemplate::BLOCK_STYLE)->update([ + 'content' => '.a { background: url("{asset:logo}"); }', + ]); + + $html = new DocumentTemplateRenderProvider(DocumentTemplate::TYPE_PARTICIPANT_INVOICE)->render([]); + + // Korrekt eingebettet ist es für dompdf kein Problem und bleibt erhalten. + $this->assertStringContainsString('url("data:image/png;base64,QUJD")', $html); + } + + public function test_unknown_asset_resolves_to_nothing(): void + { + DocumentAsset::create([ + 'name' => 'logo', + 'mime' => 'image/png', + 'data' => 'QUJD', + ]); + + DocumentTemplate::where('block', 'subject')->update([ + 'content' => '', + ]); + + $html = new DocumentTemplateRenderProvider(DocumentTemplate::TYPE_PARTICIPANT_INVOICE)->render([]); + + $this->assertStringContainsString('src="data:image/png;base64,QUJD"', $html); + $this->assertStringContainsString('src=""', $html); + $this->assertStringNotContainsString('{asset:', $html); + } + + /* + |-------------------------------------------------------------------------- + | Rechnungssteller + |-------------------------------------------------------------------------- + */ + + private function senderName(EventParticipant $participant): string + { + $command = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($participant)); + + return new ReflectionMethod($command, 'buildTokens') + ->invoke($command, 'WM-V-20260701-0005', [], 300.0)['sender_name']; + } + + public function test_without_an_own_entry_the_tenant_name_is_the_sender(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + + $this->assertSame('Wilde Möhre', $this->senderName($participant)); + } + + public function test_an_own_invoice_sender_name_wins(): void + { + $this->tenant->update(['invoice_sender_name' => 'BdP Landesverband Sachsen e.V.']); + + $participant = $this->makeParticipant($this->makeEvent()); + + $this->assertSame('BdP Landesverband Sachsen e.V.', $this->senderName($participant->fresh())); + } + + public function test_a_blank_entry_falls_back_to_the_tenant_name(): void + { + // Aus dem Formular kommt ein Leerstring, nicht null. + $this->tenant->update(['invoice_sender_name' => ' ']); + + $participant = $this->makeParticipant($this->makeEvent()); + + $this->assertSame('Wilde Möhre', $this->senderName($participant->fresh())); + } + + public function test_correcting_the_sender_reaches_existing_events(): void + { + // Der Fall, der vorher nicht funktioniert hat: der Absender wurde bei der Event-Anlage + // eingefroren, eine spätere Korrektur wirkte deshalb auf bestehende Veranstaltungen nie. + $participant = $this->makeParticipant($this->makeEvent()); + + $this->tenant->update([ + 'invoice_sender_name' => 'BdP Landesverband Sachsen e.V.', + 'address_1' => 'Bernhard-Göring-Str. 152', + ]); + + $command = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($participant->fresh())); + $tokens = new ReflectionMethod($command, 'buildTokens') + ->invoke($command, 'WM-V-20260701-0005', [], 300.0); + + $this->assertSame('BdP Landesverband Sachsen e.V.', $tokens['sender_name']); + $this->assertSame('Bernhard-Göring-Str. 152', $tokens['sender_address_1']); + } + + public function test_the_tax_basis_stays_frozen_on_the_event(): void + { + // Gegenprobe zur Abgrenzung: die Steuergrundlage erklärt, wie der Preis zustande kam, und + // folgt dem Mandanten ausdrücklich NICHT. + $event = $this->makeEvent(['tax_liable' => true, 'vat_rate' => 19]); + + $this->tenant->update(['tax_liable' => false, 'vat_rate' => 0]); + + $this->assertTrue($event->fresh()->tax_liable); + $this->assertSame(19, $event->fresh()->vat_rate); + } + + public function test_token_catalogue_matches_what_the_command_actually_provides(): void + { + // Der Katalog speist die Platzhalter-Liste und die Vorschau in der Vorlagen-Verwaltung. Liefe er + // gegenüber dem Command auseinander, würde die Verwaltung Platzhalter anbieten, die auf der echten + // Rechnung leer bleiben -- oder umgekehrt welche verschweigen. + $participant = $this->makeParticipant($this->makeEvent()); + $command = new CreateParticipantInvoiceCommand(new CreateParticipantInvoiceRequest($participant)); + + $actual = array_keys( + new ReflectionMethod($command, 'buildTokens')->invoke($command, 'WM-V-20260701-0005', [], 300.0) + ); + + sort($actual); + $documented = ParticipantInvoiceTokens::names(); + sort($documented); + + $this->assertSame($documented, $actual); + } + + public function test_conditional_sections_drop_when_the_value_is_missing(): void + { + DocumentTemplate::where('block', 'subject')->update([ + 'content' => '{if:sender_phone}Telefon: {sender_phone}{/if:sender_phone}' + . '{if:sender_city}Ort: {sender_city}{/if:sender_city}', + ]); + + $html = new DocumentTemplateRenderProvider(DocumentTemplate::TYPE_PARTICIPANT_INVOICE) + ->render(['sender_phone' => '', 'sender_city' => 'Stadt']); + + $this->assertStringNotContainsString('Telefon:', $html); + $this->assertStringContainsString('Ort: Stadt', $html); + } +} diff --git a/tests/Feature/ParticipantRefundTest.php b/tests/Feature/ParticipantRefundTest.php new file mode 100644 index 0000000..ccf4de3 --- /dev/null +++ b/tests/Feature/ParticipantRefundTest.php @@ -0,0 +1,901 @@ +tenant = Tenant::create([ + 'slug' => 'wm', + 'name' => 'Wilde Möhre', + 'address_1' => 'Musterweg 1', + 'email' => 't@example.com', + 'email_finance' => 'finance@example.com', + // Muss dem Host der Testanfragen entsprechen, sonst weist IdentifyTenant sie mit 404 ab. + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Test e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'invoice_prefix' => 'WM', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $this->tenant); + + DB::table('participation_types')->insert(['slug' => 'participant', 'name' => 'Teilnehmer']); + DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']); + // Lookup-Tabellen mit Fremdschlüsselzwang -- ohne sie scheitert schon das Anlegen. + // `invoice_types.participation_refund` bringt die Migration bereits mit. + DB::table('cost_unit_types')->insert(['slug' => CostUnitType::COST_UNIT_TYPE_EVENT, 'name' => 'Veranstaltung']); + DB::table('invoice_status')->insert(['slug' => InvoiceStatus::INVOICE_STATUS_NEW]); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION]); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_NOT_DEFINED]); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, 'name' => 'Nicht erforderlich']); + + foreach ([UserRole::USER_ROLE_ADMIN, UserRole::USER_ROLE_GROUP_LEADER, UserRole::USER_ROLE_USER] as $role) { + UserRole::create(["slug" => $role, "name" => $role]); + } + + $this->seedTemplate(); + + Mail::fake(); + } + + /** Minimale Vorlage: alles, was der Beleg braucht, in wenigen Blöcken. */ + private function seedTemplate(): void + { + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_LAYOUT, + 'content' => '
{block:subject}{block:body}
', + 'sort_order' => 10, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_STYLE, + 'content' => 'body { font-size: 10pt; }', + 'sort_order' => 20, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => 'subject', + 'content' => '

Rückerstattung {document_number}

{document_date} / {event_name}

', + 'sort_order' => 30, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_BODY, + 'content' => '
{recipient_name}
{details_table}', + 'sort_order' => 40, + ]); + } + + /** Die Kostenstelle, auf die die Erstattung gebucht wird -- beim Anlegen einer Veranstaltung entsteht sie mit. */ + private function makeCostUnit(array $attributes = []): CostUnit + { + return CostUnit::create(array_merge([ + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'type' => CostUnitType::COST_UNIT_TYPE_EVENT, + 'distance_allowance' => 0.25, + 'mail_on_new' => false, + 'allow_new' => true, + 'archived' => false, + ], $attributes)); + } + + private function makeEvent(array $attributes = []): Event + { + $fee = EventParticipationFee::create([ + 'tenant' => $this->tenant->slug, + 'type' => 'participant', + 'name' => 'Sippe', + 'description' => null, + 'amount_standard' => 60.0, + 'amount_reduced' => null, + 'amount_solidarity' => null, + ]); + + return Event::create(array_merge([ + 'cost_unit_id' => $this->makeCostUnit()->id, + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'identifier' => 'evt-' . uniqid(), + 'location' => 'Ort', + 'postal_code' => '00000', + 'email' => 'e@example.com', + 'start_date' => '2026-07-16', + 'end_date' => '2026-07-20', + 'early_bird_end' => '2026-06-20', + 'registration_final_end' => '2026-07-01', + 'early_bird_end_amount_increase' => 0, + 'account_owner' => 'Owner', + 'account_iban' => 'DE00', + 'participation_fee_type' => 'fixed', + 'participation_fee_1' => $fee->id, + 'pay_per_day' => true, + 'pay_direct' => false, + 'tax_liable' => false, + 'vat_rate' => 0, + 'vat_pricing_mode' => 'inclusive', + 'invoice_key' => 'WM-V-20260701', + ], $attributes)); + } + + /** Standardfall dieser Tests: abgemeldet und vollständig bezahlt. */ + private function makeParticipant(Event $event, array $attributes = []): EventParticipant + { + $this->sequence++; + + return $event->participants()->create(array_merge([ + 'tenant' => $this->tenant->slug, + 'identifier' => 'p-' . uniqid(), + 'invoice_sequence' => $this->sequence, + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'participation_type' => 'participant', + 'fee_type' => 'standard', + 'sibling_reduction' => false, + 'local_group' => $this->tenant->slug, + 'birthday' => '2000-01-01', + 'address_1' => 'Beispielstraße 3', + 'postcode' => '11111', + 'city' => 'Beispielstadt', + 'email_1' => 'mika@example.com', + 'phone_1' => '0170 0000000', + 'arrival_date' => '2026-07-16', + 'departure_date' => '2026-07-20', + 'arrival_eating' => 1, + 'departure_eating' => 1, + 'amount' => 300.0, + 'amount_paid' => 300.0, + 'unregistered_at' => '2026-06-12', + 'payment_purpose' => 'Sommerlager', + 'payment_method' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, + 'efz_status' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, + ], $attributes)); + } + + /** + * Der Vorgabewert 300,00 € entspricht dem gezahlten Beitrag -- es bleibt also nichts einbehalten und + * es braucht keinen Einbehaltungsgrund. Bei kleineren Beträgen muss einer mitgegeben werden. + */ + private function release( + EventParticipant $participant, + float $amount = 300.0, + string $reason = RefundReason::SICKNESS, + ?string $note = null, + ?string $retentionReason = null, + ) { + return new ReleaseRefundCommand(new ReleaseRefundRequest( + participant: $participant, + amount: new Amount($amount, 'Euro'), + reason: $reason, + reasonNote: $note, + retentionReason: $retentionReason, + ))->execute(); + } + + private function accept( + ?ParticipantRefund $refund, + string $owner = 'Mika Muster', + string $iban = 'DE02120300000000202051', + bool $declarationAccepted = true, + ) { + return new AcceptRefundCommand(new AcceptRefundRequest( + refund: $refund, + accountOwner: $owner, + accountIban: $iban, + declarationAccepted: $declarationAccepted, + ))->execute(); + } + + /* + |-------------------------------------------------------------------------- + | Freigabe + |-------------------------------------------------------------------------- + */ + + public function test_release_creates_a_pending_refund_with_a_token(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + + $response = $this->release($participant); + + $this->assertTrue($response->success); + $this->assertSame(ParticipantRefund::STATUS_PENDING, $response->refund->status); + $this->assertSame(32, strlen($response->refund->token)); + $this->assertEqualsWithDelta(300.0, $response->refund->amount->getAmount(), 0.001); + $this->assertNotNull($response->refund->released_at); + } + + public function test_release_notifies_participant_and_contact_person(): void + { + $participant = $this->makeParticipant($this->makeEvent(), ['email_2' => 'eltern@example.com']); + + $this->release($participant); + + Mail::assertSent(RefundReleasedMail::class, 2); + Mail::assertSent(RefundReleasedMail::class, fn ($mail) => $mail->hasTo('mika@example.com')); + Mail::assertSent(RefundReleasedMail::class, fn ($mail) => $mail->hasTo('eltern@example.com')); + } + + public function test_release_sends_only_one_mail_without_contact_person(): void + { + $this->release($this->makeParticipant($this->makeEvent())); + + Mail::assertSent(RefundReleasedMail::class, 1); + } + + public function test_release_is_rejected_for_a_registered_participant(): void + { + $participant = $this->makeParticipant($this->makeEvent(), ['unregistered_at' => null]); + + $response = $this->release($participant); + + $this->assertFalse($response->success); + $this->assertStringContainsString('abgemeldete', $response->message); + $this->assertSame(0, ParticipantRefund::count()); + } + + public function test_release_is_rejected_above_the_paid_amount(): void + { + $participant = $this->makeParticipant($this->makeEvent(), ['amount_paid' => 100.0]); + + $response = $this->release($participant, 150.0); + + $this->assertFalse($response->success); + $this->assertStringContainsString('nicht übersteigen', $response->message); + } + + public function test_release_accepts_a_partial_amount(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + + $response = $this->release($participant, 220.0, retentionReason: RetentionReason::CANCELLATION_FEE); + + $this->assertTrue($response->success); + $this->assertEqualsWithDelta(220.0, $response->refund->amount->getAmount(), 0.001); + // Der Rest wird am Vorgang festgeschrieben, nicht später gerechnet. + $this->assertEqualsWithDelta(80.0, $response->refund->retained_amount->getAmount(), 0.001); + } + + public function test_release_is_rejected_without_an_amount(): void + { + $response = $this->release($this->makeParticipant($this->makeEvent()), 0.0); + + $this->assertFalse($response->success); + $this->assertStringContainsString('größer als 0', $response->message); + } + + public function test_release_is_rejected_for_an_unknown_reason(): void + { + $response = $this->release($this->makeParticipant($this->makeEvent()), 300.0, 'erfunden'); + + $this->assertFalse($response->success); + $this->assertStringContainsString('Erstattungsgrund', $response->message); + } + + public function test_free_text_reason_requires_a_note(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + + $response = $this->release($participant, 300.0, RefundReason::OTHER, ' '); + + $this->assertFalse($response->success); + $this->assertStringContainsString('Erläuterung', $response->message); + } + + public function test_note_is_only_stored_for_reasons_that_require_it(): void + { + $event = $this->makeEvent(); + + $withNote = $this->release($this->makeParticipant($event), 300.0, RefundReason::OTHER, 'Umzug'); + $this->assertSame('Umzug', $withNote->refund->reason_note); + + $ignored = $this->release($this->makeParticipant($event), 300.0, RefundReason::SICKNESS, 'wird verworfen'); + $this->assertNull($ignored->refund->reason_note); + } + + public function test_a_second_release_is_rejected_while_one_is_open(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $this->release($participant); + + $response = $this->release($participant); + + $this->assertFalse($response->success); + $this->assertStringContainsString('läuft bereits', $response->message); + $this->assertSame(1, ParticipantRefund::count()); + } + + public function test_a_new_release_is_possible_after_a_cancellation(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $first = $this->release($participant); + + new CancelRefundCommand(new CancelRefundRequest($first->refund))->execute(); + + $this->assertTrue($this->release($participant)->success); + $this->assertSame(2, ParticipantRefund::count()); + } + + /* + |-------------------------------------------------------------------------- + | Bestätigung durch den Teili + |-------------------------------------------------------------------------- + */ + + public function test_accept_stores_the_normalized_bank_details(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + $response = $this->accept($refund, 'Mika Muster', 'de02 1203 0000 0000 2020 51'); + + $this->assertTrue($response->success); + + $refund->refresh(); + $this->assertSame(ParticipantRefund::STATUS_ACCEPTED, $refund->status); + $this->assertSame('Mika Muster', $refund->account_owner); + $this->assertSame('DE02120300000000202051', $refund->account_iban); + $this->assertNotNull($refund->accepted_at); + } + + public function test_accept_sends_the_confirmation_with_the_document_attached(): void + { + $participant = $this->makeParticipant($this->makeEvent(), ['email_2' => 'eltern@example.com']); + $refund = $this->release($participant)->refund; + + $this->accept($refund); + + Mail::assertSent(RefundAcceptedMail::class, 2); + $expected = sprintf( + 'Rueckerstattung-WM-V-20260701-%s-R.pdf', + str_pad((string) $participant->invoice_sequence, 4, '0', STR_PAD_LEFT) + ); + + Mail::assertSent(RefundAcceptedMail::class, function (RefundAcceptedMail $mail) use ($expected): bool { + $attachments = $mail->attachments(); + + return count($attachments) === 1 && $attachments[0]->as === $expected; + }); + } + + public function test_accept_rejects_an_invalid_iban(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + // Gültige Struktur und Länge, aber falsche Prüfziffer -- ein klassischer Zahlendreher. + $response = $this->accept($refund, 'Mika Muster', 'DE02120300000000202015'); + + $this->assertFalse($response->success); + $this->assertArrayHasKey('accountIban', $response->errorTypes); + $this->assertSame(ParticipantRefund::STATUS_PENDING, $refund->fresh()->status); + } + + /* + |-------------------------------------------------------------------------- + | Die Erklärung + |-------------------------------------------------------------------------- + */ + + public function test_accept_is_rejected_without_the_declaration(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + $response = $this->accept($refund, declarationAccepted: false); + + $this->assertFalse($response->success); + $this->assertArrayHasKey('declaration', $response->errorTypes); + $this->assertSame(ParticipantRefund::STATUS_PENDING, $refund->fresh()->status); + $this->assertNull($refund->fresh()->account_iban); + } + + public function test_the_declaration_cannot_be_skipped_over_http(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + // Ohne die Prüfung im Command ließe sich die Erklärung mit einem direkten Aufruf übergehen -- + // und der Beleg schriebe dem Teili eine Zusicherung zu, die er nie abgegeben hat. + $this->postJson('/api/v1/participant-refund/' . $refund->token . '/accept', [ + 'accountOwner' => 'Mika Muster', + 'accountIban' => 'DE02 1203 0000 0000 2020 51', + ]) + ->assertOk() + ->assertJsonPath('status', 'error') + ->assertJsonStructure(['error_types' => ['declaration']]); + + $this->assertSame(ParticipantRefund::STATUS_PENDING, $refund->fresh()->status); + } + + public function test_the_public_page_serves_the_declaration_text_name(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + $this->get('/rueckerstattung/' . $refund->token) + ->assertOk() + ->assertInertia(fn ($page) => $page->where('state', 'open')); + + // Den Wortlaut holt die Seite über dieselbe Quelle, aus der ihn auch der Beleg nimmt. + $this->get('/api/v1/core/retrieve-text-resource/' . CreateRefundDocumentCommand::DECLARATION_TEXT) + ->assertOk() + ->assertSee('Ich versichere', false); + } + + public function test_accept_requires_an_account_owner(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + $response = $this->accept($refund, ' '); + + $this->assertFalse($response->success); + $this->assertArrayHasKey('accountOwner', $response->errorTypes); + } + + public function test_accept_on_an_unknown_token_reports_no_open_refund(): void + { + $response = $this->accept(null); + + $this->assertFalse($response->success); + $this->assertSame(AcceptRefundCommand::NO_OPEN_REFUND, $response->message); + } + + public function test_accept_on_a_cancelled_refund_reports_no_open_refund(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + new CancelRefundCommand(new CancelRefundRequest($refund))->execute(); + + $response = $this->accept($refund->fresh()); + + $this->assertFalse($response->success); + $this->assertSame(AcceptRefundCommand::NO_OPEN_REFUND, $response->message); + } + + public function test_accept_twice_does_not_change_the_stored_details(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + $this->accept($refund, 'Mika Muster', 'DE02120300000000202051'); + + $response = $this->accept($refund->fresh(), 'Wer Anders', 'DE02500105170137075030'); + + $this->assertFalse($response->success); + $this->assertSame('Mika Muster', $refund->fresh()->account_owner); + } + + /* + |-------------------------------------------------------------------------- + | Abbruch + |-------------------------------------------------------------------------- + */ + + public function test_cancel_marks_the_refund_and_hides_it_from_the_participant(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $refund = $this->release($participant)->refund; + + $response = new CancelRefundCommand(new CancelRefundRequest($refund))->execute(); + + $this->assertTrue($response->success); + $this->assertSame(ParticipantRefund::STATUS_CANCELLED, $refund->fresh()->status); + $this->assertNotNull($refund->fresh()->cancelled_at); + + // Für die Anmeldung sieht es danach aus wie vor der Freigabe. + $repository = new ParticipantRefundRepository(); + $this->assertNull($repository->openFor($participant)); + $this->assertNull($repository->currentFor($participant)); + } + + public function test_cancel_sends_no_mail(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + Mail::fake(); + + new CancelRefundCommand(new CancelRefundRequest($refund))->execute(); + + Mail::assertNothingSent(); + } + + public function test_cancel_is_rejected_after_acceptance(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + $this->accept($refund); + + $response = new CancelRefundCommand(new CancelRefundRequest($refund->fresh()))->execute(); + + $this->assertFalse($response->success); + $this->assertStringContainsString('bereits bestätigt', $response->message); + $this->assertSame(ParticipantRefund::STATUS_ACCEPTED, $refund->fresh()->status); + } + + /* + |-------------------------------------------------------------------------- + | Der gezahlte Beitrag bleibt unangetastet + |-------------------------------------------------------------------------- + */ + + public function test_amount_paid_survives_the_release_and_falls_with_the_confirmation(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + + // Die Freigabe allein ändert nichts -- solange der Teili nicht bestätigt hat, ist der Beitrag + // unverändert beim Verband. + $refund = $this->release($participant)->refund; + $this->assertEqualsWithDelta(300.0, $participant->fresh()->amount_paid->getAmount(), 0.001); + + $this->accept($refund); + $this->assertEqualsWithDelta(0.0, $participant->fresh()->amount_paid->getAmount(), 0.001); + + // Der Sollbetrag bleibt: was der Teili hätte zahlen müssen, ändert die Erstattung nicht. + $this->assertEqualsWithDelta(300.0, $participant->fresh()->amount->getAmount(), 0.001); + } + + public function test_a_cancelled_release_leaves_amount_paid_alone(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $refund = $this->release($participant)->refund; + + new CancelRefundCommand(new CancelRefundRequest($refund))->execute(); + + $this->assertEqualsWithDelta(300.0, $participant->fresh()->amount_paid->getAmount(), 0.001); + } + + /* + |-------------------------------------------------------------------------- + | Über HTTP: Routen, Zugriffsschutz und die öffentliche Seite + |-------------------------------------------------------------------------- + */ + + private function makeAdmin(): User + { + return User::create([ + 'username' => 'al-' . uniqid() . '@example.com', + 'email' => 'al-' . uniqid() . '@example.com', + 'firstname' => 'Aktions', + 'lastname' => 'Leitung', + 'password' => bcrypt('secret'), + 'local_group' => $this->tenant->slug, + 'user_role_main' => UserRole::USER_ROLE_ADMIN, + 'user_role_local_group' => UserRole::USER_ROLE_USER, + 'active' => true, + ]); + } + + /** Das Konto, an dem eine Anmeldung hängen kann -- entscheidet über den Login-Hinweis in der Mail. */ + private function makeParticipantUser(): User + { + return User::create([ + 'username' => 'teili-' . uniqid() . '@example.com', + 'email' => 'teili-' . uniqid() . '@example.com', + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'password' => bcrypt('secret'), + 'local_group' => $this->tenant->slug, + 'user_role_main' => UserRole::USER_ROLE_USER, + 'user_role_local_group' => UserRole::USER_ROLE_USER, + 'active' => true, + ]); + } + + public function test_release_over_http_creates_the_refund(): void + { + $this->actingAs($this->makeAdmin()); + $participant = $this->makeParticipant($this->makeEvent()); + + $response = $this->postJson('/api/v1/participant-refund/' . $participant->identifier . '/release', [ + 'amount' => '220,50', + 'reason' => RefundReason::SICKNESS, + // Weniger als gezahlt -- der Rest bleibt beim Verband und braucht eine Begründung. + 'retentionReason' => RetentionReason::CANCELLATION_FEE, + ]); + + $response->assertOk()->assertJsonPath('status', 'success'); + $response->assertJsonPath('refund.status', ParticipantRefund::STATUS_PENDING); + + $refund = ParticipantRefund::first(); + $this->assertEqualsWithDelta(220.5, $refund->amount->getAmount(), 0.001); + + // Die Antwort trägt den Vorgang für die Liste -- aber nicht den Token-Link als Bankdaten. + $response->assertJsonPath('refund.amountValue', 220.5); + } + + public function test_release_requires_a_login(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + + $this->post('/api/v1/participant-refund/' . $participant->identifier . '/release', [ + 'amount' => '300', + 'reason' => RefundReason::SICKNESS, + ])->assertRedirect('/login'); + + $this->assertSame(0, ParticipantRefund::count()); + } + + public function test_the_public_page_shows_the_open_refund(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + $response = $this->get('/rueckerstattung/' . $refund->token); + + $response->assertOk(); + $response->assertInertia(fn ($page) => $page + // shouldExist=false: die Pages liegen unter app/Domains/**/Views, nicht dort, wo der + // Finder von Inertia sucht. + ->component('ParticipantRefund/Views/RefundPage', false) + ->where('state', 'open') + ->where('amount', '300,00 Euro') + ->where('reason', 'Krankheitsbedingte Absage')); + } + + public function test_the_public_page_never_exposes_bank_details(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + $this->accept($refund); + + $response = $this->get('/rueckerstattung/' . $refund->fresh()->token); + + $response->assertOk(); + $response->assertInertia(fn ($page) => $page->where('state', 'accepted')); + $response->assertDontSee('DE02120300000000202051'); + } + + public function test_the_public_page_hides_a_cancelled_refund(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + new CancelRefundCommand(new CancelRefundRequest($refund))->execute(); + + $this->get('/rueckerstattung/' . $refund->token) + ->assertOk() + ->assertInertia(fn ($page) => $page->where('state', 'unavailable')); + } + + public function test_an_unknown_token_shows_the_same_page_as_a_cancelled_one(): void + { + $this->get('/rueckerstattung/' . str_repeat('x', 32)) + ->assertOk() + ->assertInertia(fn ($page) => $page + ->where('state', 'unavailable') + ->where('message', AcceptRefundCommand::NO_OPEN_REFUND)); + } + + public function test_accept_over_http_works_without_a_login(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + $this->postJson('/api/v1/participant-refund/' . $refund->token . '/accept', [ + 'accountOwner' => 'Mika Muster', + 'accountIban' => 'DE02 1203 0000 0000 2020 51', + 'declarationAccepted' => true, + ])->assertOk()->assertJsonPath('status', 'success'); + + $this->assertSame('DE02120300000000202051', $refund->fresh()->account_iban); + } + + public function test_field_errors_come_back_with_status_200(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + // Der HttpClient des Frontends verwirft Antworten mit Fehlerstatus -- Feldfehler müssen daher + // mit 200 zurückkommen, sonst sieht der Teili nie, was er falsch gemacht hat. + $this->postJson('/api/v1/participant-refund/' . $refund->token . '/accept', [ + 'accountOwner' => 'Mika Muster', + 'accountIban' => 'DE02120300000000202015', + 'declarationAccepted' => true, + ]) + ->assertOk() + ->assertJsonPath('status', 'error') + ->assertJsonStructure(['error_types' => ['accountIban']]); + } + + public function test_the_document_is_not_public(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + $this->accept($refund); + + $this->get('/api/v1/participant-refund/' . $refund->fresh()->token . '/document') + ->assertRedirect('/login'); + } + + public function test_the_document_can_be_downloaded_by_the_event_management(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + $this->accept($refund); + + $this->actingAs($this->makeAdmin()); + + $response = $this->get('/api/v1/participant-refund/' . $refund->fresh()->token . '/document'); + + $response->assertOk(); + $response->assertHeader('Content-Type', 'application/pdf'); + $this->assertStringStartsWith('%PDF', $response->getContent()); + } + + public function test_cancel_requires_a_login(): void + { + $refund = $this->release($this->makeParticipant($this->makeEvent()))->refund; + + $this->post('/api/v1/participant-refund/' . $refund->token . '/cancel') + ->assertRedirect('/login'); + + $this->assertSame(ParticipantRefund::STATUS_PENDING, $refund->fresh()->status); + } + + /* + |-------------------------------------------------------------------------- + | Die Mails müssen sich auch wirklich rendern lassen + |-------------------------------------------------------------------------- + */ + + public function test_the_release_mail_renders_with_the_link(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $refund = $this->release( + $participant, + 220.0, + RefundReason::OTHER, + 'Umzug', + RetentionReason::CANCELLATION_FEE + )->refund; + + $html = new RefundReleasedMail($participant, $refund)->render(); + + $this->assertStringContainsString('220,00 Euro', $html); + $this->assertStringContainsString('Sonstiger Grund', $html); + $this->assertStringContainsString('Umzug', $html); + $this->assertStringContainsString('/rueckerstattung/' . $refund->token, $html); + // Der Baustein aus emails.subparts.disclaimer braucht eventTitle und eventEmail. + $this->assertStringContainsString('Sommerlager', $html); + $this->assertStringContainsString('e@example.com', $html); + } + + public function test_the_release_mail_omits_the_note_row_when_there_is_none(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $refund = $this->release($participant)->refund; + + $html = new RefundReleasedMail($participant, $refund)->render(); + + $this->assertStringNotContainsString('Anmerkung:', $html); + } + + public function test_the_acceptance_mail_renders_with_the_bank_details(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $refund = $this->release($participant)->refund; + $this->accept($refund); + + $html = new RefundAcceptedMail($participant, $refund->fresh(), 'PDF-Inhalt', 'beleg.pdf')->render(); + + $this->assertStringContainsString('300,00 Euro', $html); + $this->assertStringContainsString('Mika Muster', $html); + // Im Anschreiben steht die IBAN in Vierergruppen. + $this->assertStringContainsString('DE02 1203 0000 0000 2020 51', $html); + $this->assertStringContainsString('Anhang', $html); + } + + public function test_the_acceptance_mail_points_at_the_invoice(): void + { + $participant = $this->makeParticipant($this->makeEvent(), ['user_id' => $this->makeParticipantUser()->id]); + $refund = $this->release($participant)->refund; + $this->accept($refund); + + $html = new RefundAcceptedMail($participant, $refund->fresh())->render(); + + // Die Mail ist nur noch informativ -- eingereicht ist die Erstattung bereits. + $this->assertStringContainsString('musst nichts weiter tun', $html); + $this->assertStringContainsString($refund->fresh()->invoice()->first()->invoice_number, $html); + $this->assertStringContainsString('/invoice/my-invoices/new', $html); + } + + public function test_the_acceptance_mail_omits_the_login_hint_without_an_account(): void + { + // Ohne Nutzerkonto bliebe "Meine Abrechnungen" leer -- die Seite filtert über die Verknüpfung. + $participant = $this->makeParticipant($this->makeEvent(), ['user_id' => null]); + $refund = $this->release($participant)->refund; + $this->accept($refund); + + $html = new RefundAcceptedMail($participant, $refund->fresh())->render(); + + $this->assertStringNotContainsString('/invoice/my-invoices/new', $html); + } + + public function test_an_empty_second_address_gets_no_mail(): void + { + // Der Anmeldewizard legt das Feld bei Volljährigen als Leerstring an, nicht als NULL. + $this->release($this->makeParticipant($this->makeEvent(), ['email_2' => ''])); + + Mail::assertSent(RefundReleasedMail::class, 1); + } + + public function test_the_acceptance_mail_renders_without_a_document(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $refund = $this->release($participant)->refund; + $this->accept($refund); + + $mail = new RefundAcceptedMail($participant, $refund->fresh()); + + $this->assertSame([], $mail->attachments()); + $this->assertStringNotContainsString('Anhang', $mail->render()); + } + + /* + |-------------------------------------------------------------------------- + | Gründe als Auswahl fürs Frontend + |-------------------------------------------------------------------------- + */ + + public function test_reason_options_are_ordered_and_flag_the_free_text(): void + { + $options = RefundReason::options(); + + $this->assertSame( + ['sickness', 'event_cancelled', 'other'], + array_column($options, 'value') + ); + $this->assertSame('Krankheitsbedingte Absage', $options[0]['label']); + $this->assertFalse($options[0]['requiresNote']); + $this->assertTrue($options[2]['requiresNote']); + } + + public function test_reason_options_are_served_over_http(): void + { + $this->getJson('/api/v1/core/retrieve-refund-reasons') + ->assertOk() + ->assertJsonCount(3) + ->assertJsonPath('0.value', RefundReason::SICKNESS) + ->assertJsonPath('2.requiresNote', true); + } +} + + diff --git a/tests/Feature/RefundDirectCaptureTest.php b/tests/Feature/RefundDirectCaptureTest.php new file mode 100644 index 0000000..b086f48 --- /dev/null +++ b/tests/Feature/RefundDirectCaptureTest.php @@ -0,0 +1,434 @@ +tenant = Tenant::create([ + 'slug' => 'wm', + 'name' => 'Wilde Möhre', + 'address_1' => 'Musterweg 1', + 'email' => 't@example.com', + 'email_finance' => 'finance@example.com', + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Test e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'invoice_prefix' => 'WM', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $this->tenant); + + DB::table('participation_types')->insert(['slug' => 'participant', 'name' => 'Teilnehmer']); + DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']); + DB::table('cost_unit_types')->insert(['slug' => CostUnitType::COST_UNIT_TYPE_EVENT, 'name' => 'Veranstaltung']); + DB::table('invoice_status')->insert(['slug' => InvoiceStatus::INVOICE_STATUS_NEW]); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION]); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, 'name' => 'Nicht erforderlich']); + + foreach ([UserRole::USER_ROLE_ADMIN, UserRole::USER_ROLE_GROUP_LEADER, UserRole::USER_ROLE_USER] as $role) { + UserRole::create(['slug' => $role, 'name' => $role]); + } + + $this->seedTemplate(); + + // Die Aktionsleitung, die freigibt -- sie landet als `captured_by` am Vorgang. + $this->management = $this->makeUser('Aktions', 'Leitung', UserRole::USER_ROLE_ADMIN); + $this->actingAs($this->management); + + Storage::fake('local'); + Mail::fake(); + } + + private function seedTemplate(): void + { + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_LAYOUT, + 'content' => '
{block:body}
', + 'sort_order' => 10, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_BODY, + 'content' => '{details_table}

{declaration_text}

' + . '{if:capture_note}

{capture_note}

{/if:capture_note}', + 'sort_order' => 20, + ]); + } + + private function makeUser(string $firstname, string $lastname, string $role): User + { + return User::create([ + 'username' => strtolower($lastname) . '-' . uniqid() . '@example.com', + 'email' => strtolower($lastname) . '-' . uniqid() . '@example.com', + 'firstname' => $firstname, + 'lastname' => $lastname, + 'password' => bcrypt('secret'), + 'local_group' => $this->tenant->slug, + 'user_role_main' => $role, + 'user_role_local_group' => UserRole::USER_ROLE_USER, + 'active' => true, + ]); + } + + private function makeEvent(array $attributes = []): Event + { + $fee = EventParticipationFee::create([ + 'tenant' => $this->tenant->slug, + 'type' => 'participant', + 'name' => 'Sippe', + 'description' => null, + 'amount_standard' => 60.0, + 'amount_reduced' => null, + 'amount_solidarity' => null, + ]); + + $costUnit = CostUnit::create([ + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'type' => CostUnitType::COST_UNIT_TYPE_EVENT, + 'distance_allowance' => 0.25, + 'mail_on_new' => false, + 'allow_new' => true, + 'archived' => false, + ]); + + return Event::create(array_merge([ + 'cost_unit_id' => $costUnit->id, + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'identifier' => 'evt-' . uniqid(), + 'location' => 'Ort', + 'postal_code' => '00000', + 'email' => 'e@example.com', + 'start_date' => '2026-07-16', + 'end_date' => '2026-07-20', + 'early_bird_end' => '2026-06-20', + 'registration_final_end' => '2026-07-01', + 'early_bird_end_amount_increase' => 0, + 'account_owner' => 'Owner', + 'account_iban' => 'DE00', + 'participation_fee_type' => 'fixed', + 'participation_fee_1' => $fee->id, + 'pay_per_day' => true, + 'pay_direct' => false, + 'tax_liable' => false, + 'vat_rate' => 0, + 'vat_pricing_mode' => 'inclusive', + 'invoice_key' => 'WM-V-20260701', + ], $attributes)); + } + + private function makeParticipant(?Event $event = null, array $attributes = []): EventParticipant + { + $event ??= $this->makeEvent(); + $this->sequence++; + + return $event->participants()->create(array_merge([ + 'tenant' => $this->tenant->slug, + 'identifier' => 'p-' . uniqid(), + 'invoice_sequence' => $this->sequence, + 'user_id' => $this->makeUser('Mika', 'Muster', UserRole::USER_ROLE_USER)->id, + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'participation_type' => 'participant', + 'fee_type' => 'standard', + 'sibling_reduction' => false, + 'local_group' => $this->tenant->slug, + 'birthday' => '2000-01-01', + 'address_1' => 'Beispielstraße 3', + 'postcode' => '11111', + 'city' => 'Beispielstadt', + 'email_1' => 'mika@example.com', + 'phone_1' => '0170 0000000', + 'arrival_date' => '2026-07-16', + 'departure_date' => '2026-07-20', + 'arrival_eating' => 1, + 'departure_eating' => 1, + 'amount' => 300.0, + 'amount_paid' => 300.0, + 'unregistered_at' => '2026-06-12', + 'payment_purpose' => 'Sommerlager', + 'payment_method' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, + 'efz_status' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, + ], $attributes)); + } + + /** + * Freigabe mit bereits bekannter Bankverbindung. + * + * 220 von 300 gezahlten Euro: Es bleibt etwas beim Verband, deshalb gehört ein Einbehaltungsgrund + * dazu. + */ + private function releaseWithBankDetails( + ?EventParticipant $participant = null, + string $owner = 'Mika Muster', + string $iban = 'DE02120300000000202051', + float $amount = 220.0, + ?string $retentionReason = RetentionReason::CANCELLATION_FEE, + ) { + return new ReleaseRefundCommand(new ReleaseRefundRequest( + participant: $participant ?? $this->makeParticipant(), + amount: new Amount($amount, 'Euro'), + reason: RefundReason::SICKNESS, + accountOwner: $owner, + accountIban: $iban, + retentionReason: $retentionReason, + ))->execute(); + } + + /* + |-------------------------------------------------------------------------- + | Der Vorgang ist sofort abgeschlossen + |-------------------------------------------------------------------------- + */ + + public function test_the_refund_is_submitted_right_away(): void + { + $participant = $this->makeParticipant(); + + $response = $this->releaseWithBankDetails($participant); + + $this->assertTrue($response->success); + $this->assertStringContainsString('eingereicht', $response->message); + + $refund = ParticipantRefund::first(); + $this->assertSame(ParticipantRefund::STATUS_ACCEPTED, $refund->status); + $this->assertSame('Mika Muster', $refund->account_owner); + $this->assertSame('DE02120300000000202051', $refund->account_iban); + $this->assertNotNull($refund->accepted_at); + } + + public function test_the_capturing_person_is_recorded(): void + { + $this->releaseWithBankDetails(); + + $refund = ParticipantRefund::first(); + + $this->assertSame($this->management->id, $refund->captured_by); + $this->assertTrue($refund->wasCapturedByManagement()); + } + + public function test_the_invoice_exists_and_the_paid_amount_is_settled(): void + { + $participant = $this->makeParticipant(); + + $this->releaseWithBankDetails($participant); + + $invoice = Invoice::first(); + $this->assertNotNull($invoice); + $this->assertEqualsWithDelta(220.0, $invoice->amount, 0.001); + $this->assertSame($invoice->id, ParticipantRefund::first()->invoice_id); + + // 300 gezahlt, 220 erstattet -- die restlichen 80 bleiben beim Verband und werden dort geführt. + $this->assertEqualsWithDelta(80.0, $participant->fresh()->amount_paid->getAmount(), 0.001); + } + + public function test_a_full_refund_leaves_nothing_behind(): void + { + $participant = $this->makeParticipant(); + + $this->releaseWithBankDetails($participant, amount: 300.0, retentionReason: null); + + $this->assertEqualsWithDelta(0.0, $participant->fresh()->amount_paid->getAmount(), 0.001); + $this->assertEqualsWithDelta(0.0, ParticipantRefund::first()->retained_amount->getAmount(), 0.001); + $this->assertNull(ParticipantRefund::first()->retention_reason); + } + + public function test_only_the_receipt_mail_goes_out(): void + { + $this->releaseWithBankDetails(); + + // Es gibt nichts einzutragen -- die Mail mit dem Bestätigungslink wäre sinnlos. + Mail::assertNotSent(RefundReleasedMail::class); + Mail::assertSent(RefundAcceptedMail::class); + } + + /* + |-------------------------------------------------------------------------- + | Der Beleg weist aus, wer die Angaben aufgenommen hat + |-------------------------------------------------------------------------- + */ + + public function test_the_receipt_names_who_captured_the_details(): void + { + $this->releaseWithBankDetails(); + + $html = $this->renderReceipt(ParticipantRefund::first()); + + // Ohne diesen Vermerk läse sich die Erklärung wie eine Bestätigung des Teilis selbst. + $this->assertStringContainsString('Angaben aufgenommen durch Aktions Leitung am', $html); + $this->assertStringContainsString('Ich versichere', $html); + } + + public function test_the_receipt_carries_no_note_when_the_participant_confirmed(): void + { + // Gegenprobe: der gewöhnliche Weg bleibt unverändert. + $refund = new ReleaseRefundCommand(new ReleaseRefundRequest( + participant: $this->makeParticipant(), + amount: new Amount(220.0, 'Euro'), + reason: RefundReason::SICKNESS, + retentionReason: RetentionReason::CANCELLATION_FEE, + ))->execute()->refund; + + $refund->update([ + 'status' => ParticipantRefund::STATUS_ACCEPTED, + 'account_owner' => 'Mika Muster', + 'account_iban' => 'DE02120300000000202051', + 'accepted_at' => now(), + ]); + + $this->assertStringNotContainsString('aufgenommen durch', $this->renderReceipt($refund->fresh())); + } + + private function renderReceipt(ParticipantRefund $refund): string + { + $command = new CreateRefundDocumentCommand(new CreateRefundDocumentRequest($refund)); + $number = new \ReflectionMethod($command, 'documentNumber')->invoke($command); + $tokens = new \ReflectionMethod($command, 'buildTokens')->invoke($command, $number); + + return new \App\Providers\DocumentTemplateRenderProvider( + DocumentTemplate::TYPE_PARTICIPANT_REFUND + )->render($tokens); + } + + /* + |-------------------------------------------------------------------------- + | Abgelehnte Eingaben -- es gibt keine zweite Gelegenheit zu berichtigen + |-------------------------------------------------------------------------- + */ + + public function test_an_invalid_iban_stops_everything(): void + { + // Gültige Struktur, falsche Prüfziffer -- ein klassischer Zahlendreher. + $response = $this->releaseWithBankDetails(iban: 'DE02120300000000202015'); + + $this->assertFalse($response->success); + $this->assertStringContainsString('IBAN', $response->message); + $this->assertSame(0, ParticipantRefund::count()); + $this->assertSame(0, Invoice::count()); + } + + public function test_half_filled_bank_details_are_refused(): void + { + $response = new ReleaseRefundCommand(new ReleaseRefundRequest( + participant: $this->makeParticipant(), + amount: new Amount(220.0, 'Euro'), + reason: RefundReason::SICKNESS, + accountOwner: 'Mika Muster', + ))->execute(); + + $this->assertFalse($response->success); + $this->assertSame(0, ParticipantRefund::count()); + } + + public function test_without_a_cost_unit_nothing_is_created(): void + { + $participant = $this->makeParticipant($this->makeEvent(['cost_unit_id' => null])); + + $response = $this->releaseWithBankDetails($participant); + + $this->assertFalse($response->success); + $this->assertStringContainsString('Kostenstelle', $response->message); + $this->assertSame(0, ParticipantRefund::count()); + $this->assertSame(0, Invoice::count()); + // Der gezahlte Beitrag bleibt unangetastet. + $this->assertEqualsWithDelta(300.0, $participant->fresh()->amount_paid->getAmount(), 0.001); + } + + /* + |-------------------------------------------------------------------------- + | Über HTTP + |-------------------------------------------------------------------------- + */ + + public function test_release_over_http_submits_directly(): void + { + $participant = $this->makeParticipant(); + + $this->postJson('/api/v1/participant-refund/' . $participant->identifier . '/release', [ + 'amount' => '220,00', + 'reason' => RefundReason::SICKNESS, + // 220 von 300 -- der Rest bleibt beim Verband und braucht eine Begründung. + 'retentionReason' => RetentionReason::CANCELLATION_FEE, + 'accountOwner' => 'Mika Muster', + 'accountIban' => 'DE02 1203 0000 0000 2020 51', + ]) + ->assertOk() + ->assertJsonPath('status', 'success') + ->assertJsonPath('refund.status', ParticipantRefund::STATUS_ACCEPTED); + + $this->assertNotNull(ParticipantRefund::first()->invoice_id); + } + + public function test_release_over_http_without_bank_details_keeps_the_old_way(): void + { + $participant = $this->makeParticipant(); + + $this->postJson('/api/v1/participant-refund/' . $participant->identifier . '/release', [ + 'amount' => '220,00', + 'reason' => RefundReason::SICKNESS, + // 220 von 300 -- der Rest bleibt beim Verband und braucht eine Begründung. + 'retentionReason' => RetentionReason::CANCELLATION_FEE, + 'accountOwner' => '', + 'accountIban' => '', + ]) + ->assertOk() + ->assertJsonPath('refund.status', ParticipantRefund::STATUS_PENDING); + + Mail::assertSent(RefundReleasedMail::class); + $this->assertSame(0, Invoice::count()); + $this->assertNull(ParticipantRefund::first()->captured_by); + } +} diff --git a/tests/Feature/RefundDocumentTest.php b/tests/Feature/RefundDocumentTest.php new file mode 100644 index 0000000..f399337 --- /dev/null +++ b/tests/Feature/RefundDocumentTest.php @@ -0,0 +1,434 @@ +tenant = Tenant::create([ + 'slug' => 'wm', + 'name' => 'Wilde Möhre', + 'invoice_sender_name' => 'Wilde Möhre e.V.', + 'address_1' => 'Musterweg 1', + 'email' => 't@example.com', + 'email_finance' => 'finance@example.com', + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Test e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Lommatzsch', + 'postcode' => '01623', + 'invoice_prefix' => 'WM', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $this->tenant); + + DB::table('participation_types')->insert(['slug' => 'participant', 'name' => 'Teilnehmer']); + DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION]); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, 'name' => 'Nicht erforderlich']); + + $this->seedTemplate(); + } + + /** Die Vorlage setzt hier jeden Platzhalter ein, damit die Tests am gerenderten HTML prüfen können. */ + private function seedTemplate(): void + { + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_LAYOUT, + 'content' => '
{block:header_recipient}{block:subject}{block:body}
', + 'sort_order' => 10, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => 'header_recipient', + 'content' => '

{recipient_name} / {recipient_address_1} / {recipient_postcode} {recipient_city}

', + 'sort_order' => 35, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_STYLE, + 'content' => 'body { font-size: 10pt; }', + 'sort_order' => 20, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => 'subject', + 'content' => '

Rückerstattung {document_number}

' + . '

{document_date} / {event_name} / {service_period} / {unregistered_at}

' + . '

{sender_name} / {recipient_name}

', + 'sort_order' => 30, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_BODY, + 'content' => '{details_table}

{refund_amount} / {refund_reason} / {refund_reason_text}

' + . '

{account_owner} / {account_iban}

' + . '

{paid_amount} / {invoice_number}

' + . '

{declaration_text}

', + 'sort_order' => 40, + ]); + } + + private function makeEvent(array $attributes = []): Event + { + $fee = EventParticipationFee::create([ + 'tenant' => $this->tenant->slug, + 'type' => 'participant', + 'name' => 'Sippe', + 'description' => null, + 'amount_standard' => 60.0, + 'amount_reduced' => null, + 'amount_solidarity' => null, + ]); + + return Event::create(array_merge([ + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'identifier' => 'evt-' . uniqid(), + 'location' => 'Ort', + 'postal_code' => '00000', + 'email' => 'e@example.com', + 'start_date' => '2026-07-16', + 'end_date' => '2026-07-20', + 'early_bird_end' => '2026-06-20', + 'registration_final_end' => '2026-07-01', + 'early_bird_end_amount_increase' => 0, + 'account_owner' => 'Owner', + 'account_iban' => 'DE00', + 'participation_fee_type' => 'fixed', + 'participation_fee_1' => $fee->id, + 'pay_per_day' => true, + 'pay_direct' => false, + 'tax_liable' => false, + 'vat_rate' => 0, + 'vat_pricing_mode' => 'inclusive', + 'invoice_key' => 'WM-V-20260701', + ], $attributes)); + } + + private function makeParticipant(Event $event, array $attributes = []): EventParticipant + { + return $event->participants()->create(array_merge([ + 'tenant' => $this->tenant->slug, + 'identifier' => 'p-' . uniqid(), + 'invoice_sequence' => 5, + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'participation_type' => 'participant', + 'fee_type' => 'standard', + 'sibling_reduction' => false, + 'local_group' => $this->tenant->slug, + 'birthday' => '2000-01-01', + 'address_1' => 'Beispielstraße 3', + 'postcode' => '11111', + 'city' => 'Beispielstadt', + 'email_1' => 'mika@example.com', + 'phone_1' => '0170 0000000', + 'arrival_date' => '2026-07-16', + 'departure_date' => '2026-07-20', + 'arrival_eating' => 1, + 'departure_eating' => 1, + 'amount' => 300.0, + 'amount_paid' => 300.0, + 'unregistered_at' => '2026-06-12', + 'payment_purpose' => 'Sommerlager', + 'payment_method' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, + 'efz_status' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, + ], $attributes)); + } + + /** Ein bestätigter Vorgang -- der Beleg entsteht erst dann. */ + private function makeRefund(array $attributes = [], array $eventAttributes = []): ParticipantRefund + { + $event = $this->makeEvent($eventAttributes); + $participant = $this->makeParticipant($event); + + return ParticipantRefund::create(array_merge([ + 'tenant' => $this->tenant->slug, + 'event_id' => $event->id, + 'event_participant_id' => $participant->id, + 'token' => str_repeat('a', 32), + 'status' => ParticipantRefund::STATUS_ACCEPTED, + 'amount' => 300.0, + 'reason' => RefundReason::SICKNESS, + 'account_owner' => 'Mika Muster', + 'account_iban' => 'DE02120300000000202051', + 'released_at' => '2026-06-14 10:00:00', + 'accepted_at' => '2026-06-18 09:30:00', + ], $attributes)); + } + + private function document(ParticipantRefund $refund) + { + return new CreateRefundDocumentCommand(new CreateRefundDocumentRequest($refund))->execute(); + } + + /** Das gerenderte HTML -- die Zwischenstufe vor dem PDF, an der sich der Inhalt prüfen lässt. */ + private function html(ParticipantRefund $refund): string + { + $command = new CreateRefundDocumentCommand(new CreateRefundDocumentRequest($refund)); + $number = new ReflectionMethod($command, 'documentNumber')->invoke($command); + $tokens = new ReflectionMethod($command, 'buildTokens')->invoke($command, $number); + + return new DocumentTemplateRenderProvider(DocumentTemplate::TYPE_PARTICIPANT_REFUND)->render($tokens); + } + + /* + |-------------------------------------------------------------------------- + | Nummer und PDF + |-------------------------------------------------------------------------- + */ + + public function test_document_number_extends_the_invoice_number(): void + { + $response = $this->document($this->makeRefund()); + + $this->assertTrue($response->success); + $this->assertSame('WM-V-20260701-0005-R', $response->documentNumber); + $this->assertSame('Rueckerstattung-WM-V-20260701-0005-R.pdf', $response->filename); + } + + public function test_a_pdf_is_produced(): void + { + $response = $this->document($this->makeRefund()); + + $this->assertStringStartsWith('%PDF', $response->pdfContent); + } + + public function test_no_document_without_an_invoice_key(): void + { + $response = $this->document($this->makeRefund(eventAttributes: ['invoice_key' => null])); + + $this->assertFalse($response->success); + $this->assertStringContainsString('Belegnummer', $response->message); + } + + public function test_no_document_before_the_participant_confirmed(): void + { + $response = $this->document($this->makeRefund([ + 'status' => ParticipantRefund::STATUS_PENDING, + 'account_owner' => null, + 'account_iban' => null, + 'accepted_at' => null, + ])); + + $this->assertFalse($response->success); + $this->assertStringContainsString('bestätigt', $response->message); + } + + /* + |-------------------------------------------------------------------------- + | Inhalt + |-------------------------------------------------------------------------- + */ + + public function test_document_shows_amount_reason_and_bank_details(): void + { + $html = $this->html($this->makeRefund()); + + $this->assertStringContainsString('300,00', $html); + $this->assertStringContainsString('Krankheitsbedingte Absage', $html); + $this->assertStringContainsString('Die Teilnahme konnte krankheitsbedingt nicht angetreten werden.', $html); + $this->assertStringContainsString('Mika Muster', $html); + // Im Beleg steht die IBAN in Vierergruppen. + $this->assertStringContainsString('DE02 1203 0000 0000 2020 51', $html); + } + + public function test_document_shows_event_period_and_cancellation_date(): void + { + $html = $this->html($this->makeRefund()); + + $this->assertStringContainsString('Sommerlager', $html); + $this->assertStringContainsString('16.07.2026 – 20.07.2026', $html); + $this->assertStringContainsString('12.06.2026', $html); + // Belegdatum ist der Tag der Bestätigung. + $this->assertStringContainsString('18.06.2026', $html); + } + + public function test_the_reason_is_a_row_in_the_table_not_a_block_below_it(): void + { + $refund = $this->makeRefund(); + + $command = new CreateRefundDocumentCommand(new CreateRefundDocumentRequest($refund)); + $details = new ReflectionMethod($command, 'renderDetails')->invoke($command); + + $this->assertStringContainsString( + 'Begründung' + . 'Die Teilnahme konnte krankheitsbedingt nicht angetreten werden.', + $details + ); + + // Der frühere Fließtext-Block unter der Tabelle ist verschwunden. + $this->assertStringNotContainsString('reason-note', $details); + $this->assertStringEndsWith('', $details); + } + + public function test_the_reason_row_is_dropped_when_there_is_no_text(): void + { + RefundReason::find(RefundReason::SICKNESS)->update(['document_text' => '']); + + $command = new CreateRefundDocumentCommand(new CreateRefundDocumentRequest($this->makeRefund())); + $details = new ReflectionMethod($command, 'renderDetails')->invoke($command); + + // Eine Beschriftung ohne Wert sieht auf einem Beleg nach Fehler aus. + $this->assertStringNotContainsString('Begründung', $details); + $this->assertStringContainsString('Krankheitsbedingte Absage', $details); + } + + public function test_the_table_lists_the_rows_in_reading_order(): void + { + $command = new CreateRefundDocumentCommand(new CreateRefundDocumentRequest($this->makeRefund())); + $details = new ReflectionMethod($command, 'renderDetails')->invoke($command); + + preg_match_all('/([^<]+)<\/td>/', $details, $matches); + + // Erst wer erklärt, dann worauf sich die Erstattung bezieht, dann warum, dann wohin das Geld geht. + $this->assertSame( + [ + 'Name', + 'Gezahlter Teilnahmebeitrag', + 'Rechnung', + 'Erstattungsbetrag', + 'Grund', + 'Begründung', + 'Kontoinhaber*in', + 'IBAN', + ], + $matches[1] + ); + } + + public function test_the_document_carries_no_contact_details(): void + { + // Für die Abrechnung genügen Name und Anschrift; E-Mail und Telefon gehören nicht auf einen + // Beleg, der durch die Buchhaltung und ins Archiv wandert. + $html = $this->html($this->makeRefund()); + + $this->assertStringNotContainsString('mika@example.com', $html); + $this->assertStringNotContainsString('0170 0000000', $html); + } + + public function test_document_shows_the_paid_amount_next_to_the_refund(): void + { + // Teilerstattung: 220 von 300 gezahlten Euro. + $html = $this->html($this->makeRefund(['amount' => 220.0])); + + $this->assertStringContainsString('300,00', $html); + $this->assertStringContainsString('220,00', $html); + // Die Nummer der Teilnahmerechnung, ohne das -R des Belegs. + $this->assertStringContainsString('WM-V-20260701-0005', $html); + } + + public function test_document_carries_the_declaration(): void + { + $html = $this->html($this->makeRefund()); + + $this->assertStringContainsString('Ich versichere, dass ich den genannten Betrag beglichen habe', $html); + } + + public function test_the_declaration_comes_from_the_page_text(): void + { + DB::table('page_texts') + ->where('name', CreateRefundDocumentCommand::DECLARATION_TEXT) + ->update(['content' => 'Eigener Wortlaut des Verbands.']); + + $this->assertStringContainsString('Eigener Wortlaut des Verbands.', $this->html($this->makeRefund())); + } + + public function test_the_declaration_falls_back_when_the_page_text_is_missing(): void + { + // Ohne Rückfallwert stünde hier ein Fatal Error auf null -- der Beleg muss trotzdem entstehen. + DB::table('page_texts')->where('name', CreateRefundDocumentCommand::DECLARATION_TEXT)->delete(); + + $this->assertStringContainsString('Ich versichere', $this->html($this->makeRefund())); + } + + public function test_free_text_reason_replaces_the_catalog_text(): void + { + $html = $this->html($this->makeRefund([ + 'reason' => RefundReason::OTHER, + 'reason_note' => 'Umzug in ein anderes Bundesland', + ])); + + $this->assertStringContainsString('Sonstiger Grund', $html); + $this->assertStringContainsString('Umzug in ein anderes Bundesland', $html); + $this->assertStringNotContainsString('krankheitsbedingt', $html); + } + + public function test_sender_is_read_live_from_the_tenant(): void + { + $refund = $this->makeRefund(); + + $this->tenant->update(['invoice_sender_name' => 'Neuer Name e.V.']); + + $this->assertStringContainsString('Neuer Name e.V.', $this->html($refund)); + } + + public function test_single_day_event_shows_one_date(): void + { + $html = $this->html($this->makeRefund(eventAttributes: [ + 'start_date' => '2026-07-16', + 'end_date' => '2026-07-16', + ])); + + $this->assertStringContainsString('16.07.2026', $html); + $this->assertStringNotContainsString('–', $html); + } + + /* + |-------------------------------------------------------------------------- + | Katalog und Werte müssen dieselben Namen kennen + |-------------------------------------------------------------------------- + */ + + public function test_token_catalog_matches_the_generated_values(): void + { + $command = new CreateRefundDocumentCommand(new CreateRefundDocumentRequest($this->makeRefund())); + $tokens = new ReflectionMethod($command, 'buildTokens')->invoke($command, 'WM-V-20260701-0005-R'); + + $catalog = ParticipantRefundTokens::names(); + sort($catalog); + + $generated = array_keys($tokens); + sort($generated); + + $this->assertSame($catalog, $generated); + } +} diff --git a/tests/Feature/RefundInvoiceTest.php b/tests/Feature/RefundInvoiceTest.php new file mode 100644 index 0000000..936297b --- /dev/null +++ b/tests/Feature/RefundInvoiceTest.php @@ -0,0 +1,436 @@ +tenant = Tenant::create([ + 'slug' => 'wm', + 'name' => 'Wilde Möhre', + 'address_1' => 'Musterweg 1', + 'email' => 't@example.com', + 'email_finance' => 'finance@example.com', + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Test e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'invoice_prefix' => 'WM', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $this->tenant); + + DB::table('participation_types')->insert(['slug' => 'participant', 'name' => 'Teilnehmer']); + DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']); + DB::table('cost_unit_types')->insert(['slug' => CostUnitType::COST_UNIT_TYPE_EVENT, 'name' => 'Veranstaltung']); + DB::table('invoice_status')->insert(['slug' => InvoiceStatus::INVOICE_STATUS_NEW]); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION]); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, 'name' => 'Nicht erforderlich']); + + foreach ([UserRole::USER_ROLE_ADMIN, UserRole::USER_ROLE_GROUP_LEADER, UserRole::USER_ROLE_USER] as $role) { + UserRole::create(['slug' => $role, 'name' => $role]); + } + + $this->seedTemplate(); + + // Der Beleg wird als Datei abgelegt -- ohne Fake landete er im echten Storage. + Storage::fake('local'); + Mail::fake(); + } + + private function seedTemplate(): void + { + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_LAYOUT, + 'content' => '
{block:body}
', + 'sort_order' => 10, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_BODY, + 'content' => '
{recipient_name}
{details_table}', + 'sort_order' => 20, + ]); + } + + private function makeCostUnit(array $attributes = []): CostUnit + { + return CostUnit::create(array_merge([ + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'type' => CostUnitType::COST_UNIT_TYPE_EVENT, + 'distance_allowance' => 0.25, + 'mail_on_new' => false, + 'allow_new' => true, + 'archived' => false, + ], $attributes)); + } + + private function makeEvent(array $attributes = []): Event + { + $fee = EventParticipationFee::create([ + 'tenant' => $this->tenant->slug, + 'type' => 'participant', + 'name' => 'Sippe', + 'description' => null, + 'amount_standard' => 60.0, + 'amount_reduced' => null, + 'amount_solidarity' => null, + ]); + + return Event::create(array_merge([ + 'cost_unit_id' => $this->makeCostUnit()->id, + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'identifier' => 'evt-' . uniqid(), + 'location' => 'Ort', + 'postal_code' => '00000', + 'email' => 'e@example.com', + 'start_date' => '2026-07-16', + 'end_date' => '2026-07-20', + 'early_bird_end' => '2026-06-20', + 'registration_final_end' => '2026-07-01', + 'early_bird_end_amount_increase' => 0, + 'account_owner' => 'Owner', + 'account_iban' => 'DE00', + 'participation_fee_type' => 'fixed', + 'participation_fee_1' => $fee->id, + 'pay_per_day' => true, + 'pay_direct' => false, + 'tax_liable' => false, + 'vat_rate' => 0, + 'vat_pricing_mode' => 'inclusive', + 'invoice_key' => 'WM-V-20260701', + ], $attributes)); + } + + private function makeUser(): User + { + return User::create([ + 'username' => 'teili-' . uniqid() . '@example.com', + 'email' => 'teili-' . uniqid() . '@example.com', + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'password' => bcrypt('secret'), + 'local_group' => $this->tenant->slug, + 'user_role_main' => UserRole::USER_ROLE_USER, + 'user_role_local_group' => UserRole::USER_ROLE_USER, + 'active' => true, + ]); + } + + private function makeParticipant(Event $event, array $attributes = []): EventParticipant + { + $this->sequence++; + + return $event->participants()->create(array_merge([ + 'tenant' => $this->tenant->slug, + 'identifier' => 'p-' . uniqid(), + 'invoice_sequence' => $this->sequence, + 'user_id' => $this->makeUser()->id, + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'participation_type' => 'participant', + 'fee_type' => 'standard', + 'sibling_reduction' => false, + 'local_group' => $this->tenant->slug, + 'birthday' => '2000-01-01', + 'address_1' => 'Beispielstraße 3', + 'postcode' => '11111', + 'city' => 'Beispielstadt', + 'email_1' => 'mika@example.com', + 'phone_1' => '0170 0000000', + 'arrival_date' => '2026-07-16', + 'departure_date' => '2026-07-20', + 'arrival_eating' => 1, + 'departure_eating' => 1, + 'amount' => 300.0, + 'amount_paid' => 300.0, + 'unregistered_at' => '2026-06-12', + 'payment_purpose' => 'Sommerlager', + 'payment_method' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, + 'efz_status' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, + ], $attributes)); + } + + /** + * Der ganze Ablauf: Freigabe durch die Aktionsleitung, Bestätigung durch den Teili. + * + * 220 von 300 gezahlten Euro -- es bleibt etwas beim Verband, deshalb der Einbehaltungsgrund. + */ + private function runRefund( + ?EventParticipant $participant = null, + float $amount = 220.0, + string $reason = RefundReason::SICKNESS, + ?string $retentionReason = RetentionReason::CANCELLATION_FEE, + ): ParticipantRefund { + $participant ??= $this->makeParticipant($this->makeEvent()); + + $refund = new ReleaseRefundCommand(new ReleaseRefundRequest( + participant: $participant, + amount: new Amount($amount, 'Euro'), + reason: $reason, + retentionReason: $retentionReason, + ))->execute()->refund; + + new AcceptRefundCommand(new AcceptRefundRequest( + refund: $refund, + accountOwner: 'Mika Muster', + accountIban: 'DE02120300000000202051', + declarationAccepted: true, + ))->execute(); + + return $refund->fresh(); + } + + /* + |-------------------------------------------------------------------------- + | Die Abrechnung entsteht + |-------------------------------------------------------------------------- + */ + + public function test_confirming_creates_an_invoice_on_the_events_cost_unit(): void + { + $event = $this->makeEvent(); + $this->runRefund($this->makeParticipant($event)); + + $invoice = Invoice::first(); + + $this->assertNotNull($invoice); + $this->assertSame(InvoiceStatus::INVOICE_STATUS_NEW, $invoice->status); + $this->assertSame(InvoiceType::INVOICE_TYPE_PARTICIPATION_REFUND, $invoice->type); + $this->assertSame($event->cost_unit_id, $invoice->cost_unit_id); + $this->assertEqualsWithDelta(220.0, $invoice->amount, 0.001); + $this->assertFalse((bool) $invoice->donation); + } + + public function test_contact_details_come_from_the_participant(): void + { + $this->runRefund(); + + $invoice = Invoice::first(); + + $this->assertSame('Mika Muster', $invoice->contact_name); + $this->assertSame('mika@example.com', $invoice->contact_email); + $this->assertSame('0170 0000000', $invoice->contact_phone); + } + + public function test_bank_details_come_from_the_refund_not_the_participant(): void + { + $this->runRefund(); + + $invoice = Invoice::first(); + + $this->assertSame('Mika Muster', $invoice->contact_bank_owner); + $this->assertSame('DE02120300000000202051', $invoice->contact_bank_iban); + } + + public function test_the_invoice_belongs_to_the_participants_user_account(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $this->runRefund($participant); + + $invoice = Invoice::first(); + + $this->assertSame($participant->user_id, $invoice->user_id); + // Ohne das bliebe die Verknüpfung wirkungslos: CreateInvoiceCommand verwirft die user_id, + // sobald ein Verwendungszweck gesetzt ist. + $this->assertNull($invoice->payment_purpose); + } + + public function test_an_anonymous_participant_still_gets_an_invoice(): void + { + $participant = $this->makeParticipant($this->makeEvent(), ['user_id' => null]); + $this->runRefund($participant); + + $invoice = Invoice::first(); + + $this->assertNotNull($invoice); + $this->assertNull($invoice->user_id); + } + + public function test_the_notice_names_event_reason_and_the_amount_paid(): void + { + $this->runRefund(); + + // Der gezahlte Beitrag gehört in die Anmerkung, weil er am Teilnehmer gleich auf 0 gesetzt wird -- + // sonst könnte die Schatzmeisterei den Vorgang nicht mehr nachvollziehen. + $this->assertSame( + 'Rückerstattung Teilnahmebeitrag Sommerlager – Krankheitsbedingte Absage' + . ' | Gezahlter Beitrag vor Erstattung: 300,00 Euro', + Invoice::first()->comment + ); + } + + public function test_a_long_notice_keeps_the_amount_paid(): void + { + $event = $this->makeEvent(['name' => str_repeat('Sehr langer Veranstaltungsname ', 12)]); + $this->runRefund($this->makeParticipant($event)); + + $comment = Invoice::first()->comment; + + // Gekürzt wird nur der freie Teil -- der Betrag darf nie wegfallen. + $this->assertStringContainsString('Gezahlter Beitrag vor Erstattung: 300,00 Euro', $comment); + $this->assertLessThanOrEqual(255, strlen($comment), 'Die Spalte `comment` fasst 255 Zeichen.'); + } + + /* + |-------------------------------------------------------------------------- + | Der Eigenbeleg hängt an der Abrechnung + |-------------------------------------------------------------------------- + */ + + public function test_the_receipt_is_attached_and_stored(): void + { + $event = $this->makeEvent(); + $this->runRefund($this->makeParticipant($event)); + + $invoice = Invoice::first(); + + $this->assertNotNull($invoice->document_filename); + // Dasselbe Ablagemuster wie bei hochgeladenen Belegen. + $this->assertStringStartsWith('wm/invoices/' . $event->cost_unit_id . '/', $invoice->document_filename); + $this->assertStringEndsWith('.pdf', $invoice->document_filename); + + Storage::disk('local')->assertExists($invoice->document_filename); + $this->assertStringStartsWith('%PDF', Storage::disk('local')->get($invoice->document_filename)); + } + + public function test_the_refund_points_at_its_invoice(): void + { + $refund = $this->runRefund(); + + $this->assertSame(Invoice::first()->id, $refund->invoice_id); + $this->assertSame(Invoice::first()->invoice_number, $refund->invoice()->first()->invoice_number); + } + + /* + |-------------------------------------------------------------------------- + | Die Kostenstelle + |-------------------------------------------------------------------------- + */ + + public function test_without_a_cost_unit_nothing_is_stored(): void + { + $participant = $this->makeParticipant($this->makeEvent(['cost_unit_id' => null])); + + $refund = new ReleaseRefundCommand(new ReleaseRefundRequest( + participant: $participant, + amount: new Amount(220.0, 'Euro'), + reason: RefundReason::SICKNESS, + retentionReason: RetentionReason::CANCELLATION_FEE, + ))->execute()->refund; + + $response = new AcceptRefundCommand(new AcceptRefundRequest( + refund: $refund, + accountOwner: 'Mika Muster', + accountIban: 'DE02120300000000202051', + declarationAccepted: true, + ))->execute(); + + $this->assertFalse($response->success); + $this->assertStringContainsString('Aktionsleitung', $response->message); + + // Der Vorgang bleibt offen, damit die Aktionsleitung nachbessern kann. + $refund->refresh(); + $this->assertSame(ParticipantRefund::STATUS_PENDING, $refund->status); + $this->assertNull($refund->account_iban); + $this->assertSame(0, Invoice::count()); + } + + public function test_a_closed_cost_unit_is_still_booked(): void + { + // Erstattungen fallen oft erst an, wenn die Abrechnungsfrist der Veranstaltung längst durch ist. + $costUnit = $this->makeCostUnit(['allow_new' => false]); + $event = $this->makeEvent(['cost_unit_id' => $costUnit->id]); + + $this->runRefund($this->makeParticipant($event)); + + $this->assertSame($costUnit->id, Invoice::first()->cost_unit_id); + } + + /* + |-------------------------------------------------------------------------- + | Der reguläre Weg läuft mit + |-------------------------------------------------------------------------- + */ + + public function test_the_standard_confirmation_mail_is_sent(): void + { + $this->runRefund(); + + // Die Quittung des Abrechnungssystems -- zusätzlich zu unserer Mail mit dem Beleg. + Mail::assertSent(InvoiceMailsSubmittedConfirmationMail::class); + } + + public function test_amount_paid_is_settled_once_the_invoice_exists(): void + { + $participant = $this->makeParticipant($this->makeEvent()); + $this->runRefund($participant); + + // 300 gezahlt, 220 erstattet: `amount_paid` führt danach den Rest, der beim Verband bleibt. + $this->assertEqualsWithDelta(80.0, $participant->fresh()->amount_paid->getAmount(), 0.001); + + // Der Sollbetrag bleibt: was der Teili hätte zahlen müssen, ändert die Erstattung nicht. + $this->assertEqualsWithDelta(300.0, $participant->fresh()->amount->getAmount(), 0.001); + } + + public function test_the_receipt_is_written_before_the_amount_is_settled(): void + { + $refund = $this->runRefund(); + + // Reihenfolge-Falle: Beleg und Anmerkung weisen den gezahlten Beitrag aus. Wird zu früh + // verrechnet, stünden dort 80,00 € statt 300,00 €. Der Beleg selbst liegt als PDF vor; + // nachprüfbar ist die Reihenfolge an der Anmerkung, die im selben Schritt entsteht. + $this->assertStringContainsString('300,00 Euro', Invoice::first()->comment); + $this->assertEqualsWithDelta(80.0, $refund->participant->fresh()->amount_paid->getAmount(), 0.001); + } +} diff --git a/tests/Feature/RefundRetentionTest.php b/tests/Feature/RefundRetentionTest.php new file mode 100644 index 0000000..04cf6ad --- /dev/null +++ b/tests/Feature/RefundRetentionTest.php @@ -0,0 +1,407 @@ +tenant = Tenant::create([ + 'slug' => 'wm', + 'name' => 'Wilde Möhre', + 'address_1' => 'Musterweg 1', + 'email' => 't@example.com', + 'email_finance' => 'finance@example.com', + 'url' => parse_url(config('app.url'), PHP_URL_HOST), + 'account_name' => 'Test e.V.', + 'account_iban' => 'DE00', + 'account_bic' => 'XY', + 'city' => 'Stadt', + 'postcode' => '00000', + 'invoice_prefix' => 'WM', + 'is_active_local_group' => true, + 'has_active_instance' => true, + ]); + + app()->instance('tenant', $this->tenant); + + DB::table('participation_types')->insert(['slug' => 'participant', 'name' => 'Teilnehmer']); + DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']); + DB::table('cost_unit_types')->insert(['slug' => CostUnitType::COST_UNIT_TYPE_EVENT, 'name' => 'Veranstaltung']); + DB::table('invoice_status')->insert(['slug' => InvoiceStatus::INVOICE_STATUS_NEW]); + PaymentMethod::create(['slug' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION]); + EfzStatus::create(['slug' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, 'name' => 'Nicht erforderlich']); + + foreach ([UserRole::USER_ROLE_ADMIN, UserRole::USER_ROLE_GROUP_LEADER, UserRole::USER_ROLE_USER] as $role) { + UserRole::create(['slug' => $role, 'name' => $role]); + } + + $this->seedTemplate(); + + Storage::fake('local'); + Mail::fake(); + } + + /** Die Vorlage setzt den Datenblock ein -- daran lassen sich die Belegzeilen prüfen. */ + private function seedTemplate(): void + { + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_LAYOUT, + 'content' => '
{block:body}
', + 'sort_order' => 10, + ]); + + DocumentTemplate::create([ + 'document_type' => DocumentTemplate::TYPE_PARTICIPANT_REFUND, + 'block' => DocumentTemplate::BLOCK_BODY, + 'content' => '{details_table}

{retained_amount} / {retention_note}

', + 'sort_order' => 20, + ]); + } + + private function makeEvent(): Event + { + $fee = EventParticipationFee::create([ + 'tenant' => $this->tenant->slug, + 'type' => 'participant', + 'name' => 'Sippe', + 'description' => null, + 'amount_standard' => 60.0, + 'amount_reduced' => null, + 'amount_solidarity' => null, + ]); + + $costUnit = CostUnit::create([ + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'type' => CostUnitType::COST_UNIT_TYPE_EVENT, + 'distance_allowance' => 0.25, + 'mail_on_new' => false, + 'allow_new' => true, + 'archived' => false, + ]); + + return Event::create([ + 'cost_unit_id' => $costUnit->id, + 'tenant' => $this->tenant->slug, + 'name' => 'Sommerlager', + 'identifier' => 'evt-' . uniqid(), + 'location' => 'Ort', + 'postal_code' => '00000', + 'email' => 'e@example.com', + 'start_date' => '2026-07-16', + 'end_date' => '2026-07-20', + 'early_bird_end' => '2026-06-20', + 'registration_final_end' => '2026-07-01', + 'early_bird_end_amount_increase' => 0, + 'account_owner' => 'Owner', + 'account_iban' => 'DE00', + 'participation_fee_type' => 'fixed', + 'participation_fee_1' => $fee->id, + 'pay_per_day' => true, + 'pay_direct' => false, + 'tax_liable' => false, + 'vat_rate' => 0, + 'vat_pricing_mode' => 'inclusive', + // Je Test können mehrere Veranstaltungen entstehen; der Schlüssel ist eindeutig. + 'invoice_key' => 'WM-V-2026070' . ($this->sequence + 1), + ]); + } + + private function makeParticipant(array $attributes = []): EventParticipant + { + $this->sequence++; + + $user = User::create([ + 'username' => 'teili-' . uniqid() . '@example.com', + 'email' => 'teili-' . uniqid() . '@example.com', + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'password' => bcrypt('secret'), + 'local_group' => $this->tenant->slug, + 'user_role_main' => UserRole::USER_ROLE_USER, + 'user_role_local_group' => UserRole::USER_ROLE_USER, + 'active' => true, + ]); + + return $this->makeEvent()->participants()->create(array_merge([ + 'tenant' => $this->tenant->slug, + 'identifier' => 'p-' . uniqid(), + 'invoice_sequence' => $this->sequence, + 'user_id' => $user->id, + 'firstname' => 'Mika', + 'lastname' => 'Muster', + 'participation_type' => 'participant', + 'fee_type' => 'standard', + 'sibling_reduction' => false, + 'local_group' => $this->tenant->slug, + 'birthday' => '2000-01-01', + 'address_1' => 'Beispielstraße 3', + 'postcode' => '11111', + 'city' => 'Beispielstadt', + 'email_1' => 'mika@example.com', + 'phone_1' => '0170 0000000', + 'arrival_date' => '2026-07-16', + 'departure_date' => '2026-07-20', + 'arrival_eating' => 1, + 'departure_eating' => 1, + 'amount' => 300.0, + 'amount_paid' => 300.0, + 'unregistered_at' => '2026-06-12', + 'payment_purpose' => 'Sommerlager', + 'payment_method' => PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION, + 'efz_status' => EfzStatus::EFZ_STATUS_NOT_REQUIRED, + ], $attributes)); + } + + private function release( + EventParticipant $participant, + float $amount, + ?string $retentionReason = null, + ?string $retentionNote = null, + ) { + return new ReleaseRefundCommand(new ReleaseRefundRequest( + participant: $participant, + amount: new Amount($amount, 'Euro'), + reason: RefundReason::SICKNESS, + retentionReason: $retentionReason, + retentionReasonNote: $retentionNote, + ))->execute(); + } + + private function accept(ParticipantRefund $refund): void + { + new AcceptRefundCommand(new AcceptRefundRequest( + refund: $refund, + accountOwner: 'Mika Muster', + accountIban: 'DE02120300000000202051', + declarationAccepted: true, + ))->execute(); + } + + /* + |-------------------------------------------------------------------------- + | Der Grund ist Pflicht, sobald etwas bleibt + |-------------------------------------------------------------------------- + */ + + public function test_a_partial_refund_without_a_reason_is_refused(): void + { + $response = $this->release($this->makeParticipant(), 220.0); + + $this->assertFalse($response->success); + $this->assertStringContainsString('einbehalten', $response->message); + $this->assertSame(0, ParticipantRefund::count()); + } + + public function test_a_full_refund_needs_no_reason(): void + { + $response = $this->release($this->makeParticipant(), 300.0); + + $this->assertTrue($response->success); + $this->assertNull($response->refund->retention_reason); + $this->assertEqualsWithDelta(0.0, $response->refund->retained_amount->getAmount(), 0.001); + } + + public function test_a_free_text_retention_reason_needs_its_note(): void + { + $response = $this->release($this->makeParticipant(), 220.0, RetentionReason::CUSTOM, ' '); + + $this->assertFalse($response->success); + $this->assertStringContainsString('Erläuterung', $response->message); + $this->assertSame(0, ParticipantRefund::count()); + } + + public function test_an_unknown_retention_reason_is_refused(): void + { + $response = $this->release($this->makeParticipant(), 220.0, 'erfunden'); + + $this->assertFalse($response->success); + $this->assertSame(0, ParticipantRefund::count()); + } + + public function test_a_reason_sent_with_a_full_refund_is_not_stored(): void + { + // Im Formular ist das Feld dann gar nicht sichtbar -- ein Wert ohne Bezug gehört nicht in die DB. + $response = $this->release($this->makeParticipant(), 300.0, RetentionReason::CANCELLATION_FEE); + + $this->assertTrue($response->success); + $this->assertNull($response->refund->retention_reason); + } + + public function test_the_note_is_only_stored_for_reasons_that_require_it(): void + { + $withNote = $this->release($this->makeParticipant(), 220.0, RetentionReason::CUSTOM, 'Bereits gebuchte Bahnfahrt'); + $this->assertSame('Bereits gebuchte Bahnfahrt', $withNote->refund->retention_reason_note); + + $ignored = $this->release($this->makeParticipant(), 220.0, RetentionReason::MATERIAL, 'wird verworfen'); + $this->assertNull($ignored->refund->retention_reason_note); + } + + /* + |-------------------------------------------------------------------------- + | Was beim Verband bleibt + |-------------------------------------------------------------------------- + */ + + public function test_the_retained_amount_is_recorded_at_release(): void + { + $response = $this->release($this->makeParticipant(), 220.0, RetentionReason::CANCELLATION_FEE); + + // Festgeschrieben, nicht gerechnet: Nach dem Einreichen führt `amount_paid` bereits den Rest. + $this->assertEqualsWithDelta(80.0, $response->refund->retained_amount->getAmount(), 0.001); + $this->assertTrue($response->refund->hasRetention()); + } + + public function test_amount_paid_keeps_the_retained_share(): void + { + $participant = $this->makeParticipant(); + $refund = $this->release($participant, 220.0, RetentionReason::CANCELLATION_FEE)->refund; + + $this->accept($refund); + + $this->assertEqualsWithDelta(80.0, $participant->fresh()->amount_paid->getAmount(), 0.001); + } + + public function test_a_full_refund_leaves_nothing(): void + { + $participant = $this->makeParticipant(); + $refund = $this->release($participant, 300.0)->refund; + + $this->accept($refund); + + $this->assertEqualsWithDelta(0.0, $participant->fresh()->amount_paid->getAmount(), 0.001); + } + + public function test_a_second_refund_is_capped_at_the_remainder(): void + { + $participant = $this->makeParticipant(); + $this->accept($this->release($participant, 220.0, RetentionReason::CANCELLATION_FEE)->refund); + + // Es liegen noch 80 € beim Verband -- mehr kann nicht zurückgehen. + $tooMuch = $this->release($participant->fresh(), 100.0, RetentionReason::CANCELLATION_FEE); + $this->assertFalse($tooMuch->success); + + $fits = $this->release($participant->fresh(), 80.0); + $this->assertTrue($fits->success); + $this->assertEqualsWithDelta(0.0, $fits->refund->retained_amount->getAmount(), 0.001); + } + + /* + |-------------------------------------------------------------------------- + | Sichtbarkeit + |-------------------------------------------------------------------------- + */ + + public function test_the_receipt_names_the_retained_amount_and_reason(): void + { + $participant = $this->makeParticipant(); + $refund = $this->release($participant, 220.0, RetentionReason::CANCELLATION_FEE)->refund; + $this->accept($refund); + + $html = $this->renderReceipt($refund->fresh()); + + $this->assertStringContainsString('Einbehalten', $html); + $this->assertStringContainsString('80,00', $html); + $this->assertStringContainsString('Stornogebühr laut Ausschreibung', $html); + } + + public function test_the_receipt_stays_silent_on_a_full_refund(): void + { + $participant = $this->makeParticipant(); + $refund = $this->release($participant, 300.0)->refund; + $this->accept($refund); + + $this->assertStringNotContainsString('Einbehalten', $this->renderReceipt($refund->fresh())); + } + + public function test_the_mail_explains_the_retention(): void + { + $participant = $this->makeParticipant(); + $refund = $this->release($participant, 220.0, RetentionReason::CUSTOM, 'Bereits gebuchte Bahnfahrt')->refund; + $this->accept($refund); + + $html = new RefundAcceptedMail($participant, $refund->fresh())->render(); + + $this->assertStringContainsString('80,00 Euro', $html); + $this->assertStringContainsString('Sonstiger Grund', $html); + $this->assertStringContainsString('Bereits gebuchte Bahnfahrt', $html); + } + + public function test_the_mail_stays_silent_on_a_full_refund(): void + { + $participant = $this->makeParticipant(); + $refund = $this->release($participant, 300.0)->refund; + $this->accept($refund); + + $this->assertStringNotContainsString('verbleiben beim Verband', new RefundAcceptedMail($participant, $refund->fresh())->render()); + } + + public function test_the_resource_carries_the_retention_for_the_lists(): void + { + $participant = $this->makeParticipant(); + $refund = $this->release($participant, 220.0, RetentionReason::CANCELLATION_FEE)->refund; + $this->accept($refund); + + $data = $refund->fresh()->toResource()->toArray(request()); + + $this->assertTrue($data['hasRetention']); + $this->assertSame('80,00 Euro', $data['retainedAmount']); + $this->assertSame('Stornogebühr laut Ausschreibung', $data['retentionReasonLabel']); + } + + private function renderReceipt(ParticipantRefund $refund): string + { + $command = new CreateRefundDocumentCommand(new CreateRefundDocumentRequest($refund)); + $number = new ReflectionMethod($command, 'documentNumber')->invoke($command); + $tokens = new ReflectionMethod($command, 'buildTokens')->invoke($command, $number); + + return new DocumentTemplateRenderProvider(DocumentTemplate::TYPE_PARTICIPANT_REFUND)->render($tokens); + } +} diff --git a/tests/Feature/TenantTaxInformationTest.php b/tests/Feature/TenantTaxInformationTest.php index 05398c4..ca9d9cb 100644 --- a/tests/Feature/TenantTaxInformationTest.php +++ b/tests/Feature/TenantTaxInformationTest.php @@ -80,11 +80,15 @@ class TenantTaxInformationTest extends TestCase public function test_invalid_exemption_reason_fails(): void { + // Neue Tenants tragen den DB-Default (Jugendhilfe); verglichen wird deshalb gegen den Stand + // vor der Aktion, nicht gegen null. + $before = $this->tenant->fresh()->tax_exemption_reason; + $response = $this->runAction(taxLiable: false, vatRate: 0, reason: 'not_a_reason'); $this->assertFalse($response->success); - // Unbekannter Slug wird nicht aufgelöst (null) → kein Speichern, Wert bleibt unverändert. - $this->assertNull($this->tenant->fresh()->tax_exemption_reason); + // Unbekannter Slug wird nicht aufgelöst → kein Speichern, Wert bleibt unverändert. + $this->assertSame($before, $this->tenant->fresh()->tax_exemption_reason); } public function test_custom_reason_requires_note(): void diff --git a/tests/Unit/DateRangeTest.php b/tests/Unit/DateRangeTest.php new file mode 100644 index 0000000..7463483 --- /dev/null +++ b/tests/Unit/DateRangeTest.php @@ -0,0 +1,43 @@ +assertSame(1, DateRange::inclusiveDays($day, $day)); + } + + public function test_both_ends_are_counted(): void + { + // An- und Abreisetag zählen beide mit. + $this->assertSame(2, DateRange::inclusiveDays(new DateTime('2026-07-16'), new DateTime('2026-07-17'))); + $this->assertSame(5, DateRange::inclusiveDays(new DateTime('2026-07-16'), new DateTime('2026-07-20'))); + } + + public function test_the_order_of_the_arguments_does_not_matter(): void + { + $early = new DateTime('2026-07-16'); + $late = new DateTime('2026-07-20'); + + $this->assertSame( + DateRange::inclusiveDays($early, $late), + DateRange::inclusiveDays($late, $early) + ); + } + + public function test_month_and_year_boundaries_are_handled(): void + { + $this->assertSame(3, DateRange::inclusiveDays(new DateTime('2026-07-30'), new DateTime('2026-08-01'))); + $this->assertSame(3, DateRange::inclusiveDays(new DateTime('2026-12-31'), new DateTime('2027-01-02'))); + // 2028 ist ein Schaltjahr. + $this->assertSame(2, DateRange::inclusiveDays(new DateTime('2028-02-28'), new DateTime('2028-02-29'))); + } +} diff --git a/tests/Unit/EventPaymentModuleRegistryTest.php b/tests/Unit/EventPaymentModuleRegistryTest.php index a038d0f..57e0047 100644 --- a/tests/Unit/EventPaymentModuleRegistryTest.php +++ b/tests/Unit/EventPaymentModuleRegistryTest.php @@ -55,10 +55,9 @@ class EventPaymentModuleRegistryTest extends TestCase // Überweisung: keine payer-seitigen Eingaben. $this->assertSame([], (new AccountTransferPaymentModule())->getParticipantOptions()); - // Sonstiges: exemplarische Teilnehmer-Eingaben (Betrag + Passend-Checkbox). - $undefined = (new UndefinedPaymentModule())->getParticipantOptions(); - $this->assertSame(['amount_brought', 'has_exact_amount'], array_column($undefined, 'name')); - $this->assertSame('checkbox', $undefined[1]['type']); + // Sonstiges (Barzahlung vor Ort): ebenfalls keine payer-seitigen Eingaben -- die Zahlungsart + // beschreibt sich allein über den vom Veranstalter gepflegten Freitext. + $this->assertSame([], (new UndefinedPaymentModule())->getParticipantOptions()); } public function test_participant_option_helpers(): void diff --git a/tests/Unit/IbanTest.php b/tests/Unit/IbanTest.php new file mode 100644 index 0000000..076f713 --- /dev/null +++ b/tests/Unit/IbanTest.php @@ -0,0 +1,59 @@ +assertSame('DE02120300000000202051', Iban::normalize('de02 1203 0000 0000 2020 51')); + $this->assertSame('DE02120300000000202051', Iban::normalize(" DE02\t1203000000002020 51 ")); + } + + public function test_formats_in_groups_of_four(): void + { + $this->assertSame('DE02 1203 0000 0000 2020 51', Iban::format('DE02120300000000202051')); + } + + public function test_accepts_valid_ibans(): void + { + // Offizielle Testnummern der Deutschen Bundesbank bzw. der jeweiligen Zentralbanken. + foreach ([ + 'DE02120300000000202051', + 'DE02500105170137075030', + 'AT026000000001349870', + 'CH0209000000100013997', + 'FR1420041010050500013M02606', + 'NL02ABNA0123456789', + ] as $iban) { + $this->assertTrue(Iban::isValid($iban), $iban . ' sollte gültig sein'); + } + } + + public function test_rejects_a_wrong_check_digit(): void + { + // Zahlendreher in den letzten beiden Stellen -- Struktur und Länge stimmen weiterhin. + $this->assertFalse(Iban::isValid('DE02120300000000202015')); + } + + public function test_rejects_wrong_length_for_the_country(): void + { + $this->assertFalse(Iban::isValid('DE0212030000000020205')); + $this->assertFalse(Iban::isValid('DE021203000000002020511')); + } + + public function test_rejects_malformed_input(): void + { + foreach (['', ' ', 'kein IBAN', '1202120300000000202051', 'DEAB120300000000202051'] as $iban) { + $this->assertFalse(Iban::isValid($iban), $iban . ' sollte ungültig sein'); + } + } + + public function test_validates_the_normalized_form(): void + { + $this->assertTrue(Iban::isValid('de02 1203 0000 0000 2020 51')); + } +} diff --git a/tests/Unit/TextTest.php b/tests/Unit/TextTest.php new file mode 100644 index 0000000..e4d857f --- /dev/null +++ b/tests/Unit/TextTest.php @@ -0,0 +1,30 @@ +assertNull(Text::nullIfBlank(null)); + $this->assertNull(Text::nullIfBlank('')); + $this->assertNull(Text::nullIfBlank(' ')); + $this->assertNull(Text::nullIfBlank("\t\n")); + } + + public function test_content_is_kept_and_trimmed(): void + { + $this->assertSame('Musterweg 1', Text::nullIfBlank(' Musterweg 1 ')); + $this->assertSame('WM', Text::nullIfBlank('WM')); + } + + public function test_a_zero_is_content_not_emptiness(): void + { + // "0" ist falsy -- eine naive Prüfung mit `empty()` würde die Angabe verschlucken. + $this->assertSame('0', Text::nullIfBlank('0')); + } +} diff --git a/version b/version index f6cdf40..88f1811 100644 --- a/version +++ b/version @@ -1 +1 @@ -4.7.0 +4.8.0