diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..1671c9b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f4b3123 --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +APP_NAME="Lagersystem" +APP_ENV=local +APP_KEY=base64:Szw4MlXOTHB+k8WgUzV9F7++EdnDM2DgCakfIkz+/nk= +APP_DEBUG=true +APP_URL=http://localhost + +BARCODE_MODE=dynamic +LOGIN_MODE=ldap + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=lagerdb2 +DB_USERNAME=lageruser +DB_PASSWORD=5F!Y9px0rkV + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=mailjet +MAIL_DRIVER=mailjet +MAIL_HOST=in-v3.mailjet.com +MAIL_PORT=587 +MAIL_USERNAME=8baac458ffc2b109bcb7c37524986be0 +MAIL_PASSWORD=e2842903df91ad9deb940b12cc3e58e1 +MAIL_ENCRYPTION=tls +MAIL_FROM_ADDRESS=lageradministrationen@itskp-odense.dk +MAIL_FROM_NAME="${APP_NAME}" + +MAILJET_APIKEY=8baac458ffc2b109bcb7c37524986be0 +MAILJET_APISECRET=e2842903df91ad9deb940b12cc3e58e1 + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_HOST= +PUSHER_PORT=443 +PUSHER_SCHEME=https +PUSHER_APP_CLUSTER=mt1 + +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7dbbf41 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore index 9d5dff3..38e5b25 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,16 @@ -# ---> Laravel -/vendor/ -node_modules/ +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/vendor +.env +.env.backup +.phpunit.result.cache +Homestead.json +Homestead.yaml +auth.json npm-debug.log yarn-error.log - -# Laravel 4 specific -bootstrap/compiled.php -app/storage/ - -# Laravel 5 & Lumen specific -public/storage -public/hot - -# Laravel 5 & Lumen specific with changed public path -public_html/storage -public_html/hot - -storage/*.key -.env -Homestead.yaml -Homestead.json -/.vagrant -.phpunit.result.cache - +/.idea +/.vscode diff --git a/DependencyFix/MailjetMailServiceProvider.php b/DependencyFix/MailjetMailServiceProvider.php new file mode 100644 index 0000000..06411b8 --- /dev/null +++ b/DependencyFix/MailjetMailServiceProvider.php @@ -0,0 +1,26 @@ +extend('mailjet', function ($app) { + $config = $this->app['config']->get('services.mailjet', array()); + $call = $this->app['config']->get('services.mailjet.transactionnal.call', true); + $options = $this->app['config']->get('services.mailjet.transactionnal.options', array()); + + return new MailjetTransport(new \Swift_Events_SimpleEventDispatcher(), $config['key'], $config['secret'], $call, $options); + }); + } +} diff --git a/DependencyFix/MailjetServiceProvider.php b/DependencyFix/MailjetServiceProvider.php new file mode 100644 index 0000000..f1e78f2 --- /dev/null +++ b/DependencyFix/MailjetServiceProvider.php @@ -0,0 +1,57 @@ +create( + new Dsn( + 'mailjet+api', + 'default', + config('services.mailjet.key'), + config('services.mailjet.secret') + ) + ); + }); + } + + /** + * Register the application services. + * + * @return void + */ + public function register(): void + { + $this->app->singleton('Mailjet', function () { + $config = $this->app['config']->get('services.mailjet', []); + $call = $this->app['config']->get('services.mailjet.common.call', true); + $options = $this->app['config']->get('services.mailjet.common.options', []); + + return new MailjetService($config['key'], $config['secret'], $call, $options); + }); + } + + /** + * @return array + */ + public function provides(): array + { + return ['mailjet']; + } +} diff --git a/DependencyFix/instructions.txt b/DependencyFix/instructions.txt new file mode 100644 index 0000000..e1510e0 --- /dev/null +++ b/DependencyFix/instructions.txt @@ -0,0 +1 @@ +Copy the files into the "\vendor\mailjet\laravel-mailjet\src" directory \ No newline at end of file diff --git a/README.md b/README.md index a5ad98f..bf0ddd9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,66 @@ -# Lager-v3 +

Laravel Logo

-Redesign of the lending system \ No newline at end of file +

+Build Status +Total Downloads +Latest Stable Version +License +

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. + +You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell). + +### Premium Partners + +- **[Vehikl](https://vehikl.com/)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Cubet Techno Labs](https://cubettech.com)** +- **[Cyber-Duck](https://cyber-duck.co.uk)** +- **[Many](https://www.many.co.uk)** +- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)** +- **[DevSquad](https://devsquad.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel/)** +- **[OP.GG](https://op.gg)** +- **[WebReinvent](https://webreinvent.com/?utm_source=laravel&utm_medium=github&utm_campaign=patreon-sponsors)** +- **[Lendio](https://lendio.com)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..d8bc1d2 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,32 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + * + * @return void + */ + protected function commands() + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php new file mode 100644 index 0000000..82a37e4 --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,50 @@ +, \Psr\Log\LogLevel::*> + */ + protected $levels = [ + // + ]; + + /** + * A list of the exception types that are not reported. + * + * @var array> + */ + protected $dontReport = [ + // + ]; + + /** + * A list of the inputs that are never flashed to the session on validation exceptions. + * + * @var array + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + * + * @return void + */ + public function register() + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/app/Helpers/Logger.php b/app/Helpers/Logger.php new file mode 100644 index 0000000..5d73bff --- /dev/null +++ b/app/Helpers/Logger.php @@ -0,0 +1,220 @@ +user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'created')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogEdited(int $loggable_id, string $loggable_type,string $logMessage, int $amount = Null, int $target = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'edited')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogDeleted(int $loggable_id, string $loggable_type,int $amount = Null, int $target = Null,string $logMessage = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'deleted')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogForceDeleted(int $loggable_id, string $loggable_type, string $logMessage = Null,int $amount = Null,int $target = Null,): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'force_deleted')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogRestored(int $loggable_id, string $loggable_type, int $amount = Null, int $target = Null,string $logMessage = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'restored')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogLent(int $loggable_id, string $loggable_type,int $amount, int $target,string $logMessage = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'lent')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogReturn(int $loggable_id, string $loggable_type,int $amount, int $target = Null,string $logMessage = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'returned')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogSetup(int $loggable_id, string $loggable_type,int $amount, int $target = Null,string $logMessage = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'set up')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogPickup(int $loggable_id, string $loggable_type, int $amount, int $target = Null,string $logMessage = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'picked up')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogAdjusted(int $loggable_id, string $loggable_type,string $logMessage, int $amount = Null, int $target = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'adjusted')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogAmountAdded(int $loggable_id, string $loggable_type,int $amount,string $logMessage = Null, int $target = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'amount_added')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogAmountRemoved(int $loggable_id, string $loggable_type,int $amount,string $logMessage = Null, int $target = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'amount_removed')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogReserved(int $loggable_id, string $loggable_type,int $amount, int $target, string $logMessage = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'reserved')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + public static function LogValidated(int $loggable_id, string $loggable_type, int $target,int $amount = Null, string $logMessage = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'validated')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + + public static function LogCancelled(int $loggable_id, string $loggable_type, int $target,int $amount = Null, string $logMessage = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'cancelled')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } + + + public static function LogNote(int $loggable_id, string $loggable_type, int $target,string $logMessage, int $amount = Null): void + { + $log = new Log(); + $log->user()->associate(Auth::id()); + $log->action()->associate(LogAction::firstWhere('name', '=', 'note')); + $log->loggable_type = $loggable_type; + $log->loggable_id = $loggable_id; + $log->target_id = $target; + $log->amount = $amount; + $log->log = $logMessage; + $log->save(); + } +} diff --git a/app/Helpers/PaginationHelper.php b/app/Helpers/PaginationHelper.php new file mode 100644 index 0000000..e346bd8 --- /dev/null +++ b/app/Helpers/PaginationHelper.php @@ -0,0 +1,40 @@ +count(); + + return self::paginator($results->forPage($page, $pageSize), $total, $pageSize, $page, [ + 'path' => Paginator::resolveCurrentPath(), + 'pageName' => 'page', + ]); + + } + + /** + * Create a new length-aware paginator instance. + * + * @param \Illuminate\Support\Collection $items + * @param int $total + * @param int $perPage + * @param int $currentPage + * @param array $options + * @return \Illuminate\Pagination\LengthAwarePaginator + */ + protected static function paginator($items, $total, $perPage, $currentPage, $options) + { + return Container::getInstance()->makeWith(LengthAwarePaginator::class, compact( + 'items', 'total', 'perPage', 'currentPage', 'options' + )); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php new file mode 100644 index 0000000..a49bbf9 --- /dev/null +++ b/app/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,118 @@ +validate([ + 'username' => ['required','string'], + 'password' => ['required'], + + ]); + + //gets the user + $user = User::firstWhere('username', "=", $request['username']); + //if user is an AD User or not in the database Check login with AD LDAP + switch(config('app.login_mode')){ + case('db'): + if (Auth::guard('nadUser')->attempt($credentials)) { + $request->session()->regenerate(); + return $this->getRedirect($user); + } + break; + default: + if (empty($user)) { + //check if user exist on the AD and if it does import the data form the ad and make it an AD User + if ($adUser = \LdapRecord\Models\ActiveDirectory\User::findBy('samaccountname', $request['username'])) { + echo $adUser; + $ad_parts = explode(',',$adUser); + $name_parts = explode('=',$ad_parts[0]); + $name = $name_parts[1]; + + $ad_user = new User(); + $ad_user->guid = $adUser->getConvertedGuid(); + $ad_user->domain = 'default'; + $ad_user->name = $name; + $ad_user->username = $request['username']; + $ad_user->password = Hash::make($request['password']); + $ad_user->loanerType()->associate(LoanerType::firstWhere('name', "=", 'adUser')->id); + $ad_user->role()->associate(Role::firstWhere('name', "=", 'Elev')->id); + $ad_user->save(); + + //login with AD + if (Auth::guard('adUser')->attempt(['samaccountname' => $credentials['username'], 'password' => $credentials['password']])) { + $request->session()->regenerate(); + return redirect()->route('users.show',['user' => $user]); + } + } + } + elseif($user->loanerType->name === 'adUser'){ + if (Auth::guard('adUser')->attempt(['samaccountname' => $credentials['username'], 'password' => $credentials['password']])) { + $request->session()->regenerate(); + return redirect()->route('users.show',['user' => $user]); + } + } + elseif ($user->loanerType->name === 'nadUser') { + if (Auth::guard('nadUser')->attempt($credentials)) { + $request->session()->regenerate(); + return redirect()->route('users.show',['user' => $user]); + } + } + break; + } + + //if the login fails + Auth::logout(); + Session::flush(); + return back()->withInput($request->input())->withErrors([ + 'username' => 'The provided credentials do not match our records.', + ]); + } + + /** + * returns the login page + * @return Application|Factory|View|RedirectResponse + */ + public function login() + { + if(Auth::check()){ + return $this->getRedirect(Auth::user()); + } + + return view('login'); + } + + /** + * logs a user out of the system + * @return RedirectResponse + */ + public function logout() + { + Auth::logout(); + Session::flush(); + return redirect()->intended('login'); + } +} diff --git a/app/Http/Controllers/Cabel/CabelCategoryController.php b/app/Http/Controllers/Cabel/CabelCategoryController.php new file mode 100644 index 0000000..6946dbb --- /dev/null +++ b/app/Http/Controllers/Cabel/CabelCategoryController.php @@ -0,0 +1,260 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $categories = CabelCategory::where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $categories = CabelCategory::where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + } + } + else{ + $categories = CabelCategory::Paginate($PerPagination); + } + + return view('cabelCategories.index') + ->with('search_types',$search_types) + ->with('data',$categories) + ->with('data_name','cabelCategory') + ->with('data_names','cabelCategories') + ; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "building", "name" => "building")); + array_push($search_types,array("value" => "room", "name" => "room")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $categories = CabelCategory::onlyTrashed()->where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $categories = CabelCategory::onlyTrashed()->where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + } + } + else{ + $categories = CabelCategory::onlyTrashed()->paginate($PerPagination); + } + + return view('cabelCategories.deleted') + ->with('search_types',$search_types) + ->with('data',$categories) + ->with('data_name','cabelCategory') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('cabelCategories.create'); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $category = new CabelCategory(); + $category->name = $request->name; + $category->save(); + + Logger::LogCreated($category->id,get_class($category)); + + return redirect()->route('cabelCategories.show',['cabelCategory' => $category]); + } + + /** + * Display the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function show($cabelcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = CabelCategory::where('id','=',$cabelcategory)->withTrashed()->first(); + + return view('cabelCategories.show') + ->with('data',$object) + ->with('data_name','cabelCategory') + ; + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\CabelCategory $cabelcategory + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($cabelcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = CabelCategory::where('id','=',$cabelcategory)->withTrashed()->first(); + + return view('cabelCategories.edit') + ->with('data',$object) + ->with('data_name','cabelCategory') + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\CabelCategory $cabelcategory + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request, $cabelcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = CabelCategory::where('id','=',$cabelcategory)->withTrashed()->first(); + Logger::LogEdited($object->id,get_class($object),"Navn : ".$object->name." til ".$request->name); + $object->name = $request->name; + $object->save(); + + return redirect()->route('cabelCategories.show',['cabelCategory' => $object]); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\CabelCategory $cabelcategory + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($cabelcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = CabelCategory::where('id','=',$cabelcategory)->withTrashed()->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + + + + return redirect()->route('cabelCategories.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\CabelCategory $cabelcategory + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($cabelcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = CabelCategory::where('id','=',$cabelcategory)->withTrashed()->first(); + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + + return redirect()->route('cabelCategories.deleted'); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\CabelCategory $cabelcategory + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($cabelcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabelCategories_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = CabelCategory::where('id','=',$cabelcategory)->withTrashed()->first(); + $object->restore(); + + Logger::LogRestored($object->id,get_class($object)); + + return redirect()->route('cabelCategories.deleted'); + } +} diff --git a/app/Http/Controllers/Cabel/CabelController.php b/app/Http/Controllers/Cabel/CabelController.php new file mode 100644 index 0000000..60ce6b0 --- /dev/null +++ b/app/Http/Controllers/Cabel/CabelController.php @@ -0,0 +1,519 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + array_push($search_types,array("value" => "category", "name" => "category")); + + array_push($search_types,array("value" => "available", "name" => "available")); + array_push($search_types,array("value" => "loans", "name" => "loaned")); + array_push($search_types,array("value" => "reservations", "name" => "reserved")); + array_push($search_types,array("value" => "total", "name" => "total")); + + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "category": + switch($search_compare){ + case("="): + $cabels = Cabel::where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $cabels = Cabel::where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + case "name": + switch($search_compare){ + case("="): + $cabels = Cabel::where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $cabels = Cabel::where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + case "available": + $all_cabels = Cabel::all(); + $cabel_collection = collect(); + foreach($all_cabels as $cabel){ + $loans = count($cabel->loans); + $reservations = count($cabel->reservations); + $total = $cabel->total; + $available = $total - ($loans + $reservations); + switch($search_compare){ + case(">="): + if($available >= $search_term){ + $cabel_collection->add($cabel); + } + break; + case("<="): + if($available <= $search_term){ + $cabel_collection->add($cabel); + } + break; + case("="): + if($available == $search_term){ + $cabel_collection->add($cabel); + } + break; + default: + if($available == $search_term){ + $cabel_collection->add($cabel); + } + break; + } + + } + $cabels = PaginationHelper::paginate($cabel_collection, $PerPagination); + break; + case "loans": + switch($search_compare){ + case(">="): + $cabels = Cabel::has('loans', '>=' , $search_term)->paginate($PerPagination); + break; + case("<="): + $cabels = Cabel::has('loans', '<=' , $search_term)->paginate($PerPagination); + break; + case("="): + $cabels = Cabel::has('loans', '=' , $search_term)->paginate($PerPagination); + break; + default: + $cabels = Cabel::has('loans', '=' , $search_term)->paginate($PerPagination); + break; + } + break; + case "reservations": + switch($search_compare){ + case(">="): + $cabels = Cabel::has('reservations', '>=' , $search_term)->paginate($PerPagination); + break; + case("<="): + $cabels = Cabel::has('reservations', '<=' , $search_term)->paginate($PerPagination); + break; + case("="): + $cabels = Cabel::has('reservations', '=' , $search_term)->paginate($PerPagination); + break; + default: + $cabels = Cabel::has('reservations', '=' , $search_term)->paginate($PerPagination); + break; + } + break; + case "total": + switch($search_compare){ + case(">="): + $cabels = Cabel::where('total','>=',$search_term)->paginate($PerPagination); + break; + case("<="): + $cabels = Cabel::where('total','<=',$search_term)->paginate($PerPagination); + break; + case("="): + $cabels = Cabel::where('total','=',$search_term)->paginate($PerPagination); + break; + default: + $cabels = Cabel::where('total','=',$search_term)->paginate($PerPagination); + break; + } + break; + } + } + else{ + $cabels = Cabel::paginate($PerPagination); + } + return view('cabels.index') + ->with('search_types',$search_types) + ->with('data',$cabels) + ->with('data_name','cabel') + ->with('data_names','cabels') + ; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + array_push($search_types,array("value" => "category", "name" => "category")); + + array_push($search_types,array("value" => "available", "name" => "available")); + array_push($search_types,array("value" => "loans", "name" => "loaned")); + array_push($search_types,array("value" => "reservations", "name" => "reserved")); + array_push($search_types,array("value" => "total", "name" => "total")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "category": + switch($search_compare){ + case("="): + $cabels = Cabel::onlyTrashed()->where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $cabels = Cabel::onlyTrashed()->where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + case "name": + switch($search_compare){ + case("="): + $cabels = Cabel::onlyTrashed()->where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $cabels = Cabel::onlyTrashed()->where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + case "available": + $all_cabels = Cabel::all(); + $cabel_collection = collect(); + foreach($all_cabels as $cabel){ + $loans = count($cabel->loans); + $reservations = count($cabel->reservations); + $total = $cabel->total; + $available = $total - ($loans + $reservations); + switch($search_compare){ + case(">="): + if($available >= $search_term){ + $cabel_collection->add($cabel); + } + break; + case("<="): + if($available <= $search_term){ + $cabel_collection->add($cabel); + } + break; + case("="): + if($available == $search_term){ + $cabel_collection->add($cabel); + } + break; + default: + if($available == $search_term){ + $cabel_collection->add($cabel); + } + break; + } + + } + $cabels = PaginationHelper::paginate($cabel_collection, $PerPagination); + break; + case "loans": + switch($search_compare){ + case(">="): + $cabels = Cabel::has('loans', '>=' , $search_term)->paginate($PerPagination); + break; + case("<="): + $cabels = Cabel::has('loans', '<=' , $search_term)->paginate($PerPagination); + break; + case("="): + $cabels = Cabel::has('loans', '=' , $search_term)->paginate($PerPagination); + break; + default: + $cabels = Cabel::has('loans', '=' , $search_term)->paginate($PerPagination); + break; + } + break; + case "reservations": + switch($search_compare){ + case(">="): + $cabels = Cabel::has('reservations', '>=' , $search_term)->paginate($PerPagination); + break; + case("<="): + $cabels = Cabel::has('reservations', '<=' , $search_term)->paginate($PerPagination); + break; + case("="): + $cabels = Cabel::has('reservations', '=' , $search_term)->paginate($PerPagination); + break; + default: + $cabels = Cabel::has('reservations', '=' , $search_term)->paginate($PerPagination); + break; + } + break; + case "total": + switch($search_compare){ + case(">="): + $cabels = Cabel::where('total','>=',$search_term)->paginate($PerPagination); + break; + case("<="): + $cabels = Cabel::where('total','<=',$search_term)->paginate($PerPagination); + break; + case("="): + $cabels = Cabel::where('total','=',$search_term)->paginate($PerPagination); + break; + default: + $cabels = Cabel::where('total','=',$search_term)->paginate($PerPagination); + break; + } + break; + } + } + else{ + $cabels = Cabel::onlyTrashed()->paginate($PerPagination); + } + + return view('cabels.deleted') + ->with('search_types',$search_types) + ->with('data',$cabels) + ->with('data_name','cabel') + ->with('data_names','cabels') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('cabels.create') + ->with('categories',CabelCategory::all()) + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $cabel = new Cabel(); + $cabel->cabel_category_id = $request->category_id; + $cabel->name = $request->name; + $cabel->save(); + + Logger::LogCreated($cabel->id,get_class($cabel)); + + return redirect()->route('cabels.show',['cabel' => $cabel]); + } + + /** + * Display the specified resource. + * + * @param \App\Models\Cabel $cabel + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function show($cabel) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Cabel::where('id','=',$cabel)->withTrashed()->first(); + + return view('cabels.show') + ->with('data',$object) + ->with('data_name','cabel') + ; + } + + /** + * Show the form for editing the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($cabel) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Cabel::where('id','=',$cabel)->withTrashed()->first(); + + return view('cabels.edit') + ->with('categories',CabelCategory::all()) + ->with('data',$object) + ->with('data_name','cabel') + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request,$cabel) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Cabel::where('id','=',$cabel)->withTrashed()->first(); + if($object->cabel_category_id != $request->category_id){ + $CabelCategory = CabelCategory::where('id','=',$request->category_id)->first(); + Logger::LogEdited($object->id,get_class($object),$logMessage = "Kategori : ".$object->category->name." til ".$CabelCategory->name); + $object->cabel_category_id = $request->category_id; + + } + if($object->name != $request->name){ + Logger::LogEdited($object->id,get_class($object),$logMessage = "Navn : ".$object->name." til ".$request->name); + $object->name = $request->name; + } + + $object->save(); + + return redirect()->route('cabels.show',['cabel' => $cabel]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($cabel) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Cabel::where('id','=',$cabel)->withTrashed()->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + + return redirect()->route('cabels.index'); + } + + /** + * Permanently Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($cabel) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Cabel::withTrashed()->where('id','=',$cabel)->first(); + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + + return redirect()->route('cabels.index'); + } + + /** + * Restore the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($cabel) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Cabel::withTrashed()->where('id','=',$cabel)->first(); + $object->restore(); + Logger::LogRestored($object->id,get_class($object)); + + return redirect()->route('cabels.deleted'); + } + + /** + * Add the specified amount to the Pool. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function amount_add($cabel,Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_amount_add')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Cabel::where('id','=',$cabel)->first(); + $object->total += $request->amount; + $object->save(); + Logger::LogAmountAdded($object->id,get_class($object),$request->amount); + + return redirect()->route('cabels.show',['cabel' => $cabel]); + } + + /**Logger::LogAmountAdded($object->id,get_class($object),$request->amount); + * Remove the specified amount from the Pool. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function amount_remove($cabel,Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'cabels_amount_remove')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Cabel::where('id','=',$cabel)->first(); + $object->total -= $request->amount; + $object->save(); + + Logger::LogAmountRemoved($object->id,get_class($object),$request->amount); + + return redirect()->route('cabels.show',['cabel' => $cabel]); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..a0a2a8a --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,13 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'loans_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + + $search_types = []; + array_push($search_types,array("value" => "username", "name" => "username")); + array_push($search_types,array("value" => "start", "name" => "date_start")); + array_push($search_types,array("value" => "end", "name" => "date_end")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case('username'): + switch($search_compare){ + case('='): + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%'.$search_term.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%'.$search_term.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + + break; + case('start'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('='): + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','like','%'.$constructed_date.'%') + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','like','%'.$constructed_date.'%') + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + case('end'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('='): + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','like','%'.$constructed_date.'%') + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','like','%'.$constructed_date.'%') + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + default: + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + } + else{ + $loans_display = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $loans_track = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + } + + return view('loans.index') + ->with('search_types',$search_types) + ->with('data',$loans_display) + ->with('loans',$loans_track) + ->with('data_name','loan') + ->with('data_names','loans') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'loans_create_user')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $cabels = Cabel::all(); + $cabels_valid = []; + foreach($cabels as $cabel){ + $available = $cabel->total - (count($cabel->loans) + count($cabel->reservations)); + if($available >= 1){ + array_push($cabels_valid,$cabel); + } + } + + $products = Product::all(); + $products_valid = []; + foreach($products as $product){ + $available = $product->total - (count($product->loans) + count($product->reservations)); + if($available >= 1){ + array_push($products_valid,$product); + } + } + + return view('loans.create') + ->with('cabels', $cabels_valid) + ->with('products', $products_valid) + ->with('users', User::all()) + ->with('date_start_locked','true') + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'loans_create_user')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $user = User::where('username','=',$request->user)->first(); + $now = date('Y-m-d'); + $loan_type = LoanType::where('name','=','Loan')->first(); + $date_start = $request->date_start; + $date_end = $request->date_end; + $loan_products = []; + $loan_cabels = []; + $products_total_amount = 0; + $cabels_total_amount = 0; + + if(isset($request->products)){ + foreach($request->products as $key => $value){ + $product = Product::where('id','=',$request->product_id[$key])->first(); + for($i = 1; $i <= $request->product_amount[$key];$i++){ + $user->loans()->create([ + 'loanable_id' => $request->product_id[$key], + 'loanable_type' => get_class($product), + 'loan_type_id' => $loan_type->id, + 'date_start' => $now, + 'date_end' => $date_end + ]); + $products_total_amount += 1; + } + Logger::LogLent($product->id,get_class($product),$request->product_amount[$key],$user->id); + $item = [$product,$request->product_amount[$key]]; + array_push($loan_products,$item); + + } + } + + if(isset($request->cabels)){ + foreach($request->cabels as $key => $value){ + $cabel = Cabel::where('id','=',$request->cabel_id[$key])->first(); + for($i = 1; $i <= $request->cabel_amount[$key];$i++){ + $user->loans()->create([ + 'loanable_id' => $request->cabel_id[$key], + 'loanable_type' => get_class($cabel), + 'loan_type_id' => $loan_type->id, + 'date_start' => $now, + 'date_end' => $date_end + ]); + $cabels_total_amount += 1; + } + Logger::LogLent($cabel->id,get_class($cabel),$request->cabel_amount[$key],$user->id); + $item = [$cabel,$request->cabel_amount[$key]]; + array_push($loan_cabels,$item); + } + } + + // Generate the PDF + $logo = "iVBORw0KGgoAAAANSUhEUgAAAa8AAAB1CAMAAADOZ57OAAAAt1BMVEX///+AgoQAeIp6fH59f4HP0NF3eXvIycmChIYAcoWGiIrf3+D8/Pz5+fnl5uYAcYSbnZ6vsLG9vr/v8PCSk5XX2Nje3t++v8CoqquPkZLl5eWXmZrs7e1zdXe1trcAbIDt9fbh7vCio6U3jZyQvMXG3eGvz9UlhZXS5OiBs71Ynamgxs1Dk6G92N17sLpsqLOYwckOgJFknqp0pbDa5um60NZRlaOTt79lrbiHvcYAZHmn0Nd4tL0vlxF5AAAVwUlEQVR4nO1dCZujOA6FmBBCIBch90GSrtQ9VdXb27Mzvf//d62NJVs2hKR6ZzrJLu+bb7owh40fkmVJdhznUzi87B+3n7ulxuXw1ms32o3XSzejxnk49BoC99mlG1LjHGT3OV2N3t2lW1LjHHxpS742tUK8BWQNRG1x3ALeQLx6j5duSY0zsN2AdH1kUPD49Fs9kl0tXoCuzbM8fmi02+3Nl8s2qsYxvKJ47eVxJI3FTS1hV4lobxmHYCy2f7tsu2qU47kH4vUijzOgr/31su2qUQqcKjd6D7LgNzQW3y/bsBql+NIzxUkZi43sou2qUYqtPVV+QvECY3H71Gu/Xc80Oo4LRckFmvH34PD00di/V3a2miqD+X6n5mLyOGvwC9qoK48gak5ns8WgowriVrMZ0SuazdZS/pU2c6TzYjfjqU4FA+tWoWjaLF62bDa79Dhp9Wez/nBJi5rNuT7q8BZemPhs38v7ulExEN0BXeiZV8ZiD4xF4HNfVdE4ZB4HYzv18Y/81YRckfp+KHsjWvgshxfMJlYH9fGUO5ssnVLEYVgoG7C0UNZcrSixE1e20B2SVq9Wa32955OjywA1W6P9VlQigBek5yCP0Vhsg7H4AMebinpS3hHBoj/jXbLAirq+GxI2Qo+BEER9z/UF+NUsnBhCuPNchqeCYWmbW4x17LIBcwuENRlr0St4Xf0+/6yYJqXj64Mmr3HoXBho6HE23o5ccsBLXmTHKWOxDQoQOd9ER57AP3nmsukyiuJ05rEBlk7J37yXvT48gPPlL7vd7rg1Fd3XpyK287wmP9eRpxYlIhaPPG9nFw645MytMoOvJnPdVhxFSct1V4pawlfKroAux7lXhLWfy6/4QELBl6GMRSBYuT5ejtcyZNiFyzBQnZS4rurE2HWVVHC+VnjJMOCfPSGM8wWDTjwJPC8sEpbynvftYWbguZ7bNcsMvmaeBwepP1MXar74U6+BLuehoZGVXfBs2/KWsRjbo1kZhMDAnx3Sw5zGPvy5Zt4UiwlfXGvynhzpWzRfnHsuSWFBJXJlWuxazpfrBSa5lK+EV4LqIdV6QvHF6fKvgS4ygjXaZd7bGE9vwIS0jUV7NCtDFHphmbLk5WAH8LFMy4TBl7MMqCKifHHLwmNTx8Sca8OZF1jVDbjpwrzQEDvKF7/LfpAA8sW1pWEbXRAPiq9Gu+Q0DnDoKXywjMUM1WW7ypznglBqGvBBQdpyfY/p/jD5crqMcGnwxbl0V5ZGFBdMDEtCgI9f851FGOWr6ylJpwC+OF1+cY5wGUQvii80AAm2yn7MZMHeulbxecxcyTGgdFAAT5y3gDTJ5IvrSi1gJl/OhHkDeqmzdL2FE/tau2EDvI7DCZsRwozxK/DcglGJfAnL8FrooiZiSZ+j9mvD/OxVaT/ZH2r4+6iccXdXfEgp04hzbp7HwqRjZEJr80W73+IrDizVx7lt5pbn2Kgn5yvqG4QZfPGhNCxO0XK+OF3e9dClKBCwu1RNlcGT4SjHLxiLT9Zodgy8O9ioWaITB4zb9FxKFqTM5stZeAy72eKLM+PT48jzZryWDrNM+pwvJxaEqUYYfAkuvZ1t8nO+hlz2r4kurfKK4UelK9v2VPlJHtuuj+MQxjebTQqMJYHL0jDvTV2tzdeE+Xje5qvFqGSKw1zxzizrXfLlxAumRdWcL8dTMQXvp8Yn2/G9BTcsr4kuPf8tWogHO+yliAXtt7dcHxXo7jxW5pJoMT4zMq28Er5Uz9p8NZkxMoaem8inMsN1BHw5Cde8OC1vWlZJOuKM+SNKf8cXjbsOQx6R7TVfZvhRezJA7h6tqfLBGs2q0eW6z2WhPazzLnYDw9Au8JUe52vsU75SH8xyPq4ZtiDylU8BwBK0+eIPW/icsYX+pMY+ly43vCrvfvRdK0RTrRXCXraxeEyPHkM8ETrHGtZ5n1j9ViZf+NWX6EPCV1+NZmuTDMVXTpgc24p8cfNSaEVXEcbly+3b87ZL46vmq5eR8kKGKF6IavOLNZqdgXjH1Z/19qHdHwW+hsxHc69y/Or6yszgs2zqpdd8OQkSVsYX/3xmZCrGx6+1s6BGyhXgH0cMDjtDVBsXsvXKM9X7TKhyV3CbnuZrpt1ZNl87z9dGHWelvwaELhVkwpezBK9IOV9iDq5MztyeFw7kxRURRvjqEZ8vhklUhqhtLNquj/PQ5Ra3WXKSr4RbaUfmX4lHPF2Jy0cbxjBARucIlC+nG+aBgSN8cWlWKlbOl5NZuffjQngkHimSbI3DGnKo4yryWDuyss/UFvOXN0tO8jX1jvo31oyEZIbMDUIF12XaVWXw5XQCz18f5Wusgyjgj+qW+CkvB8rXP1SpCvrfy+PINhafLNdHBeJUjzGcr8A8e4qvDnO1BWDyNXddpSmFJeEtEwXDVWXy5XT4fRPDP9/ST+0U+HLG/PpLh5YVnomD47tSLkcyRJWxqNwi9ydt+YT5OiKSuDQ8InCCr6VLna0GX8J00N3YYoaPPeYzcdU0iy9nzGcWC+0VbK6I+72ledTxFJ8TfPwNfykoX/sMC60oZIYXtaVxEX1iqhyNiFGwZrbrt5ovrrsYGTwoX0JNEe5nVgiZ1mTz5YxXYiaMvCQrYgKOvBW2R4tac3U1LnrqQMQJmJqUYdaTbSy+oy3//Ywamr6ipOmBB0Kjiq/lmhl0Eb6S3CephTs1nZD8Xl/bIgW+hMSQed8OJ2V8tCS+R6IaW3yaWJJkdQHcEb5wqoWuDfRk2Bmiam5WGfZS4FOYUHh7l+uS0EQZX3533knTYd/lnEypwhX5G+LUpB8wz98RM3tRmInzx2BJkS8R1DLiy15/Hjtxp8//UkMizbcZ8Jlj0YN/ASjLgvAVoTVxJEP0vLCXQiKy2cLRLChLWinjS1jmPhPekJn5Ue/0KT+kzM/5PMEaSVNfmeElfDkt+umkARf82YLrVM/VoRjKlwifBWaU5jLICF+bb1AolSSGSZTKhLjKVonkmVPleOCKLuZ9XNQpgR9YfC18mc7mhn07BtOXp7iq65u5m7tVMWLv+Stgabryi13doiNSd5E3kHEx04VG/mHE62Z2xOUCKOXLOTR6PZSeSKUggrH4ZI1mTvaQnailO9mNFruyEFhn3LEEYz7O0ekW/XZHT/HCwrO74/FS/VVS85AyHI3Xu9lubdAaqwfA0fga+CLqkFh72T//iWOTiqtACu+DPZp97W3O1IzXhavy456LI3yRC+wM0RdrNNsLPnsVCVI1/kLE+xN8Heywl+X6gAlcvTHHr4EanRpHFuAph5U0LvTqPUlQXHVvjb8eJADW/qPkPMhXzw57gQLEqHPvxy9r8f83Hk/wleVJ9m3wfWwxQ7QhR7NC1LnG34z3E3w53/a9du/DWruMo9mbFXWu8XeDz4bfKvlyssOXQyb/1Ask5GimUxTPybmp8Rcg27TfP0yhOQ5ly4M4oWO4fdpPX+MvwkfvGbr9pLtdJW3AaGZPpWv8Ajz1fv9326DhKFD9baQ4FVIU/ycRL7vdssXSyXK+/AkXSTwfN9POkdXX5+D3ze/o0a1adSeAzhDIEEVT5URKW5y2TKAbrknKzDeQZTqAMZcFons69jn9oDzp2qxKenwjWpN2Ci6hhD5qbD0+3YWBGwRhv2U0MG4tRHk4G6SKs6bxNFWnueVAPxRZQV4QTs2QQWJ2jazbfBcoPWxe0Iw4mUsoZ18gTtqV9a3qnhgX/MtF/+L/4GmlJ1jY1xREeaKTr0OVk5UoWIm36cib6KLXOD8rT89X5JlsJeM38ay0JryP9Fwkr8S9A+IdEyGcPPUq2OnrxjMoF2vih9CUUX6rC5bXUFa5IlG6aBLi4/iN3oJ6l8eyXiPKYPQPY1C63fR+7M81ON7v272GFQY7sYlly3c1glC0FUJefY+ccWlsMsgL9CqTFhMFMq9gkd9F8wrkWRlg7tLa8Kp4ZNbkQy7OOi+miR/j/HZcaJvMGLlNJ92kHnmet4KYt2wYRLVTeSfNXeyO6NPECw/0yY58K0PWzf5xsbjX/gLTqDPc7NndHUS9tnaK4hGsaStzvlxYPmK1x9Wx/yq+mpIdnQwQSTZkwP4cvviTJGFd2TSmu20qHyXFMtoZHawCq4nJPtJN+UrgHAnuGSTjC+vk7/P5eup9lU5bLjrVXW9AhcFOeA7Tlc0Xprf0Uadgu1QEv4qvOMwvV4uM8jx30VH5QSVfpCapixZWLy3leVibnsKzxIBDl7FP4SkixunqNbmUL6iQLE9LTeGCJ6io+Cf4OvTu8wHs42H7mFX3PYGdongc65VvYBV0aHvCwWDkQ3+igFXx5UykgCktNqUKEvhiUBWMX7L7wrWuaUc6Ucvq0Hj0Dq4dtIZ9pjeWiGUVXjBp8efpXFLCF+gUXw/JywA7n+UbvuABvnEFX9hvWLxt9x7EDOxTmfCFFMUKRDqPMxE5nUZ7cmGLoWt86LhKvpJACgE8B1QPdOc870w2hOqkIEu+8gEugU6Ay2eGrMbykEmpSGbyyXLtWF+JlxQ7SKRM9SYgmq8mfDTG4hkgKByOk2U6QEn3IUXiOF8Bdp0qv+89i4RQmj9/EvZqvp+B5kvkd+ath5ev5MsUKBQ3MCGkfFlZjoQvJ5EjKKRrm7IK4gbf/DIwZN5qDHatdsQpvrpADVkMj9pQLeRe9qEE8p0r+Cr022Pvq0hr+0xQv7CJ5c+A8AUvi4xU89WhWgx0HSYmnuQLa5J8AXsBNVjxk4duD62dcVBpLqxi5AtbxHbEpwr6gyYxokqROvMzfN217/M0RJXfexo/sfqrCMrXiPbiCb5kypsrdwEYGzKBfJlpjgZfZk0D0k8gULhrDvDlhS0zW6cFprpIWaRAvqayRXT3CFDhxjLdKKSzic/wlX207/LOr5z3UhQ2saxCBNsWKqDGJ3x14fuj45c7m0yGOSY7Q/pgfJB8wikc2edwSt45KYxfTkeSghnYcyKrUnCUbMYwfrl8qtwkna/NxtE6NXJWZaPBxqRiOYYyg2A5MXGliVjBF/QCmV0/9d6ezrDMNVTY64zfe4ioc8FzhW+iRdojei5K4VtDiQqgo/RtBl+x1mJLs/vRPoSVYK78NICvkfASGV+16pR8uzH5VF91Ktrt+eOmqv8jNWUQKZV6Db3kC+xAcwuQljHGAnAkzR9QYR/KV6E7WHFt+C/BwDnp8AJq9deJqXKOYdG/Yc6/wtCHsRc9BciXBb1uYqiG/IkpE9b8K6R8ifVhK6hJT4xAVqfK2tDejq4yu0W57rAJrYMF2KoFudpSyJbkAuj3cXL+RVOjs33v+eNM7SZgp7RVYkBrlf4NmI/a/g3dI6f4StQUWb6z3qCqii8NsreollWwNoge63jl/qiBbxAJzaJ8WdZIOV+zn+XLeWw8CWf7GcuDBF5RG+7PiSqX+A9Hhnxhgzz9OsCXp2DxBaMW68iBgSiac/hixh4oKKsxnVYBkoFLqNH52J0d07KH63WBL1BixpJM0Ifmqr/4p+XL+favR+EOrNoWj8BKaTuBaOBp3wbjf7PZvKQ9xma9kq9wihiZ9obyyw6mtkzg+AWJ9mV8zczc+wQsDtCsVop/nE7RF29MqJatXYDCB9NtsDfQdDe2JwaT0Xh0B4aDU3yBq8awLR+zQ25DlFmI8fv3ly+ZPrb3JTqJpQVUXuCPCqkoSFTb8wLSbAjgA9flki9vDVXJLx/9UfCPFSwEswK+kZL3H6Oj0zyZtEKgRvYy2PPKWUlCdEtbQAXkQAEzkQr7UL6JuWbgkP0hjIiyNKf4adNu9z7esZcxQ/S/mirr9niLpmz3iBi7p/lqkZGFLv2qnH/BZ74w1XiHqNAjO/+BP9AmMwH/lfz0cf7Vha+IWvQz4IbUjMEBWeNn5l8c2evDnQiCfRRPweLY3j0MbvYWvj8PtOflBJNq/NN8xcQkoW9U5d8Y4bBnLfcPtbY0FzepLyimIQCyUgJcUwZfEU6s6EYrQ3AAa6WWQK0QeP0kX84P5w+h59rFIem7kqe9iCurDNFNVvqgTwD5gr6nG0ie5EuseCyTiWr/RgzdZg5SWlatfWH7eLiUWhbGn0Ttoa3nFQ7194I4krW8S5xR7oDrMdCFjpnP8pXd3b1zuooWB9kRrLH5/lDYwvcM0DyEJv8P9YSaL4M/W/NxBl/dcpkA/8YglTDmywtFjbFtohNpU8/Mn+DmUb5mLV4YZuiU+f3cxEhd2m4STwFTkRgoGLX1/F0zTScz1MEYPet4Rru7qn/cAIqs5bhcwJ56f3xsClMwkmDP+XzCP0s0ZzniGbP8G8z2b6hIEyqQM/hS1qXpNTD9Gz6Nf+VmCfS8uSeU6kzTFy+uZe5i2of5BIyTQtjEzwtMZ9ACcDgSvmJgQ6/hjPFi2TQ80Jt9eEa71+QNrfwNwPbu9f1j/+PPwhT4W4MQpv4+P0N0Upx/0fyNvOsSdKHCPefwhSEKUyYq4ss5XxjrMBQfyqpvZl1BozBUheoQPy4VwsL0Ic2XsmH0j010ySip26c3IzBniJQvhNWvP6LHx/a396Kae9jTPQQA52eIDoglV+LfkJ/6BDQ+TArP4QsDKaZMnOILR37TIumXSF1kdbDnSZfg2KiBRKeNfBt4IfKbBvOgQBj5PZnP8/WwfT3cvztZscfj54+2RVeJXXIMJ/wbRvwLVc45fKHr0NTrJ/mKcHpEHbJpib8oGgb0S/MCqGi5o25Fl6m4icGXkkKdILVcGDfyD2BNfpzg03w5d9Hr85GEm+zRUIqfC3tNSbU5XyF0VZ5f50vtP/dyL76fe9Qj5h/NP9RIxC2+tTthRf6hL/VZB4YI+oMPEEOw0nWXg4BJpSd2DtCXpwsP0w9ZoPs8zz/0Mf8Qcx5XJGzZIvmH/IlGxMVs91r1TyH/kCBz7o9lz2y/GkrxU1Nl8fM1FOq3L+SveUXkoNnMuYTf+VJP6MoCqz/HoszaWSM2Q22SYYjApbRa886OWZ96WjqYCROgPzSDzN3WLuTFwZRueQDPVW8N1Rjer3QQyM4fWU9MStptxQ0LreM4/Hk0Ff7hRW0M0Kt/GfbnES3nJT9F97O4r/jR19d7kLFzwl41fgle/6xSdc8fgrFNvdrrevBRGWTOfru//15v3XBFOJxIAM2yX9OOGufhR/2z5TeF7VlJTzWuBs+9TyVm17g03npn5dHUuBJk9/Vy/5vCXe2/uC18qXfHuy08Na7oJ15qnETW+G/WCdX45dj+WW+4dlN4/bMewm4Kj+f9eEONa8HbyZ/prXFNiL+/1EbiLSHb15vK3xS2jVv82Yb/Y2xPbL1W48rwUE/DbgsPm9r1e1N4qNMDbgsPH7Ur8aaw/Xipw823hO2+9nTcFKLv5258U+M68FYHnG8Lhzop8bawffrEbpY1rgCHfa0TbwrZ22MdYLkp3P27jjnfFl5f67nzbWFb68QL4T+Hg3aCFW4f7AAAAABJRU5ErkJggg=="; + + // Data for the PDF + $loaner_signature = $request->loanerSigRawData; + $lender_signature = $request->lenderSigRawData; + $date = new DateTime(); + $timestamp = $date->getTimestamp(); + $user_id = $user->id; + + // Set the PDF File data + $pdf_file_name = $user->username."_".$timestamp; + $pdf_file_extension = '.pdf'; + $pdf_file = $pdf_file_name.$pdf_file_extension; + + // Create the PDF by putting data into the pdf view + $pdf = PDF::loadView('pdf.loan',['date_start' => $now,'date_end' => $date_end,'loaner' => $loaner_signature, 'lender' => $lender_signature,'user' => $user,'cabels' => $loan_cabels,'cabels_total_amount' => $cabels_total_amount,'products' => $loan_products,'products_total_amount' => $products_total_amount]); + + // Store the PDF file on the server + $location = "contracts/"; + $file_name = $location.$pdf_file; + $file_put = Storage::put($file_name, $pdf->output()); + $file_path = storage_path($file_name); + $file = Storage::files($file_path); + + // Create the Contract + $contract = new Contract(); + $contract->user_id = $user->id; + $contract->timestamp = $timestamp; + $contract->type = "contracts"; + $contract->save(); + + // Send Mail + if($user->role->name == 'Underviser') + { + $email_sufix = "@sde.dk"; + } + else + { + $email_sufix = "@edu.sde.dk"; + } + + $email = $user->username.$email_sufix; + + $mj = new Client(config('app.mail_username'), config('app.mail_password'),true); + + $body = [ + 'FromEmail' => config('app.mail_from_address'), + 'FromName' => config('app.mail_from_name'), + 'Subject' => "Udlån", + 'Html-part' => view('emails.loan') + ->with('logo',$logo) + ->with('user',$user) + ->with('date',$date) + ->render(), + 'Recipients' => [ + [ + 'Email' => $email + ] + ], + 'Attachments' => [ + [ + 'Content-type' => "application/pdf", + 'Filename' => 'contract.pdf', + 'content' => base64_encode($pdf->output()) + ] + ], + 'Inline_attachments' => [ + [ + 'Content-type' => "image/png", + 'Filename' => "logo.png", + 'content' => $logo + ] + ] + ]; + + // All resources are located in the Resources class + + $response = $mj->post(Resources::$Email,['body' => $body]); + + return redirect()->route('loans.index'); + + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function laptop_create(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'loans_create_laptop')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $products = Product::where('product_category_id','=',ProductCategory::where('name','=','Laptop')->first()->id) + ->doesntHave('subcategory') + ->get() + ; + + $products_valid = []; + foreach($products as $product){ + $available = $product->total - (count($product->loans) + count($product->reservations)); + if($available >= 1){ + array_push($products_valid,$product); + } + } + + return view('loans.laptop.create') + ->with('users',User::all()) + ->with('laptops',$products_valid) + ->with('date_start_locked','true') + ->with('date_end_permanent','true') + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function laptop_store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'loans_create_laptop')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $user = User::where('username','=',$request->user)->first(); + $laptop = Product::where('id','=',$request->laptop_id)->first(); + + if(!$laptop){ + return back()->withErrors('Laptop not found'); + } + + $available = $laptop->total - (count($laptop->loans) + count($laptop->reservations)); + if(!$available >= 1){ + return back()->withErrors('Laptop not available'); + } + + $phone = $request->telephone; + $email_private = $request->email; + $street_name = $request->street_name; + $street_number = $request->street_number; + $street_instruction = $request->street_direction; + $city_zip = $request->zip; + $city_name = $request->city; + $date_start = $request->date_start; + $date_end = $request->date_end; + + $bag_input = $request->bag; + switch($bag_input){ + case('on'): + $bag = "yes"; + break; + default: + $bag = Null; + break; + } + + $lock_input = $request->lock; + switch($lock_input){ + case('on'): + $lock = "yes"; + break; + default: + $lock = "no"; + break; + } + + $loan_type = LoanType::where('name','=','Loan')->first(); + + $now = date('Y-m-d'); + if($request->permanent == 'on'){ + $date_end = Null; + } + else{ + $date_end = $request->date_end; + } + + $user->loans()->create([ + 'loanable_id' => $laptop->id, + 'loanable_type' => get_class($laptop), + 'loan_type_id' => $loan_type->id, + 'date_start' => $now, + 'date_end' => $date_end + ]); + + Logger::LogLent($laptop->id,get_class($laptop),1,$user->id); + + + // Generate the PDF + $logo = "iVBORw0KGgoAAAANSUhEUgAAAa8AAAB1CAMAAADOZ57OAAAAt1BMVEX///+AgoQAeIp6fH59f4HP0NF3eXvIycmChIYAcoWGiIrf3+D8/Pz5+fnl5uYAcYSbnZ6vsLG9vr/v8PCSk5XX2Nje3t++v8CoqquPkZLl5eWXmZrs7e1zdXe1trcAbIDt9fbh7vCio6U3jZyQvMXG3eGvz9UlhZXS5OiBs71Ynamgxs1Dk6G92N17sLpsqLOYwckOgJFknqp0pbDa5um60NZRlaOTt79lrbiHvcYAZHmn0Nd4tL0vlxF5AAAVwUlEQVR4nO1dCZujOA6FmBBCIBch90GSrtQ9VdXb27Mzvf//d62NJVs2hKR6ZzrJLu+bb7owh40fkmVJdhznUzi87B+3n7ulxuXw1ms32o3XSzejxnk49BoC99mlG1LjHGT3OV2N3t2lW1LjHHxpS742tUK8BWQNRG1x3ALeQLx6j5duSY0zsN2AdH1kUPD49Fs9kl0tXoCuzbM8fmi02+3Nl8s2qsYxvKJ47eVxJI3FTS1hV4lobxmHYCy2f7tsu2qU47kH4vUijzOgr/31su2qUQqcKjd6D7LgNzQW3y/bsBql+NIzxUkZi43sou2qUYqtPVV+QvECY3H71Gu/Xc80Oo4LRckFmvH34PD00di/V3a2miqD+X6n5mLyOGvwC9qoK48gak5ns8WgowriVrMZ0SuazdZS/pU2c6TzYjfjqU4FA+tWoWjaLF62bDa79Dhp9Wez/nBJi5rNuT7q8BZemPhs38v7ulExEN0BXeiZV8ZiD4xF4HNfVdE4ZB4HYzv18Y/81YRckfp+KHsjWvgshxfMJlYH9fGUO5ssnVLEYVgoG7C0UNZcrSixE1e20B2SVq9Wa32955OjywA1W6P9VlQigBek5yCP0Vhsg7H4AMebinpS3hHBoj/jXbLAirq+GxI2Qo+BEER9z/UF+NUsnBhCuPNchqeCYWmbW4x17LIBcwuENRlr0St4Xf0+/6yYJqXj64Mmr3HoXBho6HE23o5ccsBLXmTHKWOxDQoQOd9ER57AP3nmsukyiuJ05rEBlk7J37yXvT48gPPlL7vd7rg1Fd3XpyK287wmP9eRpxYlIhaPPG9nFw645MytMoOvJnPdVhxFSct1V4pawlfKroAux7lXhLWfy6/4QELBl6GMRSBYuT5ejtcyZNiFyzBQnZS4rurE2HWVVHC+VnjJMOCfPSGM8wWDTjwJPC8sEpbynvftYWbguZ7bNcsMvmaeBwepP1MXar74U6+BLuehoZGVXfBs2/KWsRjbo1kZhMDAnx3Sw5zGPvy5Zt4UiwlfXGvynhzpWzRfnHsuSWFBJXJlWuxazpfrBSa5lK+EV4LqIdV6QvHF6fKvgS4ygjXaZd7bGE9vwIS0jUV7NCtDFHphmbLk5WAH8LFMy4TBl7MMqCKifHHLwmNTx8Sca8OZF1jVDbjpwrzQEDvKF7/LfpAA8sW1pWEbXRAPiq9Gu+Q0DnDoKXywjMUM1WW7ypznglBqGvBBQdpyfY/p/jD5crqMcGnwxbl0V5ZGFBdMDEtCgI9f851FGOWr6ylJpwC+OF1+cY5wGUQvii80AAm2yn7MZMHeulbxecxcyTGgdFAAT5y3gDTJ5IvrSi1gJl/OhHkDeqmzdL2FE/tau2EDvI7DCZsRwozxK/DcglGJfAnL8FrooiZiSZ+j9mvD/OxVaT/ZH2r4+6iccXdXfEgp04hzbp7HwqRjZEJr80W73+IrDizVx7lt5pbn2Kgn5yvqG4QZfPGhNCxO0XK+OF3e9dClKBCwu1RNlcGT4SjHLxiLT9Zodgy8O9ioWaITB4zb9FxKFqTM5stZeAy72eKLM+PT48jzZryWDrNM+pwvJxaEqUYYfAkuvZ1t8nO+hlz2r4kurfKK4UelK9v2VPlJHtuuj+MQxjebTQqMJYHL0jDvTV2tzdeE+Xje5qvFqGSKw1zxzizrXfLlxAumRdWcL8dTMQXvp8Yn2/G9BTcsr4kuPf8tWogHO+yliAXtt7dcHxXo7jxW5pJoMT4zMq28Er5Uz9p8NZkxMoaem8inMsN1BHw5Cde8OC1vWlZJOuKM+SNKf8cXjbsOQx6R7TVfZvhRezJA7h6tqfLBGs2q0eW6z2WhPazzLnYDw9Au8JUe52vsU75SH8xyPq4ZtiDylU8BwBK0+eIPW/icsYX+pMY+ly43vCrvfvRdK0RTrRXCXraxeEyPHkM8ETrHGtZ5n1j9ViZf+NWX6EPCV1+NZmuTDMVXTpgc24p8cfNSaEVXEcbly+3b87ZL46vmq5eR8kKGKF6IavOLNZqdgXjH1Z/19qHdHwW+hsxHc69y/Or6yszgs2zqpdd8OQkSVsYX/3xmZCrGx6+1s6BGyhXgH0cMDjtDVBsXsvXKM9X7TKhyV3CbnuZrpt1ZNl87z9dGHWelvwaELhVkwpezBK9IOV9iDq5MztyeFw7kxRURRvjqEZ8vhklUhqhtLNquj/PQ5Ra3WXKSr4RbaUfmX4lHPF2Jy0cbxjBARucIlC+nG+aBgSN8cWlWKlbOl5NZuffjQngkHimSbI3DGnKo4yryWDuyss/UFvOXN0tO8jX1jvo31oyEZIbMDUIF12XaVWXw5XQCz18f5Wusgyjgj+qW+CkvB8rXP1SpCvrfy+PINhafLNdHBeJUjzGcr8A8e4qvDnO1BWDyNXddpSmFJeEtEwXDVWXy5XT4fRPDP9/ST+0U+HLG/PpLh5YVnomD47tSLkcyRJWxqNwi9ydt+YT5OiKSuDQ8InCCr6VLna0GX8J00N3YYoaPPeYzcdU0iy9nzGcWC+0VbK6I+72ledTxFJ8TfPwNfykoX/sMC60oZIYXtaVxEX1iqhyNiFGwZrbrt5ovrrsYGTwoX0JNEe5nVgiZ1mTz5YxXYiaMvCQrYgKOvBW2R4tac3U1LnrqQMQJmJqUYdaTbSy+oy3//Ywamr6ipOmBB0Kjiq/lmhl0Eb6S3CephTs1nZD8Xl/bIgW+hMSQed8OJ2V8tCS+R6IaW3yaWJJkdQHcEb5wqoWuDfRk2Bmiam5WGfZS4FOYUHh7l+uS0EQZX3533knTYd/lnEypwhX5G+LUpB8wz98RM3tRmInzx2BJkS8R1DLiy15/Hjtxp8//UkMizbcZ8Jlj0YN/ASjLgvAVoTVxJEP0vLCXQiKy2cLRLChLWinjS1jmPhPekJn5Ue/0KT+kzM/5PMEaSVNfmeElfDkt+umkARf82YLrVM/VoRjKlwifBWaU5jLICF+bb1AolSSGSZTKhLjKVonkmVPleOCKLuZ9XNQpgR9YfC18mc7mhn07BtOXp7iq65u5m7tVMWLv+Stgabryi13doiNSd5E3kHEx04VG/mHE62Z2xOUCKOXLOTR6PZSeSKUggrH4ZI1mTvaQnailO9mNFruyEFhn3LEEYz7O0ekW/XZHT/HCwrO74/FS/VVS85AyHI3Xu9lubdAaqwfA0fga+CLqkFh72T//iWOTiqtACu+DPZp97W3O1IzXhavy456LI3yRC+wM0RdrNNsLPnsVCVI1/kLE+xN8Heywl+X6gAlcvTHHr4EanRpHFuAph5U0LvTqPUlQXHVvjb8eJADW/qPkPMhXzw57gQLEqHPvxy9r8f83Hk/wleVJ9m3wfWwxQ7QhR7NC1LnG34z3E3w53/a9du/DWruMo9mbFXWu8XeDz4bfKvlyssOXQyb/1Ask5GimUxTPybmp8Rcg27TfP0yhOQ5ly4M4oWO4fdpPX+MvwkfvGbr9pLtdJW3AaGZPpWv8Ajz1fv9326DhKFD9baQ4FVIU/ycRL7vdssXSyXK+/AkXSTwfN9POkdXX5+D3ze/o0a1adSeAzhDIEEVT5URKW5y2TKAbrknKzDeQZTqAMZcFons69jn9oDzp2qxKenwjWpN2Ci6hhD5qbD0+3YWBGwRhv2U0MG4tRHk4G6SKs6bxNFWnueVAPxRZQV4QTs2QQWJ2jazbfBcoPWxe0Iw4mUsoZ18gTtqV9a3qnhgX/MtF/+L/4GmlJ1jY1xREeaKTr0OVk5UoWIm36cib6KLXOD8rT89X5JlsJeM38ay0JryP9Fwkr8S9A+IdEyGcPPUq2OnrxjMoF2vih9CUUX6rC5bXUFa5IlG6aBLi4/iN3oJ6l8eyXiPKYPQPY1C63fR+7M81ON7v272GFQY7sYlly3c1glC0FUJefY+ccWlsMsgL9CqTFhMFMq9gkd9F8wrkWRlg7tLa8Kp4ZNbkQy7OOi+miR/j/HZcaJvMGLlNJ92kHnmet4KYt2wYRLVTeSfNXeyO6NPECw/0yY58K0PWzf5xsbjX/gLTqDPc7NndHUS9tnaK4hGsaStzvlxYPmK1x9Wx/yq+mpIdnQwQSTZkwP4cvviTJGFd2TSmu20qHyXFMtoZHawCq4nJPtJN+UrgHAnuGSTjC+vk7/P5eup9lU5bLjrVXW9AhcFOeA7Tlc0Xprf0Uadgu1QEv4qvOMwvV4uM8jx30VH5QSVfpCapixZWLy3leVibnsKzxIBDl7FP4SkixunqNbmUL6iQLE9LTeGCJ6io+Cf4OvTu8wHs42H7mFX3PYGdongc65VvYBV0aHvCwWDkQ3+igFXx5UykgCktNqUKEvhiUBWMX7L7wrWuaUc6Ucvq0Hj0Dq4dtIZ9pjeWiGUVXjBp8efpXFLCF+gUXw/JywA7n+UbvuABvnEFX9hvWLxt9x7EDOxTmfCFFMUKRDqPMxE5nUZ7cmGLoWt86LhKvpJACgE8B1QPdOc870w2hOqkIEu+8gEugU6Ay2eGrMbykEmpSGbyyXLtWF+JlxQ7SKRM9SYgmq8mfDTG4hkgKByOk2U6QEn3IUXiOF8Bdp0qv+89i4RQmj9/EvZqvp+B5kvkd+ath5ev5MsUKBQ3MCGkfFlZjoQvJ5EjKKRrm7IK4gbf/DIwZN5qDHatdsQpvrpADVkMj9pQLeRe9qEE8p0r+Cr022Pvq0hr+0xQv7CJ5c+A8AUvi4xU89WhWgx0HSYmnuQLa5J8AXsBNVjxk4duD62dcVBpLqxi5AtbxHbEpwr6gyYxokqROvMzfN217/M0RJXfexo/sfqrCMrXiPbiCb5kypsrdwEYGzKBfJlpjgZfZk0D0k8gULhrDvDlhS0zW6cFprpIWaRAvqayRXT3CFDhxjLdKKSzic/wlX207/LOr5z3UhQ2saxCBNsWKqDGJ3x14fuj45c7m0yGOSY7Q/pgfJB8wikc2edwSt45KYxfTkeSghnYcyKrUnCUbMYwfrl8qtwkna/NxtE6NXJWZaPBxqRiOYYyg2A5MXGliVjBF/QCmV0/9d6ezrDMNVTY64zfe4ioc8FzhW+iRdojei5K4VtDiQqgo/RtBl+x1mJLs/vRPoSVYK78NICvkfASGV+16pR8uzH5VF91Ktrt+eOmqv8jNWUQKZV6Db3kC+xAcwuQljHGAnAkzR9QYR/KV6E7WHFt+C/BwDnp8AJq9deJqXKOYdG/Yc6/wtCHsRc9BciXBb1uYqiG/IkpE9b8K6R8ifVhK6hJT4xAVqfK2tDejq4yu0W57rAJrYMF2KoFudpSyJbkAuj3cXL+RVOjs33v+eNM7SZgp7RVYkBrlf4NmI/a/g3dI6f4StQUWb6z3qCqii8NsreollWwNoge63jl/qiBbxAJzaJ8WdZIOV+zn+XLeWw8CWf7GcuDBF5RG+7PiSqX+A9Hhnxhgzz9OsCXp2DxBaMW68iBgSiac/hixh4oKKsxnVYBkoFLqNH52J0d07KH63WBL1BixpJM0Ifmqr/4p+XL+favR+EOrNoWj8BKaTuBaOBp3wbjf7PZvKQ9xma9kq9wihiZ9obyyw6mtkzg+AWJ9mV8zczc+wQsDtCsVop/nE7RF29MqJatXYDCB9NtsDfQdDe2JwaT0Xh0B4aDU3yBq8awLR+zQ25DlFmI8fv3ly+ZPrb3JTqJpQVUXuCPCqkoSFTb8wLSbAjgA9flki9vDVXJLx/9UfCPFSwEswK+kZL3H6Oj0zyZtEKgRvYy2PPKWUlCdEtbQAXkQAEzkQr7UL6JuWbgkP0hjIiyNKf4adNu9z7esZcxQ/S/mirr9niLpmz3iBi7p/lqkZGFLv2qnH/BZ74w1XiHqNAjO/+BP9AmMwH/lfz0cf7Vha+IWvQz4IbUjMEBWeNn5l8c2evDnQiCfRRPweLY3j0MbvYWvj8PtOflBJNq/NN8xcQkoW9U5d8Y4bBnLfcPtbY0FzepLyimIQCyUgJcUwZfEU6s6EYrQ3AAa6WWQK0QeP0kX84P5w+h59rFIem7kqe9iCurDNFNVvqgTwD5gr6nG0ie5EuseCyTiWr/RgzdZg5SWlatfWH7eLiUWhbGn0Ttoa3nFQ7194I4krW8S5xR7oDrMdCFjpnP8pXd3b1zuooWB9kRrLH5/lDYwvcM0DyEJv8P9YSaL4M/W/NxBl/dcpkA/8YglTDmywtFjbFtohNpU8/Mn+DmUb5mLV4YZuiU+f3cxEhd2m4STwFTkRgoGLX1/F0zTScz1MEYPet4Rru7qn/cAIqs5bhcwJ56f3xsClMwkmDP+XzCP0s0ZzniGbP8G8z2b6hIEyqQM/hS1qXpNTD9Gz6Nf+VmCfS8uSeU6kzTFy+uZe5i2of5BIyTQtjEzwtMZ9ACcDgSvmJgQ6/hjPFi2TQ80Jt9eEa71+QNrfwNwPbu9f1j/+PPwhT4W4MQpv4+P0N0Upx/0fyNvOsSdKHCPefwhSEKUyYq4ss5XxjrMBQfyqpvZl1BozBUheoQPy4VwsL0Ic2XsmH0j010ySip26c3IzBniJQvhNWvP6LHx/a396Kae9jTPQQA52eIDoglV+LfkJ/6BDQ+TArP4QsDKaZMnOILR37TIumXSF1kdbDnSZfg2KiBRKeNfBt4IfKbBvOgQBj5PZnP8/WwfT3cvztZscfj54+2RVeJXXIMJ/wbRvwLVc45fKHr0NTrJ/mKcHpEHbJpib8oGgb0S/MCqGi5o25Fl6m4icGXkkKdILVcGDfyD2BNfpzg03w5d9Hr85GEm+zRUIqfC3tNSbU5XyF0VZ5f50vtP/dyL76fe9Qj5h/NP9RIxC2+tTthRf6hL/VZB4YI+oMPEEOw0nWXg4BJpSd2DtCXpwsP0w9ZoPs8zz/0Mf8Qcx5XJGzZIvmH/IlGxMVs91r1TyH/kCBz7o9lz2y/GkrxU1Nl8fM1FOq3L+SveUXkoNnMuYTf+VJP6MoCqz/HoszaWSM2Q22SYYjApbRa886OWZ96WjqYCROgPzSDzN3WLuTFwZRueQDPVW8N1Rjer3QQyM4fWU9MStptxQ0LreM4/Hk0Ff7hRW0M0Kt/GfbnES3nJT9F97O4r/jR19d7kLFzwl41fgle/6xSdc8fgrFNvdrrevBRGWTOfru//15v3XBFOJxIAM2yX9OOGufhR/2z5TeF7VlJTzWuBs+9TyVm17g03npn5dHUuBJk9/Vy/5vCXe2/uC18qXfHuy08Na7oJ15qnETW+G/WCdX45dj+WW+4dlN4/bMewm4Kj+f9eEONa8HbyZ/prXFNiL+/1EbiLSHb15vK3xS2jVv82Yb/Y2xPbL1W48rwUE/DbgsPm9r1e1N4qNMDbgsPH7Ur8aaw/Xipw823hO2+9nTcFKLv5258U+M68FYHnG8Lhzop8bawffrEbpY1rgCHfa0TbwrZ22MdYLkp3P27jjnfFl5f67nzbWFb68QL4T+Hg3aCFW4f7AAAAABJRU5ErkJggg=="; + + // Data for the PDF + $loaner_signature = $request->loanerSigRawData; + $lender_signature = $request->lenderSigRawData; + $date = new DateTime(); + $timestamp = $date->getTimestamp(); + $user_id = $user->id; + + // Set the PDF File data + $pdf_file_name = $user->username."_".$timestamp; + $pdf_file_extension = '.pdf'; + $pdf_file = $pdf_file_name.$pdf_file_extension; + + // Create the PDF by putting data into the pdf view + $pdf = PDF::loadView('pdf.laptop',['date_start' => $now,'date_end' => $date_end,'loaner' => $loaner_signature, 'lender' => $lender_signature,'user' => $user,'product' => $laptop,'telephone' => $phone,'email' => $email_private,'street_name' => $street_name,'street_number' => $street_number, 'street_instructions' => $street_instruction,'city_zip' => $city_zip,'city_name' => $city_name,'bag' => $bag,'lock' => $lock]); + + // Store the PDF file on the server + $location = "laptops/"; + $file_name = $location.$pdf_file; + $file_put = Storage::put($file_name, $pdf->output()); + $file_path = storage_path($file_name); + $file = Storage::files($file_path); + + // Create the Contract + $contract = new Contract(); + $contract->user_id = $user->id; + $contract->timestamp = $timestamp; + $contract->type = "laptops"; + $contract->save(); + + // Send Mail + if($user->role->name == 'Underviser') + { + $email_sufix = "@sde.dk"; + } + else + { + $email_sufix = "@edu.sde.dk"; + } + + $email = $user->username.$email_sufix; + + $mj = new Client(config('app.mail_username'), config('app.mail_password'),true); + + $body = [ + 'FromEmail' => config('app.mail_from_address'), + 'FromName' => config('app.mail_from_name'), + 'Subject' => "Bærbar Udlån", + 'Html-part' => view('emails.laptop') + ->with('logo',$logo) + ->with('user',$user) + ->with('date',$date) + ->render(), + 'Recipients' => [ + [ + 'Email' => $email + ] + ], + 'Attachments' => [ + [ + 'Content-type' => "application/pdf", + 'Filename' => 'contract.pdf', + 'content' => base64_encode($pdf->output()) + ] + ], + 'Inline_attachments' => [ + [ + 'Content-type' => "image/png", + 'Filename' => "logo.png", + 'content' => $logo + ] + ] + ]; + + // All resources are located in the Resources class + + $response = $mj->post(Resources::$Email,['body' => $body]); + + return redirect()->route('loans.index'); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function return_page(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'loans_return')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $cabels = Cabel::all(); + $cabels_valid = []; + foreach($cabels as $cabel){ + $lent = count($cabel->loans); + if($lent >= 1){ + array_push($cabels_valid,$cabel); + } + } + + $products = Product::all(); + $products_valid = []; + foreach($products as $product){ + $lent = count($product->loans); + if($lent >= 1){ + array_push($products_valid,$product); + } + } + + $users = User::all(); + $note_types = NoteType::all(); + + return view('loans.return') + ->with('users',$users) + ->with('products',$products_valid) + ->with('cabels',$cabels_valid) + ->with('note_types',$note_types) + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function return_action(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'loans_return')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $user = User::where('username','=',$request->user)->first(); + $loan_type = LoanType::where('name','=','Loan')->first(); + + if(isset($request->products)){ + foreach($request->products as $key => $value){ + $product = Product::where('id','=',$request->product_id[$key])->first(); + $loan_selection = Loan::where('user_id','=',$user->id) + ->where('loanable_type','=',get_class($product)) + ->where('loanable_id','=',$product->id) + ->limit($request->product_amount[$key]) + ->get(); + foreach($loan_selection as $loan){ + + $loan->delete(); + } + Logger::LogReturn($product->id,get_class($product),$request->product_amount[$key],$user->id); + } + } + + if(isset($request->product_note_text)) { + foreach($request->product_note_text as $key => $value) { + $product = Product::where('id','=',$request->product_note_id[$key])->first(); + + $note = new Note(); + $note->user_id = $user->id; + $note->note_type_id = $request->product_note_type[$key]; + $note->loanable_id = $request->product_note_id[$key]; + $note->loanable_type = get_class($product); + $note->note = $request->product_note_text[$key]; + $note->save(); + + if(isset($request->product_note_remove[$key])){ + if($request->product_note_remove[$key] == "on"){ + $amount = $request->product_amount[$key]; + $product->total -= $amount; + $product->save(); + Logger::LogAmountRemoved($product->id,get_class($product),$amount); + } + } + Logger::LogNote($product->id,get_class($product),$user->id,$request->product_note_text[$key]); + + } + } + + + if(isset($request->cabels)){ + foreach($request->cabels as $key => $value){ + $cabel = Cabel::where('id','=',$request->cabel_id[$key])->first(); + $loan_selection = Loan::where('user_id','=',$user->id) + ->where('loanable_type','=',get_class($cabel)) + ->where('loanable_id','=',$cabel->id) + ->limit($request->cabel_amount[$key]) + ->get(); + foreach($loan_selection as $loan){ + $loan->delete(); + } + + Logger::LogReturn($cabel->id,get_class($cabel),$request->cabel_amount[$key],$user->id); + } + } + + if(isset($request->cabel_note_text)) { + foreach($request->cabel_note_text as $key => $value) { + $cabel = Cabel::where('id','=',$request->cabel_note_id[$key])->first(); + $note = new Note(); + $note->user_id = $user->id; + $note->note_type_id = $request->cabel_note_type[$key]; + $note->loanable_id = $request->cabel_note_id[$key]; + $note->loanable_type = get_class($cabel); + $note->note = $request->cabel_note_text[$key]; + $note->save(); + + if(isset($request->cabel_note_remove[$key])){ + if($request->cabel_note_remove[$key] == "on"){ + $amount = $request->cabel_amount[$key]; + $cabel->total -= $amount; + $cabel->save(); + Logger::LogAmountRemoved($cabel->id,get_class($cabel),$amount); + } + } + Logger::LogNote($cabel->id,get_class($cabel),$user->id,$request->cabel_note_text[$key]); + } + } + + return redirect()->route('loans.index'); + + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function adjust_page(Request $request, $loan) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'loans_adjust')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $loan_obj = Loan::where('id','=',$loan)->first(); + + return view('loans.adjust') + ->with('users',User::all()) + ->with('data',$loan_obj) + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function adjust_action(Request $request, $loan) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'loans_adjust')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $new_date = $request->date_end; + + $primary_loan_obj = Loan::where('id','=',$loan)->first(); + $loan_user = $primary_loan_obj->user_id; + $loan_type = $primary_loan_obj->loan_type_id; + $loan_start = $primary_loan_obj->date_start; + $loan_loanable_id = $primary_loan_obj->loanable_id; + $loan_loanable_type = $primary_loan_obj->loanable_type; + + $loans = Loan::where('user_id','=',$loan_user) + ->where('loan_type_id','=',$loan_type) + ->where('date_start','=',$loan_start) + ->get() + ; + Logger::LogAdjusted($primary_loan_obj->id,get_class($primary_loan_obj),'Slut Dato : '.date('d.m.Y',strtotime($primary_loan_obj->date_end))." til ". date('d.m.Y',strtotime($new_date))); + + foreach($loans as $loan){ + $loan->date_end = $new_date; + $loan->save(); + } + return redirect()->route('loans.index'); + + } + +} diff --git a/app/Http/Controllers/Loan/NoteController.php b/app/Http/Controllers/Loan/NoteController.php new file mode 100644 index 0000000..b528dc6 --- /dev/null +++ b/app/Http/Controllers/Loan/NoteController.php @@ -0,0 +1,278 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'notes_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "username", "name" => "user")); + array_push($search_types,array("value" => "type", "name" => "type")); + array_push($search_types,array("value" => "note", "name" => "note")); + array_push($search_types,array("value" => "created", "name" => "created_at")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "username": + switch($search_compare){ + case('='): + $notes = Note::where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $notes = Note::where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + case "note": + switch($search_compare){ + case('='): + $notes = Note::where('note','=',$search_term)->paginate($PerPagination); + break; + default: + $notes = Note::where('note','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + case "type": + switch($search_compare){ + case('='): + $notes = Note::where(function ($query) use ($search_term){ + $query->whereHas('type',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $notes = Note::where(function ($query) use ($search_term){ + $query->whereHas('type',function ($query) use ($search_term){ + $query->where('name','like','%'.$search_term.'%'); + }); + })->paginate($PerPagination); + break; + } + break; + case "created": + switch($search_compare){ + default: + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + $notes = Note::where('created_at','like','%'.$constructed_date.'%')->paginate($PerPagination); + break; + } + break; + } + } + else{ + $notes = Note::Paginate($PerPagination); + } + + + return view('notes.index') + ->with('search_types',$search_types) + ->with('data',$notes) + ->with('data_name','note') + ->with('data_names','notes') + ->with('without_create','true') + ; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'notes_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + $notes = Note::onlyTrashed()->Paginate($PerPagination); + + return view('notes.deleted') + ->with('search_types',$search_types) + ->with('data',$notes) + ->with('data_name','note') + ->with('data_names','notes') + ->with('without_create','true') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @return \Illuminate\Http\Response + */ + public function show($note) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($note) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'notes_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $note_obj = Note::withTrashed()->where('id','=',$note)->first(); + $note_types = NoteType::all(); + + return view('notes.edit') + ->with('data',$note_obj) + ->with('data_name','note') + ->with('data_names','notes') + ->with('types',$note_types) + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request, $note) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'notes_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $note_obj = Note::withTrashed()->where('id','=',$note)->first(); + + if($note_obj->note_type_id != $request->type){ + $type = NoteType::where('id','=',$request->type)->first(); + Logger::LogEdited($note_obj->id,get_class($note_obj),"Type : ".$note_obj->type->name." til ".$type->name); + $note_obj->note_type_id = $request->type; + } + if($note_obj->note != $request->note) { + Logger::LogEdited($note_obj->id,get_class($note_obj),"Note : ".$note_obj->note." til ".$request->note); + $note_obj->note = $request->note; + } + $note_obj->save(); + + return redirect()->route('notes.index'); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function delete($note) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'notes_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $note_obj = Note::where('id','=',$note)->first(); + Logger::LogDeleted($note_obj->id,get_class($note_obj)); + $note_obj->delete(); + + return redirect()->route('notes.index'); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($note) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'notes_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $note_obj = Note::withTrashed()->where('id','=',$note)->first(); + Logger::LogForceDeleted($note_obj->id,get_class($note_obj)); + $note_obj->forceDelete(); + + return redirect()->route('notes.deleted'); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($note) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'notes_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $note_obj = Note::withTrashed()->where('id','=',$note)->first(); + $note_obj->restore(); + Logger::LogRestored($note_obj->id,get_class($note_obj)); + + return redirect()->route('notes.deleted'); + } +} diff --git a/app/Http/Controllers/Loan/PdfController.php b/app/Http/Controllers/Loan/PdfController.php new file mode 100644 index 0000000..c96749e --- /dev/null +++ b/app/Http/Controllers/Loan/PdfController.php @@ -0,0 +1,223 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'pdf_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "user", "name" => "user")); + array_push($search_types,array("value" => "date", "name" => "date")); + array_push($search_types,array("value" => "type", "name" => "type")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "user": + switch($search_compare){ + case('='): + $contracts = Contract::where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->orderBy('user_id') + ->orderBy('type') + ->orderBy('timestamp','desc') + ->paginate($PerPagination); + break; + default: + $contracts = Contract::where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%' . $search_term . '%'); + }); + }) + ->orderBy('user_id') + ->orderBy('type') + ->orderBy('timestamp','desc') + ->paginate($PerPagination); + break; + } + break; + case "type": + switch($search_compare){ + default: + $contracts = Contract::where('type','=',trans($search_term)) + ->orderBy('user_id') + ->orderBy('type') + ->orderBy('timestamp','desc') + ->paginate($PerPagination); + break; + } + break; + case "date": + switch($search_compare){ + case('>='): + $parts = explode(' ',$search_term); + $date_part = $parts[0]; + $time_part = $parts[1]; + $date_parts = explode('.',$date_part); + $d = $date_parts[0]; + $m = $date_parts[1]; + $y = $date_parts[2]; + $time_parts = explode(':',$time_part); + $h = $time_parts[0]; + $i = $time_parts[1]; + $s = $time_parts[2]; + $date = new DateTime(); + $timezone = new DateTimeZone('Europe/Copenhagen'); + $date->setTimezone($timezone); + $date->setDate($y,$m,$d); + $date->setTime($h,$i,$s); + $timestamp = $date->getTimestamp(); + $contracts = Contract::where('timestamp','>=',$timestamp) + ->orderBy('user_id') + ->orderBy('type') + ->orderBy('timestamp','desc') + ->paginate($PerPagination); + break; + case('<='): + $parts = explode(' ',$search_term); + $date_part = $parts[0]; + $time_part = $parts[1]; + $date_parts = explode('.',$date_part); + $d = $date_parts[0]; + $m = $date_parts[1]; + $y = $date_parts[2]; + $time_parts = explode(':',$time_part); + $h = $time_parts[0]; + $i = $time_parts[1]; + $s = $time_parts[2]; + $date = new DateTime(); + $timezone = new DateTimeZone('Europe/Copenhagen'); + $date->setTimezone($timezone); + $date->setDate($y,$m,$d); + $date->setTime($h,$i,$s); + $timestamp = $date->getTimestamp(); + $contracts = Contract::where('timestamp','<=',$timestamp) + ->orderBy('user_id') + ->orderBy('type') + ->orderBy('timestamp','desc') + ->paginate($PerPagination); + break; + default: + $parts = explode(' ',$search_term); + $date_part = $parts[0]; + $time_part = $parts[1]; + $date_parts = explode('.',$date_part); + $d = $date_parts[0]; + $m = $date_parts[1]; + $y = $date_parts[2]; + $time_parts = explode(':',$time_part); + $h = $time_parts[0]; + $i = $time_parts[1]; + $s = $time_parts[2]; + $date = new DateTime(); + $timezone = new DateTimeZone('Europe/Copenhagen'); + $date->setTimezone($timezone); + $date->setDate($y,$m,$d); + $date->setTime($h,$i,$s); + $timestamp = $date->getTimestamp(); + $contracts = Contract::where('timestamp','=',$timestamp) + ->orderBy('user_id') + ->orderBy('type') + ->orderBy('timestamp','desc') + ->paginate($PerPagination); + break; + } + break; + } + } + else{ + $contracts = Contract::orderBy('user_id') + ->orderBy('type') + ->orderBy('timestamp','desc') + ->paginate($PerPagination); + } + + + return view('contracts.index') + ->with('search_types',$search_types) + ->with('data_name','contract') + ->with('data_names','contracts') + ->with('data',$contracts) + ; + } + + public function show(Request $request,$user){ + $user_obj = User::where('username','=',$user)->first(); + + if(empty($user_obj)){ + $user_obj = User::where('name','=',$request->user)->first(); + } + + if(Auth::user()->id != $user_obj->id){ + if(!Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'pdf_view'))){ + return redirect()->intended(route('users.show',Auth::user())); + } + else{ + $user = $request->user; + $type = $request->type; + + $timestamp = $request->timestamp; + $file_name = utf8_encode('app/'.$type."/".$user."_".$timestamp.".pdf"); + $file_full = storage_path($file_name); + return Fresponse::file($file_full); + } + } + else{ + $user = $request->user; + $type = $request->type; + + $timestamp = $request->timestamp; + $file_name = utf8_encode('app/'.$type."/".$user."_".$timestamp.".pdf"); + $file_full = storage_path($file_name); + return Fresponse::file($file_full); + } + } + + public function destroy(Request $request){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'pdf_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $type = $request->type; + $user = $request->user; + $timestamp = $request->timestamp; + + $file_name = utf8_encode('app/'.$type."/".$user."_".$timestamp.".pdf"); + $file_full = storage_path($file_name); + + if(file_exists($file_full)){ + unlink($file_full); + } + + $user_obj = User::where('username','=',$user)->first(); + + return redirect()->back(); + } +} diff --git a/app/Http/Controllers/Loan/ReservationController.php b/app/Http/Controllers/Loan/ReservationController.php new file mode 100644 index 0000000..c1274fd --- /dev/null +++ b/app/Http/Controllers/Loan/ReservationController.php @@ -0,0 +1,1419 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "username", "name" => "user")); + array_push($search_types,array("value" => "room", "name" => "room")); + array_push($search_types,array("value" => "start", "name" => "date_start")); + array_push($search_types,array("value" => "end", "name" => "date_end")); + + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case('username'): + switch($search_compare){ + case('='): + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%'.$search_term.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%'.$search_term.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + + break; + case('room'): + $parts = explode('.',$search_term); + $total_parts = count($parts); + if($total_parts == 1){ + $room = $search_term; + } + else{ + $room = $parts[1]; + } + switch($search_compare){ + case('='): + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','=',$room); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','=',$room); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','like','%'.$room.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','like','%'.$room.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + case('start'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_start','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + case('end'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('date_end','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + default: + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + } + else{ + $reservations_display = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations_track = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + } + + return view('reservations.index') + ->with('search_types',$search_types) + ->with('data',$reservations_display) + ->with('reservations',$reservations_track) + ->with('data_name','reservation') + ->with('data_names','reservations') + ; + } + + public function pickups(Request $request){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_pickup')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "username", "name" => "user")); + array_push($search_types,array("value" => "room", "name" => "room")); + array_push($search_types,array("value" => "start", "name" => "date_start")); + array_push($search_types,array("value" => "end", "name" => "date_end")); + + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type) { + case('username'): + switch ($search_compare) { + case('='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%'.$search_term.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%'.$search_term).'%'; + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + + } + break; + case('room'): + $parts = explode('.',$search_term); + $total_parts = count($parts); + if($total_parts == 1){ + $room = $search_term; + } + else{ + $room = $parts[1]; + } + switch($search_compare){ + case('='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','=',$room); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','=',$room); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','like','%'.$room.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','like','%'.$room.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + case('start'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_start','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_start','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_start','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_start','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_start','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_start','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + case('end'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_end','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_end','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_end','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_end','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_end','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->where('date_end','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + } + } + else{ + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Pick Up')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + } + + + + + return view('reservations.pickups') + ->with('search_types',$search_types) + ->with('data',$loans) + ->with('reservations',$reservations) + ->with('data_name','pickup') + ->with('data_names','pickups') + ; + } + + public function setups(Request $request){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_setup')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "username", "name" => "user")); + array_push($search_types,array("value" => "room", "name" => "room")); + array_push($search_types,array("value" => "start", "name" => "date_start")); + array_push($search_types,array("value" => "end", "name" => "date_end")); + + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type) { + case('username'): + switch ($search_compare) { + case('='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%'.$search_term.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%'.$search_term.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + + } + break; + case('room'): + $parts = explode('.',$search_term); + $total_parts = count($parts); + if($total_parts == 1){ + $room = $search_term; + } + else{ + $room = $parts[1]; + } + switch($search_compare){ + case('='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','=',$room); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','=',$room); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','like','%'.$room.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','like','%'.$room.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + case('start'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_start','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_start','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_start','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_start','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_start','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_start','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + case('end'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_end','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_end','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_end','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_end','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_end','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->where('date_end','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + } + } + else{ + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + + $reservations = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Set Up')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','loanable_type','loanable_id','date_start','date_end') + ->Paginate($PerPagination) + ; + } + + return view('reservations.setups') + ->with('search_types',$search_types) + ->with('data',$loans) + ->with('reservations',$reservations) + ->with('data_name','setup') + ->with('data_names','setups') + ; + } + + public function validations(Request $request){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_validate')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "username", "name" => "user")); + array_push($search_types,array("value" => "room", "name" => "room")); + array_push($search_types,array("value" => "start", "name" => "date_start")); + array_push($search_types,array("value" => "end", "name" => "date_end")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case('username'): + switch($search_compare){ + case('='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','=',$search_term); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->where(function ($query) use ($search_term){ + $query->whereHas('user',function ($query) use ($search_term){ + $query->where('username','like','%'.$search_term.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + + break; + case('room'): + $parts = explode('.',$search_term); + $total_parts = count($parts); + if($total_parts == 1){ + $room = $search_term; + } + else{ + $room = $parts[1]; + } + switch($search_compare){ + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->where(function ($query) use ($room){ + $query->whereHas('room',function ($query) use ($room){ + $query->where('name','like','%'.$room.'%'); + }); + }) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + case('start'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->where('date_start','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->where('date_start','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->where('date_start','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + case('end'): + $parts = explode('.',$search_term); + $d = $parts[0]; + $m = $parts[1]; + $y = $parts[2]; + $constructed_date = $y."-".$m."-".$d; + switch($search_compare){ + case('>='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->where('date_end','>=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + case('<='): + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->where('date_end','<=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->where('date_end','=',$constructed_date) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + break; + default: + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + break; + } + } + else{ + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Reservation - Awaiting')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('user_id','date_start','date_end') + ->Paginate($PerPagination) + ; + } + + return view('reservations.validations') + ->with('search_types',$search_types) + ->with('data',$loans) + ->with('data_name','validation') + ->with('data_names','validations') + ; + } + + + public function create(){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $cabels = Cabel::all(); + $cabels_valid = []; + foreach($cabels as $cabel){ + $available = $cabel->total - (count($cabel->loans) + count($cabel->reservations)); + if($available >= 1){ + array_push($cabels_valid,$cabel); + } + } + + $products = Product::all(); + $products_valid = []; + foreach($products as $product){ + $available = $product->total - (count($product->loans) + count($product->reservations)); + if($available >= 1){ + array_push($products_valid,$product); + } + } + + return view('reservations.create') + ->with('cabels', $cabels_valid) + ->with('products', $products_valid) + ->with('users', User::all()) + ->with('rooms', Room::all()) + ; + } + + + public function store(Request $request){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $user = User::where('username','=',$request->user)->first(); + $room = Room::where('id','=',$request->room_id)->first(); + $loan_type = LoanType::where('name','=','Reservation - Awaiting')->first(); + $date_start = $request->date_start; + $date_end = $request->date_end; + $date_current = new DateTime();; + + $deadline = new Carbon($date_start); + $deadline = $deadline->subWeekdays(1); + $deadline->setHour(8); + $deadline->setMinutes(15); + + $cabels = []; + $products = []; + + if(isset($request->products)){ + foreach($request->products as $key => $value){ + $product = Product::where('id','=',$request->product_id[$key])->first(); + for($i = 1; $i <= $request->product_amount[$key];$i++){ + $user->loans()->create([ + 'loanable_id' => $request->product_id[$key], + 'loanable_type' => get_class($product), + 'loan_type_id' => $loan_type->id, + 'room_id' => $room->id, + 'date_start' => $date_start, + 'date_end' => $date_end, + 'date_deadline' => $deadline + ]); + } + Logger::LogReserved($product->id,get_class($product),$request->product_amount[$key],$user->id); + $item = [$product,$request->product_amount[$key]]; + array_push($products,$item); + } + + } + else{ + $products = Null; + } + + if(isset($request->cabels)){ + foreach($request->cabels as $key => $value){ + $cabel = Cabel::where('id','=',$request->cabel_id[$key])->first(); + for($i = 1; $i <= $request->cabel_amount[$key];$i++){ + + $user->loans()->create([ + 'loanable_id' => $request->cabel_id[$key], + 'loanable_type' => get_class($cabel), + 'loan_type_id' => $loan_type->id, + 'room_id' => $room->id, + 'date_start' => $date_start, + 'date_end' => $date_end, + 'date_deadline' => $deadline + ]); + } + Logger::LogReserved($cabel->id,get_class($cabel),$request->cabel_amount[$key],$user->id); + $item = [$cabel,$request->cabel_amount[$key]]; + array_push($cabels,$item); + } + } + else{ + $cabels = Null; + } + + // Send Mail + if($user->role->name == 'Underviser') + { + $email_sufix = "@sde.dk"; + } + else + { + $email_sufix = "@edu.sde.dk"; + } + + $email = $user->username.$email_sufix; + $logo = "iVBORw0KGgoAAAANSUhEUgAAAa8AAAB1CAMAAADOZ57OAAAAt1BMVEX///+AgoQAeIp6fH59f4HP0NF3eXvIycmChIYAcoWGiIrf3+D8/Pz5+fnl5uYAcYSbnZ6vsLG9vr/v8PCSk5XX2Nje3t++v8CoqquPkZLl5eWXmZrs7e1zdXe1trcAbIDt9fbh7vCio6U3jZyQvMXG3eGvz9UlhZXS5OiBs71Ynamgxs1Dk6G92N17sLpsqLOYwckOgJFknqp0pbDa5um60NZRlaOTt79lrbiHvcYAZHmn0Nd4tL0vlxF5AAAVwUlEQVR4nO1dCZujOA6FmBBCIBch90GSrtQ9VdXb27Mzvf//d62NJVs2hKR6ZzrJLu+bb7owh40fkmVJdhznUzi87B+3n7ulxuXw1ms32o3XSzejxnk49BoC99mlG1LjHGT3OV2N3t2lW1LjHHxpS742tUK8BWQNRG1x3ALeQLx6j5duSY0zsN2AdH1kUPD49Fs9kl0tXoCuzbM8fmi02+3Nl8s2qsYxvKJ47eVxJI3FTS1hV4lobxmHYCy2f7tsu2qU47kH4vUijzOgr/31su2qUQqcKjd6D7LgNzQW3y/bsBql+NIzxUkZi43sou2qUYqtPVV+QvECY3H71Gu/Xc80Oo4LRckFmvH34PD00di/V3a2miqD+X6n5mLyOGvwC9qoK48gak5ns8WgowriVrMZ0SuazdZS/pU2c6TzYjfjqU4FA+tWoWjaLF62bDa79Dhp9Wez/nBJi5rNuT7q8BZemPhs38v7ulExEN0BXeiZV8ZiD4xF4HNfVdE4ZB4HYzv18Y/81YRckfp+KHsjWvgshxfMJlYH9fGUO5ssnVLEYVgoG7C0UNZcrSixE1e20B2SVq9Wa32955OjywA1W6P9VlQigBek5yCP0Vhsg7H4AMebinpS3hHBoj/jXbLAirq+GxI2Qo+BEER9z/UF+NUsnBhCuPNchqeCYWmbW4x17LIBcwuENRlr0St4Xf0+/6yYJqXj64Mmr3HoXBho6HE23o5ccsBLXmTHKWOxDQoQOd9ER57AP3nmsukyiuJ05rEBlk7J37yXvT48gPPlL7vd7rg1Fd3XpyK287wmP9eRpxYlIhaPPG9nFw645MytMoOvJnPdVhxFSct1V4pawlfKroAux7lXhLWfy6/4QELBl6GMRSBYuT5ejtcyZNiFyzBQnZS4rurE2HWVVHC+VnjJMOCfPSGM8wWDTjwJPC8sEpbynvftYWbguZ7bNcsMvmaeBwepP1MXar74U6+BLuehoZGVXfBs2/KWsRjbo1kZhMDAnx3Sw5zGPvy5Zt4UiwlfXGvynhzpWzRfnHsuSWFBJXJlWuxazpfrBSa5lK+EV4LqIdV6QvHF6fKvgS4ygjXaZd7bGE9vwIS0jUV7NCtDFHphmbLk5WAH8LFMy4TBl7MMqCKifHHLwmNTx8Sca8OZF1jVDbjpwrzQEDvKF7/LfpAA8sW1pWEbXRAPiq9Gu+Q0DnDoKXywjMUM1WW7ypznglBqGvBBQdpyfY/p/jD5crqMcGnwxbl0V5ZGFBdMDEtCgI9f851FGOWr6ylJpwC+OF1+cY5wGUQvii80AAm2yn7MZMHeulbxecxcyTGgdFAAT5y3gDTJ5IvrSi1gJl/OhHkDeqmzdL2FE/tau2EDvI7DCZsRwozxK/DcglGJfAnL8FrooiZiSZ+j9mvD/OxVaT/ZH2r4+6iccXdXfEgp04hzbp7HwqRjZEJr80W73+IrDizVx7lt5pbn2Kgn5yvqG4QZfPGhNCxO0XK+OF3e9dClKBCwu1RNlcGT4SjHLxiLT9Zodgy8O9ioWaITB4zb9FxKFqTM5stZeAy72eKLM+PT48jzZryWDrNM+pwvJxaEqUYYfAkuvZ1t8nO+hlz2r4kurfKK4UelK9v2VPlJHtuuj+MQxjebTQqMJYHL0jDvTV2tzdeE+Xje5qvFqGSKw1zxzizrXfLlxAumRdWcL8dTMQXvp8Yn2/G9BTcsr4kuPf8tWogHO+yliAXtt7dcHxXo7jxW5pJoMT4zMq28Er5Uz9p8NZkxMoaem8inMsN1BHw5Cde8OC1vWlZJOuKM+SNKf8cXjbsOQx6R7TVfZvhRezJA7h6tqfLBGs2q0eW6z2WhPazzLnYDw9Au8JUe52vsU75SH8xyPq4ZtiDylU8BwBK0+eIPW/icsYX+pMY+ly43vCrvfvRdK0RTrRXCXraxeEyPHkM8ETrHGtZ5n1j9ViZf+NWX6EPCV1+NZmuTDMVXTpgc24p8cfNSaEVXEcbly+3b87ZL46vmq5eR8kKGKF6IavOLNZqdgXjH1Z/19qHdHwW+hsxHc69y/Or6yszgs2zqpdd8OQkSVsYX/3xmZCrGx6+1s6BGyhXgH0cMDjtDVBsXsvXKM9X7TKhyV3CbnuZrpt1ZNl87z9dGHWelvwaELhVkwpezBK9IOV9iDq5MztyeFw7kxRURRvjqEZ8vhklUhqhtLNquj/PQ5Ra3WXKSr4RbaUfmX4lHPF2Jy0cbxjBARucIlC+nG+aBgSN8cWlWKlbOl5NZuffjQngkHimSbI3DGnKo4yryWDuyss/UFvOXN0tO8jX1jvo31oyEZIbMDUIF12XaVWXw5XQCz18f5Wusgyjgj+qW+CkvB8rXP1SpCvrfy+PINhafLNdHBeJUjzGcr8A8e4qvDnO1BWDyNXddpSmFJeEtEwXDVWXy5XT4fRPDP9/ST+0U+HLG/PpLh5YVnomD47tSLkcyRJWxqNwi9ydt+YT5OiKSuDQ8InCCr6VLna0GX8J00N3YYoaPPeYzcdU0iy9nzGcWC+0VbK6I+72ledTxFJ8TfPwNfykoX/sMC60oZIYXtaVxEX1iqhyNiFGwZrbrt5ovrrsYGTwoX0JNEe5nVgiZ1mTz5YxXYiaMvCQrYgKOvBW2R4tac3U1LnrqQMQJmJqUYdaTbSy+oy3//Ywamr6ipOmBB0Kjiq/lmhl0Eb6S3CephTs1nZD8Xl/bIgW+hMSQed8OJ2V8tCS+R6IaW3yaWJJkdQHcEb5wqoWuDfRk2Bmiam5WGfZS4FOYUHh7l+uS0EQZX3533knTYd/lnEypwhX5G+LUpB8wz98RM3tRmInzx2BJkS8R1DLiy15/Hjtxp8//UkMizbcZ8Jlj0YN/ASjLgvAVoTVxJEP0vLCXQiKy2cLRLChLWinjS1jmPhPekJn5Ue/0KT+kzM/5PMEaSVNfmeElfDkt+umkARf82YLrVM/VoRjKlwifBWaU5jLICF+bb1AolSSGSZTKhLjKVonkmVPleOCKLuZ9XNQpgR9YfC18mc7mhn07BtOXp7iq65u5m7tVMWLv+Stgabryi13doiNSd5E3kHEx04VG/mHE62Z2xOUCKOXLOTR6PZSeSKUggrH4ZI1mTvaQnailO9mNFruyEFhn3LEEYz7O0ekW/XZHT/HCwrO74/FS/VVS85AyHI3Xu9lubdAaqwfA0fga+CLqkFh72T//iWOTiqtACu+DPZp97W3O1IzXhavy456LI3yRC+wM0RdrNNsLPnsVCVI1/kLE+xN8Heywl+X6gAlcvTHHr4EanRpHFuAph5U0LvTqPUlQXHVvjb8eJADW/qPkPMhXzw57gQLEqHPvxy9r8f83Hk/wleVJ9m3wfWwxQ7QhR7NC1LnG34z3E3w53/a9du/DWruMo9mbFXWu8XeDz4bfKvlyssOXQyb/1Ask5GimUxTPybmp8Rcg27TfP0yhOQ5ly4M4oWO4fdpPX+MvwkfvGbr9pLtdJW3AaGZPpWv8Ajz1fv9326DhKFD9baQ4FVIU/ycRL7vdssXSyXK+/AkXSTwfN9POkdXX5+D3ze/o0a1adSeAzhDIEEVT5URKW5y2TKAbrknKzDeQZTqAMZcFons69jn9oDzp2qxKenwjWpN2Ci6hhD5qbD0+3YWBGwRhv2U0MG4tRHk4G6SKs6bxNFWnueVAPxRZQV4QTs2QQWJ2jazbfBcoPWxe0Iw4mUsoZ18gTtqV9a3qnhgX/MtF/+L/4GmlJ1jY1xREeaKTr0OVk5UoWIm36cib6KLXOD8rT89X5JlsJeM38ay0JryP9Fwkr8S9A+IdEyGcPPUq2OnrxjMoF2vih9CUUX6rC5bXUFa5IlG6aBLi4/iN3oJ6l8eyXiPKYPQPY1C63fR+7M81ON7v272GFQY7sYlly3c1glC0FUJefY+ccWlsMsgL9CqTFhMFMq9gkd9F8wrkWRlg7tLa8Kp4ZNbkQy7OOi+miR/j/HZcaJvMGLlNJ92kHnmet4KYt2wYRLVTeSfNXeyO6NPECw/0yY58K0PWzf5xsbjX/gLTqDPc7NndHUS9tnaK4hGsaStzvlxYPmK1x9Wx/yq+mpIdnQwQSTZkwP4cvviTJGFd2TSmu20qHyXFMtoZHawCq4nJPtJN+UrgHAnuGSTjC+vk7/P5eup9lU5bLjrVXW9AhcFOeA7Tlc0Xprf0Uadgu1QEv4qvOMwvV4uM8jx30VH5QSVfpCapixZWLy3leVibnsKzxIBDl7FP4SkixunqNbmUL6iQLE9LTeGCJ6io+Cf4OvTu8wHs42H7mFX3PYGdongc65VvYBV0aHvCwWDkQ3+igFXx5UykgCktNqUKEvhiUBWMX7L7wrWuaUc6Ucvq0Hj0Dq4dtIZ9pjeWiGUVXjBp8efpXFLCF+gUXw/JywA7n+UbvuABvnEFX9hvWLxt9x7EDOxTmfCFFMUKRDqPMxE5nUZ7cmGLoWt86LhKvpJACgE8B1QPdOc870w2hOqkIEu+8gEugU6Ay2eGrMbykEmpSGbyyXLtWF+JlxQ7SKRM9SYgmq8mfDTG4hkgKByOk2U6QEn3IUXiOF8Bdp0qv+89i4RQmj9/EvZqvp+B5kvkd+ath5ev5MsUKBQ3MCGkfFlZjoQvJ5EjKKRrm7IK4gbf/DIwZN5qDHatdsQpvrpADVkMj9pQLeRe9qEE8p0r+Cr022Pvq0hr+0xQv7CJ5c+A8AUvi4xU89WhWgx0HSYmnuQLa5J8AXsBNVjxk4duD62dcVBpLqxi5AtbxHbEpwr6gyYxokqROvMzfN217/M0RJXfexo/sfqrCMrXiPbiCb5kypsrdwEYGzKBfJlpjgZfZk0D0k8gULhrDvDlhS0zW6cFprpIWaRAvqayRXT3CFDhxjLdKKSzic/wlX207/LOr5z3UhQ2saxCBNsWKqDGJ3x14fuj45c7m0yGOSY7Q/pgfJB8wikc2edwSt45KYxfTkeSghnYcyKrUnCUbMYwfrl8qtwkna/NxtE6NXJWZaPBxqRiOYYyg2A5MXGliVjBF/QCmV0/9d6ezrDMNVTY64zfe4ioc8FzhW+iRdojei5K4VtDiQqgo/RtBl+x1mJLs/vRPoSVYK78NICvkfASGV+16pR8uzH5VF91Ktrt+eOmqv8jNWUQKZV6Db3kC+xAcwuQljHGAnAkzR9QYR/KV6E7WHFt+C/BwDnp8AJq9deJqXKOYdG/Yc6/wtCHsRc9BciXBb1uYqiG/IkpE9b8K6R8ifVhK6hJT4xAVqfK2tDejq4yu0W57rAJrYMF2KoFudpSyJbkAuj3cXL+RVOjs33v+eNM7SZgp7RVYkBrlf4NmI/a/g3dI6f4StQUWb6z3qCqii8NsreollWwNoge63jl/qiBbxAJzaJ8WdZIOV+zn+XLeWw8CWf7GcuDBF5RG+7PiSqX+A9Hhnxhgzz9OsCXp2DxBaMW68iBgSiac/hixh4oKKsxnVYBkoFLqNH52J0d07KH63WBL1BixpJM0Ifmqr/4p+XL+favR+EOrNoWj8BKaTuBaOBp3wbjf7PZvKQ9xma9kq9wihiZ9obyyw6mtkzg+AWJ9mV8zczc+wQsDtCsVop/nE7RF29MqJatXYDCB9NtsDfQdDe2JwaT0Xh0B4aDU3yBq8awLR+zQ25DlFmI8fv3ly+ZPrb3JTqJpQVUXuCPCqkoSFTb8wLSbAjgA9flki9vDVXJLx/9UfCPFSwEswK+kZL3H6Oj0zyZtEKgRvYy2PPKWUlCdEtbQAXkQAEzkQr7UL6JuWbgkP0hjIiyNKf4adNu9z7esZcxQ/S/mirr9niLpmz3iBi7p/lqkZGFLv2qnH/BZ74w1XiHqNAjO/+BP9AmMwH/lfz0cf7Vha+IWvQz4IbUjMEBWeNn5l8c2evDnQiCfRRPweLY3j0MbvYWvj8PtOflBJNq/NN8xcQkoW9U5d8Y4bBnLfcPtbY0FzepLyimIQCyUgJcUwZfEU6s6EYrQ3AAa6WWQK0QeP0kX84P5w+h59rFIem7kqe9iCurDNFNVvqgTwD5gr6nG0ie5EuseCyTiWr/RgzdZg5SWlatfWH7eLiUWhbGn0Ttoa3nFQ7194I4krW8S5xR7oDrMdCFjpnP8pXd3b1zuooWB9kRrLH5/lDYwvcM0DyEJv8P9YSaL4M/W/NxBl/dcpkA/8YglTDmywtFjbFtohNpU8/Mn+DmUb5mLV4YZuiU+f3cxEhd2m4STwFTkRgoGLX1/F0zTScz1MEYPet4Rru7qn/cAIqs5bhcwJ56f3xsClMwkmDP+XzCP0s0ZzniGbP8G8z2b6hIEyqQM/hS1qXpNTD9Gz6Nf+VmCfS8uSeU6kzTFy+uZe5i2of5BIyTQtjEzwtMZ9ACcDgSvmJgQ6/hjPFi2TQ80Jt9eEa71+QNrfwNwPbu9f1j/+PPwhT4W4MQpv4+P0N0Upx/0fyNvOsSdKHCPefwhSEKUyYq4ss5XxjrMBQfyqpvZl1BozBUheoQPy4VwsL0Ic2XsmH0j010ySip26c3IzBniJQvhNWvP6LHx/a396Kae9jTPQQA52eIDoglV+LfkJ/6BDQ+TArP4QsDKaZMnOILR37TIumXSF1kdbDnSZfg2KiBRKeNfBt4IfKbBvOgQBj5PZnP8/WwfT3cvztZscfj54+2RVeJXXIMJ/wbRvwLVc45fKHr0NTrJ/mKcHpEHbJpib8oGgb0S/MCqGi5o25Fl6m4icGXkkKdILVcGDfyD2BNfpzg03w5d9Hr85GEm+zRUIqfC3tNSbU5XyF0VZ5f50vtP/dyL76fe9Qj5h/NP9RIxC2+tTthRf6hL/VZB4YI+oMPEEOw0nWXg4BJpSd2DtCXpwsP0w9ZoPs8zz/0Mf8Qcx5XJGzZIvmH/IlGxMVs91r1TyH/kCBz7o9lz2y/GkrxU1Nl8fM1FOq3L+SveUXkoNnMuYTf+VJP6MoCqz/HoszaWSM2Q22SYYjApbRa886OWZ96WjqYCROgPzSDzN3WLuTFwZRueQDPVW8N1Rjer3QQyM4fWU9MStptxQ0LreM4/Hk0Ff7hRW0M0Kt/GfbnES3nJT9F97O4r/jR19d7kLFzwl41fgle/6xSdc8fgrFNvdrrevBRGWTOfru//15v3XBFOJxIAM2yX9OOGufhR/2z5TeF7VlJTzWuBs+9TyVm17g03npn5dHUuBJk9/Vy/5vCXe2/uC18qXfHuy08Na7oJ15qnETW+G/WCdX45dj+WW+4dlN4/bMewm4Kj+f9eEONa8HbyZ/prXFNiL+/1EbiLSHb15vK3xS2jVv82Yb/Y2xPbL1W48rwUE/DbgsPm9r1e1N4qNMDbgsPH7Ur8aaw/Xipw823hO2+9nTcFKLv5258U+M68FYHnG8Lhzop8bawffrEbpY1rgCHfa0TbwrZ22MdYLkp3P27jjnfFl5f67nzbWFb68QL4T+Hg3aCFW4f7AAAAABJRU5ErkJggg=="; + + $mj = new Client(config('app.mail_username'), config('app.mail_password'),true); + + $body = [ + 'FromEmail' => config('app.mail_from_address'), + 'FromName' => config('app.mail_from_name'), + 'Subject' => "Reservation - Validering", + 'Html-part' => view('emails.reservation') + ->with('logo',$logo) + ->with('user',$user) + ->with('room',$room) + ->with('date',$date_current) + ->with('deadline',$deadline) + ->with('products',$products) + ->with('cabels',$cabels) + ->render(), + 'Recipients' => [ + [ + 'Email' => $email + ] + ], + 'Inline_attachments' => [ + [ + 'Content-type' => "image/png", + 'Filename' => "logo.png", + 'content' => $logo + ] + ] + ]; + + // All resources are located in the Resources class + + $response = $mj->post(Resources::$Email,['body' => $body]); + + return redirect()->route('reservations.index'); + } + + public function cancel(Request $request,$reservation){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_cancel')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $reservation_obj = Loan::where('id','=',$request->reservation)->first(); + $loan_type = LoanType::where('name','=','Reservation - Awaiting')->first(); + $user = User::where('id','=',$reservation_obj->user->id)->first(); + $room = Room::where('id','=',$reservation_obj->room->id)->first(); + $date_start = $reservation_obj->date_start; + + $reservations = Loan::where('loan_type_id','=',$loan_type->id) + ->where('user_id','=',$user->id) + ->where('room_id','=',$room->id) + ->where('date_start','=',$date_start) + ->get() + ; + + foreach($reservations as $loan){ + $loan->delete(); + } + + return redirect()->route('reservations.validations'); + } + + + public function validate_page(Request $request,$reservation){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_validate')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $reservation_obj = Loan::where('id','=',$reservation)->first(); + $loan_type = LoanType::where('name','=','Reservation - Awaiting')->first(); + $user = User::where('id','=',$reservation_obj->user->id)->first(); + $room = Room::where('id','=',$reservation_obj->room->id)->first(); + $date_start = $reservation_obj->date_start; + $date_end = $reservation_obj->date_end; + + $reservations = Loan::where('loan_type_id','=',$loan_type->id) + ->where('user_id','=',$user->id) + ->where('room_id','=',$room->id) + ->where('date_start','=',$date_start) + ->where('date_end','=',$date_end) + ->groupBy('loanable_type','loanable_id') + ->select('*',DB::raw('count(loanable_id) as amount')) + ->get() + ; + + return view('reservations.validate') + ->with('data',$reservation_obj) + ->with('user',$user) + ->with('room',$room) + ->with('reservations',$reservations) + ; + } + + public function validate_action(Request $request, $reservation){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_validate')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $reservation_obj = Loan::where('id','=',$reservation)->first(); + $loan_type = LoanType::where('name','=','Reservation - Awaiting')->first(); + $user = User::where('id','=',$reservation_obj->user->id)->first(); + $room = Room::where('id','=',$reservation_obj->room->id)->first(); + $date_start = $reservation_obj->date_start; + $date_end = $reservation_obj->date_end; + $deadline = $reservation_obj->date_deadline; + + $reservations = Loan::where('loan_type_id','=',$loan_type->id) + ->where('user_id','=',$user->id) + ->where('room_id','=',$room->id) + ->where('date_start','=',$date_start) + ->where('date_end','=',$date_end) + ->groupBy('loanable_type','loanable_id') + ->select('*',DB::raw('count(loanable_id) as amount')) + ->get() + ; + + $loan_products = []; + $loan_cabels = []; + $products_total_amount = 0; + $cabels_total_amount = 0; + + $loan_type_new = LoanType::where('name','=','Reservation - Set Up')->first(); + + $total = 0; + foreach($reservations as $reservation){ + switch($reservation->loanable_type){ + case('App\Models\Product'): + $product = Product::where('id','=',$reservation->loanable_id)->first(); + $loan_selection = Loan::where('user_id','=',$user->id) + ->where('loan_type_id','=',$loan_type->id) + ->where('loanable_type','=',get_class($product)) + ->where('loanable_id','=',$product->id) + ->limit($reservation->amount) + ->get() + ; + + foreach($loan_selection as $loan){ + $loan->loan_type_id = $loan_type_new->id; + $loan->save(); + $total += 1; + } + + array_push($loan_products,$reservation); + $products_total_amount += 1; + break; + case('App\Models\Cabel'): + $product = Cabel::where('id','=',$reservation->loanable_id)->first(); + $loan_selection = Loan::where('user_id','=',$user->id) + ->where('loan_type_id','=',$loan_type->id) + ->where('loanable_type','=',get_class($product)) + ->where('loanable_id','=',$product->id) + ->limit($reservation->amount) + ->get() + ; + + foreach($loan_selection as $loan){ + $loan->loan_type_id = $loan_type_new->id; + $loan->save(); + $total += 1; + } + + array_push($loan_cabels,$reservation); + $cabels_total_amount += 1; + break; + } + + } + + Logger::LogValidated($reservation_obj->id,get_class($reservation_obj),$user->id,$total); + + // Generate the PDF + // Data for the PDF + $logo = "iVBORw0KGgoAAAANSUhEUgAAAa8AAAB1CAMAAADOZ57OAAAAt1BMVEX///+AgoQAeIp6fH59f4HP0NF3eXvIycmChIYAcoWGiIrf3+D8/Pz5+fnl5uYAcYSbnZ6vsLG9vr/v8PCSk5XX2Nje3t++v8CoqquPkZLl5eWXmZrs7e1zdXe1trcAbIDt9fbh7vCio6U3jZyQvMXG3eGvz9UlhZXS5OiBs71Ynamgxs1Dk6G92N17sLpsqLOYwckOgJFknqp0pbDa5um60NZRlaOTt79lrbiHvcYAZHmn0Nd4tL0vlxF5AAAVwUlEQVR4nO1dCZujOA6FmBBCIBch90GSrtQ9VdXb27Mzvf//d62NJVs2hKR6ZzrJLu+bb7owh40fkmVJdhznUzi87B+3n7ulxuXw1ms32o3XSzejxnk49BoC99mlG1LjHGT3OV2N3t2lW1LjHHxpS742tUK8BWQNRG1x3ALeQLx6j5duSY0zsN2AdH1kUPD49Fs9kl0tXoCuzbM8fmi02+3Nl8s2qsYxvKJ47eVxJI3FTS1hV4lobxmHYCy2f7tsu2qU47kH4vUijzOgr/31su2qUQqcKjd6D7LgNzQW3y/bsBql+NIzxUkZi43sou2qUYqtPVV+QvECY3H71Gu/Xc80Oo4LRckFmvH34PD00di/V3a2miqD+X6n5mLyOGvwC9qoK48gak5ns8WgowriVrMZ0SuazdZS/pU2c6TzYjfjqU4FA+tWoWjaLF62bDa79Dhp9Wez/nBJi5rNuT7q8BZemPhs38v7ulExEN0BXeiZV8ZiD4xF4HNfVdE4ZB4HYzv18Y/81YRckfp+KHsjWvgshxfMJlYH9fGUO5ssnVLEYVgoG7C0UNZcrSixE1e20B2SVq9Wa32955OjywA1W6P9VlQigBek5yCP0Vhsg7H4AMebinpS3hHBoj/jXbLAirq+GxI2Qo+BEER9z/UF+NUsnBhCuPNchqeCYWmbW4x17LIBcwuENRlr0St4Xf0+/6yYJqXj64Mmr3HoXBho6HE23o5ccsBLXmTHKWOxDQoQOd9ER57AP3nmsukyiuJ05rEBlk7J37yXvT48gPPlL7vd7rg1Fd3XpyK287wmP9eRpxYlIhaPPG9nFw645MytMoOvJnPdVhxFSct1V4pawlfKroAux7lXhLWfy6/4QELBl6GMRSBYuT5ejtcyZNiFyzBQnZS4rurE2HWVVHC+VnjJMOCfPSGM8wWDTjwJPC8sEpbynvftYWbguZ7bNcsMvmaeBwepP1MXar74U6+BLuehoZGVXfBs2/KWsRjbo1kZhMDAnx3Sw5zGPvy5Zt4UiwlfXGvynhzpWzRfnHsuSWFBJXJlWuxazpfrBSa5lK+EV4LqIdV6QvHF6fKvgS4ygjXaZd7bGE9vwIS0jUV7NCtDFHphmbLk5WAH8LFMy4TBl7MMqCKifHHLwmNTx8Sca8OZF1jVDbjpwrzQEDvKF7/LfpAA8sW1pWEbXRAPiq9Gu+Q0DnDoKXywjMUM1WW7ypznglBqGvBBQdpyfY/p/jD5crqMcGnwxbl0V5ZGFBdMDEtCgI9f851FGOWr6ylJpwC+OF1+cY5wGUQvii80AAm2yn7MZMHeulbxecxcyTGgdFAAT5y3gDTJ5IvrSi1gJl/OhHkDeqmzdL2FE/tau2EDvI7DCZsRwozxK/DcglGJfAnL8FrooiZiSZ+j9mvD/OxVaT/ZH2r4+6iccXdXfEgp04hzbp7HwqRjZEJr80W73+IrDizVx7lt5pbn2Kgn5yvqG4QZfPGhNCxO0XK+OF3e9dClKBCwu1RNlcGT4SjHLxiLT9Zodgy8O9ioWaITB4zb9FxKFqTM5stZeAy72eKLM+PT48jzZryWDrNM+pwvJxaEqUYYfAkuvZ1t8nO+hlz2r4kurfKK4UelK9v2VPlJHtuuj+MQxjebTQqMJYHL0jDvTV2tzdeE+Xje5qvFqGSKw1zxzizrXfLlxAumRdWcL8dTMQXvp8Yn2/G9BTcsr4kuPf8tWogHO+yliAXtt7dcHxXo7jxW5pJoMT4zMq28Er5Uz9p8NZkxMoaem8inMsN1BHw5Cde8OC1vWlZJOuKM+SNKf8cXjbsOQx6R7TVfZvhRezJA7h6tqfLBGs2q0eW6z2WhPazzLnYDw9Au8JUe52vsU75SH8xyPq4ZtiDylU8BwBK0+eIPW/icsYX+pMY+ly43vCrvfvRdK0RTrRXCXraxeEyPHkM8ETrHGtZ5n1j9ViZf+NWX6EPCV1+NZmuTDMVXTpgc24p8cfNSaEVXEcbly+3b87ZL46vmq5eR8kKGKF6IavOLNZqdgXjH1Z/19qHdHwW+hsxHc69y/Or6yszgs2zqpdd8OQkSVsYX/3xmZCrGx6+1s6BGyhXgH0cMDjtDVBsXsvXKM9X7TKhyV3CbnuZrpt1ZNl87z9dGHWelvwaELhVkwpezBK9IOV9iDq5MztyeFw7kxRURRvjqEZ8vhklUhqhtLNquj/PQ5Ra3WXKSr4RbaUfmX4lHPF2Jy0cbxjBARucIlC+nG+aBgSN8cWlWKlbOl5NZuffjQngkHimSbI3DGnKo4yryWDuyss/UFvOXN0tO8jX1jvo31oyEZIbMDUIF12XaVWXw5XQCz18f5Wusgyjgj+qW+CkvB8rXP1SpCvrfy+PINhafLNdHBeJUjzGcr8A8e4qvDnO1BWDyNXddpSmFJeEtEwXDVWXy5XT4fRPDP9/ST+0U+HLG/PpLh5YVnomD47tSLkcyRJWxqNwi9ydt+YT5OiKSuDQ8InCCr6VLna0GX8J00N3YYoaPPeYzcdU0iy9nzGcWC+0VbK6I+72ledTxFJ8TfPwNfykoX/sMC60oZIYXtaVxEX1iqhyNiFGwZrbrt5ovrrsYGTwoX0JNEe5nVgiZ1mTz5YxXYiaMvCQrYgKOvBW2R4tac3U1LnrqQMQJmJqUYdaTbSy+oy3//Ywamr6ipOmBB0Kjiq/lmhl0Eb6S3CephTs1nZD8Xl/bIgW+hMSQed8OJ2V8tCS+R6IaW3yaWJJkdQHcEb5wqoWuDfRk2Bmiam5WGfZS4FOYUHh7l+uS0EQZX3533knTYd/lnEypwhX5G+LUpB8wz98RM3tRmInzx2BJkS8R1DLiy15/Hjtxp8//UkMizbcZ8Jlj0YN/ASjLgvAVoTVxJEP0vLCXQiKy2cLRLChLWinjS1jmPhPekJn5Ue/0KT+kzM/5PMEaSVNfmeElfDkt+umkARf82YLrVM/VoRjKlwifBWaU5jLICF+bb1AolSSGSZTKhLjKVonkmVPleOCKLuZ9XNQpgR9YfC18mc7mhn07BtOXp7iq65u5m7tVMWLv+Stgabryi13doiNSd5E3kHEx04VG/mHE62Z2xOUCKOXLOTR6PZSeSKUggrH4ZI1mTvaQnailO9mNFruyEFhn3LEEYz7O0ekW/XZHT/HCwrO74/FS/VVS85AyHI3Xu9lubdAaqwfA0fga+CLqkFh72T//iWOTiqtACu+DPZp97W3O1IzXhavy456LI3yRC+wM0RdrNNsLPnsVCVI1/kLE+xN8Heywl+X6gAlcvTHHr4EanRpHFuAph5U0LvTqPUlQXHVvjb8eJADW/qPkPMhXzw57gQLEqHPvxy9r8f83Hk/wleVJ9m3wfWwxQ7QhR7NC1LnG34z3E3w53/a9du/DWruMo9mbFXWu8XeDz4bfKvlyssOXQyb/1Ask5GimUxTPybmp8Rcg27TfP0yhOQ5ly4M4oWO4fdpPX+MvwkfvGbr9pLtdJW3AaGZPpWv8Ajz1fv9326DhKFD9baQ4FVIU/ycRL7vdssXSyXK+/AkXSTwfN9POkdXX5+D3ze/o0a1adSeAzhDIEEVT5URKW5y2TKAbrknKzDeQZTqAMZcFons69jn9oDzp2qxKenwjWpN2Ci6hhD5qbD0+3YWBGwRhv2U0MG4tRHk4G6SKs6bxNFWnueVAPxRZQV4QTs2QQWJ2jazbfBcoPWxe0Iw4mUsoZ18gTtqV9a3qnhgX/MtF/+L/4GmlJ1jY1xREeaKTr0OVk5UoWIm36cib6KLXOD8rT89X5JlsJeM38ay0JryP9Fwkr8S9A+IdEyGcPPUq2OnrxjMoF2vih9CUUX6rC5bXUFa5IlG6aBLi4/iN3oJ6l8eyXiPKYPQPY1C63fR+7M81ON7v272GFQY7sYlly3c1glC0FUJefY+ccWlsMsgL9CqTFhMFMq9gkd9F8wrkWRlg7tLa8Kp4ZNbkQy7OOi+miR/j/HZcaJvMGLlNJ92kHnmet4KYt2wYRLVTeSfNXeyO6NPECw/0yY58K0PWzf5xsbjX/gLTqDPc7NndHUS9tnaK4hGsaStzvlxYPmK1x9Wx/yq+mpIdnQwQSTZkwP4cvviTJGFd2TSmu20qHyXFMtoZHawCq4nJPtJN+UrgHAnuGSTjC+vk7/P5eup9lU5bLjrVXW9AhcFOeA7Tlc0Xprf0Uadgu1QEv4qvOMwvV4uM8jx30VH5QSVfpCapixZWLy3leVibnsKzxIBDl7FP4SkixunqNbmUL6iQLE9LTeGCJ6io+Cf4OvTu8wHs42H7mFX3PYGdongc65VvYBV0aHvCwWDkQ3+igFXx5UykgCktNqUKEvhiUBWMX7L7wrWuaUc6Ucvq0Hj0Dq4dtIZ9pjeWiGUVXjBp8efpXFLCF+gUXw/JywA7n+UbvuABvnEFX9hvWLxt9x7EDOxTmfCFFMUKRDqPMxE5nUZ7cmGLoWt86LhKvpJACgE8B1QPdOc870w2hOqkIEu+8gEugU6Ay2eGrMbykEmpSGbyyXLtWF+JlxQ7SKRM9SYgmq8mfDTG4hkgKByOk2U6QEn3IUXiOF8Bdp0qv+89i4RQmj9/EvZqvp+B5kvkd+ath5ev5MsUKBQ3MCGkfFlZjoQvJ5EjKKRrm7IK4gbf/DIwZN5qDHatdsQpvrpADVkMj9pQLeRe9qEE8p0r+Cr022Pvq0hr+0xQv7CJ5c+A8AUvi4xU89WhWgx0HSYmnuQLa5J8AXsBNVjxk4duD62dcVBpLqxi5AtbxHbEpwr6gyYxokqROvMzfN217/M0RJXfexo/sfqrCMrXiPbiCb5kypsrdwEYGzKBfJlpjgZfZk0D0k8gULhrDvDlhS0zW6cFprpIWaRAvqayRXT3CFDhxjLdKKSzic/wlX207/LOr5z3UhQ2saxCBNsWKqDGJ3x14fuj45c7m0yGOSY7Q/pgfJB8wikc2edwSt45KYxfTkeSghnYcyKrUnCUbMYwfrl8qtwkna/NxtE6NXJWZaPBxqRiOYYyg2A5MXGliVjBF/QCmV0/9d6ezrDMNVTY64zfe4ioc8FzhW+iRdojei5K4VtDiQqgo/RtBl+x1mJLs/vRPoSVYK78NICvkfASGV+16pR8uzH5VF91Ktrt+eOmqv8jNWUQKZV6Db3kC+xAcwuQljHGAnAkzR9QYR/KV6E7WHFt+C/BwDnp8AJq9deJqXKOYdG/Yc6/wtCHsRc9BciXBb1uYqiG/IkpE9b8K6R8ifVhK6hJT4xAVqfK2tDejq4yu0W57rAJrYMF2KoFudpSyJbkAuj3cXL+RVOjs33v+eNM7SZgp7RVYkBrlf4NmI/a/g3dI6f4StQUWb6z3qCqii8NsreollWwNoge63jl/qiBbxAJzaJ8WdZIOV+zn+XLeWw8CWf7GcuDBF5RG+7PiSqX+A9Hhnxhgzz9OsCXp2DxBaMW68iBgSiac/hixh4oKKsxnVYBkoFLqNH52J0d07KH63WBL1BixpJM0Ifmqr/4p+XL+favR+EOrNoWj8BKaTuBaOBp3wbjf7PZvKQ9xma9kq9wihiZ9obyyw6mtkzg+AWJ9mV8zczc+wQsDtCsVop/nE7RF29MqJatXYDCB9NtsDfQdDe2JwaT0Xh0B4aDU3yBq8awLR+zQ25DlFmI8fv3ly+ZPrb3JTqJpQVUXuCPCqkoSFTb8wLSbAjgA9flki9vDVXJLx/9UfCPFSwEswK+kZL3H6Oj0zyZtEKgRvYy2PPKWUlCdEtbQAXkQAEzkQr7UL6JuWbgkP0hjIiyNKf4adNu9z7esZcxQ/S/mirr9niLpmz3iBi7p/lqkZGFLv2qnH/BZ74w1XiHqNAjO/+BP9AmMwH/lfz0cf7Vha+IWvQz4IbUjMEBWeNn5l8c2evDnQiCfRRPweLY3j0MbvYWvj8PtOflBJNq/NN8xcQkoW9U5d8Y4bBnLfcPtbY0FzepLyimIQCyUgJcUwZfEU6s6EYrQ3AAa6WWQK0QeP0kX84P5w+h59rFIem7kqe9iCurDNFNVvqgTwD5gr6nG0ie5EuseCyTiWr/RgzdZg5SWlatfWH7eLiUWhbGn0Ttoa3nFQ7194I4krW8S5xR7oDrMdCFjpnP8pXd3b1zuooWB9kRrLH5/lDYwvcM0DyEJv8P9YSaL4M/W/NxBl/dcpkA/8YglTDmywtFjbFtohNpU8/Mn+DmUb5mLV4YZuiU+f3cxEhd2m4STwFTkRgoGLX1/F0zTScz1MEYPet4Rru7qn/cAIqs5bhcwJ56f3xsClMwkmDP+XzCP0s0ZzniGbP8G8z2b6hIEyqQM/hS1qXpNTD9Gz6Nf+VmCfS8uSeU6kzTFy+uZe5i2of5BIyTQtjEzwtMZ9ACcDgSvmJgQ6/hjPFi2TQ80Jt9eEa71+QNrfwNwPbu9f1j/+PPwhT4W4MQpv4+P0N0Upx/0fyNvOsSdKHCPefwhSEKUyYq4ss5XxjrMBQfyqpvZl1BozBUheoQPy4VwsL0Ic2XsmH0j010ySip26c3IzBniJQvhNWvP6LHx/a396Kae9jTPQQA52eIDoglV+LfkJ/6BDQ+TArP4QsDKaZMnOILR37TIumXSF1kdbDnSZfg2KiBRKeNfBt4IfKbBvOgQBj5PZnP8/WwfT3cvztZscfj54+2RVeJXXIMJ/wbRvwLVc45fKHr0NTrJ/mKcHpEHbJpib8oGgb0S/MCqGi5o25Fl6m4icGXkkKdILVcGDfyD2BNfpzg03w5d9Hr85GEm+zRUIqfC3tNSbU5XyF0VZ5f50vtP/dyL76fe9Qj5h/NP9RIxC2+tTthRf6hL/VZB4YI+oMPEEOw0nWXg4BJpSd2DtCXpwsP0w9ZoPs8zz/0Mf8Qcx5XJGzZIvmH/IlGxMVs91r1TyH/kCBz7o9lz2y/GkrxU1Nl8fM1FOq3L+SveUXkoNnMuYTf+VJP6MoCqz/HoszaWSM2Q22SYYjApbRa886OWZ96WjqYCROgPzSDzN3WLuTFwZRueQDPVW8N1Rjer3QQyM4fWU9MStptxQ0LreM4/Hk0Ff7hRW0M0Kt/GfbnES3nJT9F97O4r/jR19d7kLFzwl41fgle/6xSdc8fgrFNvdrrevBRGWTOfru//15v3XBFOJxIAM2yX9OOGufhR/2z5TeF7VlJTzWuBs+9TyVm17g03npn5dHUuBJk9/Vy/5vCXe2/uC18qXfHuy08Na7oJ15qnETW+G/WCdX45dj+WW+4dlN4/bMewm4Kj+f9eEONa8HbyZ/prXFNiL+/1EbiLSHb15vK3xS2jVv82Yb/Y2xPbL1W48rwUE/DbgsPm9r1e1N4qNMDbgsPH7Ur8aaw/Xipw823hO2+9nTcFKLv5258U+M68FYHnG8Lhzop8bawffrEbpY1rgCHfa0TbwrZ22MdYLkp3P27jjnfFl5f67nzbWFb68QL4T+Hg3aCFW4f7AAAAABJRU5ErkJggg=="; + $loaner_signature = $request->loanerSigRawData; + $lender_signature = $request->lenderSigRawData; + $date = new DateTime(); + $timestamp = $date->getTimestamp(); + $user_id = $user->id; + + // Set the PDF File data + $pdf_file_name = $user->username."_".$timestamp; + $pdf_file_extension = '.pdf'; + $pdf_file = $pdf_file_name.$pdf_file_extension; + + // Create the PDF by putting data into the pdf view + $pdf = PDF::loadView('pdf.reservation',['date_start' => $date_start,'date_end' => $date_end,'loaner' => $loaner_signature, 'lender' => $lender_signature,'user' => $user,'cabels' => $loan_cabels,'cabels_total_amount' => $cabels_total_amount,'products' => $loan_products,'products_total_amount' => $products_total_amount,'room' => $room]); + + // Store the PDF file on the server + $location = "reservations/"; + $file_name = $location.$pdf_file; + $file_put = Storage::put($file_name, $pdf->output()); + $file_path = storage_path($file_name); + $file = Storage::files($file_path); + + // Create the Contract + $contract = new Contract(); + $contract->user_id = $user->id; + $contract->timestamp = $timestamp; + $contract->type = "reservations"; + $contract->save(); + + // Send Mail + if($user->role->name == 'Underviser') + { + $email_sufix = "@sde.dk"; + } + else + { + $email_sufix = "@edu.sde.dk"; + } + + $email = $user->username.$email_sufix; + + $mj = new Client(config('app.mail_username'), config('app.mail_password'),true); + + $body = [ + 'FromEmail' => config('app.mail_from_address'), + 'FromName' => config('app.mail_from_name'), + 'Subject' => "Reservation - Validering", + 'Html-part' => view('emails.validation') + ->with('logo',$logo) + ->with('user',$user) + ->with('date',$date) + ->with('deadline',$deadline) + ->render(), + 'Recipients' => [ + [ + 'Email' => $email + ] + ], + 'Attachments' => [ + [ + 'Content-type' => "application/pdf", + 'Filename' => 'contract.pdf', + 'content' => base64_encode($pdf->output()) + ] + ], + 'Inline_attachments' => [ + [ + 'Content-type' => "image/png", + 'Filename' => "logo.png", + 'content' => $logo + ] + ] + ]; + + // All resources are located in the Resources class + + $response = $mj->post(Resources::$Email,['body' => $body]); + + return redirect()->route('reservations.validations'); + + } + + public function setup(Request $request, $reservation){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_setup')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $reservation_obj = Loan::where('id','=',$reservation)->first(); + $loan_type = LoanType::where('name','=','Reservation - Set Up')->first(); + $user = User::where('id','=',$reservation_obj->user->id)->first(); + $room = Room::where('id','=',$reservation_obj->room->id)->first(); + $date_start = $reservation_obj->date_start; + $date_end = $reservation_obj->date_end; + + $reservations = Loan::where('loan_type_id','=',$loan_type->id) + ->where('user_id','=',$user->id) + ->where('room_id','=',$room->id) + ->where('date_start','=',$date_start) + ->where('date_end','=',$date_end) + ->get() + ; + + $loan_type_new = LoanType::where('name','=','Reservation - Pick Up')->first(); + + $total = 0; + foreach($reservations as $loan){ + $loan->loan_type_id = $loan_type_new->id; + $loan->save(); + $total += 1; + } + Logger::LogSetup($reservation_obj->id,get_class($reservation_obj),$total); + + return redirect()->route('reservations.setups'); + } + + public function pickup(Request $request, $reservation){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'reservations_return')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $reservation_obj = Loan::where('id','=',$reservation)->first(); + $loan_type = LoanType::where('name','=','Reservation - Pick Up')->first(); + $user = User::where('id','=',$reservation_obj->user->id)->first(); + $room = Room::where('id','=',$reservation_obj->room->id)->first(); + $date_start = $reservation_obj->date_start; + $date_end = $reservation_obj->date_end; + + $reservations = Loan::where('loan_type_id','=',$loan_type->id) + ->where('user_id','=',$user->id) + ->where('room_id','=',$room->id) + ->where('date_start','=',$date_start) + ->where('date_end','=',$date_end) + ->get() + ; + + $total = 0; + foreach($reservations as $loan){ + $loan->delete(); + $total += 1; + } + + Logger::LogPickup($reservation_obj->id,get_class($reservation_obj),$total); + + return redirect()->route('reservations.pickups'); + } +} diff --git a/app/Http/Controllers/OtherController.php b/app/Http/Controllers/OtherController.php new file mode 100644 index 0000000..a6ff112 --- /dev/null +++ b/app/Http/Controllers/OtherController.php @@ -0,0 +1,184 @@ + "building", "name" => "building")); + array_push($search_types,array("value" => "room", "name" => "room")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + $logs = Log::orderBy('created_at','desc')->Paginate($PerPagination); + + return view('logs') + ->with('search_types',$search_types) + ->with('data',$logs) + ->with('data_name','log') + ->with('data_names','logs') + ->with('no_deleted',true) + ; + } + + public function statistics(Request $request){ + $search_types = []; + array_push($search_types,array("value" => "building", "name" => "building")); + array_push($search_types,array("value" => "room", "name" => "room")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + $products = Product::all(); + $cabels = Cabel::all(); + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('loanable_type','loanable_id') + ->get() + ; + $reservations = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('loanable_type','loanable_id') + ->get() + ; + + $log_returned = Log::where('log_action_id','=',LogAction::where('name','=','returned')->first()->id)->get(); + $log_returned_placement = Log::where('log_action_id','=',LogAction::where('name','=','returned')->first()->id) + ->select('*',DB::raw('SUM(amount) as sum')) + ->groupBy('user_id','created_at') + ->orderBy('sum','desc') + ->get() + ; + $log_lent = Log::where('log_action_id','=',LogAction::where('name','=','lent')->first()->id)->get(); + $log_lent_placement = Log::where('log_action_id','=',LogAction::where('name','=','lent')->first()->id) + ->select('*',DB::raw('SUM(amount) as sum')) + ->groupBy('user_id') + ->orderBy('sum','desc') + ->get() + ; + $log_reserved = Log::where('log_action_id','=',LogAction::where('name','=','reserved')->first()->id)->get(); + $log_reserved_placement = Log::where('log_action_id','=',LogAction::where('name','=','reserved')->first()->id) + ->select('*',DB::raw('SUM(amount) as sum')) + ->groupBy('user_id') + ->orderBy('sum','desc') + ->get() + ; + $log_validated = Log::where('log_action_id','=',LogAction::where('name','=','validated')->first()->id) + ->select('*',DB::raw('SUM(amount) as sum')) + ->groupBy('user_id') + ->orderBy('amount','desc') + ->get() + ; + $log_setups = Log::where('log_action_id','=',LogAction::where('name','=','set up')->first()->id) + ->select('*',DB::raw('SUM(amount) as sum')) + ->groupBy('user_id') + ->orderBy('amount','desc') + ->get() + ; + $log_pickups = Log::where('log_action_id','=',LogAction::where('name','=','picked up')->first()->id)->get(); + $log_pickups_placement = Log::where('log_action_id','=',LogAction::where('name','=','picked up')->first()->id) + ->select('*',DB::raw('SUM(amount) as sum')) + ->groupBy('user_id') + ->orderBy('amount','desc') + ->get() + ; + $log_notes = Log::where('log_action_id','=',LogAction::where('name','=','note')->first()->id)->get(); + $log_notes_placement = Log::where('log_action_id','=',LogAction::where('name','=','note')->first()->id) + ->select('*',DB::raw('count(user_id) as amount')) + ->groupBy('user_id') + ->orderBy('amount','desc') + ->get() + ; + $total_lent = 0; + $total_reserved = 0; + $total_total = 0; + + $lastday_date = Carbon::now()->subDays(1)->toDateTimeString(); + $lastday_lent = 0; + $lastday_reserved = 0; + $lastday_returned = 0; + $lastday_notes = 0; + + foreach($products as $product){ + $total_total += $product->total; + } + + foreach($cabels as $cabel){ + $total_total += $cabel->total; + } + + foreach($loans as $loan){ + $total_lent += $loan->amount; + } + + foreach($reservations as $reservation){ + $total_reserved += $reservation->amount; + } + + foreach($log_lent as $loan){ + if($loan->created_at >= $lastday_date){ + $lastday_lent += $loan->amount; + } + } + + foreach($log_reserved as $loan){ + if($loan->created_at >= $lastday_date){ + $lastday_reserved += $loan->amount; + } + } + + foreach($log_returned as $return){ + if($return->created_at >= $lastday_date){ + $lastday_returned += $return->amount; + } + } + + foreach($log_pickups as $pickup){ + if($pickup->created_at >= $lastday_date){ + $lastday_returned += $pickup->amount; + } + } + + foreach($log_notes as $note){ + if($note->created_at >= $lastday_date){ + $lastday_notes += 1; + } + } + + return view('statistics') + ->with('search_types',$search_types) + ->with('data_name','statistic') + ->with('data_names','statistics') + ->with('lastday_lent',$lastday_lent) + ->with('lastday_reserved',$lastday_reserved) + ->with('lastday_returned',$lastday_returned) + ->with('lastday_notes',$lastday_notes) + ->with('total_lent',$total_lent) + ->with('total_reserved',$total_reserved) + ->with('total_total',$total_total) + ->with('validated',$log_validated) + ->with('lent',$log_lent_placement) + ->with('reserved',$log_reserved_placement) + ->with('setups',$log_setups) + ->with('pickups',$log_pickups_placement) + ->with('returned',$log_returned_placement) + ->with('notes',$log_notes_placement) + ; + } +} diff --git a/app/Http/Controllers/Product/BrandController.php b/app/Http/Controllers/Product/BrandController.php new file mode 100644 index 0000000..56f6d41 --- /dev/null +++ b/app/Http/Controllers/Product/BrandController.php @@ -0,0 +1,252 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'brands_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $brands = Brand::where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $brands = Brand::where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + } + } + else{ + $brands = Brand::paginate($PerPagination); + } + + return view('brands.index') + ->with('search_types',$search_types) + ->with('data',$brands) + ->with('data_name','brand') + ->with('data_names','brands') + ; + } + + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'brands_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $brands = Brand::onlyTrashed()->where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $brands = Brand::onlyTrashed()->where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + } + } + else{ + $brands = Brand::onlyTrashed()->paginate($PerPagination); + } + + return view('brands.deleted') + ->with('search_types',$search_types) + ->with('data',$brands) + ->with('data_name','brand') + ->with('data_names','brands') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'brands_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('brands.create') + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'brands_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $brand = new Brand(); + $brand->name = $request->name; + $brand->save(); + Logger::LogCreated($brand->id,get_class($brand)); + + return redirect()->route('brands.show',['brand' => $brand]); + } + + /** + * Display the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function show($brand) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'brands_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Brand::withTrashed()->where('id','=',$brand)->first(); + return view('brands.show') + ->with('data',$object) + ->with('data_name','brand') + ; + } + + /** + * Show the form for editing the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($brand) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'brands_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Brand::withTrashed()->where('id','=',$brand)->first(); + + return view('brands.edit') + ->with('data',$object) + ->with('data_name','brand') + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\Brand $brand + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request, $brand) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'brands_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Brand::withTrashed()->where('id','=',$brand)->first(); + if( $object->name != $request->name){ + Logger::LogEdited($object->id,get_class($object),"Navn : ".$object->name." til ".$request->name); + $object->name = $request->name; + } + $object->save(); + + return redirect()->route('brands.show',['brand' => $brand]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($brand) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'brands_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Brand::withTrashed()->where('id','=',$brand)->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + + return redirect()->route('brands.index'); + } + + /** + * Restore the specified resource from storage. + * + * @param \App\Models\Brand $brand + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($brand) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'brands_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Brand::withTrashed()->where('id','=',$brand)->first(); + $object->restore(); + Logger::LogRestored($object->id,get_class($object)); + + return redirect()->route('brands.deleted'); + } + + /** + * Permanently emove the specified resource from storage. + * + * @param \App\Models\Brand $brand + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($brand) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'brands_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Brand::withTrashed()->where('id','=',$brand)->first(); + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + + return redirect()->route('brands.deleted'); + } +} diff --git a/app/Http/Controllers/Product/ProductCategoryController.php b/app/Http/Controllers/Product/ProductCategoryController.php new file mode 100644 index 0000000..28e5655 --- /dev/null +++ b/app/Http/Controllers/Product/ProductCategoryController.php @@ -0,0 +1,257 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'categories_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $categories = ProductCategory::where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $categories = ProductCategory::where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + } + } + else{ + $categories = ProductCategory::paginate($PerPagination); + } + + return view('categories.index') + ->with('search_types',$search_types) + ->with('data',$categories) + ->with('data_name','category') + ->with('data_names','categories') + ; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'categories_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? '10'; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $categories = ProductCategory::onlyTrashed()->where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $categories = ProductCategory::onlyTrashed()->where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + } + } + else{ + $categories = ProductCategory::onlyTrashed()->paginate($PerPagination); + } + + return view('categories.deleted') + ->with('search_types',$search_types) + ->with('data',$categories) + ->with('data_name','category') + ->with('data_names','categories') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'categories_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('categories.create') + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'categories_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $category = new ProductCategory(); + $category->name = $request->name; + $category->save(); + Logger::LogCreated($category->id,get_class($category)); + + return redirect()->route('categories.show',['category' => $category]); + } + + /** + * Display the specified resource. + * + * @param \App\Models\ProductCategory $category + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function show($category) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'categories_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductCategory::withTrashed()->where('id','=',$category)->first(); + + return view('categories.show') + ->with('data',$object) + ->with('data_name','category') + ; + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\ProductCategory $category + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($category) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'categories_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductCategory::withTrashed()->where('id','=',$category)->first(); + + return view('categories.edit') + ->with('data',$object) + ->with('data_name','category') + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\ProductCategory $category + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request,$category) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'categories_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductCategory::withTrashed()->where('id','=',$category)->first(); + if( $object->name != $request->name){ + Logger::LogEdited($object->id,get_class($object),"Navn : ".$object->name." til ".$request->name); + $object->name = $request->name; + } + $object->save(); + + return redirect()->route('categories.show',['category' => $category]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($category) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'categories_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductCategory::withTrashed()->where('id','=',$category)->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + + return redirect()->route('categories.index'); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($category) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'categories_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductCategory::withTrashed()->where('id','=',$category)->first(); + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + + return redirect()->route('categories.deleted'); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($category) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'categories_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductCategory::withTrashed()->where('id','=',$category)->first(); + $object->restore(); + Logger::LogRestored($object->id,get_class($object)); + + return redirect()->route('categories.deleted'); + } +} diff --git a/app/Http/Controllers/Product/ProductController.php b/app/Http/Controllers/Product/ProductController.php new file mode 100644 index 0000000..ab3c00e --- /dev/null +++ b/app/Http/Controllers/Product/ProductController.php @@ -0,0 +1,506 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'products_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + if(config('app.barcode_mode') == 'static'){ + array_push($search_types,array("value" => "barcode", "name" => "barcode")); + } + array_push($search_types,array("value" => "category", "name" => "category")); + array_push($search_types,array("value" => "subcategory", "name" => "subcategory")); + array_push($search_types,array("value" => "brand", "name" => "brand")); + array_push($search_types,array("value" => "model", "name" => "model")); + array_push($search_types,array("value" => "name", "name" => "name")); + array_push($search_types,array("value" => "description", "name" => "description")); + + array_push($search_types,array("value" => "available", "name" => "available")); + array_push($search_types,array("value" => "loans", "name" => "loaned")); + array_push($search_types,array("value" => "reservations", "name" => "reserved")); + array_push($search_types,array("value" => "total", "name" => "total")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "category": + switch($search_compare){ + case("="): + $products = Product::where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $products = Product::where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + case "subcategory": + switch($search_compare){ + case("="): + $products = Product::where(function ($query) use ($search_term){ + $query->whereHas('subcategory',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $products = Product::where(function ($query) use ($search_term){ + $query->whereHas('subcategory',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + case "brand": + switch($search_compare){ + case("="): + $products = Product::where(function ($query) use ($search_term){ + $query->whereHas('brand',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $products = Product::where(function ($query) use ($search_term){ + $query->whereHas('brand',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + case "model": + switch($search_compare){ + case("="): + $products = Product::where(function ($query) use ($search_term){ + $query->whereHas('model',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $products = Product::where(function ($query) use ($search_term){ + $query->whereHas('model',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + case "name": + switch($search_compare){ + case("="): + $products = Product::where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $products = Product::where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + case "description": + switch($search_compare){ + case("="): + $products = Product::where('description','=',$search_term)->paginate($PerPagination); + break; + default: + $products = Product::where('description','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + case "available": + $all_products = Product::all(); + $product_collection = collect(); + foreach($all_products as $product){ + $loans = count($product->loans); + $reservations = count($product->reservations); + $total = $product->total; + $available = $total - ($loans + $reservations); + switch($search_compare){ + case(">="): + if($available >= $search_term){ + $product_collection->add($product); + } + break; + case("<="): + if($available <= $search_term){ + $product_collection->add($product); + } + break; + case("="): + if($available == $search_term){ + $product_collection->add($product); + } + break; + default: + if($available == $search_term){ + $product_collection->add($product); + } + break; + } + + } + $products = PaginationHelper::paginate($product_collection, $PerPagination); + break; + case "loans": + switch($search_compare){ + case(">="): + $products = Product::has('loans', '>=' , $search_term)->paginate($PerPagination); + break; + case("<="): + $products = Product::has('loans', '<=' , $search_term)->paginate($PerPagination); + break; + case("="): + $products = Product::has('loans', '=' , $search_term)->paginate($PerPagination); + break; + default: + $products = Product::has('loans', '=' , $search_term)->paginate($PerPagination); + break; + } + break; + case "reservations": + switch($search_compare){ + case(">="): + $products = Product::has('reservations', '>=' , $search_term)->paginate($PerPagination); + break; + case("<="): + $products = Product::has('reservations', '<=' , $search_term)->paginate($PerPagination); + break; + case("="): + $products = Product::has('reservations', '=' , $search_term)->paginate($PerPagination); + break; + default: + $products = Product::has('reservations', '=' , $search_term)->paginate($PerPagination); + break; + } + break; + case "total": + switch($search_compare){ + case(">="): + $products = Product::where('total','>=',$search_term)->paginate($PerPagination); + break; + case("<="): + $products = Product::where('total','<=',$search_term)->paginate($PerPagination); + break; + case("="): + $products = Product::where('total','=',$search_term)->paginate($PerPagination); + break; + default: + $products = Product::where('total','=',$search_term)->paginate($PerPagination); + break; + } + break; + } + } + else{ + $products = Product::paginate($PerPagination); + } + + return view('products.index') + ->with('search_types',$search_types) + ->with('data',$products) + ->with('data_name','product') + ->with('data_names','products') + ; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'products_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + if(config('app.barcode_mode') == 'static'){ + array_push($search_types,array("value" => "barcode", "name" => "barcode")); + } + array_push($search_types,array("value" => "category", "name" => "category")); + array_push($search_types,array("value" => "subcategory", "name" => "subcategory")); + array_push($search_types,array("value" => "brand", "name" => "brand")); + array_push($search_types,array("value" => "model", "name" => "model")); + array_push($search_types,array("value" => "name", "name" => "name")); + array_push($search_types,array("value" => "description", "name" => "description")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + $products = Product::onlyTrashed()->Paginate($PerPagination); + + return view('products.deleted') + ->with('search_types',$search_types) + ->with('data',$products) + ->with('data_name','product') + ->with('data_names','products') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'products_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('products.create') + ->with('categories',ProductCategory::all()) + ->with('subcategories',ProductSubcategory::all()) + ->with('brands',Brand::has('models')->get()) + ->with('models',ProductModel::all()) + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'products_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $product = new Product(); + if(isset($request->barcode)){ + $product->barcode = $request->barcode; + } + $product->product_category_id = $request->category_id; + $product->product_subcategory_id = $request->subcategory_id; + $product->brand_id = $request->brand_id; + $product->product_model_id = $request->model_id; + $product->name = $request->name; + $product->description = $request->description; + $product->save(); + + Logger::LogCreated($product->id,get_class($product)); + + return redirect()->route('products.index'); + } + + /** + * Display the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function show($product) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'products_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Product::withTrashed()->where('id','=',$product)->first(); + return view('products.show') + ->with('data',$object) + ; + } + + /** + * Show the form for editing the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($product) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'products_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Product::withTrashed()->where('id','=',$product)->first(); + + return view('products.edit') + ->with('categories',ProductCategory::withTrashed()->get()) + ->with('subcategories',ProductSubcategory::withTrashed()->get()) + ->with('brands',Brand::withTrashed()->has('models')->get()) + ->with('models',ProductModel::withTrashed()->get()) + ->with('data',$object) + ->with('data_name','product') + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request,$product) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'products_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Product::withTrashed()->where('id','=',$product)->first(); + + if(isset($request->barcode)){ + if($object->barcode != $request->barcode){ + Logger::LogEdited($object->id,get_class($object),"Stregkode : ".$object->barcode." til ".$request->barcode); + $object->barcode = $request->barcode; + } + } + if($object->product_category_id != $request->category_id) { + $category = ProductCategory::where('id','=', $request->category_id)->first(); + Logger::LogEdited($object->id,get_class($object),"Kategori : ".$object->category->name." til ".$category->name); + $object->product_category_id = $request->category_id; + } + if($object->product_subcategory_id != $request->subcategory_id) { + $subcategory = ProductSubcategory::where('id','=', $request->subcategory_id)->first(); + Logger::LogEdited($object->id,get_class($object),"Underkategori : ".$object->subcategory->name." til ".$subcategory->name); + $object->product_subcategory_id = $request->subcategory_id; + } + if($object->brand_id != $request->brand_id) { + $brand = Brand::where('id','=', $request->brand_id)->first(); + Logger::LogEdited($object->id,get_class($object),"Fabrikant : ".$object->brand_id->name." til ".$brand->name); + $object->brand_id = $request->brand_id; + } + if($object->product_model_id != $request->model_id) { + $model = ProductModel::where('id','=', $request->model_id)->first(); + Logger::LogEdited($object->id,get_class($object),"Model : ".$object->model->name." til ".$model->name); + $object->product_model_id = $request->model_id; + } + if($object->name != $request->name) { + Logger::LogEdited($object->id,get_class($object),"Navn : ".$object->name." til ".$request->name); + $object->name = $request->name; + } + if($object->description != $request->description) { + Logger::LogEdited($object->id,get_class($object),"Beskrivels : ".$object->description." til ".$request->description); + $object->description = $request->description; + } + + $object->save(); + + return redirect()->route('products.index'); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($product) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'products_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Product::withTrashed()->where('id','=',$product)->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + return redirect()->route('products.index'); + } + + + /** + * Restore the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($product) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'products_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Product::withTrashed()->where('id','=',$product)->first(); + Logger::LogRestored($object->id,get_class($object)); + $object->restore(); + + return redirect()->route('products.deleted'); + } + + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function forceDelete($product) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'products_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Product::withTrashed()->where('id','=',$product)->first(); + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + + return redirect()->route('products.deleted'); + } + + /** + * Add the specified amount to the Pool. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function amount_add($product,Request $request) + { + $object = Product::withTrashed()->where('id','=',$product)->first(); + $object->total += $request->amount; + $object->save(); + Logger::LogAmountAdded($object->id,get_class($object),$request->amount); + + return redirect()->route('products.show',['product' => $product]); + } + + /** + * Remove the specified amount from the Pool. + * + * @param \App\Models\Product $product + * @return \Illuminate\Http\RedirectResponse + */ + public function amount_remove(Product $product,Request $request) + { + $object = Product::withTrashed()->where('id','=',$product)->first(); + $object->total -= $request->amount; + $object->save(); + Logger::LogAmountRemoved($object->id,get_class($object),$request->amount); + + return redirect()->route('products.show',['product' => $product]); + } +} diff --git a/app/Http/Controllers/Product/ProductModelController.php b/app/Http/Controllers/Product/ProductModelController.php new file mode 100644 index 0000000..e5140bd --- /dev/null +++ b/app/Http/Controllers/Product/ProductModelController.php @@ -0,0 +1,302 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'models_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + array_push($search_types,array("value" => "brand", "name" => "brand")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $models = ProductModel::where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $models = ProductModel::where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + case "brand": + switch($search_compare){ + case("="): + $models = ProductModel::where(function ($query) use ($search_term){ + $query->whereHas('brand',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $models = ProductModel::where(function ($query) use ($search_term){ + $query->whereHas('brand',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + } + } + else{ + $models = ProductModel::paginate($PerPagination); + } + + return view('models.index') + ->with('search_types',$search_types) + ->with('data',$models) + ->with('data_name','model') + ->with('data_names','models') + ; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'models_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + array_push($search_types,array("value" => "brand", "name" => "brand")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $models = ProductModel::onlyTrashed()->where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $models = ProductModel::onlyTrashed()->where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + case "brand": + switch($search_compare){ + case("="): + $models = ProductModel::onlyTrashed()->where(function ($query) use ($search_term){ + $query->whereHas('brand',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $models = ProductModel::onlyTrashed()->where(function ($query) use ($search_term){ + $query->whereHas('brand',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + } + } + else{ + $models = ProductModel::onlyTrashed()->paginate($PerPagination); + } + + return view('models.deleted') + ->with('search_types',$search_types) + ->with('data',$models) + ->with('data_name','model') + ->with('data_names','models') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'models_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('models.create') + ->with('brands',Brand::all()) + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'models_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $model = new ProductModel(); + $model->name = $request->name; + $model->brand_id = $request->brand_id; + $model->save(); + Logger::LogCreated($model->id,get_class($model)); + + return redirect()->route('models.show',['model' => $model]); + } + + /** + * Display the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function show($model) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'models_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductModel::withTrashed()->where('id','=',$model)->first(); + + return view('models.show') + ->with('data',$object) + ; + } + + /** + * Show the form for editing the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($model) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'models_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductModel::withTrashed()->where('id','=',$model)->first(); + + return view('models.edit') + ->with('data',$object) + ->with('brands',Brand::withTrashed()->get()) + ->with('data_name','model') + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request,$model) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'models_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductModel::withTrashed()->where('id','=',$model)->first(); + + if( $object->name != $request->name){ + Logger::LogEdited($object->id,get_class($object),"Navn : ".$object->name." til ".$request->name); + $object->name = $request->name; + } + if( $object->brand_id != $request->brand_id){ + $brand = Brand::withTrashed()->where('id','=',$request->brand_id)->first(); + Logger::LogEdited($object->id,get_class($object),"Fabrikant : ".$object->brand->name." til ".$brand->name); + $object->brand_id = $request->brand_id; + } + + $object->save(); + + return redirect()->route('models.show',['model' => $model]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($model) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'models_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductModel::withTrashed()->where('id','=',$model)->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + + return redirect()->route('models.index'); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($model) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'models_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductModel::withTrashed()->where('id','=',$model)->first(); + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + + return redirect()->route('models.deleted'); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($model) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'models_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductModel::withTrashed()->where('id','=',$model)->first(); + $object->restore(); + Logger::LogRestored($object->id,get_class($object)); + + return redirect()->route('models.deleted'); + } +} diff --git a/app/Http/Controllers/Product/ProductSubcategoryController.php b/app/Http/Controllers/Product/ProductSubcategoryController.php new file mode 100644 index 0000000..fb90e24 --- /dev/null +++ b/app/Http/Controllers/Product/ProductSubcategoryController.php @@ -0,0 +1,308 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + array_push($search_types,array("value" => "category", "name" => "category")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $categories = ProductSubcategory::where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $categories = ProductSubcategory::where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + case "category": + switch($search_compare){ + case("="): + $categories = ProductSubcategory::where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $categories = ProductSubcategory::where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + } + } + else{ + $categories = ProductSubcategory::paginate($PerPagination); + } + + return view('subcategories.index') + ->with('search_types',$search_types) + ->with('data',$categories) + ->with('data_name','subcategory') + ->with('data_names','subcategories') + ; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $categories = ProductSubcategory::onlyTrashed()->where('name','=',$search_term)->paginate($PerPagination); + break; + default: + $categories = ProductSubcategory::onlyTrashed()->where('name','like','%' . $search_term . '%')->paginate($PerPagination); + break; + } + break; + case "category": + switch($search_compare){ + case("="): + $categories = ProductSubcategory::onlyTrashed()->where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $categories = ProductSubcategory::onlyTrashed()->where(function ($query) use ($search_term){ + $query->whereHas('category',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + } + } + else{ + $categories = ProductSubcategory::onlyTrashed()->paginate($PerPagination); + } + + return view('subcategories.deleted') + ->with('search_types',$search_types) + ->with('data',$categories) + ->with('data_name','subcategory') + ->with('data_names','subcategories') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('subcategories.create') + ->with('categories',ProductCategory::all()) + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $subcategory = new ProductSubcategory(); + $subcategory->name = $request->name; + $subcategory->product_category_id = $request->category_id; + $subcategory->save(); + Logger::LogCreated($subcategory->id,get_class($subcategory)); + + return redirect()->route('subcategories.show',['subcategory' => $subcategory]); + } + + /** + * Display the specified resource. + * + * @param \App\Models\ProductSubcategory $subcategory + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function show($subcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductSubcategory::withTrashed()->where('id','=',$subcategory)->first(); + return view('subcategories.show') + ->with('data',$object) + ->with('data_name','subcategory') + ; + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\ProductSubcategory $subcategory + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($subcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductSubcategory::withTrashed()->where('id','=',$subcategory)->first(); + + $data_type = "subcategory"; + + return view('subcategories.edit') + ->with('data',$object) + ->with('data_name',$data_type) + ->with('categories',ProductCategory::all()) + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\ProductSubcategory $subcategory + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request,$subcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductSubcategory::withTrashed()->where('id','=',$subcategory)->first(); + + if( $object->name != $request->name){ + Logger::LogEdited($object->id,get_class($object),"Navn : ".$object->name." til ".$request->name); + $object->name = $request->name; + } + if( $object->product_category_id != $request->category_id){ + $category = ProductCategory::withTrashed()->where('id','=',$request->category_id)->first(); + Logger::LogEdited($object->id,get_class($object),"Kategori : ".$object->category->name." til ".$category->name); + $object->product_category_id = $request->category_id; + } + + $object->save(); + + return redirect()->route('subcategories.show',['subcategory' => $subcategory]); + } + + /** + * Remove the specified resource from storage. + * + * @return RedirectResponse + */ + public function destroy($subcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductSubcategory::withTrashed()->where('id','=',$subcategory)->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + + return redirect()->route('subcategories.index'); + } + + /** + * Permanently Remove the specified resource from storage. + * + * @return RedirectResponse + */ + public function delete_force($subcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductSubcategory::withTrashed()->where('id','=',$subcategory)->first(); + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + + + return redirect()->route('subcategories.deleted'); + } + + + /** + * Restore the specified resource from storage. + * + * @return RedirectResponse + */ + public function restore($subcategory) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'subcategories_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = ProductSubcategory::withTrashed()->where('id','=',$subcategory)->first(); + $object->restore(); + Logger::LogRestored($object->id,get_class($object)); + + return redirect()->route('subcategories.deleted'); + } +} diff --git a/app/Http/Controllers/Rooms/BuildingController.php b/app/Http/Controllers/Rooms/BuildingController.php new file mode 100644 index 0000000..c3528eb --- /dev/null +++ b/app/Http/Controllers/Rooms/BuildingController.php @@ -0,0 +1,242 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + $buildings = Building::where(function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + })->orderBy('name', 'asc')->paginate($PerPagination); + break; + } + } + else{ + $buildings = Building::orderBy('name', 'asc')->paginate($PerPagination); + } + + return view('buildings.index') + ->with('search_types',$search_types) + ->with('data',$buildings) + ->with('data_name','building') + ->with('data_names','buildings') + ; + } + + + /** + * Display a listing of the resource. + * + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p'); + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + $buildings = Building::where(function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + })->orderBy('name', 'asc')->paginate($PerPagination); + break; + } + } + else{ + $buildings = Building::onlyTrashed()->orderBy('name', 'asc')->paginate($PerPagination); + } + + return view('buildings.deleted') + ->with('search_types',$search_types) + ->with('data',$buildings) + ->with('data_name','building') + ->with('data_names','buildings') + ; + } + + /** + * Show the form for creating a new resource. + * + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('buildings.create'); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $building = new Building(); + $building->name = $request->name; + $building->save(); + Logger::LogCreated($building->id,get_class($building)); + + return redirect()->route('buildings.show',['building' => $building]); + } + + /** + * Display the specified resource. + * + * @return Application|Factory|View + */ + public function show($building) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Building::withTrashed()->where('id','=',$building)->first(); + + return view('buildings.show') + ->with('data',$object) + ->with('data_name','building') + ; + } + + /** + * Show the form for editing the specified resource. + * + * @return Application|Factory|View + */ + public function edit($building) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Building::withTrashed()->where('id','=',$building)->first(); + return view('buildings.edit') + ->with('data',$object) + ->with('data_name','building') + ; + } + + /** + * Update the specified resource in storage. + * + */ + public function update(Request $request, $building) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Building::withTrashed()->where('id','=',$building)->first(); + if( $object->name != $request->name){ + Logger::LogEdited($object->id,get_class($object),"Navn : ".$object->name." til ".$request->name); + $object->name = $request->name; + } + $object->save(); + + return redirect()->route('buildings.show',['building' => $building]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($building) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Building::withTrashed()->where('id','=',$building)->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + + return redirect()->route('buildings.index'); + } + + /** + * Permanently Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($building) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Building::withTrashed()->where('id','=',$building)->first(); + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + + return redirect()->route('buildings.deleted'); + } + + /** + * Permanently Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($building) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'buildings_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Building::withTrashed()->where('id','=',$building)->first(); + $object->restore(); + Logger::LogRestored($object->id,get_class($object)); + + return redirect()->route('buildings.deleted'); + } +} diff --git a/app/Http/Controllers/Rooms/RoomController.php b/app/Http/Controllers/Rooms/RoomController.php new file mode 100644 index 0000000..2bf22e1 --- /dev/null +++ b/app/Http/Controllers/Rooms/RoomController.php @@ -0,0 +1,284 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "building", "name" => "building")); + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "building": + $rooms = Room::where(function ($query) use ($search_term){ + $query->whereHas('building',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->join('buildings', 'rooms.building_id', '=', 'buildings.id')->select('rooms.*')->orderBy('buildings.name','asc')->paginate($PerPagination); + break; + case "name": + $rooms = Room::where('rooms.name','like','%' . $search_term . '%')->join('buildings', 'rooms.building_id', '=', 'buildings.id')->select('rooms.*')->orderBy('buildings.name','asc')->paginate($PerPagination); + break; + } + + } + else{ + $rooms = Room::join('buildings', 'rooms.building_id', '=', 'buildings.id')->select('rooms.*')->orderBy('buildings.name','asc')->paginate($PerPagination); + } + + + return view('rooms.index') + ->with('search_types',$search_types) + ->with('data',$rooms) + ->with('data_name','room') + ->with('data_names','rooms') + ; + } + + /** + * Display a listing of the resource. + * + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "building", "name" => "building")); + array_push($search_types,array("value" => "room", "name" => "room")); + + $PerPagination = $request->input('p') ?? '10'; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + + if($search_term != ""){ + switch ($search_type){ + case "building": + $rooms = Room::where(function ($query) use ($search_term){ + $query->whereHas('building',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->join('buildings', 'rooms.building_id', '=', 'buildings.id')->select('rooms.*')->orderBy('buildings.name','asc')->paginate($PerPagination); + break; + break; + case "room": + $rooms = Room::where('rooms.name','like','%' . $search_term . '%')->join('buildings', 'rooms.building_id', '=', 'buildings.id')->select('rooms.*')->orderBy('buildings.name','asc')->paginate($PerPagination); + break; + } + + } + else{ + $rooms = Room::onlyTrashed()->join('buildings', 'rooms.building_id', '=', 'buildings.id')->select('rooms.*')->orderBy('buildings.name','asc')->onlyTrashed()->Paginate($PerPagination); + } + + + return view('rooms.deleted') + ->with('search_types',$search_types) + ->with('data',$rooms) + ->with('data_name','room') + ; + } + + /** + * Show the form for creating a new resource. + * + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('rooms.create') + ->with('buildings',Building::all()->sortBy(['name','asc'])) + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $room = new Room(); + $room->building_id = $request->building_id; + $room->name = $request->name; + $room->save(); + Logger::LogCreated($room->id,get_class($room)); + + return redirect()->route('rooms.show',['room' => $room]); + } + + /** + * Display the specified resource. + * + * @param \App\Models\Room $room + */ + public function show($room) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Room::where('id','=',$room)->withTrashed()->first(); + + $reservations = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('room_id','=',$object->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('loanable_type','loanable_id','loan_type_id','room_id') + ->orderBy('loan_type_id') + ->orderBy('user_id') + ->orderBy('date_start') + ->orderBy('date_end') + ->orderBy('loanable_type') + ->orderBy('loanable_id') + ->get() + ; + + return view('rooms.show') + ->with('data',$object) + ->with('data_name','room') + ->with('reservations',$reservations) + ; + } + + /** + * Show the form for editing the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($room) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Room::where('id','=',$room)->withTrashed()->first(); + + return view('rooms.edit') + ->with('data',$object) + ->with('buildings',Building::all()->sortBy([['name','asc']])) + ->with('data_name','room') + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request, $room) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Room::where('id','=',$room)->withTrashed()->first(); + + $object->building_id = $request->building_id; + if( $object->name != $request->name){ + Logger::LogEdited($object->id,get_class($object),"Navn : ".$object->name." til ".$request->name); + $object->name = $request->name; + } + if( $object->building_id != $request->building_id){ + $building = Building::withTrashed()->where('id','=',$request->building_id)->first(); + Logger::LogEdited($object->id,get_class($object),"Navn : ".$object->building->name." til ".$building->name); + $object->building_id = $request->building_id; + } + $object->save(); + + return redirect()->route('rooms.show',['room' => $room]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($room) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Room::where('id','=',$room)->withTrashed()->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + + return redirect()->route('rooms.index'); + } + + /** + * Permanently Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($room) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Room::where('id','=',$room)->withTrashed()->first(); + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + + return redirect()->route('rooms.deleted'); + } + + /** + * Restore the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($room) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'rooms_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Room::where('id','=',$room)->withTrashed()->first(); + $object->restore(); + Logger::LogRestored($object->id,get_class($object)); + + return redirect()->route('rooms.deleted'); + } +} diff --git a/app/Http/Controllers/User/RoleController.php b/app/Http/Controllers/User/RoleController.php new file mode 100644 index 0000000..3965253 --- /dev/null +++ b/app/Http/Controllers/User/RoleController.php @@ -0,0 +1,1001 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'roles_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $roles = Role::where(function ($query) use ($search_term){ + $query->where('name','=',$search_term); + })->paginate($PerPagination); + break; + default: + $roles = Role::where(function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + })->paginate($PerPagination); + break; + } + + break; + } + } + else{ + $roles = Role::paginate($PerPagination); + } + + return view('roles.index') + ->with('search_types',$search_types) + ->with('data',$roles) + ->with('data_name','role') + ->with('data_names','roles') + ; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "name", "name" => "name")); + + + $PerPagination = $request->input('p'); + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "name": + switch($search_compare){ + case("="): + $roles = Role::onlyTrashed()->where(function ($query) use ($search_term){ + $query->where('name','=',$search_term); + })->paginate($PerPagination); + break; + default: + $roles = Role::onlyTrashed()->where(function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + })->paginate($PerPagination); + break; + } + break; + } + } + else{ + $roles = Role::onlyTrashed()->paginate($PerPagination); + } + + return view('roles.deleted') + ->with('search_types',$search_types) + ->with('data',$roles) + ->with('data_name','role') + ->with('data_names','roles') + ; + } + + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + return view('roles.create') + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $role = new Role(); + $role->name = $request->name; + $role->save(); + + return redirect()->route('roles.index'); + } + + /** + * Display the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function show($role) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Role::withTrashed()->where('id','=',$role)->first(); + + return view('roles.show') + ->with('data',$object) + ->with('data_name','role') + ; + } + + /** + * Show the form for editing the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($role) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Role::withTrashed()->where('id','=',$role)->first(); + + $permissions = $object->permissions()->get()->pluck('name')->toArray(); + + return view('roles.edit') + ->with('data',$object) + ->with('permissions',$permissions) + ->with('data_name','role') + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\Role $role + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request, $role) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Role::withTrashed()->where('id','=',$role)->first(); + + $object->name = $request->name; + $object->save(); + + if(Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_edit'))) + { + $permissionIds = []; + if (!empty($request['home_page'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','home_page')->id + ); + } + + if (!empty($request['brands_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','brands_viewAny')->id + ); + } + + if (!empty($request['brands_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','brands_viewAny_deleted')->id + ); + } + + if (!empty($request['brands_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','brands_view')->id + ); + } + + if (!empty($request['brands_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','brands_create')->id + ); + } + + if (!empty($request['brands_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','brands_edit')->id + ); + } + + if (!empty($request['brands_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','brands_delete')->id + ); + } + + if (!empty($request['brands_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','brands_delete_force')->id + ); + } + + if (!empty($request['brands_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','brands_restore')->id + ); + } + + if (!empty($request['models_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','models_viewAny')->id + ); + } + + if (!empty($request['models_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','models_viewAny_deleted')->id + ); + } + + if (!empty($request['models_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','models_view')->id + ); + } + + if (!empty($request['models_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','models_create')->id + ); + } + + if (!empty($request['models_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','models_edit')->id + ); + } + + if (!empty($request['models_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','models_delete')->id + ); + } + + if (!empty($request['models_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','models_delete_force')->id + ); + } + + if (!empty($request['models_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','models_restore')->id + ); + } + + if (!empty($request['products_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_viewAny')->id + ); + } + + if (!empty($request['products_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_viewAny_deleted')->id + ); + } + + if (!empty($request['products_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_view')->id + ); + } + + if (!empty($request['products_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_create')->id + ); + } + + if (!empty($request['products_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_edit')->id + ); + } + + if (!empty($request['products_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_delete')->id + ); + } + + if (!empty($request['products_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_delete_force')->id + ); + } + + if (!empty($request['products_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_restore')->id + ); + } + + if (!empty($request['products_amount_add'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_amount_add')->id + ); + } + + if (!empty($request['products_amount_remove'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','products_amount_remove')->id + ); + } + + if (!empty($request['categories_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','categories_viewAny')->id + ); + } + + if (!empty($request['categories_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','categories_viewAny_deleted')->id + ); + } + + if (!empty($request['categories_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','categories_view')->id + ); + } + + if (!empty($request['categories_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','categories_create')->id + ); + } + + if (!empty($request['categories_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','categories_edit')->id + ); + } + + if (!empty($request['categories_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','categories_delete')->id + ); + } + + if (!empty($request['categories_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','categories_delete_force')->id + ); + } + + if (!empty($request['categories_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','categories_restore')->id + ); + } + + if (!empty($request['subcategories_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','subcategories_viewAny')->id + ); + } + + if (!empty($request['subcategories_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','subcategories_viewAny_deleted')->id + ); + } + + if (!empty($request['subcategories_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','subcategories_view')->id + ); + } + + if (!empty($request['subcategories_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','subcategories_create')->id + ); + } + + if (!empty($request['subcategories_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','subcategories_edit')->id + ); + } + + if (!empty($request['subcategories_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','subcategories_delete')->id + ); + } + + if (!empty($request['subcategories_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','subcategories_delete_force')->id + ); + } + + if (!empty($request['subcategories_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','subcategories_restore')->id + ); + } + + if (!empty($request['users_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_viewAny')->id + ); + } + + if (!empty($request['users_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_viewAny_deleted')->id + ); + } + + if (!empty($request['users_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_view')->id + ); + } + + if (!empty($request['users_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_create')->id + ); + } + + if (!empty($request['users_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_edit')->id + ); + } + + if (!empty($request['users_edit_username'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_edit_username')->id + ); + } + + if (!empty($request['users_edit_role'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_edit_role')->id + ); + } + + if (!empty($request['users_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_delete')->id + ); + } + + if (!empty($request['users_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_delete_force')->id + ); + } + + if (!empty($request['users_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','users_restore')->id + ); + } + + if (!empty($request['buildings_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','buildings_viewAny')->id + ); + } + + if (!empty($request['buildings_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','buildings_viewAny_deleted')->id + ); + } + + if (!empty($request['buildings_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','buildings_view')->id + ); + } + + if (!empty($request['buildings_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','buildings_create')->id + ); + } + + if (!empty($request['buildings_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','buildings_edit')->id + ); + } + + if (!empty($request['buildings_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','buildings_delete')->id + ); + } + + if (!empty($request['buildings_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','buildings_delete_force')->id + ); + } + + if (!empty($request['buildings_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','buildings_restore')->id + ); + } + + if (!empty($request['rooms_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','rooms_viewAny')->id + ); + } + + if (!empty($request['rooms_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','rooms_viewAny_deleted')->id + ); + } + + if (!empty($request['rooms_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','rooms_view')->id + ); + } + + if (!empty($request['rooms_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','rooms_create')->id + ); + } + + if (!empty($request['rooms_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','rooms_edit')->id + ); + } + + if (!empty($request['rooms_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','rooms_delete')->id + ); + } + + if (!empty($request['rooms_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','rooms_delete_force')->id + ); + } + + if (!empty($request['rooms_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','rooms_restore')->id + ); + } + + if (!empty($request['cabels_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_viewAny')->id + ); + } + + if (!empty($request['cabels_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_viewAny_deleted')->id + ); + } + + if (!empty($request['cabels_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_view')->id + ); + } + + if (!empty($request['cabels_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_create')->id + ); + } + + if (!empty($request['cabels_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_edit')->id + ); + } + + if (!empty($request['cabels_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_delete')->id + ); + } + + if (!empty($request['cabels_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_delete_force')->id + ); + } + + if (!empty($request['cabels_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_restore')->id + ); + } + + if (!empty($request['cabels_amount_add'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_amount_add')->id + ); + } + + if (!empty($request['cabels_amount_remove'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabels_amount_remove')->id + ); + } + + if (!empty($request['cabelCategories_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabelCategories_viewAny')->id + ); + } + + if (!empty($request['cabelCategories_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabelCategories_viewAny_deleted')->id + ); + } + + if (!empty($request['cabelCategories_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabelCategories_view')->id + ); + } + + if (!empty($request['cabelCategories_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabelCategories_create')->id + ); + } + + if (!empty($request['cabelCategories_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabelCategories_edit')->id + ); + } + + if (!empty($request['cabelCategories_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabelCategories_delete')->id + ); + } + + if (!empty($request['cabelCategories_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabelCategories_delete_force')->id + ); + } + + if (!empty($request['cabelCategories_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','cabelCategories_restore')->id + ); + } + + if (!empty($request['roles_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','roles_viewAny')->id + ); + } + + if (!empty($request['roles_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','roles_viewAny_deleted')->id + ); + } + + if (!empty($request['roles_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','roles_view')->id + ); + } + + if (!empty($request['roles_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','roles_create')->id + ); + } + + if (!empty($request['roles_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','roles_edit')->id + ); + } + + if (!empty($request['roles_edit_permissions'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','roles_edit_permissions')->id + ); + } + + if (!empty($request['roles_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','roles_delete')->id + ); + } + + if (!empty($request['roles_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','roles_delete_force')->id + ); + } + + if (!empty($request['roles_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','roles_restore')->id + ); + } + + if (!empty($request['loans_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','loans_viewAny')->id + ); + } + + if (!empty($request['loans_create_user'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','loans_create_user')->id + ); + } + + if (!empty($request['loans_create_laptop'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','loans_create_laptop')->id + ); + } + + if (!empty($request['loans_adjust'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','loans_adjust')->id + ); + } + + if (!empty($request['loans_return'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','loans_return')->id + ); + } + + if (!empty($request['reservations_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','reservations_viewAny')->id + ); + } + + if (!empty($request['reservations_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','reservations_create')->id + ); + } + + if (!empty($request['reservations_validate'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','reservations_validate')->id + ); + } + + if (!empty($request['reservations_cancel'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','reservations_cancel')->id + ); + } + + if (!empty($request['reservations_setup'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','reservations_setup')->id + ); + } + + if (!empty($request['reservations_pickup'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','reservations_pickup')->id + ); + } + + if (!empty($request['reservations_return'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','reservations_return')->id + ); + } + + if (!empty($request['reservations_adjust'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','reservations_adjust')->id + ); + } + + if (!empty($request['notes_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','notes_viewAny')->id + ); + } + + if (!empty($request['notes_viewAny_deleted'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','notes_viewAny_deleted')->id + ); + } + + if (!empty($request['notes_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','notes_view')->id + ); + } + + if (!empty($request['notes_create'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','notes_create')->id + ); + } + + if (!empty($request['notes_edit'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','notes_edit')->id + ); + } + + if (!empty($request['notes_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','notes_delete')->id + ); + } + + if (!empty($request['notes_delete_force'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','notes_delete_force')->id + ); + } + + if (!empty($request['notes_restore'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','notes_restore')->id + ); + } + + if (!empty($request['pdf_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','pdf_viewAny')->id + ); + } + + if (!empty($request['pdf_view'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','pdf_view')->id + ); + } + + if (!empty($request['pdf_delete'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','pdf_delete')->id + ); + } + + if (!empty($request['logs_viewAny'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','logs_viewAny')->id + ); + } + + if (!empty($request['statistics'])){ + array_push($permissionIds, + Permission::firstWhere('name','=','statistics')->id + ); + } + + $object->permissions()->sync($permissionIds); + } + + return redirect()->route('roles.index'); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($role) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Role::withTrashed()->where('id','=',$role)->first(); + $object->delete(); + + return redirect()->route('roles.index'); + } + + /** + * Permanently Remove the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($role) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Role::withTrashed()->where('id','=',$role)->first(); + $object->forceDelete(); + + return redirect()->route('roles.index'); + } + + /** + * Restore the specified resource from storage. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($role) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'roles_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = Role::withTrashed()->where('id','=',$role)->first(); + $object->restore(); + + return redirect()->route('roles.index'); + } +} diff --git a/app/Http/Controllers/User/UserController.php b/app/Http/Controllers/User/UserController.php new file mode 100644 index 0000000..2e75cd8 --- /dev/null +++ b/app/Http/Controllers/User/UserController.php @@ -0,0 +1,446 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'users_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "username", "name" => "username")); + array_push($search_types,array("value" => "name", "name" => "name_full")); + array_push($search_types,array("value" => "role", "name" => "role")); + + $PerPagination = $request->input('p') ?? 10; + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "username": + switch($search_compare){ + case('='): + $users = User::where(function ($query) use ($search_term){ + $query->where('username','=',$search_term); + })->paginate($PerPagination); + break; + default: + $users = User::where(function ($query) use ($search_term){ + $query->where('username','like','%' . $search_term . '%'); + })->paginate($PerPagination); + break; + } + + break; + case "name": + switch($search_compare){ + case('='): + $users = User::where(function ($query) use ($search_term){ + $query->where('name','=',$search_term); + })->paginate($PerPagination); + break; + default: + $users = User::where(function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + })->paginate($PerPagination); + break; + } + break; + case "role": + switch($search_compare){ + case('='): + $users = User::where(function ($query) use ($search_term){ + $query->whereHas('role',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $users = User::where(function ($query) use ($search_term){ + $query->whereHas('role',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + } + } + else{ + $users = User::paginate($PerPagination); + } + + return view('users.index') + ->with('search_types',$search_types) + ->with('data',$users) + ->with('data_name','user') + ->with('data_names','users') + ; + } + + /** + * Display a listing of the resource. + * + */ + public function deleted(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $search_types = []; + array_push($search_types,array("value" => "username", "name" => "username")); + array_push($search_types,array("value" => "name", "name" => "name")); + array_push($search_types,array("value" => "role", "name" => "role")); + + $PerPagination = $request->input('p'); + $search_term = $request->input('search_term'); + $search_type = $request->input('search_type'); + $search_compare = $request->input('search_compare'); + + if($search_term != ""){ + switch ($search_type){ + case "username": + switch($search_compare){ + case('='): + $users = User::onlyTrashed()->where(function ($query) use ($search_term){ + $query->where('username','=',$search_term); + })->paginate($PerPagination); + break; + default: + $users = User::onlyTrashed()->where(function ($query) use ($search_term){ + $query->where('username','like','%' . $search_term . '%'); + })->paginate($PerPagination); + break; + } + + break; + case "name": + switch($search_compare){ + case('='): + $users = User::onlyTrashed()->where(function ($query) use ($search_term){ + $query->where('name','=',$search_term); + })->paginate($PerPagination); + break; + default: + $users = User::onlyTrashed()->where(function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + })->paginate($PerPagination); + break; + } + break; + case "role": + switch($search_compare){ + case('='): + $users = User::onlyTrashed()->where(function ($query) use ($search_term){ + $query->whereHas('role',function ($query) use ($search_term){ + $query->where('name','=',$search_term); + }); + })->paginate($PerPagination); + break; + default: + $users = User::onlyTrashed()->where(function ($query) use ($search_term){ + $query->whereHas('role',function ($query) use ($search_term){ + $query->where('name','like','%' . $search_term . '%'); + }); + })->paginate($PerPagination); + break; + } + break; + default: + $users = User::onlyTrashed()->where(function ($query) use ($search_term){ + $query->where('username', 'like', '%'.$search_term.'%') + ->orWhere('name', 'like', '%'.$search_term.'%') + ->orWhereHas('role', function ($query) use ($search_term){ + $query->where('name', 'like', '%'.$search_term.'%'); + }); + })->paginate($PerPagination); + break; + } + } + else{ + $users = User::onlyTrashed()->paginate($PerPagination); + } + + return view('users.deleted') + ->with('search_types',$search_types) + ->with('data',$users) + ->with('data_name','user') + ->with('data_names','users') + ; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function create() + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'user_ceate')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $exclude = array(); + if(Auth::user()->role->name != "Administrator"){ + array_push($exclude,Role::firstWhere("name", "=", "Administrator")->id); + } + + return view('users.create') + ->with('loanerTypes', LoanerType::all()) + ->with('roles', Role::all()->except($exclude)) + ->with('password_input_repeat','true') + ; + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $nadUser = LoanerType::where('name','=','nadUser')->first(); + $user = new User(); + $user->name = $request->name; + $user->username = $request->username; + $user->password = Hash::make($request->password); + $user->loaner_type_id = $nadUser->id; + $user->role_id = $request->role_id; + $user->save(); + Logger::LogCreated($user->id,get_class($user)); + + return redirect()->route('users.index'); + } + + /** + * Display the specified resource. + * + * @param \App\Models\User $user + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function show($user) + { + $object = User::withTrashed()->where('id','=',$user)->first(); + + if(Auth::user()->id != $object->id){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + $loans = Loan::where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ->where('user_id','=',$object->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('loanable_type','loanable_id','date_start','date_end') + ->orderBy('date_end') + ->orderBy('date_start') + ->orderBy('loanable_type') + ->orderBy('loanable_id') + ->get() + ; + + $reservations = Loan::where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ->where('user_id','=',$object->id) + ->select('*',DB::raw('count(loanable_id) as amount')) + ->groupBy('loanable_type','loanable_id','loan_type_id','room_id') + ->orderBy('loan_type_id') + ->orderBy('room_id') + ->orderBy('date_start') + ->orderBy('date_end') + ->orderBy('loanable_type') + ->orderBy('loanable_id') + ->get() + ; + + $notes = Note::where('user_id','=',$object->id) + ->get() + ; + + $contracts = Contract::where('user_id','=',$object->id) + ->orderBy('type') + ->orderBy('timestamp','desc') + ->get() + ; + + return view('users.show') + ->with('data',$object) + ->with('loans',$loans) + ->with('reservations',$reservations) + ->with('contracts',$contracts) + ->with('notes',$notes) + ; + } + + /** + * Show the form for editing the specified resource. + * + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + public function edit($user) + { + $object = User::withTrashed()->where('id','=',$user)->first(); + + if(Auth::user()->id != $object->id){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + $exclude = array(); + if(Auth::user()->role->name != "Administrator"){ + array_push($exclude,Role::where("name","=","Administrator")->first()->id); + } + + return view('users.edit') + ->with('data', $object) + ->with('loanerTypes', LoanerType::all()) + ->with('users', User::all()) + ->with('roles', Role::all()->except($exclude)) + ->with('password_input_repeat','true') + ->with('data_name', 'user') + ->with('data_names', 'users') + ; + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request, $user) + { + $object = User::withTrashed()->where('id','=',$user)->first(); + + if(Auth::user()->id != $object->id){ + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + return redirect()->route('roles.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\User $user + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($user) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'user_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = User::withTrashed()->where('id','=',$user)->first(); + Logger::LogDeleted($object->id,get_class($object)); + $object->delete(); + return redirect()->route('users.index'); + } + + /** + * Permanently Remove the specified resource from storage. + * + * @param \App\Models\User $user + * @return \Illuminate\Http\RedirectResponse + */ + public function delete_force($user) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'user_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = User::withTrashed()->where('id','=',$user)->first(); + + $laptop_files = Storage::files('laptops'); + foreach($laptop_files as $file){ + $no_dir = str_replace("laptops/", "",$file); + $parts = explode('_',$no_dir); + $file_name = 'app\\'.$file; + $file_full = storage_path($file_name); + if($parts[0] == $object->username){ + unlink($file_full); + } + } + + $reservation_files = Storage::files('reservation'); + foreach($reservation_files as $file){ + $no_dir = str_replace("reservation/", "",$file); + $parts = explode('_',$no_dir); + $file_name = 'app\\'.$file; + $file_full = storage_path($file_name); + if($parts[0] == $object->username){ + unlink($file_full); + } + } + + $contract_files = Storage::files('contracts'); + foreach($contract_files as $file){ + $no_dir = str_replace("contracts/", "",$file); + $parts = explode('_',$no_dir); + $file_name = 'app\\'.$file; + $file_full = storage_path($file_name); + if($parts[0] == $object->username){ + unlink($file_full); + } + } + + Logger::LogForceDeleted($object->id,get_class($object)); + $object->forceDelete(); + return redirect()->route('users.index'); + } + + /** + * Restore the specified resource from storage. + * + * @param \App\Models\User $user + * @return \Illuminate\Http\RedirectResponse + */ + public function restore($user) + { + Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'user_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + $object = User::withTrashed()->where('id','=',$user)->first(); + $object->restore(); + Logger::LogRestored($object->id,get_class($object)); + + return redirect()->route('users.index'); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..0079688 --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,67 @@ + + */ + protected $middleware = [ + // \App\Http\Middleware\TrustHosts::class, + \App\Http\Middleware\TrustProxies::class, + \Illuminate\Http\Middleware\HandleCors::class, + \App\Http\Middleware\PreventRequestsDuringMaintenance::class, + \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, + \App\Http\Middleware\TrimStrings::class, + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + ]; + + /** + * The application's route middleware groups. + * + * @var array> + */ + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + 'throttle:api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'signed' => \App\Http\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + ]; +} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..704089a --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,21 @@ +expectsJson()) { + return route('login'); + } + } +} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..867695b --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php new file mode 100644 index 0000000..74cbd9a --- /dev/null +++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php new file mode 100644 index 0000000..a2813a0 --- /dev/null +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,32 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..88cadca --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ + + */ + protected $except = [ + 'current_password', + 'password', + 'password_confirmation', + ]; +} diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php new file mode 100644 index 0000000..7186414 --- /dev/null +++ b/app/Http/Middleware/TrustHosts.php @@ -0,0 +1,20 @@ + + */ + public function hosts() + { + return [ + $this->allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php new file mode 100644 index 0000000..3391630 --- /dev/null +++ b/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,28 @@ +|string|null + */ + protected $proxies; + + /** + * The headers that should be used to detect proxies. + * + * @var int + */ + protected $headers = + Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; +} diff --git a/app/Http/Middleware/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php new file mode 100644 index 0000000..ee4045d --- /dev/null +++ b/app/Http/Middleware/ValidateSignature.php @@ -0,0 +1,22 @@ + + */ + protected $ignore = [ + // 'fbclid', + // 'utm_campaign', + // 'utm_content', + // 'utm_medium', + // 'utm_source', + // 'utm_term', + ]; +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 0000000..9e86521 --- /dev/null +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/app/Models/Brand.php b/app/Models/Brand.php new file mode 100644 index 0000000..ca6d6a0 --- /dev/null +++ b/app/Models/Brand.php @@ -0,0 +1,26 @@ +hasMany(ProductModel::class,'brand_id','id')->withTrashed(); + } + + public function products() + { + return $this->hasMany(Product::class,'brand_id','id')->withTrashed(); + } +} diff --git a/app/Models/Building.php b/app/Models/Building.php new file mode 100644 index 0000000..7c021f1 --- /dev/null +++ b/app/Models/Building.php @@ -0,0 +1,17 @@ +hasMany(Room::class,'building_id','id'); + } +} diff --git a/app/Models/Cabel.php b/app/Models/Cabel.php new file mode 100644 index 0000000..728aa0d --- /dev/null +++ b/app/Models/Cabel.php @@ -0,0 +1,29 @@ +belongsTo(CabelCategory::class,'cabel_category_id')->withTrashed(); + } + + public function loans() + { + return $this->morphtoMany(User::class, 'loanable','loans')->where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id)->withTrashed(); + } + + public function reservations() + { + return $this->morphtoMany(User::class, 'loanable','loans')->where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id)->withTrashed(); + } + +} diff --git a/app/Models/CabelCategory.php b/app/Models/CabelCategory.php new file mode 100644 index 0000000..c735fd8 --- /dev/null +++ b/app/Models/CabelCategory.php @@ -0,0 +1,17 @@ +hasMany(Cabel::class,'cabel_category_id','id')->withTrashed(); + } +} diff --git a/app/Models/Contract.php b/app/Models/Contract.php new file mode 100644 index 0000000..b605e83 --- /dev/null +++ b/app/Models/Contract.php @@ -0,0 +1,23 @@ +belongsTo(User::class, 'user_id')->withTrashed(); + } +} diff --git a/app/Models/Loan.php b/app/Models/Loan.php new file mode 100644 index 0000000..2938e0d --- /dev/null +++ b/app/Models/Loan.php @@ -0,0 +1,42 @@ +belongsTo(User::class, 'user_id')->withTrashed(); + } + + public function room() + { + return $this->belongsTo(Room::class, 'room_id')->withTrashed(); + } + + public function type() + { + return $this->belongsTo(LoanType::class, 'loan_type_id'); + } + + public function loanable() + { + return $this->morphTo()->withTrashed(); + } +} diff --git a/app/Models/LoanType.php b/app/Models/LoanType.php new file mode 100644 index 0000000..a88529a --- /dev/null +++ b/app/Models/LoanType.php @@ -0,0 +1,12 @@ +belongsTo(User::class, 'user_id')->withTrashed(); + } + + public function target() + { + return $this->belongsTo(User::class, 'target_id')->withTrashed(); + } + + public function action() + { + return $this->belongsTo(LogAction::class, 'log_action_id'); + } + + public function loggable() + { + return $this->morphTo()->withTrashed(); + } +} diff --git a/app/Models/LogAction.php b/app/Models/LogAction.php new file mode 100644 index 0000000..4efc349 --- /dev/null +++ b/app/Models/LogAction.php @@ -0,0 +1,15 @@ +belongsTo(User::class,'user_id')->withTrashed(); + } + + public function type() + { + return $this->belongsTo(NoteType::class,'note_type_id'); + } + + public function loanable() + { + return $this->morphTo()->withTrashed(); + } + +} diff --git a/app/Models/NoteType.php b/app/Models/NoteType.php new file mode 100644 index 0000000..d558c50 --- /dev/null +++ b/app/Models/NoteType.php @@ -0,0 +1,11 @@ +belongsToMany(Role::class, "role_has_permission", "permission_id", "role_id")->withTimestamps(); + } +} diff --git a/app/Models/Product.php b/app/Models/Product.php new file mode 100644 index 0000000..141d055 --- /dev/null +++ b/app/Models/Product.php @@ -0,0 +1,43 @@ +belongsTo(ProductCategory::class,'product_category_id','id')->withTrashed(); + } + + public function subcategory() + { + return $this->belongsTo(ProductSubcategory::class,'product_subcategory_id','id')->withTrashed(); + } + + public function brand() + { + return $this->belongsTo(Brand::class,'brand_id','id')->withTrashed(); + } + + public function model() + { + return $this->belongsTo(ProductModel::class,'product_model_id','id')->withTrashed(); + } + + public function loans() + { + return $this->morphtoMany(User::class, 'loanable','loans')->where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id); + } + + public function reservations() + { + return $this->morphtoMany(User::class, 'loanable','loans')->where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id); + } + +} diff --git a/app/Models/ProductCategory.php b/app/Models/ProductCategory.php new file mode 100644 index 0000000..fc52932 --- /dev/null +++ b/app/Models/ProductCategory.php @@ -0,0 +1,26 @@ +hasMany(ProductSubcategory::class,'product_category_id','id')->withTrashed(); + } + + public function products() + { + return $this->hasMany(Product::class,'product_category_id','id')->withTrashed(); + } +} diff --git a/app/Models/ProductModel.php b/app/Models/ProductModel.php new file mode 100644 index 0000000..9ebc954 --- /dev/null +++ b/app/Models/ProductModel.php @@ -0,0 +1,28 @@ +belongsTo(Brand::class,'brand_id','id')->withTrashed(); + } + + public function products() + { + return $this->hasMany(Product::class,'product_model_id','id')->withTrashed(); + } +} + + diff --git a/app/Models/ProductSubcategory.php b/app/Models/ProductSubcategory.php new file mode 100644 index 0000000..29e3544 --- /dev/null +++ b/app/Models/ProductSubcategory.php @@ -0,0 +1,27 @@ +belongsTo(ProductCategory::class,'product_category_id','id')->withTrashed(); + } + + public function products() + { + return $this->hasMany(Product::class,'product_subcategory_id','id')->withTrashed(); + } +} diff --git a/app/Models/Role.php b/app/Models/Role.php new file mode 100644 index 0000000..d0ee6c9 --- /dev/null +++ b/app/Models/Role.php @@ -0,0 +1,33 @@ +belongsToMany(Permission::class, "role_has_permission", 'role_id', 'permission_id')->withTimestamps(); + } + + public function users(): HasMany + { + return $this->hasMany(User::class,'role_id'); + } + +} diff --git a/app/Models/Room.php b/app/Models/Room.php new file mode 100644 index 0000000..c2ddf4d --- /dev/null +++ b/app/Models/Room.php @@ -0,0 +1,26 @@ +belongsTo(Building::class,'building_id','id')->withTrashed() + ; + } + + public function reservations() + { + return $this->hasMany(Loan::class,'room_id') + ->where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ; + } + +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..dee2c64 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,79 @@ + + */ + protected $fillable = [ + 'name', + 'username', + 'password', + 'guid', + 'domain' + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * Gets the Loaner Type that the users belongs to + * @return BelongsTo + */ + public function loanerType(): BelongsTo + { + return $this->belongsTo(LoanerType::class); + } + + /** + * Gets the roles that the users belongs to + * @return BelongsTo + */ + public function role(): BelongsTo + { + return $this->belongsTo(Role::class); + } + + public function loans() + { + return $this->hasMany(Loan::class,'user_id') + ->where('loan_type_id','=',LoanType::where('name','=','Loan')->first()->id) + ; + } + + public function reservations() + { + return $this->hasMany(Loan::class,'user_id') + ->where('loan_type_id','!=',LoanType::where('name','=','Loan')->first()->id) + ; + } + + public function notes() + { + return $this->hasMany(Note::class,'user_id'); + } + +} diff --git a/app/Policies/BrandPolicy.php b/app/Policies/BrandPolicy.php new file mode 100644 index 0000000..cf4921a --- /dev/null +++ b/app/Policies/BrandPolicy.php @@ -0,0 +1,128 @@ +role->permissions->contains(Permission::firstWhere('name','=','brands_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','brands_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @param Brand $Brand + * @param User $model + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','brands_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','brands_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @param Brand $Brand + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','brands_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @param Brand $Brand + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','brands_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @param Brand $Brand + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','brands_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @param Brand $Brand + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','brands_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/BuildingPolicy.php b/app/Policies/BuildingPolicy.php new file mode 100644 index 0000000..7631dc9 --- /dev/null +++ b/app/Policies/BuildingPolicy.php @@ -0,0 +1,123 @@ +role->permissions->contains(Permission::firstWhere('name','=','buildings_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','buildings_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','buildings_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','buildings_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','buildings_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','buildings_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','buildings_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','buildings_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/CabelCategoryPolicy.php b/app/Policies/CabelCategoryPolicy.php new file mode 100644 index 0000000..a059f3f --- /dev/null +++ b/app/Policies/CabelCategoryPolicy.php @@ -0,0 +1,121 @@ +role->permissions->contains(Permission::firstWhere('name','=','cabelCategories_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabelCategories_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabelCategories_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabelCategories_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabelCategories_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabelCategories_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabelCategories_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabelCategories_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/CabelPolicy.php b/app/Policies/CabelPolicy.php new file mode 100644 index 0000000..39ca6c9 --- /dev/null +++ b/app/Policies/CabelPolicy.php @@ -0,0 +1,146 @@ +role->permissions->contains(Permission::firstWhere('name','=','cabels_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabels_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabels_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabels_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabels_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabels_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete_force(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabels_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabels_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can add to the pool. + * + * @return Response|bool + */ + public function amount_add() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabels_amount_add')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can remove from the pool. + * + * @return Response|bool + */ + public function amount_remove() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','cabels_amount_remove')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/CategoryPolicy.php b/app/Policies/CategoryPolicy.php new file mode 100644 index 0000000..7ac3eb7 --- /dev/null +++ b/app/Policies/CategoryPolicy.php @@ -0,0 +1,122 @@ +role->permissions->contains(Permission::firstWhere('name','=','categories_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','categories_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','categories_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','categories_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','categories_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','categories_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','categories_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','categories_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/LoanPolicy.php b/app/Policies/LoanPolicy.php new file mode 100644 index 0000000..070aad5 --- /dev/null +++ b/app/Policies/LoanPolicy.php @@ -0,0 +1,85 @@ +role->permissions->contains(Permission::firstWhere('name','=','loans_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create_user(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','loans_create_user')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create_laptop(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','loans_create_laptop')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function adjust(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','loans_adjust')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function return(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','loans_return')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/ModelPolicy.php b/app/Policies/ModelPolicy.php new file mode 100644 index 0000000..b4ddbdc --- /dev/null +++ b/app/Policies/ModelPolicy.php @@ -0,0 +1,123 @@ +role->permissions->contains(Permission::firstWhere('name','=','models_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','models_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','models_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','models_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','models_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','models_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','models_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','models_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + +} diff --git a/app/Policies/NotePolicy.php b/app/Policies/NotePolicy.php new file mode 100644 index 0000000..cafed07 --- /dev/null +++ b/app/Policies/NotePolicy.php @@ -0,0 +1,121 @@ +role->permissions->contains(Permission::firstWhere('name','=','notes_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view any notes. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','notes_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','notes_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create notes. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','notes_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','notes_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','notes_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','notes_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','notes_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/OtherPolicy.php b/app/Policies/OtherPolicy.php new file mode 100644 index 0000000..6522e1e --- /dev/null +++ b/app/Policies/OtherPolicy.php @@ -0,0 +1,45 @@ +role->permissions->contains(Permission::firstWhere('name','=','logs_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + public function home_page() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','home_page')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + public function statistics() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','statistics')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/PDFPolicy.php b/app/Policies/PDFPolicy.php new file mode 100644 index 0000000..1a99499 --- /dev/null +++ b/app/Policies/PDFPolicy.php @@ -0,0 +1,61 @@ +role->permissions->contains(Permission::firstWhere('name','=','pdf_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','pdf_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','pdf_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/ProductPolicy.php b/app/Policies/ProductPolicy.php new file mode 100644 index 0000000..5be1ffe --- /dev/null +++ b/app/Policies/ProductPolicy.php @@ -0,0 +1,144 @@ +role->permissions->contains(Permission::firstWhere('name','=','products_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','products_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','products_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','products_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','products_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','products_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','products_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','products_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can add to the pool. + * + * @return Response|bool + */ + public function amount_add() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','products_amount_add')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can remove from the pool. + * + * @return Response|bool + */ + public function amount_remove() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','products_amount_remove')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/ReservationPolicy.php b/app/Policies/ReservationPolicy.php new file mode 100644 index 0000000..69771ea --- /dev/null +++ b/app/Policies/ReservationPolicy.php @@ -0,0 +1,119 @@ +role->permissions->contains(Permission::firstWhere('name','=','reservations_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','reservations_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function extend(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','reservations_extend')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function return(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','reservations_return')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can validate the model. + * + * @return Response + */ + public function validate(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','reservations_validate')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can cancel the model. + * + * @return Response + */ + public function cancel(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','reservations_cancel')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function pickup(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','reservations_pickup')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function setup(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','reservations_setup')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/RolePolicy.php b/app/Policies/RolePolicy.php new file mode 100644 index 0000000..b468a63 --- /dev/null +++ b/app/Policies/RolePolicy.php @@ -0,0 +1,127 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'user_view_any'))); + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','roles_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + public function viewAny_deleted(): Response + { + //ConsoleLogger::DebugToConsole("users Policy - viewAny - returns: ".$user->role->permissions->contains(Permission::firstWhere('name', '=', 'user_view_any'))); + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','roles_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + //ConsoleLogger::DebugToConsole("users Policy - View - returns: ".$user->role->permissions->contains(Permission::firstWhere('name', '=', 'user_view'))); + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','roles_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','roles_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','roles_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','roles_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','roles_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','roles_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function edit_permissions() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','roles_edit_permissions')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + +} diff --git a/app/Policies/RoomPolicy.php b/app/Policies/RoomPolicy.php new file mode 100644 index 0000000..68f8cdf --- /dev/null +++ b/app/Policies/RoomPolicy.php @@ -0,0 +1,123 @@ +role->permissions->contains(Permission::firstWhere('name','=','rooms_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','rooms_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','rooms_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','rooms_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','rooms_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','rooms_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','rooms_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','rooms_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/SubcategoryPolicy.php b/app/Policies/SubcategoryPolicy.php new file mode 100644 index 0000000..2f8e1b1 --- /dev/null +++ b/app/Policies/SubcategoryPolicy.php @@ -0,0 +1,125 @@ +role->permissions->contains(Permission::firstWhere('name','=','subcategories_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','subcategories_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @return Response + */ + public function view(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','subcategories_view')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','subcategories_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @return Response + */ + public function edit(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','subcategories_edit')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + + } + + /** + * Determine whether the user can delete the model. + * + * @return Response + */ + public function delete(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','subcategories_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @return Response|bool + */ + public function restore() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','subcategories_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @return Response|bool + */ + public function delete_force() + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name','=','subcategories_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php new file mode 100644 index 0000000..6116605 --- /dev/null +++ b/app/Policies/UserPolicy.php @@ -0,0 +1,156 @@ +role->permissions->contains(Permission::firstWhere('name', '=', 'users_viewAny')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view any models. + * + * @return Response + */ + public function viewAny_deleted(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_viewAny_deleted')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can view the model. + * + * @param User $user + * @param User $model + * @return Response + */ + public function view(User $user): Response + { + return ($user->id === Auth::user()->id + or Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_view'))) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can create models. + * + * @return Response + */ + public function create(): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_create')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can update the model. + * + * @param User $user + * @return Response + */ + public function edit(User $user): Response + { + return ($user->id === Auth::user()->id + or Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_edit'))) + ? Response::allow() + : Response::deny('you are not the chosen one'); + + + } + + /** + * Determine whether the user can delete the model. + * + * @param User $user + * @return Response + */ + public function delete(User $user): Response + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_delete')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can restore the model. + * + * @param User $user + * @return Response|bool + */ + public function restore(User $user) + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_restore')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @param User $user + * @return Response|bool + */ + public function delete_force(User $user) + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_delete_force')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @param User $user + * @return Response|bool + */ + public function edit_username(User $user) + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_edit_username')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } + + /** + * Determine whether the user can permanently delete the model. + * + * @param User $user + * @return Response|bool + */ + public function edit_role(User $user) + { + return Auth::user()->role->permissions->contains(Permission::firstWhere('name', '=', 'users_edit_role')) + ? Response::allow() + : Response::deny('you are not the chosen one'); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..c220bc7 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,31 @@ + + */ + protected $policies = [ + // 'App\Models\models' => 'App\Policies\ModelPolicy', + Role::class => RolePolicy::class, + User::class => UserPolicy::class, + Building::class => BuildingPolicy::class, + Room::class => RoomPolicy::class, + Brand::class => BrandPolicy::class, + ProductModel::class => ModelPolicy::class, + ProductCategory::class => CategoryPolicy::class, + ProductSubcategory::class => SubcategoryPolicy::class, + Product::class => ProductPolicy::class, + Cabel::class => CabelPolicy::class, + Cabelcategory::class => CabelcategoryPolicy::class, + Note::class => NotePolicy::class, + ]; + + /** + * Register any authentication / authorization services. + * + * @return void + */ + public function boot() + { + $this->registerPolicies(); + + // users Policy + Gate::define('users_viewAny', [UserPolicy::class,'viewAny']); + Gate::define('users_viewAny_deleted', [UserPolicy::class,'viewAny_deleted']); + Gate::define('users_view', [UserPolicy::class,'view']); + Gate::define('users_edit', [UserPolicy::class,'edit']); + Gate::define('users_edit_role', [UserPolicy::class,'edit_role']); + Gate::define('users_edit_username', [UserPolicy::class,'edit_username']); + Gate::define('users_delete', [UserPolicy::class,'delete']); + Gate::define('users_delete_force', [UserPolicy::class,'delete_force']); + Gate::define('users_restore', [UserPolicy::class,'restore']); + + // buildings Policy + Gate::define('buildings_viewAny', [BuildingPolicy::class,'viewAny']); + Gate::define('buildings_viewAny_deleted', [BuildingPolicy::class,'viewAny_deleted']); + Gate::define('buildings_view', [BuildingPolicy::class,'view']); + Gate::define('buildings_create', [BuildingPolicy::class,'create']); + Gate::define('buildings_edit', [BuildingPolicy::class,'edit']); + Gate::define('buildings_delete', [BuildingPolicy::class,'delete']); + Gate::define('buildings_delete_force', [BuildingPolicy::class,'delete_force']); + Gate::define('buildings_restore', [BuildingPolicy::class,'restore']); + + // rooms Policy + Gate::define('rooms_viewAny', [RoomPolicy::class,'viewAny']); + Gate::define('rooms_viewAny_deleted', [RoomPolicy::class,'viewAny_deleted']); + Gate::define('rooms_view', [RoomPolicy::class,'view']); + Gate::define('rooms_create', [RoomPolicy::class,'create']); + Gate::define('rooms_edit', [RoomPolicy::class,'edit']); + Gate::define('rooms_delete', [RoomPolicy::class,'delete']); + Gate::define('rooms_delete_force', [RoomPolicy::class,'delete_force']); + Gate::define('rooms_restore', [RoomPolicy::class,'restore']); + + //PDF + Gate::define('pdf_viewAny',[PDFPolicy::class,'viewAny']); + Gate::define('pdf_view',[PDFPolicy::class,'view']); + Gate::define('pdf_delete',[PDFPolicy::class,'delete']); + + // roles Policy + Gate::define('roles_viewAny', [RolePolicy::class, 'viewAny']); + Gate::define('roles_viewAny_deleted', [RolePolicy::class, 'viewAny_deleted']); + Gate::define('roles_view', [RolePolicy::class, 'view']); + Gate::define('roles_create', [RolePolicy::class, 'create']); + Gate::define('roles_edit', [RolePolicy::class, 'edit']); + Gate::define('roles_edit_permissions', [RolePolicy::class, 'edit_permissions']); + Gate::define('roles_delete', [RolePolicy::class, 'delete']); + Gate::define('roles_delete_force', [RolePolicy::class, 'delete_force']); + Gate::define('roles_restore', [RolePolicy::class, 'restore']); + + // brands Policy + Gate::define('brands_viewAny', [BrandPolicy::class, 'viewAny']); + Gate::define('brands_viewAny_deleted', [BrandPolicy::class, 'viewAny_deleted']); + Gate::define('brands_view', [BrandPolicy::class, 'view']); + Gate::define('brands_create', [BrandPolicy::class, 'create']); + Gate::define('brands_edit', [BrandPolicy::class, 'edit']); + Gate::define('brands_delete', [BrandPolicy::class, 'delete']); + Gate::define('brands_delete_force', [BrandPolicy::class, 'delete_force']); + Gate::define('brands_restore', [BrandPolicy::class, 'restore']); + + // models Policy + Gate::define('models_viewAny', [ModelPolicy::class, 'viewAny']); + Gate::define('models_viewAny_deleted', [ModelPolicy::class, 'viewAny_deleted']); + Gate::define('models_view', [ModelPolicy::class, 'view']); + Gate::define('models_create', [ModelPolicy::class, 'create']); + Gate::define('models_edit', [ModelPolicy::class, 'edit']); + Gate::define('models_delete', [ModelPolicy::class, 'delete']); + Gate::define('models_delete_force', [ModelPolicy::class, 'delete_force']); + Gate::define('models_restore', [ModelPolicy::class, 'restore']); + + // categories Policy + Gate::define('categories_viewAny', [CategoryPolicy::class, 'viewAny']); + Gate::define('categories_viewAny_deleted', [CategoryPolicy::class, 'viewAny_deleted']); + Gate::define('categories_view', [CategoryPolicy::class, 'view']); + Gate::define('categories_create', [CategoryPolicy::class, 'create']); + Gate::define('categories_edit', [CategoryPolicy::class, 'edit']); + Gate::define('categories_delete', [CategoryPolicy::class, 'delete']); + Gate::define('categories_delete_force', [CategoryPolicy::class, 'delete_force']); + Gate::define('categories_restore', [CategoryPolicy::class, 'restore']); + + // subcategories Policy + Gate::define('subcategories_viewAny', [SubcategoryPolicy::class, 'viewAny']); + Gate::define('subcategories_viewAny_deleted', [SubcategoryPolicy::class, 'viewAny_deleted']); + Gate::define('subcategories_view', [SubcategoryPolicy::class, 'view']); + Gate::define('subcategories_create', [SubcategoryPolicy::class, 'create']); + Gate::define('subcategories_edit', [SubcategoryPolicy::class, 'edit']); + Gate::define('subcategories_delete', [SubcategoryPolicy::class, 'delete']); + Gate::define('subcategories_delete_force', [SubcategoryPolicy::class, 'delete_force']); + Gate::define('subcategories_restore', [SubcategoryPolicy::class, 'restore']); + + // products Policy + Gate::define('products_viewAny', [ProductPolicy::class, 'viewAny']); + Gate::define('products_viewAny_deleted', [ProductPolicy::class, 'viewAny_deleted']); + Gate::define('products_view', [ProductPolicy::class, 'view']); + Gate::define('products_create', [ProductPolicy::class, 'create']); + Gate::define('products_edit', [ProductPolicy::class, 'edit']); + Gate::define('products_delete', [ProductPolicy::class, 'delete']); + Gate::define('products_delete_force', [ProductPolicy::class, 'delete_force']); + Gate::define('products_restore', [ProductPolicy::class, 'restore']); + Gate::define('products_amount_add', [ProductPolicy::class, 'amount_add']); + Gate::define('products_amount_remove', [ProductPolicy::class, 'amount_remove']); + + // cabel categories Policy + Gate::define('cabelCategories_viewAny',[CabelcategoryPolicy::class,'viewAny']); + Gate::define('cabelCategories_viewAny_deleted',[CabelcategoryPolicy::class,'viewAny_deleted']); + Gate::define('cabelCategories_view',[CabelcategoryPolicy::class,'view']); + Gate::define('cabelCategories_create',[CabelcategoryPolicy::class,'create']); + Gate::define('cabelCategories_edit',[CabelcategoryPolicy::class,'edit']); + Gate::define('cabelCategories_delete',[CabelcategoryPolicy::class,'delete']); + Gate::define('cabelCategories_delete_force',[CabelcategoryPolicy::class,'delete_force']); + Gate::define('cabelCategories_restore',[CabelcategoryPolicy::class,'restore']); + + // cabels Policy + Gate::define('cabels_viewAny',[CabelPolicy::class,'viewAny']); + Gate::define('cabels_viewAny_deleted',[CabelPolicy::class,'viewAny_deleted']); + Gate::define('cabels_view',[CabelPolicy::class,'view']); + Gate::define('cabels_create',[CabelPolicy::class,'create']); + Gate::define('cabels_edit',[CabelPolicy::class,'edit']); + Gate::define('cabels_delete',[CabelPolicy::class,'delete']); + Gate::define('cabels_delete_force',[CabelPolicy::class,'delete_force']); + Gate::define('cabels_restore',[CabelPolicy::class,'restore']); + Gate::define('cabels_amount_add',[CabelPolicy::class,'amount_add']); + Gate::define('cabels_amount_remove',[CabelPolicy::class,'amount_remove']); + + // loans Policy + Gate::define('loans_viewAny',[LoanPolicy::class,'viewAny']); + Gate::define('loans_create_user',[LoanPolicy::class,'create_user']); + Gate::define('loans_create_laptop',[LoanPolicy::class,'create_laptop']); + Gate::define('loans_adjust',[LoanPolicy::class,'adjust']); + Gate::define('loans_return',[LoanPolicy::class,'return']); + + // reservations + Gate::define('reservations_viewAny',[ReservationPolicy::class,'viewAny']); + Gate::define('reservations_create',[ReservationPolicy::class,'create']); + Gate::define('reservations_validate',[ReservationPolicy::class,'validate']); + Gate::define('reservations_cancel',[ReservationPolicy::class,'cancel']); + Gate::define('reservations_setup',[ReservationPolicy::class,'setup']); + Gate::define('reservations_pickup',[ReservationPolicy::class,'pickup']); + Gate::define('reservations_extend',[ReservationPolicy::class,'extend']); + Gate::define('reservations_return',[ReservationPolicy::class,'return']); + + // notes + Gate::define('notes_viewAny',[NotePolicy::class,'viewAny']); + Gate::define('notes_viewAny_deleted',[NotePolicy::class,'viewAny_deleted']); + Gate::define('notes_view',[NotePolicy::class,'view']); + Gate::define('notes_create',[NotePolicy::class,'create']); + Gate::define('notes_edit',[NotePolicy::class,'edit']); + Gate::define('notes_delete',[NotePolicy::class,'delete']); + Gate::define('notes_delete_force',[NotePolicy::class,'delete_force']); + Gate::define('notes_restore',[NotePolicy::class,'restore']); + + // Other + Gate::define('home_page',[OtherPolicy::class,'home_page']); + Gate::define('logs_viewAny',[OtherPolicy::class,'logs']); + Gate::define('statistics',[OtherPolicy::class,'statistics']); + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..395c518 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,21 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + * + * @return void + */ + public function boot() + { + // + } + + /** + * Determine if events and listeners should be automatically discovered. + * + * @return bool + */ + public function shouldDiscoverEvents() + { + return false; + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..ea87f2e --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,52 @@ +configureRateLimiting(); + + $this->routes(function () { + Route::middleware('api') + ->prefix('api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); + }); + } + + /** + * Configure the rate limiters for the application. + * + * @return void + */ + protected function configureRateLimiting() + { + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); + }); + } +} diff --git a/artisan b/artisan new file mode 100644 index 0000000..67a3329 --- /dev/null +++ b/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..037e17d --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..67762f9 --- /dev/null +++ b/composer.json @@ -0,0 +1,69 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The Laravel Framework.", + "keywords": ["framework", "laravel"], + "license": "MIT", + "require": { + "php": "^8.0.2", + "barryvdh/laravel-dompdf": "^2.0", + "directorytree/ldaprecord-laravel": "^2.6", + "guzzlehttp/guzzle": "^7.2", + "laravel/framework": "^9.19", + "laravel/sanctum": "^3.0", + "laravel/tinker": "^2.7", + "mailjet/laravel-mailjet": "^3.0", + "ext-pdo": "*" + }, + "require-dev": { + "fakerphp/faker": "^1.9.1", + "laravel/pint": "^1.0", + "laravel/sail": "^1.0.1", + "mockery/mockery": "^1.4.4", + "nunomaduro/collision": "^6.1", + "phpunit/phpunit": "^9.5.10", + "spatie/laravel-ignition": "^1.0" + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ] + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..c8446f0 --- /dev/null +++ b/composer.lock @@ -0,0 +1,8566 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "6dd871ffcf47b2ee5db0e2f279b8fc73", + "packages": [ + { + "name": "barryvdh/laravel-dompdf", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-dompdf.git", + "reference": "1d47648c6cef37f715ecb8bcc5f5a656ad372e27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/1d47648c6cef37f715ecb8bcc5f5a656ad372e27", + "reference": "1d47648c6cef37f715ecb8bcc5f5a656ad372e27", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "^2", + "illuminate/support": "^6|^7|^8|^9", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "nunomaduro/larastan": "^1|^2", + "orchestra/testbench": "^4|^5|^6|^7", + "phpro/grumphp": "^1", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\DomPDF\\ServiceProvider" + ], + "aliases": { + "Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf", + "PDF": "Barryvdh\\DomPDF\\Facade\\Pdf" + } + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\DomPDF\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "A DOMPDF Wrapper for Laravel", + "keywords": [ + "dompdf", + "laravel", + "pdf" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-dompdf/issues", + "source": "https://github.com/barryvdh/laravel-dompdf/tree/v2.0.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2022-07-06T11:12:10+00:00" + }, + { + "name": "brick/math", + "version": "0.10.2", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "4.25.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.10.2" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2022-08-10T22:54:19+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "0992cc19268b259a39e86f296da5f0677841f42c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c", + "reference": "0992cc19268b259a39e86f296da5f0677841f42c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^3.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1" + }, + "time": "2021-08-13T13:06:58+00:00" + }, + { + "name": "directorytree/ldaprecord", + "version": "v2.17.1", + "source": { + "type": "git", + "url": "https://github.com/DirectoryTree/LdapRecord.git", + "reference": "8ad10c26a992b46a265ff84b2d1845003c910a6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DirectoryTree/LdapRecord/zipball/8ad10c26a992b46a265ff84b2d1845003c910a6e", + "reference": "8ad10c26a992b46a265ff84b2d1845003c910a6e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-ldap": "*", + "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0", + "nesbot/carbon": "^1.0|^2.0", + "php": ">=7.3", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0", + "symfony/polyfill-php80": "^1.25", + "tightenco/collect": "^5.6|^6.0|^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^9.0", + "spatie/ray": "^1.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "LdapRecord\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Steve Bauman", + "email": "steven_bauman@outlook.com", + "role": "Developer" + } + ], + "description": "A fully-featured LDAP ORM.", + "homepage": "https://www.ldaprecord.com", + "keywords": [ + "active directory", + "ad", + "adLDAP", + "adldap2", + "directory", + "ldap", + "ldaprecord", + "orm", + "windows" + ], + "support": { + "docs": "https://ldaprecord.com", + "email": "steven_bauman@outlook.com", + "issues": "https://github.com/DirectoryTree/LdapRecord/issues", + "source": "https://github.com/DirectoryTree/LdapRecord" + }, + "funding": [ + { + "url": "https://github.com/stevebauman", + "type": "github" + } + ], + "time": "2022-09-21T18:34:09+00:00" + }, + { + "name": "directorytree/ldaprecord-laravel", + "version": "v2.6.0", + "source": { + "type": "git", + "url": "https://github.com/DirectoryTree/LdapRecord-Laravel.git", + "reference": "ec537bc3534f874bcade5febd3199cbb0758d9bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DirectoryTree/LdapRecord-Laravel/zipball/ec537bc3534f874bcade5febd3199cbb0758d9bb", + "reference": "ec537bc3534f874bcade5febd3199cbb0758d9bb", + "shasum": "" + }, + "require": { + "directorytree/ldaprecord": "^2.4.4", + "ext-ldap": "*", + "illuminate/support": "^5.6|^6.0|^7.0|^8.0|^9.0", + "php": ">=7.3", + "ramsey/uuid": "*" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^3.7|^4.0|^5.0|^6.0|^7.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "spatie/ray": "^1.28" + }, + "type": "project", + "extra": { + "laravel": { + "providers": [ + "LdapRecord\\Laravel\\LdapServiceProvider", + "LdapRecord\\Laravel\\LdapAuthServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "LdapRecord\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "LDAP Authentication & Management for Laravel.", + "keywords": [ + "adldap2", + "laravel", + "ldap", + "ldaprecord" + ], + "support": { + "issues": "https://github.com/DirectoryTree/LdapRecord-Laravel/issues", + "source": "https://github.com/DirectoryTree/LdapRecord-Laravel/tree/v2.6.0" + }, + "funding": [ + { + "url": "https://github.com/stevebauman", + "type": "github" + } + ], + "time": "2022-07-22T17:06:47+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "ade2b3bbfb776f27f0558e26eed43b5d9fe1b392" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/ade2b3bbfb776f27f0558e26eed43b5d9fe1b392", + "reference": "ade2b3bbfb776f27f0558e26eed43b5d9fe1b392", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.5" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2022-09-07T09:01:28+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-02-28T11:07:21+00:00" + }, + { + "name": "dompdf/dompdf", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "c5310df0e22c758c85ea5288175fc6cd777bc085" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/c5310df0e22c758c85ea5288175fc6cd777bc085", + "reference": "c5310df0e22c758c85ea5288175fc6cd777bc085", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "phenx/php-font-lib": ">=0.5.4 <1.0.0", + "phenx/php-svg-lib": ">=0.3.3 <1.0.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "ext-zip": "*", + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "type": "library", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "issues": "https://github.com/dompdf/dompdf/issues", + "source": "https://github.com/dompdf/dompdf/tree/v2.0.1" + }, + "time": "2022-09-22T13:43:41+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2022-09-10T18:51:20+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715", + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2022-06-18T20:57:19+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2022-02-20T15:07:15+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8", + "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.28 || ^9.5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2022-07-30T15:56:11+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-08-28T15:39:27+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:55:35+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/69568e4293f4fa993f3b0e51c9723e1e17c41379", + "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:45:39+00:00" + }, + { + "name": "laravel/framework", + "version": "v9.31.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "75013d4fffe3b24748d313fbbea53206351214f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/75013d4fffe3b24748d313fbbea53206351214f7", + "reference": "75013d4fffe3b24748d313fbbea53206351214f7", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "dragonmantank/cron-expression": "^3.1", + "egulias/email-validator": "^3.1", + "ext-mbstring": "*", + "ext-openssl": "*", + "fruitcake/php-cors": "^1.2", + "laravel/serializable-closure": "^1.0", + "league/commonmark": "^2.2", + "league/flysystem": "^3.0.16", + "monolog/monolog": "^2.0", + "nesbot/carbon": "^2.53.1", + "nunomaduro/termwind": "^1.13", + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.2.2", + "symfony/console": "^6.0.3", + "symfony/error-handler": "^6.0", + "symfony/finder": "^6.0", + "symfony/http-foundation": "^6.0", + "symfony/http-kernel": "^6.0", + "symfony/mailer": "^6.0", + "symfony/mime": "^6.0", + "symfony/process": "^6.0", + "symfony/routing": "^6.0", + "symfony/uid": "^6.0", + "symfony/var-dumper": "^6.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.198.1", + "doctrine/dbal": "^2.13.3|^3.1.4", + "fakerphp/faker": "^1.9.2", + "guzzlehttp/guzzle": "^7.2", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.4.4", + "orchestra/testbench-core": "^7.1", + "pda/pheanstalk": "^4.0", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^9.5.8", + "predis/predis": "^1.1.9|^2.0", + "symfony/cache": "^6.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.198.1).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "ext-bcmath": "Required to use the multiple_of validation rule.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.2).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.4.4).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8).", + "predis/predis": "Required to use the predis connector (^1.1.9|^2.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-09-20T13:32:50+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "b71e80a3a8e8029e2ec8c1aa814b999609ce16dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/b71e80a3a8e8029e2ec8c1aa814b999609ce16dc", + "reference": "b71e80a3a8e8029e2ec8c1aa814b999609ce16dc", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21", + "illuminate/contracts": "^9.21", + "illuminate/database": "^9.21", + "illuminate/support": "^9.21", + "php": "^8.0.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.0", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2022-07-29T21:33:30+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae", + "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2022-09-08T13:45:54+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "dff39b661e827dae6e092412f976658df82dbac5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/dff39b661e827dae6e092412f976658df82dbac5", + "reference": "dff39b661e827dae6e092412f976658df82dbac5", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.10.4|^0.11.1", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.7.2" + }, + "time": "2022-03-23T12:38:24+00:00" + }, + { + "name": "league/commonmark", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "84d74485fdb7074f4f9dd6f02ab957b1de513257" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/84d74485fdb7074f4f9dd6f02ab957b1de513257", + "reference": "84d74485fdb7074f4f9dd6f02ab957b1de513257", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2022-07-29T10:59:45+00:00" + }, + { + "name": "league/config", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.90", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2021-08-14T12:15:32+00:00" + }, + { + "name": "league/flysystem", + "version": "3.5.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "c73c4eb31f2e883b3897ab5591aa2dbc48112433" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c73c4eb31f2e883b3897ab5591aa2dbc48112433", + "reference": "c73c4eb31f2e883b3897ab5591aa2dbc48112433", + "shasum": "" + }, + "require": { + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.0", + "aws/aws-sdk-php": "^3.198.1", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.14", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.5.11", + "sabre/dav": "^4.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.5.2" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-09-23T18:59:16+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-04-17T13:12:02+00:00" + }, + { + "name": "mailjet/laravel-mailjet", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/mailjet/laravel-mailjet.git", + "reference": "f1c2ab525c2f99e05b3e811bda9561a9115fd302" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mailjet/laravel-mailjet/zipball/f1c2ab525c2f99e05b3e811bda9561a9115fd302", + "reference": "f1c2ab525c2f99e05b3e811bda9561a9115fd302", + "shasum": "" + }, + "require": { + "laravel/framework": "~5.1|^6.0|^7.0|^8.0|^9.0", + "mailjet/mailjet-apiv3-php": "^1.5.6", + "php": "^7.1.3|^8.0", + "symfony/mailjet-mailer": "^6.0" + }, + "require-dev": { + "fakerphp/faker": "~1", + "mockery/mockery": "0.9.*|^1.0", + "orchestra/testbench": "3.6|^4.0|^5.0|^6.0", + "phpunit/phpunit": "~7.0|^8.0|^9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Mailjet\\LaravelMailjet\\MailjetServiceProvider" + ], + "aliases": { + "Mailjet": "Mailjet\\LaravelMailjet\\Facades\\Mailjet" + } + } + }, + "autoload": { + "psr-4": { + "Mailjet\\LaravelMailjet\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gaetan DELBART", + "email": "gaetan@moltencore.io", + "homepage": "https://github.com/gagaXD" + }, + { + "name": "Titouan BENOIT", + "email": "titouan.benoit@gmx.fr", + "homepage": "https://github.com/Nightbr" + }, + { + "name": "Mailjet API", + "email": "api@mailjet.com", + "homepage": "https://dev.mailjet.com/" + } + ], + "description": "Laravel package for Mailjet API V3 and Laravel Mailjet Mail Transport", + "homepage": "https://github.com/mailjet/laravel-mailjet", + "keywords": [ + "Mailjet", + "framework", + "laravel", + "mailjet API", + "mailjet wrapper", + "transport" + ], + "support": { + "issues": "https://github.com/mailjet/laravel-mailjet/issues", + "source": "https://github.com/mailjet/laravel-mailjet/tree/3.0.3" + }, + "time": "2022-07-06T16:41:42+00:00" + }, + { + "name": "mailjet/mailjet-apiv3-php", + "version": "v1.5.7", + "source": { + "type": "git", + "url": "https://github.com/mailjet/mailjet-apiv3-php.git", + "reference": "414650b079dcec86ada225599e73092177e2d8e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mailjet/mailjet-apiv3-php/zipball/414650b079dcec86ada225599e73092177e2d8e5", + "reference": "414650b079dcec86ada225599e73092177e2d8e5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^7.4.4", + "php": "^7.2|^8.0", + "psr/http-client": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "php-coveralls/php-coveralls": "^2.0", + "phpunit/phpunit": "^8|^9" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mailjet": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mailjet", + "email": "dev@mailjet.com", + "homepage": "https://dev.mailjet.com" + } + ], + "description": "PHP wrapper for the Mailjet API", + "homepage": "https://github.com/mailjet/mailjet-apiv3-php/", + "keywords": [ + "Mailjet", + "api", + "email", + "php", + "v3" + ], + "support": { + "issues": "https://github.com/mailjet/mailjet-apiv3-php/issues", + "source": "https://github.com/mailjet/mailjet-apiv3-php/tree/v1.5.7" + }, + "time": "2022-07-21T18:58:53+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.7.6", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "897eb517a343a2281f11bc5556d6548db7d93947" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/897eb517a343a2281f11bc5556d6548db7d93947", + "reference": "897eb517a343a2281f11bc5556d6548db7d93947", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-libxml": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.7.6" + }, + "time": "2022-08-18T16:18:26+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2022-07-24T11:55:47+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.62.1", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", + "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2022-09-02T07:48:13+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df", + "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.2" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^0.12", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.2" + }, + "time": "2021-10-15T11:40:02+00:00" + }, + { + "name": "nette/utils", + "version": "v3.2.8", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", + "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.3" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "nette/tester": "~2.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v3.2.8" + }, + "time": "2022-09-12T23:36:20+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.15.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" + }, + "time": "2022-09-04T07:30:47+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.14.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "10065367baccf13b6e30f5e9246fa4f63a79eb1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/10065367baccf13b6e30f5e9246fa4f63a79eb1d", + "reference": "10065367baccf13b6e30f5e9246fa4f63a79eb1d", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.14.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2022-08-01T11:03:24+00:00" + }, + { + "name": "phenx/php-font-lib", + "version": "0.5.4", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/dd448ad1ce34c63d09baccd05415e361300c35b4", + "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4", + "shasum": "" + }, + "require": { + "ext-mbstring": "*" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3 || ^4 || ^5" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.4" + }, + "time": "2021-12-17T19:44:54+00:00" + }, + { + "name": "phenx/php-svg-lib", + "version": "0.5.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "76876c6cf3080bcb6f249d7d59705108166a6685" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/76876c6cf3080bcb6f249d7d59705108166a6685", + "reference": "76876c6cf3080bcb6f249d7d59705108166a6685", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/PhenX/php-svg-lib", + "support": { + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.0" + }, + "time": "2022-09-06T12:16:56+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8", + "phpunit/phpunit": "^8.5.28 || ^9.5.21" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2022-07-30T15:51:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/8707bf3cea6f710bf6ef05491234e3ab06f6432a", + "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/2.0.0" + }, + "time": "2021-10-29T13:22:09+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.11.8", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "f455acf3645262ae389b10e9beba0c358aa6994e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/f455acf3645262ae389b10e9beba0c358aa6994e", + "reference": "f455acf3645262ae389b10e9beba0c358aa6994e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^4.0 || ^3.1", + "php": "^8.0 || ^7.0.8", + "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.11.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.11.8" + }, + "time": "2022-07-28T14:25:11+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8", + "symfony/polyfill-php81": "^1.23" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fakerphp/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.8", + "mockery/mockery": "^1.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5 || ^9", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2021-10-10T03:01:02+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.5.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/a161a26d917604dc6d3aa25100fddf2556e9f35d", + "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10", + "ext-ctype": "*", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.5.1" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2022-09-16T03:22:46+00:00" + }, + { + "name": "sabberworm/php-css-parser", + "version": "8.4.0", + "source": { + "type": "git", + "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/e41d2140031d533348b2192a83f02d8dd8a71d30", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=5.6.20" + }, + "require-dev": { + "codacy/coverage": "^1.4", + "phpunit/phpunit": "^4.8.36" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues", + "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.4.0" + }, + "time": "2021-12-11T13:40:54+00:00" + }, + { + "name": "symfony/console", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "7fccea8728aa2d431a6725b02b3ce759049fc84d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/7fccea8728aa2d431a6725b02b3ce759049fc84d", + "reference": "7fccea8728aa2d431a6725b02b3ce759049fc84d", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-26T10:32:31+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/0dd5e36b80e1de97f8f74ed7023ac2b837a36443", + "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T17:24:16+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-02-25T11:15:52+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "736e42db3fd586d91820355988698e434e1d8419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/736e42db3fd586d91820355988698e434e1d8419", + "reference": "736e42db3fd586d91820355988698e434e1d8419", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-29T07:42:06+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347", + "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-05T16:51:07+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "02ff5eea2f453731cfbc6bc215e456b781480448" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448", + "reference": "02ff5eea2f453731cfbc6bc215e456b781480448", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-02-25T11:15:52+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-29T07:42:06+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "18e0f106a32887bcebef757e5b39c88e39a08f20" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/18e0f106a32887bcebef757e5b39c88e39a08f20", + "reference": "18e0f106a32887bcebef757e5b39c88e39a08f20", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^5.4|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-19T14:27:04+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "2144c53a278254af57fa1e6f71427be656fab6f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2144c53a278254af57fa1e6f71427be656fab6f4", + "reference": "2144c53a278254af57fa1e6f71427be656fab6f4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/error-handler": "^6.1", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.1", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^6.1", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^6.1", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-26T14:50:30+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "55a7cb8f8518d35e2a039daaec6e1ee20509510e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/55a7cb8f8518d35e2a039daaec6e1ee20509510e", + "reference": "55a7cb8f8518d35e2a039daaec6e1ee20509510e", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<5.4" + }, + "require-dev": { + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/messenger": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-03T05:16:05+00:00" + }, + { + "name": "symfony/mailjet-mailer", + "version": "v6.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailjet-mailer.git", + "reference": "618d1416ca5fb84f45817aaa674ad5f210a88fc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailjet-mailer/zipball/618d1416ca5fb84f45817aaa674ad5f210a88fc6", + "reference": "618d1416ca5fb84f45817aaa674ad5f210a88fc6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/mailer": "^5.4|^6.0" + }, + "require-dev": { + "symfony/http-client": "^5.4|^6.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Mailjet\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailjet Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailjet-mailer/tree/v6.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-04-12T16:22:53+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "5d1de2d3c52f8ca469c488f4b9e007e9e9cee0b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/5d1de2d3c52f8ca469c488f4b9e007e9e9cee0b3", + "reference": "5d1de2d3c52f8ca469c488f4b9e007e9e9cee0b3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-19T14:27:04+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-10T07:21:04+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/a41886c1c81dc075a09c71fe6db5b9d68c79de23", + "reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/process", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/a6506e99cfad7059b1ab5cab395854a0a0c21292", + "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T17:24:16+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "ef9108b3a88045b7546e808fb404ddb073dd35ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/ef9108b3a88045b7546e808fb404ddb073dd35ea", + "reference": "ef9108b3a88045b7546e808fb404ddb073dd35ea", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-20T15:00:40+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239", + "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:18:58+00:00" + }, + { + "name": "symfony/string", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "290972cad7b364e3befaa74ba0ec729800fb161c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/290972cad7b364e3befaa74ba0ec729800fb161c", + "reference": "290972cad7b364e3befaa74ba0ec729800fb161c", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-12T18:05:43+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "45d0f5bb8df7255651ca91c122fab604e776af03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/45d0f5bb8df7255651ca91c122fab604e776af03", + "reference": "45d0f5bb8df7255651ca91c122fab604e776af03", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-02T16:17:38+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/606be0f48e05116baef052f7f3abdb345c8e02cc", + "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T17:24:16+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "ea2ccf0fdb88c83e626105b68e5bab5c132d812b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/ea2ccf0fdb88c83e626105b68e5bab5c132d812b", + "reference": "ea2ccf0fdb88c83e626105b68e5bab5c132d812b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-20T13:46:29+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427", + "reference": "d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-20T13:46:29+00:00" + }, + { + "name": "tightenco/collect", + "version": "v8.83.23", + "source": { + "type": "git", + "url": "https://github.com/tighten/collect.git", + "reference": "a4423c6ace6b54ba4f86c0ac9de588c57bc94d79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tighten/collect/zipball/a4423c6ace6b54ba4f86c0ac9de588c57bc94d79", + "reference": "a4423c6ace6b54ba4f86c0ac9de588c57bc94d79", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "symfony/var-dumper": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "nesbot/carbon": "^2.23.0", + "phpunit/phpunit": "^8.3" + }, + "type": "library", + "autoload": { + "files": [ + "src/Collect/Support/helpers.php", + "src/Collect/Support/alias.php" + ], + "psr-4": { + "Tightenco\\Collect\\": "src/Collect" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "Collect - Illuminate Collections as a separate package.", + "keywords": [ + "collection", + "laravel" + ], + "support": { + "issues": "https://github.com/tighten/collect/issues", + "source": "https://github.com/tighten/collect/tree/v8.83.23" + }, + "time": "2022-08-22T17:50:04+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.5", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/4348a3a06651827a27d989ad1d13efec6bb49b19", + "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.5" + }, + "time": "2022-09-12T13:28:28+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.4.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2021-12-12T23:22:04+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-03-03T08:28:38+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/37f751c67a5372d4e26353bd9384bc03744ec77b", + "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "symfony/phpunit-bridge": "^4.4 || ^5.2" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.20-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.20.0" + }, + "time": "2022-07-20T13:12:54+00:00" + }, + { + "name": "filp/whoops", + "version": "2.14.5", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", + "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.14.5" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2022-01-07T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "1d276e4c803397a26cc337df908f55c2a4e90d86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/1d276e4c803397a26cc337df908f55c2a4e90d86", + "reference": "1d276e4c803397a26cc337df908f55c2a4e90d86", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.11.0", + "illuminate/view": "^9.27", + "laravel-zero/framework": "^9.1.3", + "mockery/mockery": "^1.5.0", + "nunomaduro/larastan": "^2.2", + "nunomaduro/termwind": "^1.14.0", + "pestphp/pest": "^1.22.1" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2022-09-13T15:07:15+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "73030c18b769f27e6f6aacf7848d024fa9a55560" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/73030c18b769f27e6f6aacf7848d024fa9a55560", + "reference": "73030c18b769f27e6f6aacf7848d024fa9a55560", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.0|^9.0", + "illuminate/contracts": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "php": "^7.3|^8.0" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2022-08-31T16:38:14+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.5.1" + }, + "time": "2022-09-07T15:32:08+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2022-03-03T13:19:32+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "17f600e2e8872856ff2846243efb74ad4b6da531" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/17f600e2e8872856ff2846243efb74ad4b6da531", + "reference": "17f600e2e8872856ff2846243efb74ad4b6da531", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.14.5", + "php": "^8.0.0", + "symfony/console": "^6.0.2" + }, + "require-dev": { + "brianium/paratest": "^6.4.1", + "laravel/framework": "^9.26.1", + "laravel/pint": "^1.1.1", + "nunomaduro/larastan": "^1.0.3", + "nunomaduro/mock-final-classes": "^1.1.0", + "orchestra/testbench": "^7.7", + "phpunit/phpunit": "^9.5.23", + "spatie/ignition": "^1.4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "6.x-dev" + }, + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2022-08-29T09:11:20+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.17", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.14", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-08-30T12:24:04+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.5.25", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", + "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2022-09-25T03:44:45+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-04-03T09:37:03+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-12T14:47:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", + "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/backtrace/issues", + "source": "https://github.com/spatie/backtrace/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2021-11-09T10:57:15+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "b1b974348750925b717fa8c8b97a0db0d1aa40ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/b1b974348750925b717fa8c8b97a0db0d1aa40ca", + "reference": "b1b974348750925b717fa8c8b97a0db0d1aa40ca", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0", + "php": "^8.0", + "spatie/backtrace": "^1.2", + "symfony/http-foundation": "^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", + "symfony/process": "^5.2|^6.0", + "symfony/var-dumper": "^5.2|^6.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.3.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-08-08T10:10:20+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/dd3d456779108d7078baf4e43f8c2b937d9794a1", + "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "monolog/monolog": "^2.0", + "php": "^8.0", + "spatie/flare-client-php": "^1.1", + "symfony/console": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "symfony/process": "^5.4|^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-08-26T11:51:15+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "192962f4d84526f6868c512530c00633e3165749" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/192962f4d84526f6868c512530c00633e3165749", + "reference": "192962f4d84526f6868c512530c00633e3165749", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^8.77|^9.27", + "monolog/monolog": "^2.3", + "php": "^8.0", + "spatie/flare-client-php": "^1.0.1", + "spatie/ignition": "^1.4.1", + "symfony/console": "^5.0|^6.0", + "symfony/var-dumper": "^5.0|^6.0" + }, + "require-dev": { + "filp/whoops": "^2.14", + "livewire/livewire": "^2.8|dev-develop", + "mockery/mockery": "^1.4", + "nunomaduro/larastan": "^1.0", + "orchestra/testbench": "^6.23|^7.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/laravel-ray": "^1.27" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-09-16T13:45:54+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0.2" + }, + "platform-dev": [], + "plugin-api-version": "2.2.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..9b915d5 --- /dev/null +++ b/config/app.php @@ -0,0 +1,239 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + 'asset_url' => env('ASSET_URL'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'Europe/Copenhagen', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'da', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => 'file', + // 'store' => 'redis', + ], + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => [ + /* + * Custom Service Providers + */ + Mailjet\LaravelMailjet\MailjetServiceProvider::class, + + /* + * Laravel Framework Service Providers... + */ + Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, + Illuminate\Bus\BusServiceProvider::class, + Illuminate\Cache\CacheServiceProvider::class, + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, + Illuminate\Cookie\CookieServiceProvider::class, + Illuminate\Database\DatabaseServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, + Illuminate\Filesystem\FilesystemServiceProvider::class, + Illuminate\Foundation\Providers\FoundationServiceProvider::class, + Illuminate\Hashing\HashServiceProvider::class, + Illuminate\Mail\MailServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, + Illuminate\Pagination\PaginationServiceProvider::class, + Illuminate\Pipeline\PipelineServiceProvider::class, + Illuminate\Queue\QueueServiceProvider::class, + Illuminate\Redis\RedisServiceProvider::class, + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, + Illuminate\Session\SessionServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, + Illuminate\View\ViewServiceProvider::class, + + /* + * Package Service Providers... + */ + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + + ], + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([ + // 'ExampleClass' => App\Example\ExampleClass::class, + 'Mailjet' => Mailjet\LaravelMailjet\Facades\Mailjet::class, + 'Logger' => \App\Helpers\Logger::class, + 'PaginationHelper' => \App\Helpers\PaginationHelper::class, + ])->toArray(), + + /* + |-------------------------------------------------------------------------- + | Custom Vars + |-------------------------------------------------------------------------- + | Custom ENV variables + | + */ + + 'barcode_mode' => env('BARCODE_MODE'), + 'login_mode' => env('LOGIN_MODE'), + 'mail_username' => env('MAIL_USERNAME'), + 'mail_password' => env('MAIL_PASSWORD'), + 'mail_from_address' => env('MAIL_FROM_ADDRESS'), + 'mail_from_name' => env('MAIL_FROM_NAME'), + 'app_url' => env('APP_URL'), + + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..c1cf766 --- /dev/null +++ b/config/auth.php @@ -0,0 +1,136 @@ + [ + 'guard' => 'nadUser', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'nadUser' => [ + 'driver' => 'session', + 'provider' => 'nadUser', + ], + 'adUser' => [ + 'driver' => 'session', + 'provider' => 'ldap', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'nadUser' => [ + 'driver' => 'eloquent', + 'model' => User::class, + ], + 'ldap' => [ + 'driver' => 'ldap', // Was 'eloquent'. + 'model' => \LdapRecord\Models\ActiveDirectory\User::class, + 'rules' => [], + 'database' => [ + 'model' => User::class, + 'sync_passwords' => true, + 'sync_attributes' => [ + 'username' => 'samaccountname', + 'name' => 'cn', + 'loaner_type_id' => LoanerType::firstWhere('name','=','adUser')->id, + //'role_id' => 2 //Role::firstWhere('name','=','elev')->id + + ], + 'password' => 'password', + ], + ] + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_resets', + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000..1688242 --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,70 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'host' => env('PUSHER_HOST', 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', + 'port' => env('PUSHER_PORT', 443), + 'scheme' => env('PUSHER_SCHEME', 'https'), + 'encrypted' => true, + 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', + ], + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..33bb295 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,110 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, or DynamoDB cache + | stores there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..8a39e6d --- /dev/null +++ b/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..bd9b78d --- /dev/null +++ b/config/database.php @@ -0,0 +1,151 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => false, + 'engine' => 'InnoDB', + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/dompdf.php b/config/dompdf.php new file mode 100644 index 0000000..8ad2022 --- /dev/null +++ b/config/dompdf.php @@ -0,0 +1,284 @@ + false, // Throw an Exception on warnings from dompdf + + 'public_path' => null, // Override the public path if needed + + /* + * Dejavu Sans font is missing glyphs for converted entities, turn it off if you need to show € and £. + */ + 'convert_entities' => true, + + 'options' => array( + /** + * The location of the DOMPDF font directory + * + * The location of the directory where DOMPDF will store fonts and font metrics + * Note: This directory must exist and be writable by the webserver process. + * *Please note the trailing slash.* + * + * Notes regarding fonts: + * Additional .afm font metrics can be added by executing load_font.php from command line. + * + * Only the original "Base 14 fonts" are present on all pdf viewers. Additional fonts must + * be embedded in the pdf file or the PDF may not display correctly. This can significantly + * increase file size unless font subsetting is enabled. Before embedding a font please + * review your rights under the font license. + * + * Any font specification in the source HTML is translated to the closest font available + * in the font directory. + * + * The pdf standard "Base 14 fonts" are: + * Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique, + * Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique, + * Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic, + * Symbol, ZapfDingbats. + */ + "font_dir" => storage_path('fonts'), // advised by dompdf (https://github.com/dompdf/dompdf/pull/782) + + /** + * The location of the DOMPDF font cache directory + * + * This directory contains the cached font metrics for the fonts used by DOMPDF. + * This directory can be the same as DOMPDF_FONT_DIR + * + * Note: This directory must exist and be writable by the webserver process. + */ + "font_cache" => storage_path('fonts'), + + /** + * The location of a temporary directory. + * + * The directory specified must be writeable by the webserver process. + * The temporary directory is required to download remote images and when + * using the PFDLib back end. + */ + "temp_dir" => sys_get_temp_dir(), + + /** + * ==== IMPORTANT ==== + * + * dompdf's "chroot": Prevents dompdf from accessing system files or other + * files on the webserver. All local files opened by dompdf must be in a + * subdirectory of this directory. DO NOT set it to '/' since this could + * allow an attacker to use dompdf to read any files on the server. This + * should be an absolute path. + * This is only checked on command line call by dompdf.php, but not by + * direct class use like: + * $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output(); + */ + "chroot" => realpath(base_path()), + + /** + * Protocol whitelist + * + * Protocols and PHP wrappers allowed in URIs, and the validation rules + * that determine if a resouce may be loaded. Full support is not guaranteed + * for the protocols/wrappers specified + * by this array. + * + * @var array + */ + 'allowed_protocols' => [ + "file://" => ["rules" => []], + "http://" => ["rules" => []], + "https://" => ["rules" => []] + ], + + /** + * @var string + */ + 'log_output_file' => null, + + /** + * Whether to enable font subsetting or not. + */ + "enable_font_subsetting" => false, + + /** + * The PDF rendering backend to use + * + * Valid settings are 'PDFLib', 'CPDF' (the bundled R&OS PDF class), 'GD' and + * 'auto'. 'auto' will look for PDFLib and use it if found, or if not it will + * fall back on CPDF. 'GD' renders PDFs to graphic files. {@link + * Canvas_Factory} ultimately determines which rendering class to instantiate + * based on this setting. + * + * Both PDFLib & CPDF rendering backends provide sufficient rendering + * capabilities for dompdf, however additional features (e.g. object, + * image and font support, etc.) differ between backends. Please see + * {@link PDFLib_Adapter} for more information on the PDFLib backend + * and {@link CPDF_Adapter} and lib/class.pdf.php for more information + * on CPDF. Also see the documentation for each backend at the links + * below. + * + * The GD rendering backend is a little different than PDFLib and + * CPDF. Several features of CPDF and PDFLib are not supported or do + * not make any sense when creating image files. For example, + * multiple pages are not supported, nor are PDF 'objects'. Have a + * look at {@link GD_Adapter} for more information. GD support is + * experimental, so use it at your own risk. + * + * @link http://www.pdflib.com + * @link http://www.ros.co.nz/pdf + * @link http://www.php.net/image + */ + "pdf_backend" => "CPDF", + + /** + * PDFlib license key + * + * If you are using a licensed, commercial version of PDFlib, specify + * your license key here. If you are using PDFlib-Lite or are evaluating + * the commercial version of PDFlib, comment out this setting. + * + * @link http://www.pdflib.com + * + * If pdflib present in web server and auto or selected explicitely above, + * a real license code must exist! + */ + //"DOMPDF_PDFLIB_LICENSE" => "your license key here", + + /** + * html target media view which should be rendered into pdf. + * List of types and parsing rules for future extensions: + * http://www.w3.org/TR/REC-html40/types.html + * screen, tty, tv, projection, handheld, print, braille, aural, all + * Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3. + * Note, even though the generated pdf file is intended for print output, + * the desired content might be different (e.g. screen or projection view of html file). + * Therefore allow specification of content here. + */ + "default_media_type" => "screen", + + /** + * The default paper size. + * + * North America standard is "letter"; other countries generally "a4" + * + * @see CPDF_Adapter::PAPER_SIZES for valid sizes ('letter', 'legal', 'A4', etc.) + */ + "default_paper_size" => "a4", + + /** + * The default paper orientation. + * + * The orientation of the page (portrait or landscape). + * + * @var string + */ + 'default_paper_orientation' => "portrait", + + /** + * The default font family + * + * Used if no suitable fonts can be found. This must exist in the font folder. + * @var string + */ + "default_font" => "serif", + + /** + * Image DPI setting + * + * This setting determines the default DPI setting for images and fonts. The + * DPI may be overridden for inline images by explictly setting the + * image's width & height style attributes (i.e. if the image's native + * width is 600 pixels and you specify the image's width as 72 points, + * the image will have a DPI of 600 in the rendered PDF. The DPI of + * background images can not be overridden and is controlled entirely + * via this parameter. + * + * For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI). + * If a size in html is given as px (or without unit as image size), + * this tells the corresponding size in pt. + * This adjusts the relative sizes to be similar to the rendering of the + * html page in a reference browser. + * + * In pdf, always 1 pt = 1/72 inch + * + * Rendering resolution of various browsers in px per inch: + * Windows Firefox and Internet Explorer: + * SystemControl->Display properties->FontResolution: Default:96, largefonts:120, custom:? + * Linux Firefox: + * about:config *resolution: Default:96 + * (xorg screen dimension in mm and Desktop font dpi settings are ignored) + * + * Take care about extra font/image zoom factor of browser. + * + * In images, size in pixel attribute, img css style, are overriding + * the real image dimension in px for rendering. + * + * @var int + */ + "dpi" => 96, + + /** + * Enable inline PHP + * + * If this setting is set to true then DOMPDF will automatically evaluate + * inline PHP contained within tags. + * + * Enabling this for documents you do not trust (e.g. arbitrary remote html + * pages) is a security risk. Set this option to false if you wish to process + * untrusted documents. + * + * @var bool + */ + "enable_php" => false, + + /** + * Enable inline Javascript + * + * If this setting is set to true then DOMPDF will automatically insert + * JavaScript code contained within tags. + * + * @var bool + */ + "enable_javascript" => true, + + /** + * Enable remote file access + * + * If this setting is set to true, DOMPDF will access remote sites for + * images and CSS files as required. + * This is required for part of test case www/test/image_variants.html through www/examples.php + * + * Attention! + * This can be a security risk, in particular in combination with DOMPDF_ENABLE_PHP and + * allowing remote access to dompdf.php or on allowing remote html code to be passed to + * $dompdf = new DOMPDF(, $dompdf->load_html(..., + * This allows anonymous users to download legally doubtful internet content which on + * tracing back appears to being downloaded by your server, or allows malicious php code + * in remote html pages to be executed by your server with your account privileges. + * + * @var bool + */ + "enable_remote" => true, + + /** + * A ratio applied to the fonts height to be more like browsers' line height + */ + "font_height_ratio" => 1.1, + + /** + * Use the HTML5 Lib parser + * + * @deprecated This feature is now always on in dompdf 2.x + * @var bool + */ + "enable_html5_parser" => true, + ), + + +); diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..e9d9dbd --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,76 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been set up for each driver as an example of the required values. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + 'throw' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 0000000..bcd3be4 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 65536, + 'threads' => 1, + 'time' => 4, + ], + +]; diff --git a/config/ldap.php b/config/ldap.php new file mode 100644 index 0000000..635786f --- /dev/null +++ b/config/ldap.php @@ -0,0 +1,73 @@ + env('LDAP_CONNECTION', 'default'), + + /* + |-------------------------------------------------------------------------- + | LDAP Connections + |-------------------------------------------------------------------------- + | + | Below you may configure each LDAP connection your application requires + | access to. Be sure to include a valid base DN - otherwise you may + | not receive any results when performing LDAP search operations. + | + */ + + 'connections' => [ + + 'default' => [ + 'hosts' => [env('LDAP_HOST', '172.16.1.187')], + 'username' => env('LDAP_USERNAME', 'CN=Ldap Con,OU=OU_ServerAccounts,OU=OU_Zone9,OU=OU_IT-SKP,OU=OU_Main,DC=ITSKP-ODENSE,DC=dk'), + 'password' => env('LDAP_PASSWORD', 'SKPlager1!'), + 'port' => env('LDAP_PORT', 389), + 'base_dn' => env('LDAP_BASE_DN', 'dc=ITSKP-ODENSE,dc=dk'), + 'timeout' => env('LDAP_TIMEOUT', 5), + 'use_ssl' => env('LDAP_SSL', false), + 'use_tls' => env('LDAP_TLS', false), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | LDAP Logging + |-------------------------------------------------------------------------- + | + | When LDAP logging is enabled, all LDAP search and authentication + | operations are logged using the default application logging + | driver. This can assist in debugging issues and more. + | + */ + + 'logging' => env('LDAP_LOGGING', true), + + /* + |-------------------------------------------------------------------------- + | LDAP Cache + |-------------------------------------------------------------------------- + | + | LDAP caching enables the ability of caching search results using the + | query builder. This is great for running expensive operations that + | may take many seconds to complete, such as a pagination request. + | + */ + + 'cache' => [ + 'enabled' => env('LDAP_CACHE', false), + 'driver' => env('CACHE_DRIVER', 'file'), + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..5aa1dbb --- /dev/null +++ b/config/logging.php @@ -0,0 +1,122 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..d61e5c9 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,163 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", + | "postmark", "log", "array", "failover" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + ], + + 'postmark' => [ + 'transport' => 'postmark', + ], + + 'mailjet' => [ + 'transport' => 'mailjet', + + 'key' => env('MAILJET_APIKEY'), + + 'secret' => env('MAILJET_APISECRET'), + + 'transactional' => [ + + 'call' => true, + + 'options' => [ + + 'url' => 'api.mailjet.com', + + 'version' => 'v3.1', + + 'call' => true, + + 'secured' => true + + ] + + ], + + 'common' => [ + + 'call' => true, + + 'options' => [ + + 'url' => 'api.mailjet.com', + + 'version' => 'v3', + + 'call' => true, + + 'secured' => true + + ] + + ] + + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..25ea5a8 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,93 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/sanctum.php b/config/sanctum.php new file mode 100644 index 0000000..529cfdc --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,67 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort() + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..d7ba155 --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'scheme' => 'https', + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + 'mailjet' => [ + 'key' => env('MAILJET_APIKEY'), + 'secret' => env('MAILJET_APISECRET'), + ] + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..8fed97c --- /dev/null +++ b/config/session.php @@ -0,0 +1,201 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..22b8a18 --- /dev/null +++ b/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..20b3532 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,42 @@ + + */ +class UserFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'name' => fake()->name(), + 'email' => fake()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + * + * @return static + */ + public function unverified() + { + return $this->state(function (array $attributes) { + return [ + 'email_verified_at' => null, + ]; + }); + } +} diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php new file mode 100644 index 0000000..fcacb80 --- /dev/null +++ b/database/migrations/2014_10_12_100000_create_password_resets_table.php @@ -0,0 +1,32 @@ +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('password_resets'); + } +}; diff --git a/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php new file mode 100644 index 0000000..1719198 --- /dev/null +++ b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php new file mode 100644 index 0000000..6c81fd2 --- /dev/null +++ b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -0,0 +1,37 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2022_08_17_083017_create_loaner_types_table.php b/database/migrations/2022_08_17_083017_create_loaner_types_table.php new file mode 100644 index 0000000..fee95fe --- /dev/null +++ b/database/migrations/2022_08_17_083017_create_loaner_types_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('name')->unique(); + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('loaner_types'); + } +}; diff --git a/database/migrations/2022_08_17_083031_create_roles_table.php b/database/migrations/2022_08_17_083031_create_roles_table.php new file mode 100644 index 0000000..5d0c0b8 --- /dev/null +++ b/database/migrations/2022_08_17_083031_create_roles_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('name')->unique(); + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('roles'); + } +}; diff --git a/database/migrations/2022_08_17_083032_create_permissions_table.php b/database/migrations/2022_08_17_083032_create_permissions_table.php new file mode 100644 index 0000000..5055c93 --- /dev/null +++ b/database/migrations/2022_08_17_083032_create_permissions_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('name')->unique(); + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('permissions'); + } +}; diff --git a/database/migrations/2022_08_17_083032_create_role_has_permission_table.php b/database/migrations/2022_08_17_083032_create_role_has_permission_table.php new file mode 100644 index 0000000..b8bd726 --- /dev/null +++ b/database/migrations/2022_08_17_083032_create_role_has_permission_table.php @@ -0,0 +1,38 @@ +unsignedBigInteger('role_id'); + $table->unsignedBigInteger('permission_id'); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + + $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade'); + $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('role_has_permission'); + } +}; diff --git a/database/migrations/2022_08_17_083045_create_users_table.php b/database/migrations/2022_08_17_083045_create_users_table.php new file mode 100644 index 0000000..7832b21 --- /dev/null +++ b/database/migrations/2022_08_17_083045_create_users_table.php @@ -0,0 +1,49 @@ +id(); + $table->string('guid')->unique()->nullable(); + $table->string('domain')->nullable(); + $table->string('name'); + $table->string('username')->unique()->nullable(); + $table->string('password')->nullable(); + $table->rememberToken(); + + $table->unsignedBigInteger('loaner_type_id')->default(1); + $table->unsignedBigInteger('role_id')->default(2); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + + $table->foreign('loaner_type_id')->references('id')->on('loaner_types')->onDelete('cascade'); + $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade'); + + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +}; diff --git a/database/migrations/2022_08_17_090709_create_product_categories_table.php b/database/migrations/2022_08_17_090709_create_product_categories_table.php new file mode 100644 index 0000000..43db3f9 --- /dev/null +++ b/database/migrations/2022_08_17_090709_create_product_categories_table.php @@ -0,0 +1,36 @@ +id(); + $table->string("name")->unique(); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_categories'); + } +}; diff --git a/database/migrations/2022_08_17_090719_create_brands_table.php b/database/migrations/2022_08_17_090719_create_brands_table.php new file mode 100644 index 0000000..739f0a0 --- /dev/null +++ b/database/migrations/2022_08_17_090719_create_brands_table.php @@ -0,0 +1,35 @@ +id(); + $table->string("name")->unique(); + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('brands'); + } +}; diff --git a/database/migrations/2022_08_17_090720_create_product_models_table.php b/database/migrations/2022_08_17_090720_create_product_models_table.php new file mode 100644 index 0000000..746b792 --- /dev/null +++ b/database/migrations/2022_08_17_090720_create_product_models_table.php @@ -0,0 +1,39 @@ +id(); + $table->string("name")->unique(); + $table->unsignedBigInteger('brand_id'); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + + $table->foreign('brand_id')->references('id')->on('brands')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_models'); + } +}; diff --git a/database/migrations/2022_08_17_090745_create_product_subcategories_table.php b/database/migrations/2022_08_17_090745_create_product_subcategories_table.php new file mode 100644 index 0000000..70e76c5 --- /dev/null +++ b/database/migrations/2022_08_17_090745_create_product_subcategories_table.php @@ -0,0 +1,40 @@ +id(); + $table->string("name")->unique(); + $table->unsignedBigInteger('product_category_id'); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + + $table->foreign('product_category_id')->references('id')->on('product_categories')->onDelete('cascade'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_subcategories'); + } +}; diff --git a/database/migrations/2022_08_17_090757_create_products_table.php b/database/migrations/2022_08_17_090757_create_products_table.php new file mode 100644 index 0000000..d41d4eb --- /dev/null +++ b/database/migrations/2022_08_17_090757_create_products_table.php @@ -0,0 +1,49 @@ +id(); + $table->string("barcode")->nullable(); + $table->string("name")->unique(); + $table->text("description")->nullable(); + + $table->unsignedBigInteger('brand_id'); + $table->unsignedBigInteger('product_model_id'); + $table->unsignedBigInteger('product_category_id'); + $table->unsignedBigInteger('product_subcategory_id')->nullable(); + $table->unsignedBigInteger('total')->default(0); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + + $table->foreign('brand_id')->references('id')->on('brands')->onDelete('cascade'); + $table->foreign('product_model_id')->references('id')->on('product_models')->onDelete('cascade'); + $table->foreign('product_category_id')->references('id')->on('product_categories')->onDelete('cascade'); + $table->foreign('product_subcategory_id')->references('id')->on('product_subcategories')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('products'); + } +}; diff --git a/database/migrations/2022_08_18_101017_create_loan_types_table.php b/database/migrations/2022_08_18_101017_create_loan_types_table.php new file mode 100644 index 0000000..ef75ea5 --- /dev/null +++ b/database/migrations/2022_08_18_101017_create_loan_types_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('name'); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('loan_types'); + } +}; diff --git a/database/migrations/2022_08_22_092857_create_cabel_categories_table.php b/database/migrations/2022_08_22_092857_create_cabel_categories_table.php new file mode 100644 index 0000000..9652282 --- /dev/null +++ b/database/migrations/2022_08_22_092857_create_cabel_categories_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('name'); + + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('cabelcategories'); + } +}; diff --git a/database/migrations/2022_08_22_092858_create_cabels_table.php b/database/migrations/2022_08_22_092858_create_cabels_table.php new file mode 100644 index 0000000..fd94ba8 --- /dev/null +++ b/database/migrations/2022_08_22_092858_create_cabels_table.php @@ -0,0 +1,39 @@ +id(); + $table->string('name'); + $table->unsignedBigInteger('cabel_category_id'); + $table->unsignedBigInteger('total'); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + + $table->foreign('cabel_category_id')->references('id')->on('cabel_categories')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('cabels'); + } +}; diff --git a/database/migrations/2022_08_23_084019_create_buildings_table.php b/database/migrations/2022_08_23_084019_create_buildings_table.php new file mode 100644 index 0000000..f13cb18 --- /dev/null +++ b/database/migrations/2022_08_23_084019_create_buildings_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('name'); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('buildings'); + } +}; diff --git a/database/migrations/2022_08_23_084020_create_rooms_table.php b/database/migrations/2022_08_23_084020_create_rooms_table.php new file mode 100644 index 0000000..55aa035 --- /dev/null +++ b/database/migrations/2022_08_23_084020_create_rooms_table.php @@ -0,0 +1,39 @@ +id(); + + $table->unsignedBigInteger('building_id'); + $table->string('name'); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + + $table->foreign('building_id')->references('id')->on('buildings')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('rooms'); + } +}; diff --git a/database/migrations/2022_09_07_061527_create_loans_table.php b/database/migrations/2022_09_07_061527_create_loans_table.php new file mode 100644 index 0000000..031d53f --- /dev/null +++ b/database/migrations/2022_09_07_061527_create_loans_table.php @@ -0,0 +1,49 @@ +id(); + + $table->unsignedBigInteger('loan_type_id'); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('room_id')->nullable(); + + $table->morphs('loanable'); + + $table->date('date_start'); + $table->date('date_end')->nullable(); + $table->timestamp('date_deadline')->nullable(); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('room_id')->references('id')->on('rooms')->onDelete('cascade'); + $table->foreign('loan_type_id')->references('id')->on('loan_types')->onDelete('cascade'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('loans'); + } +}; diff --git a/database/migrations/2022_09_12_063341_create_note_types_table.php b/database/migrations/2022_09_12_063341_create_note_types_table.php new file mode 100644 index 0000000..c31bad6 --- /dev/null +++ b/database/migrations/2022_09_12_063341_create_note_types_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('name')->unique(); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('note_types'); + } +}; diff --git a/database/migrations/2022_09_12_063342_create_notes_table.php b/database/migrations/2022_09_12_063342_create_notes_table.php new file mode 100644 index 0000000..6c24b11 --- /dev/null +++ b/database/migrations/2022_09_12_063342_create_notes_table.php @@ -0,0 +1,45 @@ +id(); + + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('note_type_id'); + + $table->text('note'); + + $table->morphs('loanable'); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + $table->timestamp('deleted_at')->nullable(); + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('note_type_id')->references('id')->on('note_types')->onDelete('cascade'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('notes'); + } +}; diff --git a/database/migrations/2022_09_19_080748_create_log_actions_table.php b/database/migrations/2022_09_19_080748_create_log_actions_table.php new file mode 100644 index 0000000..7f9f9e7 --- /dev/null +++ b/database/migrations/2022_09_19_080748_create_log_actions_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('name')->unique(); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('log_actions'); + } +}; diff --git a/database/migrations/2022_09_19_080749_create_logs_table.php b/database/migrations/2022_09_19_080749_create_logs_table.php new file mode 100644 index 0000000..aca2c4f --- /dev/null +++ b/database/migrations/2022_09_19_080749_create_logs_table.php @@ -0,0 +1,48 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('target_id')->nullable(); + $table->unsignedBigInteger('log_action_id'); + + $table->string('log')->nullable(); + + $table->morphs('loggable'); + + $table->unsignedBigInteger('amount')->nullable(); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('target_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('log_action_id')->references('id')->on('log_actions')->onDelete('cascade'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('logs'); + } +}; diff --git a/database/migrations/2022_09_20_145739_create_contracts_table.php b/database/migrations/2022_09_20_145739_create_contracts_table.php new file mode 100644 index 0000000..4694c1e --- /dev/null +++ b/database/migrations/2022_09_20_145739_create_contracts_table.php @@ -0,0 +1,40 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->string('type'); + $table->unsignedBigInteger('timestamp'); + + $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('contracts'); + } +}; diff --git a/database/seeders/BrandSeeder.php b/database/seeders/BrandSeeder.php new file mode 100644 index 0000000..c0bab21 --- /dev/null +++ b/database/seeders/BrandSeeder.php @@ -0,0 +1,48 @@ + 'Dell'], + ['name' => 'HP'], + ['name' => 'AOC'], + ['name' => 'Samsung'], + ['name' => 'LG'], + ['name' => 'BenQ'], + ['name' => 'Acer'], + ['name' => 'Philips'], + ['name' => 'Speed Demon'], + ['name' => 'Chieftec'], + ['name' => 'Lenovo'], + ['name' => 'Fujitsu'], + ['name' => 'Atom'], + ['name' => 'Western Digital'], + ['name' => 'Logitech'], + ['name' => 'Brother'], + ['name' => 'Toshiba'], + ['name' => 'Microsoft'], + ['name' => 'Asus'], + ['name' => 'TRENDnet'], + ['name' => 'TP-Link'], + ['name' => 'Netgear'], + ['name' => 'Linksys'], + ['name' => 'Cisco'], + ['name' => 'Test Brand'], + ]; + foreach ($items as $item) { + Brand::create($item); + } + } +} diff --git a/database/seeders/BuildingSeeder.php b/database/seeders/BuildingSeeder.php new file mode 100644 index 0000000..0b5fb73 --- /dev/null +++ b/database/seeders/BuildingSeeder.php @@ -0,0 +1,27 @@ + 'Bygning 7'], + ['name' => 'Bygning 8'], + ['name' => 'Test Building'], + ]; + foreach ($items as $item) { + Building::create($item); + } + } +} diff --git a/database/seeders/CabelCategorySeeder.php b/database/seeders/CabelCategorySeeder.php new file mode 100644 index 0000000..63bdb62 --- /dev/null +++ b/database/seeders/CabelCategorySeeder.php @@ -0,0 +1,31 @@ + 'Netværk'], + ['name' => 'Skærm'], + ['name' => 'Adapters/Convertors'], + ['name' => 'Strøm'], + ['name' => 'USB'], + ['name' => 'Konsole'], + ]; + foreach ($items as $item) { + CabelCategory::create($item); + } + } +} diff --git a/database/seeders/CabelSeeder.php b/database/seeders/CabelSeeder.php new file mode 100644 index 0000000..33c38a8 --- /dev/null +++ b/database/seeders/CabelSeeder.php @@ -0,0 +1,135 @@ + CabelCategory::where('name','=','Netværk')->first()->id, + 'name' => '0-1m', + 'total' => 138, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Netværk')->first()->id, + 'name' => '1-2m', + 'total' => 32, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Netværk')->first()->id, + 'name' => '2-5m', + 'total' => 54, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Netværk')->first()->id, + 'name' => '5-10m', + 'total' => 32, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Skærm')->first()->id, + 'name' => 'DisplayPort', + 'total' => 13, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Skærm')->first()->id, + 'name' => 'VGA', + 'total' => 75, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Skærm')->first()->id, + 'name' => 'HDMI', + 'total' => 51, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Skærm')->first()->id, + 'name' => 'DVI', + 'total' => 71, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Skærm')->first()->id, + 'name' => 'DVI fuld', + 'total' => 70, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Adapters/Convertors')->first()->id, + 'name' => 'VGA til Mini HDMI', + 'total' => 1, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Adapters/Convertors')->first()->id, + 'name' => 'VGA til DVI', + 'total' => 1, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Adapters/Convertors')->first()->id, + 'name' => 'HDMI til DVI', + 'total' => 2, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Adapters/Convertors')->first()->id, + 'name' => 'Konsole USB til VGA Adaptor', + 'total' => 20, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Strøm')->first()->id, + 'name' => 'Strømkabler med jord', + 'total' => 191, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Strøm')->first()->id, + 'name' => 'Stikdåse ', + 'total' => 148, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','USB')->first()->id, + 'name' => 'USB-A til Mini-USB', + 'total' => 2, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','USB')->first()->id, + 'name' => 'USB-A til VGA 4 header', + 'total' => 1, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','USB')->first()->id, + 'name' => 'USB-A til DVI ', + 'total' => 1, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','USB')->first()->id, + 'name' => 'USB-A til USB-B', + 'total' => 11, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Konsole')->first()->id, + 'name' => 'Cisco Console til VGA', + 'total' => 44, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Konsole')->first()->id, + 'name' => 'Cisco USB til Mini-USB', + 'total' => 5, + ], + [ + 'cabel_category_id' => CabelCategory::where('name','=','Konsole')->first()->id, + 'name' => 'Cisco USB til Console', + 'total' => 23, + ], + ]; + foreach ($items as $item) { + Cabel::create($item); + } + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..81eb1dd --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,44 @@ +create(); + + // \App\Models\users::factory()->create([ + // 'name' => 'Test users', + // 'email' => 'test@example.com', + // ]); + + $this->call([ + PermissionSeeder::class, + RoleSeeder::class, + LoanerTypeSeeder::class, + UserSeeder::class, + BuildingSeeder::class, + RoomSeeder::class, + BrandSeeder::class, + ProductCategorySeeder::class, + ProductSubcategorySeeder::class, + ProductModelSeeder::class, + ProductSeeder::class, + LoanTypeSeeder::class, + CabelCategorySeeder::class, + CabelSeeder::class, + NoteTypeSeeder::class, + NoteSeeder::class, + LogActionSeeder::class, + ]); + } +} diff --git a/database/seeders/LoanTypeSeeder.php b/database/seeders/LoanTypeSeeder.php new file mode 100644 index 0000000..699fde3 --- /dev/null +++ b/database/seeders/LoanTypeSeeder.php @@ -0,0 +1,29 @@ + 'Loan'], + ['name' => 'Reservation - Awaiting'], + ['name' => 'Reservation - Set Up'], + ['name' => 'Reservation - Pick Up'], + ]; + foreach ($items as $item) { + LoanType::create($item); + } + } +} diff --git a/database/seeders/LoanerTypeSeeder.php b/database/seeders/LoanerTypeSeeder.php new file mode 100644 index 0000000..b32cfdb --- /dev/null +++ b/database/seeders/LoanerTypeSeeder.php @@ -0,0 +1,25 @@ + 'adUser'], + ['name' => 'nadUser'], + ]; + foreach ($items as $item) { + LoanerType::create($item); + } + } +} diff --git a/database/seeders/LogActionSeeder.php b/database/seeders/LogActionSeeder.php new file mode 100644 index 0000000..8d5883f --- /dev/null +++ b/database/seeders/LogActionSeeder.php @@ -0,0 +1,42 @@ + 'created'], + ['name' => 'edited'], + ['name' => 'deleted'], + ['name' => 'restored'], + ['name' => 'force_deleted'], + ['name' => 'lent'], + ['name' => 'adjusted'], + ['name' => 'returned'], + ['name' => 'note'], + ['name' => 'reserved'], + ['name' => 'cancelled'], + ['name' => 'validated'], + ['name' => 'set up'], + ['name' => 'picked up'], + ['name' => 'amount_added'], + ['name' => 'amount_removed'], + + ]; + foreach ($items as $item) { + LogAction::create($item); + } + } +} diff --git a/database/seeders/NoteSeeder.php b/database/seeders/NoteSeeder.php new file mode 100644 index 0000000..5bc281a --- /dev/null +++ b/database/seeders/NoteSeeder.php @@ -0,0 +1,19 @@ + 'Beskadiget'], + ['name' => 'Mangler'], + ]; + foreach ($items as $item) { + NoteType::create($item); + } + + } +} diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php new file mode 100644 index 0000000..f2c1e41 --- /dev/null +++ b/database/seeders/PermissionSeeder.php @@ -0,0 +1,147 @@ + 'users_viewAny'], + ['name' => 'users_viewAny_deleted'], + ['name' => 'users_view'], + ['name' => 'users_create'], + ['name' => 'users_edit'], + ['name' => 'users_edit_role'], + ['name' => 'users_edit_username'], + ['name' => 'users_delete'], + ['name' => 'users_delete_force'], + ['name' => 'users_restore'], + ['name' => 'buildings_viewAny'], + ['name' => 'buildings_viewAny_deleted'], + ['name' => 'buildings_view'], + ['name' => 'buildings_create'], + ['name' => 'buildings_edit'], + ['name' => 'buildings_delete'], + ['name' => 'buildings_delete_force'], + ['name' => 'buildings_restore'], + ['name' => 'rooms_viewAny'], + ['name' => 'rooms_viewAny_deleted'], + ['name' => 'rooms_view'], + ['name' => 'rooms_create'], + ['name' => 'rooms_edit'], + ['name' => 'rooms_delete'], + ['name' => 'rooms_delete_force'], + ['name' => 'rooms_restore'], + ['name' => 'roles_viewAny'], + ['name' => 'roles_viewAny_deleted'], + ['name' => 'roles_view'], + ['name' => 'roles_create'], + ['name' => 'roles_edit'], + ['name' => 'roles_edit_permissions'], + ['name' => 'roles_delete'], + ['name' => 'roles_delete_force'], + ['name' => 'roles_restore'], + ['name' => 'roles_permission'], + ['name' => 'brands_viewAny'], + ['name' => 'brands_viewAny_deleted'], + ['name' => 'brands_view'], + ['name' => 'brands_create'], + ['name' => 'brands_edit'], + ['name' => 'brands_delete'], + ['name' => 'brands_delete_force'], + ['name' => 'brands_restore'], + ['name' => 'models_viewAny'], + ['name' => 'models_viewAny_deleted'], + ['name' => 'models_view'], + ['name' => 'models_create'], + ['name' => 'models_edit'], + ['name' => 'models_delete'], + ['name' => 'models_delete_force'], + ['name' => 'models_restore'], + ['name' => 'categories_viewAny'], + ['name' => 'categories_viewAny_deleted'], + ['name' => 'categories_view'], + ['name' => 'categories_create'], + ['name' => 'categories_edit'], + ['name' => 'categories_delete'], + ['name' => 'categories_delete_force'], + ['name' => 'categories_restore'], + ['name' => 'subcategories_viewAny'], + ['name' => 'subcategories_viewAny_deleted'], + ['name' => 'subcategories_view'], + ['name' => 'subcategories_create'], + ['name' => 'subcategories_edit'], + ['name' => 'subcategories_delete'], + ['name' => 'subcategories_delete_force'], + ['name' => 'subcategories_restore'], + ['name' => 'products_viewAny'], + ['name' => 'products_viewAny_deleted'], + ['name' => 'products_view'], + ['name' => 'products_create'], + ['name' => 'products_edit'], + ['name' => 'products_delete'], + ['name' => 'products_delete_force'], + ['name' => 'products_restore'], + ['name' => 'products_amount_add'], + ['name' => 'products_amount_remove'], + ['name' => 'pdf_viewAny'], + ['name' => 'pdf_view'], + ['name' => 'pdf_delete'], + ['name' => 'cabels_viewAny'], + ['name' => 'cabels_viewAny_deleted'], + ['name' => 'cabels_view'], + ['name' => 'cabels_create'], + ['name' => 'cabels_edit'], + ['name' => 'cabels_delete'], + ['name' => 'cabels_delete_force'], + ['name' => 'cabels_restore'], + ['name' => 'cabels_amount_add'], + ['name' => 'cabels_amount_remove'], + ['name' => 'cabelCategories_viewAny'], + ['name' => 'cabelCategories_viewAny_deleted'], + ['name' => 'cabelCategories_view'], + ['name' => 'cabelCategories_create'], + ['name' => 'cabelCategories_edit'], + ['name' => 'cabelCategories_delete'], + ['name' => 'cabelCategories_delete_force'], + ['name' => 'cabelCategories_restore'], + ['name' => 'cabelCategories_amount_add'], + ['name' => 'cabelCategories_amount_remove'], + ['name' => 'logs_viewAny'], + ['name' => 'statistics'], + ['name' => 'loans_viewAny'], + ['name' => 'loans_create_user'], + ['name' => 'loans_create_laptop'], + ['name' => 'loans_adjust'], + ['name' => 'loans_return'], + ['name' => 'reservations_viewAny'], + ['name' => 'reservations_create'], + ['name' => 'reservations_validate'], + ['name' => 'reservations_cancel'], + ['name' => 'reservations_setup'], + ['name' => 'reservations_pickup'], + ['name' => 'reservations_return'], + ['name' => 'reservations_adjust'], + ['name' => 'notes_viewAny'], + ['name' => 'notes_viewAny_deleted'], + ['name' => 'notes_view'], + ['name' => 'notes_create'], + ['name' => 'notes_edit'], + ['name' => 'notes_delete'], + ['name' => 'notes_delete_force'], + ['name' => 'notes_restore'], + ]; + foreach ($items as $item) { + Permission::create($item); + } + } +} diff --git a/database/seeders/ProductCategorySeeder.php b/database/seeders/ProductCategorySeeder.php new file mode 100644 index 0000000..9a0035c --- /dev/null +++ b/database/seeders/ProductCategorySeeder.php @@ -0,0 +1,44 @@ + 'Adapter'], + ['name' => 'Andet'], + ['name' => 'Laptop'], + ['name' => 'Bog'], + ['name' => 'El'], + ['name' => 'Enhed'], + ['name' => 'Hardware'], + ['name' => 'I/O Device'], + ['name' => 'Network'], + ['name' => 'Skærm'], + ['name' => 'Software'], + ['name' => 'Kit'], + ['name' => 'Printer'], + ['name' => 'Stationær'], + ['name' => 'Docking Station'], + ['name' => 'Server'], + ['name' => 'Tablet'], + ['name' => 'Værktøj'], + ['name' => 'Tilbehør'], + ['name' => 'Hub'], + ['name' => 'RobotArm - Tinker Kit'], + ]; + foreach ($items as $item) { + ProductCategory::create($item); + } + } +} diff --git a/database/seeders/ProductModelSeeder.php b/database/seeders/ProductModelSeeder.php new file mode 100644 index 0000000..786765c --- /dev/null +++ b/database/seeders/ProductModelSeeder.php @@ -0,0 +1,27 @@ + Brand::where('name','=','Test Brand')->first()->id,'name' => 'Test Model'], + ]; + foreach ($items as $item) { + ProductModel::create($item); + } + + } +} diff --git a/database/seeders/ProductSeeder.php b/database/seeders/ProductSeeder.php new file mode 100644 index 0000000..1cc8c59 --- /dev/null +++ b/database/seeders/ProductSeeder.php @@ -0,0 +1,47 @@ + ProductCategory::where('name','=','Laptop')->first()->id, + 'product_subcategory_id' => ProductSubcategory::where('name','=','Server Rum')->first()->id, + 'brand_id' => Brand::where('name','=','Test Brand')->first()->id, + 'product_model_id' => ProductModel::where('name','=','Test Model')->first()->id, + 'name' => 'Test Product', + 'description' => "Test Description", + 'total' => 100, + 'barcode' => "Test.Product.0001", + ], + [ + 'product_category_id' => ProductCategory::where('name','=','Laptop')->first()->id, + 'brand_id' => Brand::where('name','=','Test Brand')->first()->id, + 'product_model_id' => ProductModel::where('name','=','Test Model')->first()->id, + 'name' => 'Test Product 2', + 'description' => "Test Description 2", + 'total' => 100, + 'barcode' => "Test.Product.0002", + ], + ]; + foreach ($items as $item) { + Product::create($item); + } + } +} diff --git a/database/seeders/ProductSubcategorySeeder.php b/database/seeders/ProductSubcategorySeeder.php new file mode 100644 index 0000000..4712cef --- /dev/null +++ b/database/seeders/ProductSubcategorySeeder.php @@ -0,0 +1,26 @@ + ProductCategory::where('name','=','Laptop')->first()->id,'name' => 'Server Rum'], + ]; + foreach ($items as $item) { + ProductSubcategory::create($item); + } + } +} diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php new file mode 100644 index 0000000..992c195 --- /dev/null +++ b/database/seeders/RoleSeeder.php @@ -0,0 +1,31 @@ + 'Administrator'], + ['name' => 'Elev'], + ['name' => 'Underviser'], + ['name' => 'Helpdesk'], + ['name' => 'Server'], + ]; + foreach ($items as $item) { + Role::create($item); + } + + Role::where('name', '=', 'Administrator')->first()->permissions()->sync(Permission::all()); + } +} diff --git a/database/seeders/RoomSeeder.php b/database/seeders/RoomSeeder.php new file mode 100644 index 0000000..a9dde05 --- /dev/null +++ b/database/seeders/RoomSeeder.php @@ -0,0 +1,27 @@ + Building::where('name','=','Bygning 7')->first()->id,'name' => '7X1'], + ['building_id' => Building::where('name','=','Bygning 8')->first()->id,'name' => '8X1'], + ]; + foreach ($items as $item) { + Room::create($item); + } + } +} diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..7bd91db --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,77 @@ + "Danny Johansson", + 'username' => 'dann4624', + 'guid' => '5e5417ed-d489-4376-a2d3-c263e70fe15e', + 'domain' => 'default', + 'password' => Hash::make('Nimai!1159'), + 'loaner_type_id' => LoanerType::all()->firstWhere('name','=', 'adUser')->id, + 'role_id' => 1 + ]); + + User::firstOrCreate([ + 'name' => "Ynnad Nossnahoj", + 'username' => 'dann4625', + 'password' => Hash::make('Nimai!1159'), + 'loaner_type_id' => LoanerType::all()->firstWhere('name','=', 'nadUser')->id, + 'role_id' => 1 + ]); + + User::firstOrCreate([ + 'name' => "Demo Admin", + 'username' => 'demo_admin', + 'password' => Hash::make('Pass1234'), + 'loaner_type_id' => LoanerType::all()->firstWhere('name','=', 'nadUser')->id, + 'role_id' => 1 + ]); + + User::firstOrCreate([ + 'name' => "Demo Student", + 'username' => 'demo_student', + 'password' => Hash::make('Pass1234'), + 'loaner_type_id' => LoanerType::all()->firstWhere('name','=', 'nadUser')->id, + 'role_id' => 2 + ]); + + User::firstOrCreate([ + 'name' => "Demo Teacher", + 'username' => 'demo_teacher', + 'password' => Hash::make('Pass1234'), + 'loaner_type_id' => LoanerType::all()->firstWhere('name','=', 'nadUser')->id, + 'role_id' => 3 + ]); + + User::firstOrCreate([ + 'name' => "Demo Helper", + 'username' => 'demo_helper', + 'password' => Hash::make('Pass1234'), + 'loaner_type_id' => LoanerType::all()->firstWhere('name','=', 'nadUser')->id, + 'role_id' => 4 + ]); + + User::firstOrCreate([ + 'name' => "Demo Server", + 'username' => 'demo_server', + 'password' => Hash::make('Pass1234'), + 'loaner_type_id' => LoanerType::all()->firstWhere('name','=', 'nadUser')->id, + 'role_id' => 5 + ]); + } +} diff --git a/lang/en/auth.php b/lang/en/auth.php new file mode 100644 index 0000000..6598e2c --- /dev/null +++ b/lang/en/auth.php @@ -0,0 +1,20 @@ + 'These credentials do not match our records.', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/lang/en/pagination.php b/lang/en/pagination.php new file mode 100644 index 0000000..d481411 --- /dev/null +++ b/lang/en/pagination.php @@ -0,0 +1,19 @@ + '« Previous', + 'next' => 'Next »', + +]; diff --git a/lang/en/passwords.php b/lang/en/passwords.php new file mode 100644 index 0000000..2345a56 --- /dev/null +++ b/lang/en/passwords.php @@ -0,0 +1,22 @@ + 'Your password has been reset!', + 'sent' => 'We have emailed your password reset link!', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that email address.", + +]; diff --git a/lang/en/validation.php b/lang/en/validation.php new file mode 100644 index 0000000..5ea01fa --- /dev/null +++ b/lang/en/validation.php @@ -0,0 +1,174 @@ + 'The :attribute must be accepted.', + 'accepted_if' => 'The :attribute must be accepted when :other is :value.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute must only contain letters.', + 'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute must only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'array' => 'The :attribute must have between :min and :max items.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'numeric' => 'The :attribute must be between :min and :max.', + 'string' => 'The :attribute must be between :min and :max characters.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'current_password' => 'The password is incorrect.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'declined' => 'The :attribute must be declined.', + 'declined_if' => 'The :attribute must be declined when :other is :value.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'doesnt_end_with' => 'The :attribute may not end with one of the following: :values.', + 'doesnt_start_with' => 'The :attribute may not start with one of the following: :values.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'enum' => 'The selected :attribute is invalid.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'array' => 'The :attribute must have more than :value items.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'numeric' => 'The :attribute must be greater than :value.', + 'string' => 'The :attribute must be greater than :value characters.', + ], + 'gte' => [ + 'array' => 'The :attribute must have :value items or more.', + 'file' => 'The :attribute must be greater than or equal to :value kilobytes.', + 'numeric' => 'The :attribute must be greater than or equal to :value.', + 'string' => 'The :attribute must be greater than or equal to :value characters.', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'array' => 'The :attribute must have less than :value items.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'numeric' => 'The :attribute must be less than :value.', + 'string' => 'The :attribute must be less than :value characters.', + ], + 'lte' => [ + 'array' => 'The :attribute must not have more than :value items.', + 'file' => 'The :attribute must be less than or equal to :value kilobytes.', + 'numeric' => 'The :attribute must be less than or equal to :value.', + 'string' => 'The :attribute must be less than or equal to :value characters.', + ], + 'mac_address' => 'The :attribute must be a valid MAC address.', + 'max' => [ + 'array' => 'The :attribute must not have more than :max items.', + 'file' => 'The :attribute must not be greater than :max kilobytes.', + 'numeric' => 'The :attribute must not be greater than :max.', + 'string' => 'The :attribute must not be greater than :max characters.', + ], + 'max_digits' => 'The :attribute must not have more than :max digits.', + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'array' => 'The :attribute must have at least :min items.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'numeric' => 'The :attribute must be at least :min.', + 'string' => 'The :attribute must be at least :min characters.', + ], + 'min_digits' => 'The :attribute must have at least :min digits.', + 'multiple_of' => 'The :attribute must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'password' => [ + 'letters' => 'The :attribute must contain at least one letter.', + 'mixed' => 'The :attribute must contain at least one uppercase and one lowercase letter.', + 'numbers' => 'The :attribute must contain at least one number.', + 'symbols' => 'The :attribute must contain at least one symbol.', + 'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.', + ], + 'present' => 'The :attribute field must be present.', + 'prohibited' => 'The :attribute field is prohibited.', + 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', + 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_array_keys' => 'The :attribute field must contain entries for: :values.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_if_accepted' => 'The :attribute field is required when :other is accepted.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'array' => 'The :attribute must contain :size items.', + 'file' => 'The :attribute must be :size kilobytes.', + 'numeric' => 'The :attribute must be :size.', + 'string' => 'The :attribute must be :size characters.', + ], + 'starts_with' => 'The :attribute must start with one of the following: :values.', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid timezone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute must be a valid URL.', + 'uuid' => 'The :attribute must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..dab50d8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1114 @@ +{ + "name": "lager6", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "axios": "^0.27", + "laravel-vite-plugin": "^0.6.0", + "lodash": "^4.17.19", + "postcss": "^8.1.14", + "vite": "^3.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.9.tgz", + "integrity": "sha512-VZPy/ETF3fBG5PiinIkA0W/tlsvlEgJccyN2DzWZEl0DlVKRbu91PvY2D6Lxgluj4w9QtYHjOWjAT44C+oQ+EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.9.tgz", + "integrity": "sha512-O+NfmkfRrb3uSsTa4jE3WApidSe3N5++fyOVGP1SmMZi4A3BZELkhUUvj5hwmMuNdlpzAZ8iAPz2vmcR7DCFQA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.9.tgz", + "integrity": "sha512-OnYr1rkMVxtmMHIAKZLMcEUlJmqcbxBz9QoBU8G9v455na0fuzlT/GLu6l+SRghrk0Mm2fSSciMmzV43Q8e0Gg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.9", + "@esbuild/linux-loong64": "0.15.9", + "esbuild-android-64": "0.15.9", + "esbuild-android-arm64": "0.15.9", + "esbuild-darwin-64": "0.15.9", + "esbuild-darwin-arm64": "0.15.9", + "esbuild-freebsd-64": "0.15.9", + "esbuild-freebsd-arm64": "0.15.9", + "esbuild-linux-32": "0.15.9", + "esbuild-linux-64": "0.15.9", + "esbuild-linux-arm": "0.15.9", + "esbuild-linux-arm64": "0.15.9", + "esbuild-linux-mips64le": "0.15.9", + "esbuild-linux-ppc64le": "0.15.9", + "esbuild-linux-riscv64": "0.15.9", + "esbuild-linux-s390x": "0.15.9", + "esbuild-netbsd-64": "0.15.9", + "esbuild-openbsd-64": "0.15.9", + "esbuild-sunos-64": "0.15.9", + "esbuild-windows-32": "0.15.9", + "esbuild-windows-64": "0.15.9", + "esbuild-windows-arm64": "0.15.9" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.9.tgz", + "integrity": "sha512-HQCX7FJn9T4kxZQkhPjNZC7tBWZqJvhlLHPU2SFzrQB/7nDXjmTIFpFTjt7Bd1uFpeXmuwf5h5fZm+x/hLnhbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.9.tgz", + "integrity": "sha512-E6zbLfqbFVCNEKircSHnPiSTsm3fCRxeIMPfrkS33tFjIAoXtwegQfVZqMGR0FlsvVxp2NEDOUz+WW48COCjSg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.9.tgz", + "integrity": "sha512-gI7dClcDN/HHVacZhTmGjl0/TWZcGuKJ0I7/xDGJwRQQn7aafZGtvagOFNmuOq+OBFPhlPv1T6JElOXb0unkSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.9.tgz", + "integrity": "sha512-VZIMlcRN29yg/sv7DsDwN+OeufCcoTNaTl3Vnav7dL/nvsApD7uvhVRbgyMzv0zU/PP0xRhhIpTyc7lxEzHGSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.9.tgz", + "integrity": "sha512-uM4z5bTvuAXqPxrI204txhlsPIolQPWRMLenvGuCPZTnnGlCMF2QLs0Plcm26gcskhxewYo9LkkmYSS5Czrb5A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.9.tgz", + "integrity": "sha512-HHDjT3O5gWzicGdgJ5yokZVN9K9KG05SnERwl9nBYZaCjcCgj/sX8Ps1jvoFSfNCO04JSsHSOWo4qvxFuj8FoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.9.tgz", + "integrity": "sha512-AQIdE8FugGt1DkcekKi5ycI46QZpGJ/wqcMr7w6YUmOmp2ohQ8eO4sKUsOxNOvYL7hGEVwkndSyszR6HpVHLFg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.9.tgz", + "integrity": "sha512-4RXjae7g6Qs7StZyiYyXTZXBlfODhb1aBVAjd+ANuPmMhWthQilWo7rFHwJwL7DQu1Fjej2sODAVwLbcIVsAYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.9.tgz", + "integrity": "sha512-3Zf2GVGUOI7XwChH3qrnTOSqfV1V4CAc/7zLVm4lO6JT6wbJrTgEYCCiNSzziSju+J9Jhf9YGWk/26quWPC6yQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.9.tgz", + "integrity": "sha512-a+bTtxJmYmk9d+s2W4/R1SYKDDAldOKmWjWP0BnrWtDbvUBNOm++du0ysPju4mZVoEFgS1yLNW+VXnG/4FNwdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.9.tgz", + "integrity": "sha512-Zn9HSylDp89y+TRREMDoGrc3Z4Hs5u56ozZLQCiZAUx2+HdbbXbWdjmw3FdTJ/i7t5Cew6/Q+6kfO3KCcFGlyw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.9.tgz", + "integrity": "sha512-OEiOxNAMH9ENFYqRsWUj3CWyN3V8P3ZXyfNAtX5rlCEC/ERXrCEFCJji/1F6POzsXAzxvUJrTSTCy7G6BhA6Fw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.9.tgz", + "integrity": "sha512-ukm4KsC3QRausEFjzTsOZ/qqazw0YvJsKmfoZZm9QW27OHjk2XKSQGGvx8gIEswft/Sadp03/VZvAaqv5AIwNA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.9.tgz", + "integrity": "sha512-uDOQEH55wQ6ahcIKzQr3VyjGc6Po/xblLGLoUk3fVL1qjlZAibtQr6XRfy5wPJLu/M2o0vQKLq4lyJ2r1tWKcw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.9.tgz", + "integrity": "sha512-yWgxaYTQz+TqX80wXRq6xAtb7GSBAp6gqLKfOdANg9qEmAI1Bxn04IrQr0Mzm4AhxvGKoHzjHjMgXbCCSSDxcw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.9.tgz", + "integrity": "sha512-JmS18acQl4iSAjrEha1MfEmUMN4FcnnrtTaJ7Qg0tDCOcgpPPQRLGsZqhes0vmx8VA6IqRyScqXvaL7+Q0Uf3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.9.tgz", + "integrity": "sha512-UKynGSWpzkPmXW3D2UMOD9BZPIuRaSqphxSCwScfEE05Be3KAmvjsBhht1fLzKpiFVJb0BYMd4jEbWMyJ/z1hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.9.tgz", + "integrity": "sha512-aqXvu4/W9XyTVqO/hw3rNxKE1TcZiEYHPsXM9LwYmKSX9/hjvfIJzXwQBlPcJ/QOxedfoMVH0YnhhQ9Ffb0RGA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.9.tgz", + "integrity": "sha512-zm7h91WUmlS4idMtjvCrEeNhlH7+TNOmqw5dJPJZrgFaxoFyqYG6CKDpdFCQXdyKpD5yvzaQBOMVTCBVKGZDEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.9.tgz", + "integrity": "sha512-yQEVIv27oauAtvtuhJVfSNMztJJX47ismRS6Sv2QMVV9RM+6xjbMWuuwM2nxr5A2/gj/mu2z9YlQxiwoFRCfZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.6.1.tgz", + "integrity": "sha512-L8zt+bttm6+C0mo3an5J8wRW03SsjbTEouGb3bH2jj/XclFVAX/xEUkG9efhdRHjbEH5RY6cmdJ7bmf7zqjwIQ==", + "dev": true, + "dependencies": { + "vite-plugin-full-reload": "^1.0.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "vite": "^3.0.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.78.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", + "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/vite": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.3.tgz", + "integrity": "sha512-/3XWiktaopByM5bd8dqvHxRt5EEgRikevnnrpND0gRfNkrMrPaGGexhtLCzv15RcCMtV2CLw+BPas8YFeSG0KA==", + "dev": true, + "dependencies": { + "esbuild": "^0.15.6", + "postcss": "^8.4.16", + "resolve": "^1.22.1", + "rollup": "~2.78.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.4.tgz", + "integrity": "sha512-9WejQII6zJ++m/YE173Zvl2jq4cqa404KNrVT+JDzDnqaGRq5UvOvA48fnsSWPIMXFV7S0dq5+sZqcSB+tKBgA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "vite": "^2 || ^3" + } + } + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.9.tgz", + "integrity": "sha512-VZPy/ETF3fBG5PiinIkA0W/tlsvlEgJccyN2DzWZEl0DlVKRbu91PvY2D6Lxgluj4w9QtYHjOWjAT44C+oQ+EQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.9.tgz", + "integrity": "sha512-O+NfmkfRrb3uSsTa4jE3WApidSe3N5++fyOVGP1SmMZi4A3BZELkhUUvj5hwmMuNdlpzAZ8iAPz2vmcR7DCFQA==", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "esbuild": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.9.tgz", + "integrity": "sha512-OnYr1rkMVxtmMHIAKZLMcEUlJmqcbxBz9QoBU8G9v455na0fuzlT/GLu6l+SRghrk0Mm2fSSciMmzV43Q8e0Gg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.15.9", + "@esbuild/linux-loong64": "0.15.9", + "esbuild-android-64": "0.15.9", + "esbuild-android-arm64": "0.15.9", + "esbuild-darwin-64": "0.15.9", + "esbuild-darwin-arm64": "0.15.9", + "esbuild-freebsd-64": "0.15.9", + "esbuild-freebsd-arm64": "0.15.9", + "esbuild-linux-32": "0.15.9", + "esbuild-linux-64": "0.15.9", + "esbuild-linux-arm": "0.15.9", + "esbuild-linux-arm64": "0.15.9", + "esbuild-linux-mips64le": "0.15.9", + "esbuild-linux-ppc64le": "0.15.9", + "esbuild-linux-riscv64": "0.15.9", + "esbuild-linux-s390x": "0.15.9", + "esbuild-netbsd-64": "0.15.9", + "esbuild-openbsd-64": "0.15.9", + "esbuild-sunos-64": "0.15.9", + "esbuild-windows-32": "0.15.9", + "esbuild-windows-64": "0.15.9", + "esbuild-windows-arm64": "0.15.9" + } + }, + "esbuild-android-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.9.tgz", + "integrity": "sha512-HQCX7FJn9T4kxZQkhPjNZC7tBWZqJvhlLHPU2SFzrQB/7nDXjmTIFpFTjt7Bd1uFpeXmuwf5h5fZm+x/hLnhbw==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.9.tgz", + "integrity": "sha512-E6zbLfqbFVCNEKircSHnPiSTsm3fCRxeIMPfrkS33tFjIAoXtwegQfVZqMGR0FlsvVxp2NEDOUz+WW48COCjSg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.9.tgz", + "integrity": "sha512-gI7dClcDN/HHVacZhTmGjl0/TWZcGuKJ0I7/xDGJwRQQn7aafZGtvagOFNmuOq+OBFPhlPv1T6JElOXb0unkSQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.9.tgz", + "integrity": "sha512-VZIMlcRN29yg/sv7DsDwN+OeufCcoTNaTl3Vnav7dL/nvsApD7uvhVRbgyMzv0zU/PP0xRhhIpTyc7lxEzHGSw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.9.tgz", + "integrity": "sha512-uM4z5bTvuAXqPxrI204txhlsPIolQPWRMLenvGuCPZTnnGlCMF2QLs0Plcm26gcskhxewYo9LkkmYSS5Czrb5A==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.9.tgz", + "integrity": "sha512-HHDjT3O5gWzicGdgJ5yokZVN9K9KG05SnERwl9nBYZaCjcCgj/sX8Ps1jvoFSfNCO04JSsHSOWo4qvxFuj8FoA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.9.tgz", + "integrity": "sha512-AQIdE8FugGt1DkcekKi5ycI46QZpGJ/wqcMr7w6YUmOmp2ohQ8eO4sKUsOxNOvYL7hGEVwkndSyszR6HpVHLFg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.9.tgz", + "integrity": "sha512-4RXjae7g6Qs7StZyiYyXTZXBlfODhb1aBVAjd+ANuPmMhWthQilWo7rFHwJwL7DQu1Fjej2sODAVwLbcIVsAYQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.9.tgz", + "integrity": "sha512-3Zf2GVGUOI7XwChH3qrnTOSqfV1V4CAc/7zLVm4lO6JT6wbJrTgEYCCiNSzziSju+J9Jhf9YGWk/26quWPC6yQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.9.tgz", + "integrity": "sha512-a+bTtxJmYmk9d+s2W4/R1SYKDDAldOKmWjWP0BnrWtDbvUBNOm++du0ysPju4mZVoEFgS1yLNW+VXnG/4FNwdQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.9.tgz", + "integrity": "sha512-Zn9HSylDp89y+TRREMDoGrc3Z4Hs5u56ozZLQCiZAUx2+HdbbXbWdjmw3FdTJ/i7t5Cew6/Q+6kfO3KCcFGlyw==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.9.tgz", + "integrity": "sha512-OEiOxNAMH9ENFYqRsWUj3CWyN3V8P3ZXyfNAtX5rlCEC/ERXrCEFCJji/1F6POzsXAzxvUJrTSTCy7G6BhA6Fw==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.9.tgz", + "integrity": "sha512-ukm4KsC3QRausEFjzTsOZ/qqazw0YvJsKmfoZZm9QW27OHjk2XKSQGGvx8gIEswft/Sadp03/VZvAaqv5AIwNA==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.9.tgz", + "integrity": "sha512-uDOQEH55wQ6ahcIKzQr3VyjGc6Po/xblLGLoUk3fVL1qjlZAibtQr6XRfy5wPJLu/M2o0vQKLq4lyJ2r1tWKcw==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.9.tgz", + "integrity": "sha512-yWgxaYTQz+TqX80wXRq6xAtb7GSBAp6gqLKfOdANg9qEmAI1Bxn04IrQr0Mzm4AhxvGKoHzjHjMgXbCCSSDxcw==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.9.tgz", + "integrity": "sha512-JmS18acQl4iSAjrEha1MfEmUMN4FcnnrtTaJ7Qg0tDCOcgpPPQRLGsZqhes0vmx8VA6IqRyScqXvaL7+Q0Uf3A==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.9.tgz", + "integrity": "sha512-UKynGSWpzkPmXW3D2UMOD9BZPIuRaSqphxSCwScfEE05Be3KAmvjsBhht1fLzKpiFVJb0BYMd4jEbWMyJ/z1hQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.9.tgz", + "integrity": "sha512-aqXvu4/W9XyTVqO/hw3rNxKE1TcZiEYHPsXM9LwYmKSX9/hjvfIJzXwQBlPcJ/QOxedfoMVH0YnhhQ9Ffb0RGA==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.9.tgz", + "integrity": "sha512-zm7h91WUmlS4idMtjvCrEeNhlH7+TNOmqw5dJPJZrgFaxoFyqYG6CKDpdFCQXdyKpD5yvzaQBOMVTCBVKGZDEg==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.9.tgz", + "integrity": "sha512-yQEVIv27oauAtvtuhJVfSNMztJJX47ismRS6Sv2QMVV9RM+6xjbMWuuwM2nxr5A2/gj/mu2z9YlQxiwoFRCfZA==", + "dev": true, + "optional": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "laravel-vite-plugin": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.6.1.tgz", + "integrity": "sha512-L8zt+bttm6+C0mo3an5J8wRW03SsjbTEouGb3bH2jj/XclFVAX/xEUkG9efhdRHjbEH5RY6cmdJ7bmf7zqjwIQ==", + "dev": true, + "requires": { + "vite-plugin-full-reload": "^1.0.1" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "postcss": { + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rollup": { + "version": "2.78.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", + "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "vite": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.3.tgz", + "integrity": "sha512-/3XWiktaopByM5bd8dqvHxRt5EEgRikevnnrpND0gRfNkrMrPaGGexhtLCzv15RcCMtV2CLw+BPas8YFeSG0KA==", + "dev": true, + "requires": { + "esbuild": "^0.15.6", + "fsevents": "~2.3.2", + "postcss": "^8.4.16", + "resolve": "^1.22.1", + "rollup": "~2.78.0" + } + }, + "vite-plugin-full-reload": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.4.tgz", + "integrity": "sha512-9WejQII6zJ++m/YE173Zvl2jq4cqa404KNrVT+JDzDnqaGRq5UvOvA48fnsSWPIMXFV7S0dq5+sZqcSB+tKBgA==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6d30231 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "axios": "^0.27", + "laravel-vite-plugin": "^0.6.0", + "lodash": "^4.17.19", + "postcss": "^8.1.14", + "vite": "^3.0.0" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..2ac86a1 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,31 @@ + + + + + ./tests/Unit + + + ./tests/Feature + + + + + ./app + + + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..3aec5e2 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/SDELogo.PNG b/public/SDELogo.PNG new file mode 100644 index 0000000..e6de8d3 Binary files /dev/null and b/public/SDELogo.PNG differ diff --git a/public/SKPFullLogo.png b/public/SKPFullLogo.png new file mode 100644 index 0000000..abf4a0d Binary files /dev/null and b/public/SKPFullLogo.png differ diff --git a/public/SdeFullLogo.png b/public/SdeFullLogo.png new file mode 100644 index 0000000..f09631f Binary files /dev/null and b/public/SdeFullLogo.png differ diff --git a/public/css/app.css b/public/css/app.css new file mode 100644 index 0000000..a2d11e3 --- /dev/null +++ b/public/css/app.css @@ -0,0 +1,18407 @@ +@charset "UTF-8"; +td.dt-control { + background: url("https://www.datatables.net/examples/resources/details_open.png") no-repeat center center; + cursor: pointer; +} + +tr.dt-hasChild td.dt-control { + background: url("https://www.datatables.net/examples/resources/details_close.png") no-repeat center center; +} + +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +/*! Bootstrap 5 integration for DataTables + * + * ©2020 SpryMedia Ltd, all rights reserved. + * License: MIT datatables.net/license/mit + */ +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; + border-collapse: separate !important; + border-spacing: 0; +} +table.dataTable td, +table.dataTable th { + box-sizing: content-box; +} +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_length select { + width: auto; + display: inline-block; +} +div.dataTables_wrapper div.dataTables_filter { + text-align: right; +} +div.dataTables_wrapper div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} +div.dataTables_wrapper div.dataTables_filter input { + margin-left: 0.5em; + display: inline-block; + width: auto; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 0.85em; +} +div.dataTables_wrapper div.dataTables_paginate { + margin: 0; + white-space: nowrap; + text-align: right; +} +div.dataTables_wrapper div.dataTables_paginate ul.pagination { + margin: 2px 0; + white-space: nowrap; + justify-content: flex-end; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 1em 0; +} + +table.dataTable > thead > tr > th:active, +table.dataTable > thead > tr > td:active { + outline: none; +} +table.dataTable > thead > tr > th:not(.sorting_disabled), +table.dataTable > thead > tr > td:not(.sorting_disabled) { + padding-right: 30px; +} +table.dataTable > thead .sorting, +table.dataTable > thead .sorting_asc, +table.dataTable > thead .sorting_desc, +table.dataTable > thead .sorting_asc_disabled, +table.dataTable > thead .sorting_desc_disabled { + cursor: pointer; + position: relative; +} +table.dataTable > thead .sorting:before, table.dataTable > thead .sorting:after, +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_asc:after, +table.dataTable > thead .sorting_desc:before, +table.dataTable > thead .sorting_desc:after, +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_asc_disabled:after, +table.dataTable > thead .sorting_desc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:after { + position: absolute; + bottom: 0.5em; + display: block; + opacity: 0.3; +} +table.dataTable > thead .sorting:before, +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_desc:before, +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:before { + right: 1em; + content: "↑"; +} +table.dataTable > thead .sorting:after, +table.dataTable > thead .sorting_asc:after, +table.dataTable > thead .sorting_desc:after, +table.dataTable > thead .sorting_asc_disabled:after, +table.dataTable > thead .sorting_desc_disabled:after { + right: 0.5em; + content: "↓"; +} +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_desc:after { + opacity: 1; +} +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:after { + opacity: 0; +} + +div.dataTables_scrollHead table.dataTable { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody > table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} +div.dataTables_scrollBody > table > thead .sorting:before, +div.dataTables_scrollBody > table > thead .sorting_asc:before, +div.dataTables_scrollBody > table > thead .sorting_desc:before, +div.dataTables_scrollBody > table > thead .sorting:after, +div.dataTables_scrollBody > table > thead .sorting_asc:after, +div.dataTables_scrollBody > table > thead .sorting_desc:after { + display: none; +} +div.dataTables_scrollBody > table > tbody tr:first-child th, +div.dataTables_scrollBody > table > tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot > .dataTables_scrollFootInner { + box-sizing: content-box; +} +div.dataTables_scrollFoot > .dataTables_scrollFootInner > table { + margin-top: 0 !important; + border-top: none; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper div.dataTables_length, + div.dataTables_wrapper div.dataTables_filter, + div.dataTables_wrapper div.dataTables_info, + div.dataTables_wrapper div.dataTables_paginate { + text-align: center; + } + div.dataTables_wrapper div.dataTables_paginate ul.pagination { + justify-content: center !important; + } +} +table.dataTable.table-sm > thead > tr > th:not(.sorting_disabled) { + padding-right: 20px; +} +table.dataTable.table-sm .sorting:before, +table.dataTable.table-sm .sorting_asc:before, +table.dataTable.table-sm .sorting_desc:before { + top: 5px; + right: 0.85em; +} +table.dataTable.table-sm .sorting:after, +table.dataTable.table-sm .sorting_asc:after, +table.dataTable.table-sm .sorting_desc:after { + top: 5px; +} + +table.table-bordered.dataTable { + border-right-width: 0; +} +table.table-bordered.dataTable thead tr:first-child th, +table.table-bordered.dataTable thead tr:first-child td { + border-top-width: 1px; +} +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-left-width: 0; +} +table.table-bordered.dataTable th:first-child, table.table-bordered.dataTable th:first-child, +table.table-bordered.dataTable td:first-child, +table.table-bordered.dataTable td:first-child { + border-left-width: 1px; +} +table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable td:last-child, +table.table-bordered.dataTable td:last-child { + border-right-width: 1px; +} +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-bottom-width: 1px; +} + +div.dataTables_scrollHead table.table-bordered { + border-bottom-width: 0; +} + +div.table-responsive > div.dataTables_wrapper > div.row { + margin: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:first-child { + padding-left: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:last-child { + padding-right: 0; +} + +table.dataTable.table-striped > tbody > tr:nth-of-type(2n+1) { + --bs-table-accent-bg: transparent; +} +table.dataTable.table-striped > tbody > tr.odd { + --bs-table-accent-bg: var(--bs-table-striped-bg); +} + +@charset "UTF-8"; +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg-rgb: 255, 255, 255; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-bg: #fff; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +hr { + margin: 1rem 0; + color: inherit; + background-color: currentColor; + border: 0; + opacity: 0.25; +} + +hr:not([size]) { + height: 1px; +} + +h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1, .h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + h1, .h1 { + font-size: 2.5rem; + } +} + +h2, .h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + h2, .h2 { + font-size: 2rem; + } +} + +h3, .h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + h3, .h3 { + font-size: 1.75rem; + } +} + +h4, .h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + h4, .h4 { + font-size: 1.5rem; + } +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-bs-original-title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul { + padding-left: 2rem; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small, .small { + font-size: 0.875em; +} + +mark, .mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: #0d6efd; + text-decoration: underline; +} +a:hover { + color: #0a58ca; +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; + direction: ltr /* rtl:ignore */; + unicode-bidi: bidi-override; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +code { + font-size: 0.875em; + color: #d63384; + word-wrap: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 0.875em; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 1em; + font-weight: 700; +} + +figure { + margin: 0 0 1rem; +} + +img, +svg { + vertical-align: middle; +} + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: #6c757d; + text-align: left; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + +label { + display: inline-block; +} + +button { + border-radius: 0; +} + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +select { + text-transform: none; +} + +[role=button] { + cursor: pointer; +} + +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} + +[list]::-webkit-calendar-picker-indicator { + display: none; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} +button:not(:disabled), +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled) { + cursor: pointer; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: textfield; +} + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::-webkit-file-upload-button { + font: inherit; +} + +::file-selector-button { + font: inherit; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +iframe { + border: 0; +} + +summary { + display: list-item; + cursor: pointer; +} + +progress { + vertical-align: baseline; +} + +[hidden] { + display: none !important; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 0.875em; + color: #6c757d; +} + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + width: 100%; + padding-right: var(--bs-gutter-x, 0.75rem); + padding-left: var(--bs-gutter-x, 0.75rem); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1320px; + } +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.33333333%; + } + + .offset-sm-2 { + margin-left: 16.66666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.33333333%; + } + + .offset-sm-5 { + margin-left: 41.66666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.33333333%; + } + + .offset-sm-8 { + margin-left: 66.66666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.33333333%; + } + + .offset-sm-11 { + margin-left: 91.66666667%; + } + + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.33333333%; + } + + .offset-md-2 { + margin-left: 16.66666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.33333333%; + } + + .offset-md-5 { + margin-left: 41.66666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.33333333%; + } + + .offset-md-8 { + margin-left: 66.66666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.33333333%; + } + + .offset-md-11 { + margin-left: 91.66666667%; + } + + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.33333333%; + } + + .offset-lg-2 { + margin-left: 16.66666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.33333333%; + } + + .offset-lg-5 { + margin-left: 41.66666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.33333333%; + } + + .offset-lg-8 { + margin-left: 66.66666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.33333333%; + } + + .offset-lg-11 { + margin-left: 91.66666667%; + } + + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.33333333%; + } + + .offset-xl-2 { + margin-left: 16.66666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.33333333%; + } + + .offset-xl-5 { + margin-left: 41.66666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.33333333%; + } + + .offset-xl-8 { + margin-left: 66.66666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.33333333%; + } + + .offset-xl-11 { + margin-left: 91.66666667%; + } + + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xxl-0 { + margin-left: 0; + } + + .offset-xxl-1 { + margin-left: 8.33333333%; + } + + .offset-xxl-2 { + margin-left: 16.66666667%; + } + + .offset-xxl-3 { + margin-left: 25%; + } + + .offset-xxl-4 { + margin-left: 33.33333333%; + } + + .offset-xxl-5 { + margin-left: 41.66666667%; + } + + .offset-xxl-6 { + margin-left: 50%; + } + + .offset-xxl-7 { + margin-left: 58.33333333%; + } + + .offset-xxl-8 { + margin-left: 66.66666667%; + } + + .offset-xxl-9 { + margin-left: 75%; + } + + .offset-xxl-10 { + margin-left: 83.33333333%; + } + + .offset-xxl-11 { + margin-left: 91.66666667%; + } + + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-bg: transparent; + --bs-table-accent-bg: transparent; + --bs-table-striped-color: #212529; + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: #212529; + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: #212529; + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: #212529; + vertical-align: top; + border-color: #dee2e6; +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} +.table > :not(:first-child) { + border-top: 2px solid currentColor; +} + +.caption-top { + caption-side: top; +} + +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} + +.table-bordered > :not(caption) > * { + border-width: 1px 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 1px; +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} + +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color); +} + +.table-hover > tbody > tr:hover > * { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color); +} + +.table-primary { + --bs-table-bg: #cfe2ff; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: #000; + border-color: #bacbe6; +} + +.table-secondary { + --bs-table-bg: #e2e3e5; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: #000; + border-color: #cbccce; +} + +.table-success { + --bs-table-bg: #d1e7dd; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: #000; + border-color: #bcd0c7; +} + +.table-info { + --bs-table-bg: #cff4fc; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: #000; + border-color: #badce3; +} + +.table-warning { + --bs-table-bg: #fff3cd; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: #000; + border-color: #e6dbb9; +} + +.table-danger { + --bs-table-bg: #f8d7da; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: #000; + border-color: #dfc2c4; +} + +.table-light { + --bs-table-bg: #f8f9fa; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: #000; + border-color: #dfe0e1; +} + +.table-dark { + --bs-table-bg: #212529; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #373b3e; +} + +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; +} + +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: #6c757d; +} + +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type=file] { + overflow: hidden; +} +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: #212529; + background-color: #fff; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value { + height: 1.5em; +} +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} +.form-control::-webkit-file-upload-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: #dde0e3; +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #dde0e3; +} +.form-control::-webkit-file-upload-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: #dde0e3; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} +.form-control-sm::-webkit-file-upload-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-sm::-webkit-file-upload-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} +.form-control-lg::-webkit-file-upload-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +.form-control-lg::-webkit-file-upload-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} + +textarea.form-control { + min-height: calc(1.5em + 0.75rem + 2px); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); +} + +.form-control-color { + width: 3rem; + height: auto; + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + height: 1.5em; + border-radius: 0.25rem; +} +.form-control-color::-webkit-color-swatch { + height: 1.5em; + border-radius: 0.25rem; +} + +.form-select { + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + -moz-padding-start: calc(0.75rem - 3px); + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], .form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: #e9ecef; +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #212529; +} + +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-input { + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: 1px solid rgba(0, 0, 0, 0.25); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + color-adjust: exact; +} +.form-check-input[type=checkbox] { + border-radius: 0.25em; +} +.form-check-input[type=radio] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type=checkbox] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type=radio] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type=checkbox]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: #b6d4fe; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-select { + height: calc(3.5rem + 2px); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + height: 100%; + padding: 1rem 0.75rem; + pointer-events: none; + border: 1px solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control:-ms-input-placeholder { + color: transparent; +} +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-ms-input-placeholder) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:not(:-ms-input-placeholder) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus { + z-index: 3; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 3; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} + +.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: -1px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #198754; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(25, 135, 84, 0.9); + border-radius: 0.25rem; +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #198754; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:valid, .form-select.is-valid { + border-color: #198754; +} +.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, .form-select.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated .form-check-input:valid, .form-check-input.is-valid { + border-color: #198754; +} +.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { + background-color: #198754; +} +.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #198754; +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid, +.was-validated .input-group .form-select:valid, +.input-group .form-select.is-valid { + z-index: 1; +} +.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus, +.was-validated .input-group .form-select:valid:focus, +.input-group .form-select.is-valid:focus { + z-index: 3; +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:invalid, .form-select.is-invalid { + border-color: #dc3545; +} +.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-check-input:invalid, .form-check-input.is-invalid { + border-color: #dc3545; +} +.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { + background-color: #dc3545; +} +.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid, +.was-validated .input-group .form-select:invalid, +.input-group .form-select.is-invalid { + z-index: 2; +} +.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus, +.was-validated .input-group .form-select:invalid:focus, +.input-group .form-select.is-invalid:focus { + z-index: 3; +} + +.btn { + display: inline-block; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: #212529; +} +.btn-check:focus + .btn, .btn:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.btn:disabled, .btn.disabled, fieldset:disabled .btn { + pointer-events: none; + opacity: 0.65; +} + +.btn-primary { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-primary:hover { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; +} +.btn-check:focus + .btn-primary, .btn-primary:focus { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; + box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); +} +.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0a58ca; + border-color: #0a53be; +} +.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); +} +.btn-primary:disabled, .btn-primary.disabled { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-secondary:hover { + color: #fff; + background-color: #5c636a; + border-color: #565e64; +} +.btn-check:focus + .btn-secondary, .btn-secondary:focus { + color: #fff; + background-color: #5c636a; + border-color: #565e64; + box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); +} +.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #565e64; + border-color: #51585e; +} +.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); +} +.btn-secondary:disabled, .btn-secondary.disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-success { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-success:hover { + color: #fff; + background-color: #157347; + border-color: #146c43; +} +.btn-check:focus + .btn-success, .btn-success:focus { + color: #fff; + background-color: #157347; + border-color: #146c43; + box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); +} +.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #146c43; + border-color: #13653f; +} +.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); +} +.btn-success:disabled, .btn-success.disabled { + color: #fff; + background-color: #198754; + border-color: #198754; +} + +.btn-info { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-info:hover { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; +} +.btn-check:focus + .btn-info, .btn-info:focus { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; + box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); +} +.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle { + color: #000; + background-color: #3dd5f3; + border-color: #25cff2; +} +.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); +} +.btn-info:disabled, .btn-info.disabled { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} + +.btn-warning { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-warning:hover { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; +} +.btn-check:focus + .btn-warning, .btn-warning:focus { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; + box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); +} +.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle { + color: #000; + background-color: #ffcd39; + border-color: #ffc720; +} +.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); +} +.btn-warning:disabled, .btn-warning.disabled { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-danger:hover { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; +} +.btn-check:focus + .btn-danger, .btn-danger:focus { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; + box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); +} +.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #b02a37; + border-color: #a52834; +} +.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); +} +.btn-danger:disabled, .btn-danger.disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-light { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-light:hover { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:focus + .btn-light, .btn-light:focus { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); +} +.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); +} +.btn-light:disabled, .btn-light.disabled { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-dark { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-dark:hover { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; +} +.btn-check:focus + .btn-dark, .btn-dark:focus { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; + box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); +} +.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1a1e21; + border-color: #191c1f; +} +.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); +} +.btn-dark:disabled, .btn-dark.disabled { + color: #fff; + background-color: #212529; + border-color: #212529; +} + +.btn-outline-primary { + color: #0d6efd; + border-color: #0d6efd; +} +.btn-outline-primary:hover { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); +} +.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); +} +.btn-outline-primary:disabled, .btn-outline-primary.disabled { + color: #0d6efd; + background-color: transparent; +} + +.btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; +} +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus { + box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); +} +.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); +} +.btn-outline-secondary:disabled, .btn-outline-secondary.disabled { + color: #6c757d; + background-color: transparent; +} + +.btn-outline-success { + color: #198754; + border-color: #198754; +} +.btn-outline-success:hover { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-check:focus + .btn-outline-success, .btn-outline-success:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); +} +.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); +} +.btn-outline-success:disabled, .btn-outline-success.disabled { + color: #198754; + background-color: transparent; +} + +.btn-outline-info { + color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-outline-info:hover { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-check:focus + .btn-outline-info, .btn-outline-info:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); +} +.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); +} +.btn-outline-info:disabled, .btn-outline-info.disabled { + color: #0dcaf0; + background-color: transparent; +} + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107; +} +.btn-outline-warning:hover { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus { + box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); +} +.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); +} +.btn-outline-warning:disabled, .btn-outline-warning.disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545; +} +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); +} +.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); +} +.btn-outline-danger:disabled, .btn-outline-danger.disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-outline-light:hover { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:focus + .btn-outline-light, .btn-outline-light:focus { + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); +} +.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); +} +.btn-outline-light:disabled, .btn-outline-light.disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-dark { + color: #212529; + border-color: #212529; +} +.btn-outline-dark:hover { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus { + box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); +} +.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); +} +.btn-outline-dark:disabled, .btn-outline-dark.disabled { + color: #212529; + background-color: transparent; +} + +.btn-link { + font-weight: 400; + color: #0d6efd; + text-decoration: underline; +} +.btn-link:hover { + color: #0a58ca; +} +.btn-link:disabled, .btn-link.disabled { + color: #6c757d; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} + +.dropup, +.dropend, +.dropdown, +.dropstart { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + z-index: 1000; + display: none; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: 0.125rem; +} + +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} + +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid rgba(0, 0, 0, 0.15); +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:hover, .dropdown-item:focus { + color: #1e2125; + background-color: #e9ecef; +} +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #0d6efd; +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: #adb5bd; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1rem; + color: #212529; +} + +.dropdown-menu-dark { + color: #dee2e6; + background-color: #343a40; + border-color: rgba(0, 0, 0, 0.15); +} +.dropdown-menu-dark .dropdown-item { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus { + color: #fff; + background-color: rgba(255, 255, 255, 0.15); +} +.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active { + color: #fff; + background-color: #0d6efd; +} +.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled { + color: #adb5bd; +} +.dropdown-menu-dark .dropdown-divider { + border-color: rgba(0, 0, 0, 0.15); +} +.dropdown-menu-dark .dropdown-item-text { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-header { + color: #adb5bd; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:nth-child(n+3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn ~ .btn, +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; + color: #0d6efd; + text-decoration: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:hover, .nav-link:focus { + color: #0a58ca; +} +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6; +} +.nav-tabs .nav-link { + margin-bottom: -1px; + background: none; + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; + isolation: isolate; +} +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + background: none; + border: 0; + border-radius: 0.25rem; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #0d6efd; +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-sm, +.navbar > .container-md, +.navbar > .container-lg, +.navbar > .container-xl, +.navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; +} +.navbar-brand { + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + text-decoration: none; + white-space: nowrap; +} +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; +} + +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; + transition: box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 0.25rem; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-sm .offcanvas-top, + .navbar-expand-sm .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-md .offcanvas-top, + .navbar-expand-md .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-lg .offcanvas-top, + .navbar-expand-lg .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-xl .offcanvas-top, + .navbar-expand-xl .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; + } + .navbar-expand-xxl .offcanvas-top, + .navbar-expand-xxl .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none; +} +.navbar-expand .offcanvas-top, +.navbar-expand .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; +} +.navbar-expand .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.55); +} +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.55); + border-color: rgba(0, 0, 0, 0.1); +} +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.55); +} +.navbar-light .navbar-text a, +.navbar-light .navbar-text a:hover, +.navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.55); +} +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.55); + border-color: rgba(255, 255, 255, 0.1); +} +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.55); +} +.navbar-dark .navbar-text a, +.navbar-dark .navbar-text a:hover, +.navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: 1rem 1rem; +} + +.card-title { + margin-bottom: 0.5rem; +} + +.card-subtitle { + margin-top: -0.25rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link + .card-link { + margin-left: 1rem; +} + +.card-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-footer { + padding: 0.5rem 1rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.5rem; + margin-bottom: -0.5rem; + margin-left: -0.5rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.5rem; + margin-left: -0.5rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1rem; + border-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-group > .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: 1rem 1.25rem; + font-size: 1rem; + color: #212529; + text-align: left; + background-color: #fff; + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: #0c63e4; + background-color: #e7f1ff; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125); +} +.accordion-button:not(.collapsed)::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + transform: rotate(-180deg); +} +.accordion-button::after { + flex-shrink: 0; + width: 1.25rem; + height: 1.25rem; + margin-left: auto; + content: ""; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-size: 1.25rem; + transition: transform 0.2s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.accordion-item:first-of-type { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.accordion-body { + padding: 1rem 1.25rem; +} + +.accordion-flush .accordion-collapse { + border-width: 0; +} +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button { + border-radius: 0; +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0 0; + margin-bottom: 1rem; + list-style: none; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: 0.5rem; + color: #6c757d; + content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; +} +.breadcrumb-item.active { + color: #6c757d; +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link { + position: relative; + display: block; + color: #0d6efd; + text-decoration: none; + background-color: #fff; + border: 1px solid #dee2e6; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: #0a58ca; + background-color: #e9ecef; + border-color: #dee2e6; +} +.page-link:focus { + z-index: 3; + color: #0a58ca; + background-color: #e9ecef; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +.page-item:not(:first-child) .page-link { + margin-left: -1px; +} +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + background-color: #fff; + border-color: #dee2e6; +} + +.page-link { + padding: 0.375rem 0.75rem; +} + +.page-item:first-child .page-link { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.35em 0.65em; + font-size: 0.75em; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.alert { + position: relative; + padding: 1rem 1rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} + +.alert-primary { + color: #084298; + background-color: #cfe2ff; + border-color: #b6d4fe; +} +.alert-primary .alert-link { + color: #06357a; +} + +.alert-secondary { + color: #41464b; + background-color: #e2e3e5; + border-color: #d3d6d8; +} +.alert-secondary .alert-link { + color: #34383c; +} + +.alert-success { + color: #0f5132; + background-color: #d1e7dd; + border-color: #badbcc; +} +.alert-success .alert-link { + color: #0c4128; +} + +.alert-info { + color: #055160; + background-color: #cff4fc; + border-color: #b6effb; +} +.alert-info .alert-link { + color: #04414d; +} + +.alert-warning { + color: #664d03; + background-color: #fff3cd; + border-color: #ffecb5; +} +.alert-warning .alert-link { + color: #523e02; +} + +.alert-danger { + color: #842029; + background-color: #f8d7da; + border-color: #f5c2c7; +} +.alert-danger .alert-link { + color: #6a1a21; +} + +.alert-light { + color: #636464; + background-color: #fefefe; + border-color: #fdfdfe; +} +.alert-light .alert-link { + color: #4f5050; +} + +.alert-dark { + color: #141619; + background-color: #d3d3d4; + border-color: #bcbebf; +} +.alert-dark .alert-link { + color: #101214; +} + +@-webkit-keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #0d6efd; + transition: width 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: 1s linear infinite progress-bar-stripes; + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: 0.25rem; +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > li::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.5rem 1rem; + color: #212529; + text-decoration: none; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; +} + +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 1px; +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #084298; + background-color: #cfe2ff; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #084298; + background-color: #bacbe6; +} +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #084298; + border-color: #084298; +} + +.list-group-item-secondary { + color: #41464b; + background-color: #e2e3e5; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #41464b; + background-color: #cbccce; +} +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #41464b; + border-color: #41464b; +} + +.list-group-item-success { + color: #0f5132; + background-color: #d1e7dd; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #0f5132; + background-color: #bcd0c7; +} +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f5132; + border-color: #0f5132; +} + +.list-group-item-info { + color: #055160; + background-color: #cff4fc; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #055160; + background-color: #badce3; +} +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #055160; + border-color: #055160; +} + +.list-group-item-warning { + color: #664d03; + background-color: #fff3cd; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #664d03; + background-color: #e6dbb9; +} +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #664d03; + border-color: #664d03; +} + +.list-group-item-danger { + color: #842029; + background-color: #f8d7da; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #842029; + background-color: #dfc2c4; +} +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #842029; + border-color: #842029; +} + +.list-group-item-light { + color: #636464; + background-color: #fefefe; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #636464; + background-color: #e5e5e5; +} +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #636464; + border-color: #636464; +} + +.list-group-item-dark { + color: #141619; + background-color: #d3d3d4; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #141619; + background-color: #bebebf; +} +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #141619; + border-color: #141619; +} + +.btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: #000; + background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; + border: 0; + border-radius: 0.25rem; + opacity: 0.5; +} +.btn-close:hover { + color: #000; + text-decoration: none; + opacity: 0.75; +} +.btn-close:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + opacity: 1; +} +.btn-close:disabled, .btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: 0.25; +} + +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%); +} + +.toast { + width: 350px; + max-width: 100%; + font-size: 0.875rem; + pointer-events: auto; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} + +.toast-container { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast-header { + display: flex; + align-items: center; + padding: 0.5rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.toast-header .btn-close { + margin-right: -0.375rem; + margin-left: 0.75rem; +} + +.toast-body { + padding: 0.75rem; + word-wrap: break-word; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1055; + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable { + height: calc(100% - 1rem); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - 1rem); +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + width: 100vw; + height: 100vh; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.modal-header .btn-close { + padding: 0.5rem 0.5rem; + margin: -0.5rem -0.5rem -0.5rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: flex; + flex-wrap: wrap; + flex-shrink: 0; + align-items: center; + justify-content: flex-end; + padding: 0.75rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: calc(0.3rem - 1px); + border-bottom-left-radius: calc(0.3rem - 1px); +} +.modal-footer > * { + margin: 0.25rem; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + + .modal-dialog-scrollable { + height: calc(100% - 3.5rem); + } + + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + + .modal-sm { + max-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-header { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} +.modal-fullscreen .modal-footer { + border-radius: 0; +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } +} +.tooltip { + position: absolute; + z-index: 1080; + display: block; + margin: 0; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .tooltip-arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] { + padding: 0.4rem 0; +} +.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { + bottom: 0; +} +.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { + top: -1px; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] { + padding: 0 0.4rem; +} +.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { + right: -1px; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] { + padding: 0.4rem 0; +} +.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { + top: 0; +} +.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] { + padding: 0 0.4rem; +} +.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { + left: -1px; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0 /* rtl:ignore */; + z-index: 1070; + display: block; + max-width: 276px; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .popover-arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; +} +.popover .popover-arrow::before, .popover .popover-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { + bottom: calc(-0.5rem - 1px); +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { + top: calc(-0.5rem - 1px); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f0f0f0; +} + +.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f0f0f0; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 1rem 1rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +/* rtl:begin:ignore */ +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + +/* rtl:end:ignore */ +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, + .carousel-fade .active.carousel-item-end { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +/* rtl:options: { + "autoRename": true, + "stringMap":[ { + "name" : "prev-next", + "search" : "prev", + "replace" : "next" + } ] +} */ +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; + list-style: none; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} + +.carousel-dark .carousel-control-prev-icon, +.carousel-dark .carousel-control-next-icon { + filter: invert(1) grayscale(100); +} +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} +.carousel-dark .carousel-caption { + color: #000; +} + +@-webkit-keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } +} +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: 0.75s linear infinite spinner-border; + animation: 0.75s linear infinite spinner-border; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@-webkit-keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: 0.75s linear infinite spinner-grow; + animation: 0.75s linear infinite spinner-grow; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; + } +} +.offcanvas { + position: fixed; + bottom: 0; + z-index: 1045; + display: flex; + flex-direction: column; + max-width: 100%; + visibility: hidden; + background-color: #fff; + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} + +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem 1rem; +} +.offcanvas-header .btn-close { + padding: 0.5rem 0.5rem; + margin-top: -0.5rem; + margin-right: -0.5rem; + margin-bottom: -0.5rem; +} + +.offcanvas-title { + margin-bottom: 0; + line-height: 1.5; +} + +.offcanvas-body { + flex-grow: 1; + padding: 1rem 1rem; + overflow-y: auto; +} + +.offcanvas-start { + top: 0; + left: 0; + width: 400px; + border-right: 1px solid rgba(0, 0, 0, 0.2); + transform: translateX(-100%); +} + +.offcanvas-end { + top: 0; + right: 0; + width: 400px; + border-left: 1px solid rgba(0, 0, 0, 0.2); + transform: translateX(100%); +} + +.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + transform: translateY(-100%); +} + +.offcanvas-bottom { + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-top: 1px solid rgba(0, 0, 0, 0.2); + transform: translateY(100%); +} + +.offcanvas.show { + transform: none; +} + +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentColor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} + +.placeholder-xs { + min-height: 0.6em; +} + +.placeholder-sm { + min-height: 0.8em; +} + +.placeholder-lg { + min-height: 1.2em; +} + +.placeholder-glow .placeholder { + -webkit-animation: placeholder-glow 2s ease-in-out infinite; + animation: placeholder-glow 2s ease-in-out infinite; +} + +@-webkit-keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} + +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +.placeholder-wave { + -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + -webkit-animation: placeholder-wave 2s linear infinite; + animation: placeholder-wave 2s linear infinite; +} + +@-webkit-keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} + +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.link-primary { + color: #0d6efd; +} +.link-primary:hover, .link-primary:focus { + color: #0a58ca; +} + +.link-secondary { + color: #6c757d; +} +.link-secondary:hover, .link-secondary:focus { + color: #565e64; +} + +.link-success { + color: #198754; +} +.link-success:hover, .link-success:focus { + color: #146c43; +} + +.link-info { + color: #0dcaf0; +} +.link-info:hover, .link-info:focus { + color: #3dd5f3; +} + +.link-warning { + color: #ffc107; +} +.link-warning:hover, .link-warning:focus { + color: #ffcd39; +} + +.link-danger { + color: #dc3545; +} +.link-danger:hover, .link-danger:focus { + color: #b02a37; +} + +.link-light { + color: #f8f9fa; +} +.link-light:hover, .link-light:focus { + color: #f9fafb; +} + +.link-dark { + color: #212529; +} +.link-dark:hover, .link-dark:focus { + color: #1a1e21; +} + +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} + +.ratio-4x3 { + --bs-aspect-ratio: 75%; +} + +.ratio-16x9 { + --bs-aspect-ratio: 56.25%; +} + +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} + +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} + +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.vr { + display: inline-block; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentColor; + opacity: 0.25; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.float-start { + float: left !important; +} + +.float-end { + float: right !important; +} + +.float-none { + float: none !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-25 { + opacity: 0.25 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-75 { + opacity: 0.75 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.top-50 { + top: 50% !important; +} + +.top-100 { + top: 100% !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.bottom-50 { + bottom: 50% !important; +} + +.bottom-100 { + bottom: 100% !important; +} + +.start-0 { + left: 0 !important; +} + +.start-50 { + left: 50% !important; +} + +.start-100 { + left: 100% !important; +} + +.end-0 { + right: 0 !important; +} + +.end-50 { + right: 50% !important; +} + +.end-100 { + right: 100% !important; +} + +.translate-middle { + transform: translate(-50%, -50%) !important; +} + +.translate-middle-x { + transform: translateX(-50%) !important; +} + +.translate-middle-y { + transform: translateY(-50%) !important; +} + +.border { + border: 1px solid #dee2e6 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top { + border-top: 1px solid #dee2e6 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-end { + border-right: 1px solid #dee2e6 !important; +} + +.border-end-0 { + border-right: 0 !important; +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-start { + border-left: 1px solid #dee2e6 !important; +} + +.border-start-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #0d6efd !important; +} + +.border-secondary { + border-color: #6c757d !important; +} + +.border-success { + border-color: #198754 !important; +} + +.border-info { + border-color: #0dcaf0 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #212529 !important; +} + +.border-white { + border-color: #fff !important; +} + +.border-1 { + border-width: 1px !important; +} + +.border-2 { + border-width: 2px !important; +} + +.border-3 { + border-width: 3px !important; +} + +.border-4 { + border-width: 4px !important; +} + +.border-5 { + border-width: 5px !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.vw-100 { + width: 100vw !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} + +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} + +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} + +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} + +.fs-5 { + font-size: 1.25rem !important; +} + +.fs-6 { + font-size: 1rem !important; +} + +.fst-italic { + font-style: italic !important; +} + +.fst-normal { + font-style: normal !important; +} + +.fw-light { + font-weight: 300 !important; +} + +.fw-lighter { + font-weight: lighter !important; +} + +.fw-normal { + font-weight: 400 !important; +} + +.fw-bold { + font-weight: 700 !important; +} + +.fw-bolder { + font-weight: bolder !important; +} + +.lh-1 { + line-height: 1 !important; +} + +.lh-sm { + line-height: 1.25 !important; +} + +.lh-base { + line-height: 1.5 !important; +} + +.lh-lg { + line-height: 2 !important; +} + +.text-start { + text-align: left !important; +} + +.text-end { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +/* rtl:begin:remove */ +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +/* rtl:end:remove */ +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} + +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} + +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} + +.text-muted { + --bs-text-opacity: 1; + color: #6c757d !important; +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} + +.text-opacity-25 { + --bs-text-opacity: 0.25; +} + +.text-opacity-50 { + --bs-text-opacity: 0.5; +} + +.text-opacity-75 { + --bs-text-opacity: 0.75; +} + +.text-opacity-100 { + --bs-text-opacity: 1; +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} + +.bg-opacity-100 { + --bs-bg-opacity: 1; +} + +.bg-gradient { + background-image: var(--bs-gradient) !important; +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + -ms-user-select: auto !important; + user-select: auto !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + user-select: none !important; +} + +.pe-none { + pointer-events: none !important; +} + +.pe-auto { + pointer-events: auto !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-1 { + border-radius: 0.2rem !important; +} + +.rounded-2 { + border-radius: 0.25rem !important; +} + +.rounded-3 { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-end { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-start { + border-bottom-left-radius: 0.25rem !important; + border-top-left-radius: 0.25rem !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + + .float-sm-end { + float: right !important; + } + + .float-sm-none { + float: none !important; + } + + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-grid { + display: grid !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: flex !important; + } + + .d-sm-inline-flex { + display: inline-flex !important; + } + + .d-sm-none { + display: none !important; + } + + .flex-sm-fill { + flex: 1 1 auto !important; + } + + .flex-sm-row { + flex-direction: row !important; + } + + .flex-sm-column { + flex-direction: column !important; + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-sm-wrap { + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-sm-0 { + gap: 0 !important; + } + + .gap-sm-1 { + gap: 0.25rem !important; + } + + .gap-sm-2 { + gap: 0.5rem !important; + } + + .gap-sm-3 { + gap: 1rem !important; + } + + .gap-sm-4 { + gap: 1.5rem !important; + } + + .gap-sm-5 { + gap: 3rem !important; + } + + .justify-content-sm-start { + justify-content: flex-start !important; + } + + .justify-content-sm-end { + justify-content: flex-end !important; + } + + .justify-content-sm-center { + justify-content: center !important; + } + + .justify-content-sm-between { + justify-content: space-between !important; + } + + .justify-content-sm-around { + justify-content: space-around !important; + } + + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + + .align-items-sm-start { + align-items: flex-start !important; + } + + .align-items-sm-end { + align-items: flex-end !important; + } + + .align-items-sm-center { + align-items: center !important; + } + + .align-items-sm-baseline { + align-items: baseline !important; + } + + .align-items-sm-stretch { + align-items: stretch !important; + } + + .align-content-sm-start { + align-content: flex-start !important; + } + + .align-content-sm-end { + align-content: flex-end !important; + } + + .align-content-sm-center { + align-content: center !important; + } + + .align-content-sm-between { + align-content: space-between !important; + } + + .align-content-sm-around { + align-content: space-around !important; + } + + .align-content-sm-stretch { + align-content: stretch !important; + } + + .align-self-sm-auto { + align-self: auto !important; + } + + .align-self-sm-start { + align-self: flex-start !important; + } + + .align-self-sm-end { + align-self: flex-end !important; + } + + .align-self-sm-center { + align-self: center !important; + } + + .align-self-sm-baseline { + align-self: baseline !important; + } + + .align-self-sm-stretch { + align-self: stretch !important; + } + + .order-sm-first { + order: -1 !important; + } + + .order-sm-0 { + order: 0 !important; + } + + .order-sm-1 { + order: 1 !important; + } + + .order-sm-2 { + order: 2 !important; + } + + .order-sm-3 { + order: 3 !important; + } + + .order-sm-4 { + order: 4 !important; + } + + .order-sm-5 { + order: 5 !important; + } + + .order-sm-last { + order: 6 !important; + } + + .m-sm-0 { + margin: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-sm-0 { + margin-top: 0 !important; + } + + .mt-sm-1 { + margin-top: 0.25rem !important; + } + + .mt-sm-2 { + margin-top: 0.5rem !important; + } + + .mt-sm-3 { + margin-top: 1rem !important; + } + + .mt-sm-4 { + margin-top: 1.5rem !important; + } + + .mt-sm-5 { + margin-top: 3rem !important; + } + + .mt-sm-auto { + margin-top: auto !important; + } + + .me-sm-0 { + margin-right: 0 !important; + } + + .me-sm-1 { + margin-right: 0.25rem !important; + } + + .me-sm-2 { + margin-right: 0.5rem !important; + } + + .me-sm-3 { + margin-right: 1rem !important; + } + + .me-sm-4 { + margin-right: 1.5rem !important; + } + + .me-sm-5 { + margin-right: 3rem !important; + } + + .me-sm-auto { + margin-right: auto !important; + } + + .mb-sm-0 { + margin-bottom: 0 !important; + } + + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + + .mb-sm-3 { + margin-bottom: 1rem !important; + } + + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + + .mb-sm-5 { + margin-bottom: 3rem !important; + } + + .mb-sm-auto { + margin-bottom: auto !important; + } + + .ms-sm-0 { + margin-left: 0 !important; + } + + .ms-sm-1 { + margin-left: 0.25rem !important; + } + + .ms-sm-2 { + margin-left: 0.5rem !important; + } + + .ms-sm-3 { + margin-left: 1rem !important; + } + + .ms-sm-4 { + margin-left: 1.5rem !important; + } + + .ms-sm-5 { + margin-left: 3rem !important; + } + + .ms-sm-auto { + margin-left: auto !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-sm-0 { + padding-top: 0 !important; + } + + .pt-sm-1 { + padding-top: 0.25rem !important; + } + + .pt-sm-2 { + padding-top: 0.5rem !important; + } + + .pt-sm-3 { + padding-top: 1rem !important; + } + + .pt-sm-4 { + padding-top: 1.5rem !important; + } + + .pt-sm-5 { + padding-top: 3rem !important; + } + + .pe-sm-0 { + padding-right: 0 !important; + } + + .pe-sm-1 { + padding-right: 0.25rem !important; + } + + .pe-sm-2 { + padding-right: 0.5rem !important; + } + + .pe-sm-3 { + padding-right: 1rem !important; + } + + .pe-sm-4 { + padding-right: 1.5rem !important; + } + + .pe-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-0 { + padding-bottom: 0 !important; + } + + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pb-sm-3 { + padding-bottom: 1rem !important; + } + + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pb-sm-5 { + padding-bottom: 3rem !important; + } + + .ps-sm-0 { + padding-left: 0 !important; + } + + .ps-sm-1 { + padding-left: 0.25rem !important; + } + + .ps-sm-2 { + padding-left: 0.5rem !important; + } + + .ps-sm-3 { + padding-left: 1rem !important; + } + + .ps-sm-4 { + padding-left: 1.5rem !important; + } + + .ps-sm-5 { + padding-left: 3rem !important; + } + + .text-sm-start { + text-align: left !important; + } + + .text-sm-end { + text-align: right !important; + } + + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + + .float-md-end { + float: right !important; + } + + .float-md-none { + float: none !important; + } + + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-grid { + display: grid !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: flex !important; + } + + .d-md-inline-flex { + display: inline-flex !important; + } + + .d-md-none { + display: none !important; + } + + .flex-md-fill { + flex: 1 1 auto !important; + } + + .flex-md-row { + flex-direction: row !important; + } + + .flex-md-column { + flex-direction: column !important; + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-md-grow-0 { + flex-grow: 0 !important; + } + + .flex-md-grow-1 { + flex-grow: 1 !important; + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-md-wrap { + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-md-0 { + gap: 0 !important; + } + + .gap-md-1 { + gap: 0.25rem !important; + } + + .gap-md-2 { + gap: 0.5rem !important; + } + + .gap-md-3 { + gap: 1rem !important; + } + + .gap-md-4 { + gap: 1.5rem !important; + } + + .gap-md-5 { + gap: 3rem !important; + } + + .justify-content-md-start { + justify-content: flex-start !important; + } + + .justify-content-md-end { + justify-content: flex-end !important; + } + + .justify-content-md-center { + justify-content: center !important; + } + + .justify-content-md-between { + justify-content: space-between !important; + } + + .justify-content-md-around { + justify-content: space-around !important; + } + + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + + .align-items-md-start { + align-items: flex-start !important; + } + + .align-items-md-end { + align-items: flex-end !important; + } + + .align-items-md-center { + align-items: center !important; + } + + .align-items-md-baseline { + align-items: baseline !important; + } + + .align-items-md-stretch { + align-items: stretch !important; + } + + .align-content-md-start { + align-content: flex-start !important; + } + + .align-content-md-end { + align-content: flex-end !important; + } + + .align-content-md-center { + align-content: center !important; + } + + .align-content-md-between { + align-content: space-between !important; + } + + .align-content-md-around { + align-content: space-around !important; + } + + .align-content-md-stretch { + align-content: stretch !important; + } + + .align-self-md-auto { + align-self: auto !important; + } + + .align-self-md-start { + align-self: flex-start !important; + } + + .align-self-md-end { + align-self: flex-end !important; + } + + .align-self-md-center { + align-self: center !important; + } + + .align-self-md-baseline { + align-self: baseline !important; + } + + .align-self-md-stretch { + align-self: stretch !important; + } + + .order-md-first { + order: -1 !important; + } + + .order-md-0 { + order: 0 !important; + } + + .order-md-1 { + order: 1 !important; + } + + .order-md-2 { + order: 2 !important; + } + + .order-md-3 { + order: 3 !important; + } + + .order-md-4 { + order: 4 !important; + } + + .order-md-5 { + order: 5 !important; + } + + .order-md-last { + order: 6 !important; + } + + .m-md-0 { + margin: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-md-0 { + margin-top: 0 !important; + } + + .mt-md-1 { + margin-top: 0.25rem !important; + } + + .mt-md-2 { + margin-top: 0.5rem !important; + } + + .mt-md-3 { + margin-top: 1rem !important; + } + + .mt-md-4 { + margin-top: 1.5rem !important; + } + + .mt-md-5 { + margin-top: 3rem !important; + } + + .mt-md-auto { + margin-top: auto !important; + } + + .me-md-0 { + margin-right: 0 !important; + } + + .me-md-1 { + margin-right: 0.25rem !important; + } + + .me-md-2 { + margin-right: 0.5rem !important; + } + + .me-md-3 { + margin-right: 1rem !important; + } + + .me-md-4 { + margin-right: 1.5rem !important; + } + + .me-md-5 { + margin-right: 3rem !important; + } + + .me-md-auto { + margin-right: auto !important; + } + + .mb-md-0 { + margin-bottom: 0 !important; + } + + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + + .mb-md-3 { + margin-bottom: 1rem !important; + } + + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + + .mb-md-5 { + margin-bottom: 3rem !important; + } + + .mb-md-auto { + margin-bottom: auto !important; + } + + .ms-md-0 { + margin-left: 0 !important; + } + + .ms-md-1 { + margin-left: 0.25rem !important; + } + + .ms-md-2 { + margin-left: 0.5rem !important; + } + + .ms-md-3 { + margin-left: 1rem !important; + } + + .ms-md-4 { + margin-left: 1.5rem !important; + } + + .ms-md-5 { + margin-left: 3rem !important; + } + + .ms-md-auto { + margin-left: auto !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-md-0 { + padding-top: 0 !important; + } + + .pt-md-1 { + padding-top: 0.25rem !important; + } + + .pt-md-2 { + padding-top: 0.5rem !important; + } + + .pt-md-3 { + padding-top: 1rem !important; + } + + .pt-md-4 { + padding-top: 1.5rem !important; + } + + .pt-md-5 { + padding-top: 3rem !important; + } + + .pe-md-0 { + padding-right: 0 !important; + } + + .pe-md-1 { + padding-right: 0.25rem !important; + } + + .pe-md-2 { + padding-right: 0.5rem !important; + } + + .pe-md-3 { + padding-right: 1rem !important; + } + + .pe-md-4 { + padding-right: 1.5rem !important; + } + + .pe-md-5 { + padding-right: 3rem !important; + } + + .pb-md-0 { + padding-bottom: 0 !important; + } + + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + + .pb-md-3 { + padding-bottom: 1rem !important; + } + + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + + .pb-md-5 { + padding-bottom: 3rem !important; + } + + .ps-md-0 { + padding-left: 0 !important; + } + + .ps-md-1 { + padding-left: 0.25rem !important; + } + + .ps-md-2 { + padding-left: 0.5rem !important; + } + + .ps-md-3 { + padding-left: 1rem !important; + } + + .ps-md-4 { + padding-left: 1.5rem !important; + } + + .ps-md-5 { + padding-left: 3rem !important; + } + + .text-md-start { + text-align: left !important; + } + + .text-md-end { + text-align: right !important; + } + + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + + .float-lg-end { + float: right !important; + } + + .float-lg-none { + float: none !important; + } + + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-grid { + display: grid !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: flex !important; + } + + .d-lg-inline-flex { + display: inline-flex !important; + } + + .d-lg-none { + display: none !important; + } + + .flex-lg-fill { + flex: 1 1 auto !important; + } + + .flex-lg-row { + flex-direction: row !important; + } + + .flex-lg-column { + flex-direction: column !important; + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-lg-wrap { + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-lg-0 { + gap: 0 !important; + } + + .gap-lg-1 { + gap: 0.25rem !important; + } + + .gap-lg-2 { + gap: 0.5rem !important; + } + + .gap-lg-3 { + gap: 1rem !important; + } + + .gap-lg-4 { + gap: 1.5rem !important; + } + + .gap-lg-5 { + gap: 3rem !important; + } + + .justify-content-lg-start { + justify-content: flex-start !important; + } + + .justify-content-lg-end { + justify-content: flex-end !important; + } + + .justify-content-lg-center { + justify-content: center !important; + } + + .justify-content-lg-between { + justify-content: space-between !important; + } + + .justify-content-lg-around { + justify-content: space-around !important; + } + + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + + .align-items-lg-start { + align-items: flex-start !important; + } + + .align-items-lg-end { + align-items: flex-end !important; + } + + .align-items-lg-center { + align-items: center !important; + } + + .align-items-lg-baseline { + align-items: baseline !important; + } + + .align-items-lg-stretch { + align-items: stretch !important; + } + + .align-content-lg-start { + align-content: flex-start !important; + } + + .align-content-lg-end { + align-content: flex-end !important; + } + + .align-content-lg-center { + align-content: center !important; + } + + .align-content-lg-between { + align-content: space-between !important; + } + + .align-content-lg-around { + align-content: space-around !important; + } + + .align-content-lg-stretch { + align-content: stretch !important; + } + + .align-self-lg-auto { + align-self: auto !important; + } + + .align-self-lg-start { + align-self: flex-start !important; + } + + .align-self-lg-end { + align-self: flex-end !important; + } + + .align-self-lg-center { + align-self: center !important; + } + + .align-self-lg-baseline { + align-self: baseline !important; + } + + .align-self-lg-stretch { + align-self: stretch !important; + } + + .order-lg-first { + order: -1 !important; + } + + .order-lg-0 { + order: 0 !important; + } + + .order-lg-1 { + order: 1 !important; + } + + .order-lg-2 { + order: 2 !important; + } + + .order-lg-3 { + order: 3 !important; + } + + .order-lg-4 { + order: 4 !important; + } + + .order-lg-5 { + order: 5 !important; + } + + .order-lg-last { + order: 6 !important; + } + + .m-lg-0 { + margin: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-lg-0 { + margin-top: 0 !important; + } + + .mt-lg-1 { + margin-top: 0.25rem !important; + } + + .mt-lg-2 { + margin-top: 0.5rem !important; + } + + .mt-lg-3 { + margin-top: 1rem !important; + } + + .mt-lg-4 { + margin-top: 1.5rem !important; + } + + .mt-lg-5 { + margin-top: 3rem !important; + } + + .mt-lg-auto { + margin-top: auto !important; + } + + .me-lg-0 { + margin-right: 0 !important; + } + + .me-lg-1 { + margin-right: 0.25rem !important; + } + + .me-lg-2 { + margin-right: 0.5rem !important; + } + + .me-lg-3 { + margin-right: 1rem !important; + } + + .me-lg-4 { + margin-right: 1.5rem !important; + } + + .me-lg-5 { + margin-right: 3rem !important; + } + + .me-lg-auto { + margin-right: auto !important; + } + + .mb-lg-0 { + margin-bottom: 0 !important; + } + + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + + .mb-lg-3 { + margin-bottom: 1rem !important; + } + + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + + .mb-lg-5 { + margin-bottom: 3rem !important; + } + + .mb-lg-auto { + margin-bottom: auto !important; + } + + .ms-lg-0 { + margin-left: 0 !important; + } + + .ms-lg-1 { + margin-left: 0.25rem !important; + } + + .ms-lg-2 { + margin-left: 0.5rem !important; + } + + .ms-lg-3 { + margin-left: 1rem !important; + } + + .ms-lg-4 { + margin-left: 1.5rem !important; + } + + .ms-lg-5 { + margin-left: 3rem !important; + } + + .ms-lg-auto { + margin-left: auto !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-lg-0 { + padding-top: 0 !important; + } + + .pt-lg-1 { + padding-top: 0.25rem !important; + } + + .pt-lg-2 { + padding-top: 0.5rem !important; + } + + .pt-lg-3 { + padding-top: 1rem !important; + } + + .pt-lg-4 { + padding-top: 1.5rem !important; + } + + .pt-lg-5 { + padding-top: 3rem !important; + } + + .pe-lg-0 { + padding-right: 0 !important; + } + + .pe-lg-1 { + padding-right: 0.25rem !important; + } + + .pe-lg-2 { + padding-right: 0.5rem !important; + } + + .pe-lg-3 { + padding-right: 1rem !important; + } + + .pe-lg-4 { + padding-right: 1.5rem !important; + } + + .pe-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-0 { + padding-bottom: 0 !important; + } + + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pb-lg-3 { + padding-bottom: 1rem !important; + } + + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pb-lg-5 { + padding-bottom: 3rem !important; + } + + .ps-lg-0 { + padding-left: 0 !important; + } + + .ps-lg-1 { + padding-left: 0.25rem !important; + } + + .ps-lg-2 { + padding-left: 0.5rem !important; + } + + .ps-lg-3 { + padding-left: 1rem !important; + } + + .ps-lg-4 { + padding-left: 1.5rem !important; + } + + .ps-lg-5 { + padding-left: 3rem !important; + } + + .text-lg-start { + text-align: left !important; + } + + .text-lg-end { + text-align: right !important; + } + + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + + .float-xl-end { + float: right !important; + } + + .float-xl-none { + float: none !important; + } + + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-grid { + display: grid !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: flex !important; + } + + .d-xl-inline-flex { + display: inline-flex !important; + } + + .d-xl-none { + display: none !important; + } + + .flex-xl-fill { + flex: 1 1 auto !important; + } + + .flex-xl-row { + flex-direction: row !important; + } + + .flex-xl-column { + flex-direction: column !important; + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-xl-wrap { + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-xl-0 { + gap: 0 !important; + } + + .gap-xl-1 { + gap: 0.25rem !important; + } + + .gap-xl-2 { + gap: 0.5rem !important; + } + + .gap-xl-3 { + gap: 1rem !important; + } + + .gap-xl-4 { + gap: 1.5rem !important; + } + + .gap-xl-5 { + gap: 3rem !important; + } + + .justify-content-xl-start { + justify-content: flex-start !important; + } + + .justify-content-xl-end { + justify-content: flex-end !important; + } + + .justify-content-xl-center { + justify-content: center !important; + } + + .justify-content-xl-between { + justify-content: space-between !important; + } + + .justify-content-xl-around { + justify-content: space-around !important; + } + + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + + .align-items-xl-start { + align-items: flex-start !important; + } + + .align-items-xl-end { + align-items: flex-end !important; + } + + .align-items-xl-center { + align-items: center !important; + } + + .align-items-xl-baseline { + align-items: baseline !important; + } + + .align-items-xl-stretch { + align-items: stretch !important; + } + + .align-content-xl-start { + align-content: flex-start !important; + } + + .align-content-xl-end { + align-content: flex-end !important; + } + + .align-content-xl-center { + align-content: center !important; + } + + .align-content-xl-between { + align-content: space-between !important; + } + + .align-content-xl-around { + align-content: space-around !important; + } + + .align-content-xl-stretch { + align-content: stretch !important; + } + + .align-self-xl-auto { + align-self: auto !important; + } + + .align-self-xl-start { + align-self: flex-start !important; + } + + .align-self-xl-end { + align-self: flex-end !important; + } + + .align-self-xl-center { + align-self: center !important; + } + + .align-self-xl-baseline { + align-self: baseline !important; + } + + .align-self-xl-stretch { + align-self: stretch !important; + } + + .order-xl-first { + order: -1 !important; + } + + .order-xl-0 { + order: 0 !important; + } + + .order-xl-1 { + order: 1 !important; + } + + .order-xl-2 { + order: 2 !important; + } + + .order-xl-3 { + order: 3 !important; + } + + .order-xl-4 { + order: 4 !important; + } + + .order-xl-5 { + order: 5 !important; + } + + .order-xl-last { + order: 6 !important; + } + + .m-xl-0 { + margin: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-xl-0 { + margin-top: 0 !important; + } + + .mt-xl-1 { + margin-top: 0.25rem !important; + } + + .mt-xl-2 { + margin-top: 0.5rem !important; + } + + .mt-xl-3 { + margin-top: 1rem !important; + } + + .mt-xl-4 { + margin-top: 1.5rem !important; + } + + .mt-xl-5 { + margin-top: 3rem !important; + } + + .mt-xl-auto { + margin-top: auto !important; + } + + .me-xl-0 { + margin-right: 0 !important; + } + + .me-xl-1 { + margin-right: 0.25rem !important; + } + + .me-xl-2 { + margin-right: 0.5rem !important; + } + + .me-xl-3 { + margin-right: 1rem !important; + } + + .me-xl-4 { + margin-right: 1.5rem !important; + } + + .me-xl-5 { + margin-right: 3rem !important; + } + + .me-xl-auto { + margin-right: auto !important; + } + + .mb-xl-0 { + margin-bottom: 0 !important; + } + + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + + .mb-xl-3 { + margin-bottom: 1rem !important; + } + + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + + .mb-xl-5 { + margin-bottom: 3rem !important; + } + + .mb-xl-auto { + margin-bottom: auto !important; + } + + .ms-xl-0 { + margin-left: 0 !important; + } + + .ms-xl-1 { + margin-left: 0.25rem !important; + } + + .ms-xl-2 { + margin-left: 0.5rem !important; + } + + .ms-xl-3 { + margin-left: 1rem !important; + } + + .ms-xl-4 { + margin-left: 1.5rem !important; + } + + .ms-xl-5 { + margin-left: 3rem !important; + } + + .ms-xl-auto { + margin-left: auto !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-xl-0 { + padding-top: 0 !important; + } + + .pt-xl-1 { + padding-top: 0.25rem !important; + } + + .pt-xl-2 { + padding-top: 0.5rem !important; + } + + .pt-xl-3 { + padding-top: 1rem !important; + } + + .pt-xl-4 { + padding-top: 1.5rem !important; + } + + .pt-xl-5 { + padding-top: 3rem !important; + } + + .pe-xl-0 { + padding-right: 0 !important; + } + + .pe-xl-1 { + padding-right: 0.25rem !important; + } + + .pe-xl-2 { + padding-right: 0.5rem !important; + } + + .pe-xl-3 { + padding-right: 1rem !important; + } + + .pe-xl-4 { + padding-right: 1.5rem !important; + } + + .pe-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-0 { + padding-bottom: 0 !important; + } + + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pb-xl-3 { + padding-bottom: 1rem !important; + } + + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pb-xl-5 { + padding-bottom: 3rem !important; + } + + .ps-xl-0 { + padding-left: 0 !important; + } + + .ps-xl-1 { + padding-left: 0.25rem !important; + } + + .ps-xl-2 { + padding-left: 0.5rem !important; + } + + .ps-xl-3 { + padding-left: 1rem !important; + } + + .ps-xl-4 { + padding-left: 1.5rem !important; + } + + .ps-xl-5 { + padding-left: 3rem !important; + } + + .text-xl-start { + text-align: left !important; + } + + .text-xl-end { + text-align: right !important; + } + + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + + .float-xxl-end { + float: right !important; + } + + .float-xxl-none { + float: none !important; + } + + .d-xxl-inline { + display: inline !important; + } + + .d-xxl-inline-block { + display: inline-block !important; + } + + .d-xxl-block { + display: block !important; + } + + .d-xxl-grid { + display: grid !important; + } + + .d-xxl-table { + display: table !important; + } + + .d-xxl-table-row { + display: table-row !important; + } + + .d-xxl-table-cell { + display: table-cell !important; + } + + .d-xxl-flex { + display: flex !important; + } + + .d-xxl-inline-flex { + display: inline-flex !important; + } + + .d-xxl-none { + display: none !important; + } + + .flex-xxl-fill { + flex: 1 1 auto !important; + } + + .flex-xxl-row { + flex-direction: row !important; + } + + .flex-xxl-column { + flex-direction: column !important; + } + + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-xxl-0 { + gap: 0 !important; + } + + .gap-xxl-1 { + gap: 0.25rem !important; + } + + .gap-xxl-2 { + gap: 0.5rem !important; + } + + .gap-xxl-3 { + gap: 1rem !important; + } + + .gap-xxl-4 { + gap: 1.5rem !important; + } + + .gap-xxl-5 { + gap: 3rem !important; + } + + .justify-content-xxl-start { + justify-content: flex-start !important; + } + + .justify-content-xxl-end { + justify-content: flex-end !important; + } + + .justify-content-xxl-center { + justify-content: center !important; + } + + .justify-content-xxl-between { + justify-content: space-between !important; + } + + .justify-content-xxl-around { + justify-content: space-around !important; + } + + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + + .align-items-xxl-start { + align-items: flex-start !important; + } + + .align-items-xxl-end { + align-items: flex-end !important; + } + + .align-items-xxl-center { + align-items: center !important; + } + + .align-items-xxl-baseline { + align-items: baseline !important; + } + + .align-items-xxl-stretch { + align-items: stretch !important; + } + + .align-content-xxl-start { + align-content: flex-start !important; + } + + .align-content-xxl-end { + align-content: flex-end !important; + } + + .align-content-xxl-center { + align-content: center !important; + } + + .align-content-xxl-between { + align-content: space-between !important; + } + + .align-content-xxl-around { + align-content: space-around !important; + } + + .align-content-xxl-stretch { + align-content: stretch !important; + } + + .align-self-xxl-auto { + align-self: auto !important; + } + + .align-self-xxl-start { + align-self: flex-start !important; + } + + .align-self-xxl-end { + align-self: flex-end !important; + } + + .align-self-xxl-center { + align-self: center !important; + } + + .align-self-xxl-baseline { + align-self: baseline !important; + } + + .align-self-xxl-stretch { + align-self: stretch !important; + } + + .order-xxl-first { + order: -1 !important; + } + + .order-xxl-0 { + order: 0 !important; + } + + .order-xxl-1 { + order: 1 !important; + } + + .order-xxl-2 { + order: 2 !important; + } + + .order-xxl-3 { + order: 3 !important; + } + + .order-xxl-4 { + order: 4 !important; + } + + .order-xxl-5 { + order: 5 !important; + } + + .order-xxl-last { + order: 6 !important; + } + + .m-xxl-0 { + margin: 0 !important; + } + + .m-xxl-1 { + margin: 0.25rem !important; + } + + .m-xxl-2 { + margin: 0.5rem !important; + } + + .m-xxl-3 { + margin: 1rem !important; + } + + .m-xxl-4 { + margin: 1.5rem !important; + } + + .m-xxl-5 { + margin: 3rem !important; + } + + .m-xxl-auto { + margin: auto !important; + } + + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-xxl-0 { + margin-top: 0 !important; + } + + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + + .mt-xxl-3 { + margin-top: 1rem !important; + } + + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + + .mt-xxl-5 { + margin-top: 3rem !important; + } + + .mt-xxl-auto { + margin-top: auto !important; + } + + .me-xxl-0 { + margin-right: 0 !important; + } + + .me-xxl-1 { + margin-right: 0.25rem !important; + } + + .me-xxl-2 { + margin-right: 0.5rem !important; + } + + .me-xxl-3 { + margin-right: 1rem !important; + } + + .me-xxl-4 { + margin-right: 1.5rem !important; + } + + .me-xxl-5 { + margin-right: 3rem !important; + } + + .me-xxl-auto { + margin-right: auto !important; + } + + .mb-xxl-0 { + margin-bottom: 0 !important; + } + + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + + .mb-xxl-auto { + margin-bottom: auto !important; + } + + .ms-xxl-0 { + margin-left: 0 !important; + } + + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + + .ms-xxl-3 { + margin-left: 1rem !important; + } + + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + + .ms-xxl-5 { + margin-left: 3rem !important; + } + + .ms-xxl-auto { + margin-left: auto !important; + } + + .p-xxl-0 { + padding: 0 !important; + } + + .p-xxl-1 { + padding: 0.25rem !important; + } + + .p-xxl-2 { + padding: 0.5rem !important; + } + + .p-xxl-3 { + padding: 1rem !important; + } + + .p-xxl-4 { + padding: 1.5rem !important; + } + + .p-xxl-5 { + padding: 3rem !important; + } + + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-xxl-0 { + padding-top: 0 !important; + } + + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + + .pt-xxl-3 { + padding-top: 1rem !important; + } + + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + + .pt-xxl-5 { + padding-top: 3rem !important; + } + + .pe-xxl-0 { + padding-right: 0 !important; + } + + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + + .pe-xxl-3 { + padding-right: 1rem !important; + } + + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + + .pe-xxl-5 { + padding-right: 3rem !important; + } + + .pb-xxl-0 { + padding-bottom: 0 !important; + } + + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + + .ps-xxl-0 { + padding-left: 0 !important; + } + + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + + .ps-xxl-3 { + padding-left: 1rem !important; + } + + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + + .ps-xxl-5 { + padding-left: 3rem !important; + } + + .text-xxl-start { + text-align: left !important; + } + + .text-xxl-end { + text-align: right !important; + } + + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + + .fs-2 { + font-size: 2rem !important; + } + + .fs-3 { + font-size: 1.75rem !important; + } + + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-grid { + display: grid !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: flex !important; + } + + .d-print-inline-flex { + display: inline-flex !important; + } + + .d-print-none { + display: none !important; + } +} +/*! + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fad, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; +} + +.fa-lg { + font-size: 1.3333333333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.fa-xs { + font-size: 0.75em; +} + +.fa-sm { + font-size: 0.875em; +} + +.fa-1x { + font-size: 1em; +} + +.fa-2x { + font-size: 2em; +} + +.fa-3x { + font-size: 3em; +} + +.fa-4x { + font-size: 4em; +} + +.fa-5x { + font-size: 5em; +} + +.fa-6x { + font-size: 6em; +} + +.fa-7x { + font-size: 7em; +} + +.fa-8x { + font-size: 8em; +} + +.fa-9x { + font-size: 9em; +} + +.fa-10x { + font-size: 10em; +} + +.fa-fw { + text-align: center; + width: 1.25em; +} + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; +} +.fa-ul > li { + position: relative; +} + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; +} + +.fa-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.fa-pull-left { + float: left; +} + +.fa-pull-right { + float: right; +} + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: 0.3em; +} +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: 0.3em; +} + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +@keyframes fa-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + transform: rotate(90deg); +} + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + transform: rotate(180deg); +} + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + transform: rotate(270deg); +} + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + transform: scale(-1, 1); +} + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + transform: scale(1, -1); +} + +.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + transform: scale(-1, -1); +} + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical, +:root .fa-flip-both { + filter: none; +} + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; +} + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; +} + +.fa-stack-1x { + line-height: inherit; +} + +.fa-stack-2x { + font-size: 2em; +} + +.fa-inverse { + color: #fff; +} + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; +} + +.fa-accessible-icon:before { + content: "\f368"; +} + +.fa-accusoft:before { + content: "\f369"; +} + +.fa-acquisitions-incorporated:before { + content: "\f6af"; +} + +.fa-ad:before { + content: "\f641"; +} + +.fa-address-book:before { + content: "\f2b9"; +} + +.fa-address-card:before { + content: "\f2bb"; +} + +.fa-adjust:before { + content: "\f042"; +} + +.fa-adn:before { + content: "\f170"; +} + +.fa-adversal:before { + content: "\f36a"; +} + +.fa-affiliatetheme:before { + content: "\f36b"; +} + +.fa-air-freshener:before { + content: "\f5d0"; +} + +.fa-airbnb:before { + content: "\f834"; +} + +.fa-algolia:before { + content: "\f36c"; +} + +.fa-align-center:before { + content: "\f037"; +} + +.fa-align-justify:before { + content: "\f039"; +} + +.fa-align-left:before { + content: "\f036"; +} + +.fa-align-right:before { + content: "\f038"; +} + +.fa-alipay:before { + content: "\f642"; +} + +.fa-allergies:before { + content: "\f461"; +} + +.fa-amazon:before { + content: "\f270"; +} + +.fa-amazon-pay:before { + content: "\f42c"; +} + +.fa-ambulance:before { + content: "\f0f9"; +} + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} + +.fa-amilia:before { + content: "\f36d"; +} + +.fa-anchor:before { + content: "\f13d"; +} + +.fa-android:before { + content: "\f17b"; +} + +.fa-angellist:before { + content: "\f209"; +} + +.fa-angle-double-down:before { + content: "\f103"; +} + +.fa-angle-double-left:before { + content: "\f100"; +} + +.fa-angle-double-right:before { + content: "\f101"; +} + +.fa-angle-double-up:before { + content: "\f102"; +} + +.fa-angle-down:before { + content: "\f107"; +} + +.fa-angle-left:before { + content: "\f104"; +} + +.fa-angle-right:before { + content: "\f105"; +} + +.fa-angle-up:before { + content: "\f106"; +} + +.fa-angry:before { + content: "\f556"; +} + +.fa-angrycreative:before { + content: "\f36e"; +} + +.fa-angular:before { + content: "\f420"; +} + +.fa-ankh:before { + content: "\f644"; +} + +.fa-app-store:before { + content: "\f36f"; +} + +.fa-app-store-ios:before { + content: "\f370"; +} + +.fa-apper:before { + content: "\f371"; +} + +.fa-apple:before { + content: "\f179"; +} + +.fa-apple-alt:before { + content: "\f5d1"; +} + +.fa-apple-pay:before { + content: "\f415"; +} + +.fa-archive:before { + content: "\f187"; +} + +.fa-archway:before { + content: "\f557"; +} + +.fa-arrow-alt-circle-down:before { + content: "\f358"; +} + +.fa-arrow-alt-circle-left:before { + content: "\f359"; +} + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; +} + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; +} + +.fa-arrow-circle-down:before { + content: "\f0ab"; +} + +.fa-arrow-circle-left:before { + content: "\f0a8"; +} + +.fa-arrow-circle-right:before { + content: "\f0a9"; +} + +.fa-arrow-circle-up:before { + content: "\f0aa"; +} + +.fa-arrow-down:before { + content: "\f063"; +} + +.fa-arrow-left:before { + content: "\f060"; +} + +.fa-arrow-right:before { + content: "\f061"; +} + +.fa-arrow-up:before { + content: "\f062"; +} + +.fa-arrows-alt:before { + content: "\f0b2"; +} + +.fa-arrows-alt-h:before { + content: "\f337"; +} + +.fa-arrows-alt-v:before { + content: "\f338"; +} + +.fa-artstation:before { + content: "\f77a"; +} + +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} + +.fa-asterisk:before { + content: "\f069"; +} + +.fa-asymmetrik:before { + content: "\f372"; +} + +.fa-at:before { + content: "\f1fa"; +} + +.fa-atlas:before { + content: "\f558"; +} + +.fa-atlassian:before { + content: "\f77b"; +} + +.fa-atom:before { + content: "\f5d2"; +} + +.fa-audible:before { + content: "\f373"; +} + +.fa-audio-description:before { + content: "\f29e"; +} + +.fa-autoprefixer:before { + content: "\f41c"; +} + +.fa-avianex:before { + content: "\f374"; +} + +.fa-aviato:before { + content: "\f421"; +} + +.fa-award:before { + content: "\f559"; +} + +.fa-aws:before { + content: "\f375"; +} + +.fa-baby:before { + content: "\f77c"; +} + +.fa-baby-carriage:before { + content: "\f77d"; +} + +.fa-backspace:before { + content: "\f55a"; +} + +.fa-backward:before { + content: "\f04a"; +} + +.fa-bacon:before { + content: "\f7e5"; +} + +.fa-bacteria:before { + content: "\e059"; +} + +.fa-bacterium:before { + content: "\e05a"; +} + +.fa-bahai:before { + content: "\f666"; +} + +.fa-balance-scale:before { + content: "\f24e"; +} + +.fa-balance-scale-left:before { + content: "\f515"; +} + +.fa-balance-scale-right:before { + content: "\f516"; +} + +.fa-ban:before { + content: "\f05e"; +} + +.fa-band-aid:before { + content: "\f462"; +} + +.fa-bandcamp:before { + content: "\f2d5"; +} + +.fa-barcode:before { + content: "\f02a"; +} + +.fa-bars:before { + content: "\f0c9"; +} + +.fa-baseball-ball:before { + content: "\f433"; +} + +.fa-basketball-ball:before { + content: "\f434"; +} + +.fa-bath:before { + content: "\f2cd"; +} + +.fa-battery-empty:before { + content: "\f244"; +} + +.fa-battery-full:before { + content: "\f240"; +} + +.fa-battery-half:before { + content: "\f242"; +} + +.fa-battery-quarter:before { + content: "\f243"; +} + +.fa-battery-three-quarters:before { + content: "\f241"; +} + +.fa-battle-net:before { + content: "\f835"; +} + +.fa-bed:before { + content: "\f236"; +} + +.fa-beer:before { + content: "\f0fc"; +} + +.fa-behance:before { + content: "\f1b4"; +} + +.fa-behance-square:before { + content: "\f1b5"; +} + +.fa-bell:before { + content: "\f0f3"; +} + +.fa-bell-slash:before { + content: "\f1f6"; +} + +.fa-bezier-curve:before { + content: "\f55b"; +} + +.fa-bible:before { + content: "\f647"; +} + +.fa-bicycle:before { + content: "\f206"; +} + +.fa-biking:before { + content: "\f84a"; +} + +.fa-bimobject:before { + content: "\f378"; +} + +.fa-binoculars:before { + content: "\f1e5"; +} + +.fa-biohazard:before { + content: "\f780"; +} + +.fa-birthday-cake:before { + content: "\f1fd"; +} + +.fa-bitbucket:before { + content: "\f171"; +} + +.fa-bitcoin:before { + content: "\f379"; +} + +.fa-bity:before { + content: "\f37a"; +} + +.fa-black-tie:before { + content: "\f27e"; +} + +.fa-blackberry:before { + content: "\f37b"; +} + +.fa-blender:before { + content: "\f517"; +} + +.fa-blender-phone:before { + content: "\f6b6"; +} + +.fa-blind:before { + content: "\f29d"; +} + +.fa-blog:before { + content: "\f781"; +} + +.fa-blogger:before { + content: "\f37c"; +} + +.fa-blogger-b:before { + content: "\f37d"; +} + +.fa-bluetooth:before { + content: "\f293"; +} + +.fa-bluetooth-b:before { + content: "\f294"; +} + +.fa-bold:before { + content: "\f032"; +} + +.fa-bolt:before { + content: "\f0e7"; +} + +.fa-bomb:before { + content: "\f1e2"; +} + +.fa-bone:before { + content: "\f5d7"; +} + +.fa-bong:before { + content: "\f55c"; +} + +.fa-book:before { + content: "\f02d"; +} + +.fa-book-dead:before { + content: "\f6b7"; +} + +.fa-book-medical:before { + content: "\f7e6"; +} + +.fa-book-open:before { + content: "\f518"; +} + +.fa-book-reader:before { + content: "\f5da"; +} + +.fa-bookmark:before { + content: "\f02e"; +} + +.fa-bootstrap:before { + content: "\f836"; +} + +.fa-border-all:before { + content: "\f84c"; +} + +.fa-border-none:before { + content: "\f850"; +} + +.fa-border-style:before { + content: "\f853"; +} + +.fa-bowling-ball:before { + content: "\f436"; +} + +.fa-box:before { + content: "\f466"; +} + +.fa-box-open:before { + content: "\f49e"; +} + +.fa-box-tissue:before { + content: "\e05b"; +} + +.fa-boxes:before { + content: "\f468"; +} + +.fa-braille:before { + content: "\f2a1"; +} + +.fa-brain:before { + content: "\f5dc"; +} + +.fa-bread-slice:before { + content: "\f7ec"; +} + +.fa-briefcase:before { + content: "\f0b1"; +} + +.fa-briefcase-medical:before { + content: "\f469"; +} + +.fa-broadcast-tower:before { + content: "\f519"; +} + +.fa-broom:before { + content: "\f51a"; +} + +.fa-brush:before { + content: "\f55d"; +} + +.fa-btc:before { + content: "\f15a"; +} + +.fa-buffer:before { + content: "\f837"; +} + +.fa-bug:before { + content: "\f188"; +} + +.fa-building:before { + content: "\f1ad"; +} + +.fa-bullhorn:before { + content: "\f0a1"; +} + +.fa-bullseye:before { + content: "\f140"; +} + +.fa-burn:before { + content: "\f46a"; +} + +.fa-buromobelexperte:before { + content: "\f37f"; +} + +.fa-bus:before { + content: "\f207"; +} + +.fa-bus-alt:before { + content: "\f55e"; +} + +.fa-business-time:before { + content: "\f64a"; +} + +.fa-buy-n-large:before { + content: "\f8a6"; +} + +.fa-buysellads:before { + content: "\f20d"; +} + +.fa-calculator:before { + content: "\f1ec"; +} + +.fa-calendar:before { + content: "\f133"; +} + +.fa-calendar-alt:before { + content: "\f073"; +} + +.fa-calendar-check:before { + content: "\f274"; +} + +.fa-calendar-day:before { + content: "\f783"; +} + +.fa-calendar-minus:before { + content: "\f272"; +} + +.fa-calendar-plus:before { + content: "\f271"; +} + +.fa-calendar-times:before { + content: "\f273"; +} + +.fa-calendar-week:before { + content: "\f784"; +} + +.fa-camera:before { + content: "\f030"; +} + +.fa-camera-retro:before { + content: "\f083"; +} + +.fa-campground:before { + content: "\f6bb"; +} + +.fa-canadian-maple-leaf:before { + content: "\f785"; +} + +.fa-candy-cane:before { + content: "\f786"; +} + +.fa-cannabis:before { + content: "\f55f"; +} + +.fa-capsules:before { + content: "\f46b"; +} + +.fa-car:before { + content: "\f1b9"; +} + +.fa-car-alt:before { + content: "\f5de"; +} + +.fa-car-battery:before { + content: "\f5df"; +} + +.fa-car-crash:before { + content: "\f5e1"; +} + +.fa-car-side:before { + content: "\f5e4"; +} + +.fa-caravan:before { + content: "\f8ff"; +} + +.fa-caret-down:before { + content: "\f0d7"; +} + +.fa-caret-left:before { + content: "\f0d9"; +} + +.fa-caret-right:before { + content: "\f0da"; +} + +.fa-caret-square-down:before { + content: "\f150"; +} + +.fa-caret-square-left:before { + content: "\f191"; +} + +.fa-caret-square-right:before { + content: "\f152"; +} + +.fa-caret-square-up:before { + content: "\f151"; +} + +.fa-caret-up:before { + content: "\f0d8"; +} + +.fa-carrot:before { + content: "\f787"; +} + +.fa-cart-arrow-down:before { + content: "\f218"; +} + +.fa-cart-plus:before { + content: "\f217"; +} + +.fa-cash-register:before { + content: "\f788"; +} + +.fa-cat:before { + content: "\f6be"; +} + +.fa-cc-amazon-pay:before { + content: "\f42d"; +} + +.fa-cc-amex:before { + content: "\f1f3"; +} + +.fa-cc-apple-pay:before { + content: "\f416"; +} + +.fa-cc-diners-club:before { + content: "\f24c"; +} + +.fa-cc-discover:before { + content: "\f1f2"; +} + +.fa-cc-jcb:before { + content: "\f24b"; +} + +.fa-cc-mastercard:before { + content: "\f1f1"; +} + +.fa-cc-paypal:before { + content: "\f1f4"; +} + +.fa-cc-stripe:before { + content: "\f1f5"; +} + +.fa-cc-visa:before { + content: "\f1f0"; +} + +.fa-centercode:before { + content: "\f380"; +} + +.fa-centos:before { + content: "\f789"; +} + +.fa-certificate:before { + content: "\f0a3"; +} + +.fa-chair:before { + content: "\f6c0"; +} + +.fa-chalkboard:before { + content: "\f51b"; +} + +.fa-chalkboard-teacher:before { + content: "\f51c"; +} + +.fa-charging-station:before { + content: "\f5e7"; +} + +.fa-chart-area:before { + content: "\f1fe"; +} + +.fa-chart-bar:before { + content: "\f080"; +} + +.fa-chart-line:before { + content: "\f201"; +} + +.fa-chart-pie:before { + content: "\f200"; +} + +.fa-check:before { + content: "\f00c"; +} + +.fa-check-circle:before { + content: "\f058"; +} + +.fa-check-double:before { + content: "\f560"; +} + +.fa-check-square:before { + content: "\f14a"; +} + +.fa-cheese:before { + content: "\f7ef"; +} + +.fa-chess:before { + content: "\f439"; +} + +.fa-chess-bishop:before { + content: "\f43a"; +} + +.fa-chess-board:before { + content: "\f43c"; +} + +.fa-chess-king:before { + content: "\f43f"; +} + +.fa-chess-knight:before { + content: "\f441"; +} + +.fa-chess-pawn:before { + content: "\f443"; +} + +.fa-chess-queen:before { + content: "\f445"; +} + +.fa-chess-rook:before { + content: "\f447"; +} + +.fa-chevron-circle-down:before { + content: "\f13a"; +} + +.fa-chevron-circle-left:before { + content: "\f137"; +} + +.fa-chevron-circle-right:before { + content: "\f138"; +} + +.fa-chevron-circle-up:before { + content: "\f139"; +} + +.fa-chevron-down:before { + content: "\f078"; +} + +.fa-chevron-left:before { + content: "\f053"; +} + +.fa-chevron-right:before { + content: "\f054"; +} + +.fa-chevron-up:before { + content: "\f077"; +} + +.fa-child:before { + content: "\f1ae"; +} + +.fa-chrome:before { + content: "\f268"; +} + +.fa-chromecast:before { + content: "\f838"; +} + +.fa-church:before { + content: "\f51d"; +} + +.fa-circle:before { + content: "\f111"; +} + +.fa-circle-notch:before { + content: "\f1ce"; +} + +.fa-city:before { + content: "\f64f"; +} + +.fa-clinic-medical:before { + content: "\f7f2"; +} + +.fa-clipboard:before { + content: "\f328"; +} + +.fa-clipboard-check:before { + content: "\f46c"; +} + +.fa-clipboard-list:before { + content: "\f46d"; +} + +.fa-clock:before { + content: "\f017"; +} + +.fa-clone:before { + content: "\f24d"; +} + +.fa-closed-captioning:before { + content: "\f20a"; +} + +.fa-cloud:before { + content: "\f0c2"; +} + +.fa-cloud-download-alt:before { + content: "\f381"; +} + +.fa-cloud-meatball:before { + content: "\f73b"; +} + +.fa-cloud-moon:before { + content: "\f6c3"; +} + +.fa-cloud-moon-rain:before { + content: "\f73c"; +} + +.fa-cloud-rain:before { + content: "\f73d"; +} + +.fa-cloud-showers-heavy:before { + content: "\f740"; +} + +.fa-cloud-sun:before { + content: "\f6c4"; +} + +.fa-cloud-sun-rain:before { + content: "\f743"; +} + +.fa-cloud-upload-alt:before { + content: "\f382"; +} + +.fa-cloudflare:before { + content: "\e07d"; +} + +.fa-cloudscale:before { + content: "\f383"; +} + +.fa-cloudsmith:before { + content: "\f384"; +} + +.fa-cloudversify:before { + content: "\f385"; +} + +.fa-cocktail:before { + content: "\f561"; +} + +.fa-code:before { + content: "\f121"; +} + +.fa-code-branch:before { + content: "\f126"; +} + +.fa-codepen:before { + content: "\f1cb"; +} + +.fa-codiepie:before { + content: "\f284"; +} + +.fa-coffee:before { + content: "\f0f4"; +} + +.fa-cog:before { + content: "\f013"; +} + +.fa-cogs:before { + content: "\f085"; +} + +.fa-coins:before { + content: "\f51e"; +} + +.fa-columns:before { + content: "\f0db"; +} + +.fa-comment:before { + content: "\f075"; +} + +.fa-comment-alt:before { + content: "\f27a"; +} + +.fa-comment-dollar:before { + content: "\f651"; +} + +.fa-comment-dots:before { + content: "\f4ad"; +} + +.fa-comment-medical:before { + content: "\f7f5"; +} + +.fa-comment-slash:before { + content: "\f4b3"; +} + +.fa-comments:before { + content: "\f086"; +} + +.fa-comments-dollar:before { + content: "\f653"; +} + +.fa-compact-disc:before { + content: "\f51f"; +} + +.fa-compass:before { + content: "\f14e"; +} + +.fa-compress:before { + content: "\f066"; +} + +.fa-compress-alt:before { + content: "\f422"; +} + +.fa-compress-arrows-alt:before { + content: "\f78c"; +} + +.fa-concierge-bell:before { + content: "\f562"; +} + +.fa-confluence:before { + content: "\f78d"; +} + +.fa-connectdevelop:before { + content: "\f20e"; +} + +.fa-contao:before { + content: "\f26d"; +} + +.fa-cookie:before { + content: "\f563"; +} + +.fa-cookie-bite:before { + content: "\f564"; +} + +.fa-copy:before { + content: "\f0c5"; +} + +.fa-copyright:before { + content: "\f1f9"; +} + +.fa-cotton-bureau:before { + content: "\f89e"; +} + +.fa-couch:before { + content: "\f4b8"; +} + +.fa-cpanel:before { + content: "\f388"; +} + +.fa-creative-commons:before { + content: "\f25e"; +} + +.fa-creative-commons-by:before { + content: "\f4e7"; +} + +.fa-creative-commons-nc:before { + content: "\f4e8"; +} + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; +} + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; +} + +.fa-creative-commons-nd:before { + content: "\f4eb"; +} + +.fa-creative-commons-pd:before { + content: "\f4ec"; +} + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; +} + +.fa-creative-commons-remix:before { + content: "\f4ee"; +} + +.fa-creative-commons-sa:before { + content: "\f4ef"; +} + +.fa-creative-commons-sampling:before { + content: "\f4f0"; +} + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; +} + +.fa-creative-commons-share:before { + content: "\f4f2"; +} + +.fa-creative-commons-zero:before { + content: "\f4f3"; +} + +.fa-credit-card:before { + content: "\f09d"; +} + +.fa-critical-role:before { + content: "\f6c9"; +} + +.fa-crop:before { + content: "\f125"; +} + +.fa-crop-alt:before { + content: "\f565"; +} + +.fa-cross:before { + content: "\f654"; +} + +.fa-crosshairs:before { + content: "\f05b"; +} + +.fa-crow:before { + content: "\f520"; +} + +.fa-crown:before { + content: "\f521"; +} + +.fa-crutch:before { + content: "\f7f7"; +} + +.fa-css3:before { + content: "\f13c"; +} + +.fa-css3-alt:before { + content: "\f38b"; +} + +.fa-cube:before { + content: "\f1b2"; +} + +.fa-cubes:before { + content: "\f1b3"; +} + +.fa-cut:before { + content: "\f0c4"; +} + +.fa-cuttlefish:before { + content: "\f38c"; +} + +.fa-d-and-d:before { + content: "\f38d"; +} + +.fa-d-and-d-beyond:before { + content: "\f6ca"; +} + +.fa-dailymotion:before { + content: "\e052"; +} + +.fa-dashcube:before { + content: "\f210"; +} + +.fa-database:before { + content: "\f1c0"; +} + +.fa-deaf:before { + content: "\f2a4"; +} + +.fa-deezer:before { + content: "\e077"; +} + +.fa-delicious:before { + content: "\f1a5"; +} + +.fa-democrat:before { + content: "\f747"; +} + +.fa-deploydog:before { + content: "\f38e"; +} + +.fa-deskpro:before { + content: "\f38f"; +} + +.fa-desktop:before { + content: "\f108"; +} + +.fa-dev:before { + content: "\f6cc"; +} + +.fa-deviantart:before { + content: "\f1bd"; +} + +.fa-dharmachakra:before { + content: "\f655"; +} + +.fa-dhl:before { + content: "\f790"; +} + +.fa-diagnoses:before { + content: "\f470"; +} + +.fa-diaspora:before { + content: "\f791"; +} + +.fa-dice:before { + content: "\f522"; +} + +.fa-dice-d20:before { + content: "\f6cf"; +} + +.fa-dice-d6:before { + content: "\f6d1"; +} + +.fa-dice-five:before { + content: "\f523"; +} + +.fa-dice-four:before { + content: "\f524"; +} + +.fa-dice-one:before { + content: "\f525"; +} + +.fa-dice-six:before { + content: "\f526"; +} + +.fa-dice-three:before { + content: "\f527"; +} + +.fa-dice-two:before { + content: "\f528"; +} + +.fa-digg:before { + content: "\f1a6"; +} + +.fa-digital-ocean:before { + content: "\f391"; +} + +.fa-digital-tachograph:before { + content: "\f566"; +} + +.fa-directions:before { + content: "\f5eb"; +} + +.fa-discord:before { + content: "\f392"; +} + +.fa-discourse:before { + content: "\f393"; +} + +.fa-disease:before { + content: "\f7fa"; +} + +.fa-divide:before { + content: "\f529"; +} + +.fa-dizzy:before { + content: "\f567"; +} + +.fa-dna:before { + content: "\f471"; +} + +.fa-dochub:before { + content: "\f394"; +} + +.fa-docker:before { + content: "\f395"; +} + +.fa-dog:before { + content: "\f6d3"; +} + +.fa-dollar-sign:before { + content: "\f155"; +} + +.fa-dolly:before { + content: "\f472"; +} + +.fa-dolly-flatbed:before { + content: "\f474"; +} + +.fa-donate:before { + content: "\f4b9"; +} + +.fa-door-closed:before { + content: "\f52a"; +} + +.fa-door-open:before { + content: "\f52b"; +} + +.fa-dot-circle:before { + content: "\f192"; +} + +.fa-dove:before { + content: "\f4ba"; +} + +.fa-download:before { + content: "\f019"; +} + +.fa-draft2digital:before { + content: "\f396"; +} + +.fa-drafting-compass:before { + content: "\f568"; +} + +.fa-dragon:before { + content: "\f6d5"; +} + +.fa-draw-polygon:before { + content: "\f5ee"; +} + +.fa-dribbble:before { + content: "\f17d"; +} + +.fa-dribbble-square:before { + content: "\f397"; +} + +.fa-dropbox:before { + content: "\f16b"; +} + +.fa-drum:before { + content: "\f569"; +} + +.fa-drum-steelpan:before { + content: "\f56a"; +} + +.fa-drumstick-bite:before { + content: "\f6d7"; +} + +.fa-drupal:before { + content: "\f1a9"; +} + +.fa-dumbbell:before { + content: "\f44b"; +} + +.fa-dumpster:before { + content: "\f793"; +} + +.fa-dumpster-fire:before { + content: "\f794"; +} + +.fa-dungeon:before { + content: "\f6d9"; +} + +.fa-dyalog:before { + content: "\f399"; +} + +.fa-earlybirds:before { + content: "\f39a"; +} + +.fa-ebay:before { + content: "\f4f4"; +} + +.fa-edge:before { + content: "\f282"; +} + +.fa-edge-legacy:before { + content: "\e078"; +} + +.fa-edit:before { + content: "\f044"; +} + +.fa-egg:before { + content: "\f7fb"; +} + +.fa-eject:before { + content: "\f052"; +} + +.fa-elementor:before { + content: "\f430"; +} + +.fa-ellipsis-h:before { + content: "\f141"; +} + +.fa-ellipsis-v:before { + content: "\f142"; +} + +.fa-ello:before { + content: "\f5f1"; +} + +.fa-ember:before { + content: "\f423"; +} + +.fa-empire:before { + content: "\f1d1"; +} + +.fa-envelope:before { + content: "\f0e0"; +} + +.fa-envelope-open:before { + content: "\f2b6"; +} + +.fa-envelope-open-text:before { + content: "\f658"; +} + +.fa-envelope-square:before { + content: "\f199"; +} + +.fa-envira:before { + content: "\f299"; +} + +.fa-equals:before { + content: "\f52c"; +} + +.fa-eraser:before { + content: "\f12d"; +} + +.fa-erlang:before { + content: "\f39d"; +} + +.fa-ethereum:before { + content: "\f42e"; +} + +.fa-ethernet:before { + content: "\f796"; +} + +.fa-etsy:before { + content: "\f2d7"; +} + +.fa-euro-sign:before { + content: "\f153"; +} + +.fa-evernote:before { + content: "\f839"; +} + +.fa-exchange-alt:before { + content: "\f362"; +} + +.fa-exclamation:before { + content: "\f12a"; +} + +.fa-exclamation-circle:before { + content: "\f06a"; +} + +.fa-exclamation-triangle:before { + content: "\f071"; +} + +.fa-expand:before { + content: "\f065"; +} + +.fa-expand-alt:before { + content: "\f424"; +} + +.fa-expand-arrows-alt:before { + content: "\f31e"; +} + +.fa-expeditedssl:before { + content: "\f23e"; +} + +.fa-external-link-alt:before { + content: "\f35d"; +} + +.fa-external-link-square-alt:before { + content: "\f360"; +} + +.fa-eye:before { + content: "\f06e"; +} + +.fa-eye-dropper:before { + content: "\f1fb"; +} + +.fa-eye-slash:before { + content: "\f070"; +} + +.fa-facebook:before { + content: "\f09a"; +} + +.fa-facebook-f:before { + content: "\f39e"; +} + +.fa-facebook-messenger:before { + content: "\f39f"; +} + +.fa-facebook-square:before { + content: "\f082"; +} + +.fa-fan:before { + content: "\f863"; +} + +.fa-fantasy-flight-games:before { + content: "\f6dc"; +} + +.fa-fast-backward:before { + content: "\f049"; +} + +.fa-fast-forward:before { + content: "\f050"; +} + +.fa-faucet:before { + content: "\e005"; +} + +.fa-fax:before { + content: "\f1ac"; +} + +.fa-feather:before { + content: "\f52d"; +} + +.fa-feather-alt:before { + content: "\f56b"; +} + +.fa-fedex:before { + content: "\f797"; +} + +.fa-fedora:before { + content: "\f798"; +} + +.fa-female:before { + content: "\f182"; +} + +.fa-fighter-jet:before { + content: "\f0fb"; +} + +.fa-figma:before { + content: "\f799"; +} + +.fa-file:before { + content: "\f15b"; +} + +.fa-file-alt:before { + content: "\f15c"; +} + +.fa-file-archive:before { + content: "\f1c6"; +} + +.fa-file-audio:before { + content: "\f1c7"; +} + +.fa-file-code:before { + content: "\f1c9"; +} + +.fa-file-contract:before { + content: "\f56c"; +} + +.fa-file-csv:before { + content: "\f6dd"; +} + +.fa-file-download:before { + content: "\f56d"; +} + +.fa-file-excel:before { + content: "\f1c3"; +} + +.fa-file-export:before { + content: "\f56e"; +} + +.fa-file-image:before { + content: "\f1c5"; +} + +.fa-file-import:before { + content: "\f56f"; +} + +.fa-file-invoice:before { + content: "\f570"; +} + +.fa-file-invoice-dollar:before { + content: "\f571"; +} + +.fa-file-medical:before { + content: "\f477"; +} + +.fa-file-medical-alt:before { + content: "\f478"; +} + +.fa-file-pdf:before { + content: "\f1c1"; +} + +.fa-file-powerpoint:before { + content: "\f1c4"; +} + +.fa-file-prescription:before { + content: "\f572"; +} + +.fa-file-signature:before { + content: "\f573"; +} + +.fa-file-upload:before { + content: "\f574"; +} + +.fa-file-video:before { + content: "\f1c8"; +} + +.fa-file-word:before { + content: "\f1c2"; +} + +.fa-fill:before { + content: "\f575"; +} + +.fa-fill-drip:before { + content: "\f576"; +} + +.fa-film:before { + content: "\f008"; +} + +.fa-filter:before { + content: "\f0b0"; +} + +.fa-fingerprint:before { + content: "\f577"; +} + +.fa-fire:before { + content: "\f06d"; +} + +.fa-fire-alt:before { + content: "\f7e4"; +} + +.fa-fire-extinguisher:before { + content: "\f134"; +} + +.fa-firefox:before { + content: "\f269"; +} + +.fa-firefox-browser:before { + content: "\e007"; +} + +.fa-first-aid:before { + content: "\f479"; +} + +.fa-first-order:before { + content: "\f2b0"; +} + +.fa-first-order-alt:before { + content: "\f50a"; +} + +.fa-firstdraft:before { + content: "\f3a1"; +} + +.fa-fish:before { + content: "\f578"; +} + +.fa-fist-raised:before { + content: "\f6de"; +} + +.fa-flag:before { + content: "\f024"; +} + +.fa-flag-checkered:before { + content: "\f11e"; +} + +.fa-flag-usa:before { + content: "\f74d"; +} + +.fa-flask:before { + content: "\f0c3"; +} + +.fa-flickr:before { + content: "\f16e"; +} + +.fa-flipboard:before { + content: "\f44d"; +} + +.fa-flushed:before { + content: "\f579"; +} + +.fa-fly:before { + content: "\f417"; +} + +.fa-folder:before { + content: "\f07b"; +} + +.fa-folder-minus:before { + content: "\f65d"; +} + +.fa-folder-open:before { + content: "\f07c"; +} + +.fa-folder-plus:before { + content: "\f65e"; +} + +.fa-font:before { + content: "\f031"; +} + +.fa-font-awesome:before { + content: "\f2b4"; +} + +.fa-font-awesome-alt:before { + content: "\f35c"; +} + +.fa-font-awesome-flag:before { + content: "\f425"; +} + +.fa-font-awesome-logo-full:before { + content: "\f4e6"; +} + +.fa-fonticons:before { + content: "\f280"; +} + +.fa-fonticons-fi:before { + content: "\f3a2"; +} + +.fa-football-ball:before { + content: "\f44e"; +} + +.fa-fort-awesome:before { + content: "\f286"; +} + +.fa-fort-awesome-alt:before { + content: "\f3a3"; +} + +.fa-forumbee:before { + content: "\f211"; +} + +.fa-forward:before { + content: "\f04e"; +} + +.fa-foursquare:before { + content: "\f180"; +} + +.fa-free-code-camp:before { + content: "\f2c5"; +} + +.fa-freebsd:before { + content: "\f3a4"; +} + +.fa-frog:before { + content: "\f52e"; +} + +.fa-frown:before { + content: "\f119"; +} + +.fa-frown-open:before { + content: "\f57a"; +} + +.fa-fulcrum:before { + content: "\f50b"; +} + +.fa-funnel-dollar:before { + content: "\f662"; +} + +.fa-futbol:before { + content: "\f1e3"; +} + +.fa-galactic-republic:before { + content: "\f50c"; +} + +.fa-galactic-senate:before { + content: "\f50d"; +} + +.fa-gamepad:before { + content: "\f11b"; +} + +.fa-gas-pump:before { + content: "\f52f"; +} + +.fa-gavel:before { + content: "\f0e3"; +} + +.fa-gem:before { + content: "\f3a5"; +} + +.fa-genderless:before { + content: "\f22d"; +} + +.fa-get-pocket:before { + content: "\f265"; +} + +.fa-gg:before { + content: "\f260"; +} + +.fa-gg-circle:before { + content: "\f261"; +} + +.fa-ghost:before { + content: "\f6e2"; +} + +.fa-gift:before { + content: "\f06b"; +} + +.fa-gifts:before { + content: "\f79c"; +} + +.fa-git:before { + content: "\f1d3"; +} + +.fa-git-alt:before { + content: "\f841"; +} + +.fa-git-square:before { + content: "\f1d2"; +} + +.fa-github:before { + content: "\f09b"; +} + +.fa-github-alt:before { + content: "\f113"; +} + +.fa-github-square:before { + content: "\f092"; +} + +.fa-gitkraken:before { + content: "\f3a6"; +} + +.fa-gitlab:before { + content: "\f296"; +} + +.fa-gitter:before { + content: "\f426"; +} + +.fa-glass-cheers:before { + content: "\f79f"; +} + +.fa-glass-martini:before { + content: "\f000"; +} + +.fa-glass-martini-alt:before { + content: "\f57b"; +} + +.fa-glass-whiskey:before { + content: "\f7a0"; +} + +.fa-glasses:before { + content: "\f530"; +} + +.fa-glide:before { + content: "\f2a5"; +} + +.fa-glide-g:before { + content: "\f2a6"; +} + +.fa-globe:before { + content: "\f0ac"; +} + +.fa-globe-africa:before { + content: "\f57c"; +} + +.fa-globe-americas:before { + content: "\f57d"; +} + +.fa-globe-asia:before { + content: "\f57e"; +} + +.fa-globe-europe:before { + content: "\f7a2"; +} + +.fa-gofore:before { + content: "\f3a7"; +} + +.fa-golf-ball:before { + content: "\f450"; +} + +.fa-goodreads:before { + content: "\f3a8"; +} + +.fa-goodreads-g:before { + content: "\f3a9"; +} + +.fa-google:before { + content: "\f1a0"; +} + +.fa-google-drive:before { + content: "\f3aa"; +} + +.fa-google-pay:before { + content: "\e079"; +} + +.fa-google-play:before { + content: "\f3ab"; +} + +.fa-google-plus:before { + content: "\f2b3"; +} + +.fa-google-plus-g:before { + content: "\f0d5"; +} + +.fa-google-plus-square:before { + content: "\f0d4"; +} + +.fa-google-wallet:before { + content: "\f1ee"; +} + +.fa-gopuram:before { + content: "\f664"; +} + +.fa-graduation-cap:before { + content: "\f19d"; +} + +.fa-gratipay:before { + content: "\f184"; +} + +.fa-grav:before { + content: "\f2d6"; +} + +.fa-greater-than:before { + content: "\f531"; +} + +.fa-greater-than-equal:before { + content: "\f532"; +} + +.fa-grimace:before { + content: "\f57f"; +} + +.fa-grin:before { + content: "\f580"; +} + +.fa-grin-alt:before { + content: "\f581"; +} + +.fa-grin-beam:before { + content: "\f582"; +} + +.fa-grin-beam-sweat:before { + content: "\f583"; +} + +.fa-grin-hearts:before { + content: "\f584"; +} + +.fa-grin-squint:before { + content: "\f585"; +} + +.fa-grin-squint-tears:before { + content: "\f586"; +} + +.fa-grin-stars:before { + content: "\f587"; +} + +.fa-grin-tears:before { + content: "\f588"; +} + +.fa-grin-tongue:before { + content: "\f589"; +} + +.fa-grin-tongue-squint:before { + content: "\f58a"; +} + +.fa-grin-tongue-wink:before { + content: "\f58b"; +} + +.fa-grin-wink:before { + content: "\f58c"; +} + +.fa-grip-horizontal:before { + content: "\f58d"; +} + +.fa-grip-lines:before { + content: "\f7a4"; +} + +.fa-grip-lines-vertical:before { + content: "\f7a5"; +} + +.fa-grip-vertical:before { + content: "\f58e"; +} + +.fa-gripfire:before { + content: "\f3ac"; +} + +.fa-grunt:before { + content: "\f3ad"; +} + +.fa-guilded:before { + content: "\e07e"; +} + +.fa-guitar:before { + content: "\f7a6"; +} + +.fa-gulp:before { + content: "\f3ae"; +} + +.fa-h-square:before { + content: "\f0fd"; +} + +.fa-hacker-news:before { + content: "\f1d4"; +} + +.fa-hacker-news-square:before { + content: "\f3af"; +} + +.fa-hackerrank:before { + content: "\f5f7"; +} + +.fa-hamburger:before { + content: "\f805"; +} + +.fa-hammer:before { + content: "\f6e3"; +} + +.fa-hamsa:before { + content: "\f665"; +} + +.fa-hand-holding:before { + content: "\f4bd"; +} + +.fa-hand-holding-heart:before { + content: "\f4be"; +} + +.fa-hand-holding-medical:before { + content: "\e05c"; +} + +.fa-hand-holding-usd:before { + content: "\f4c0"; +} + +.fa-hand-holding-water:before { + content: "\f4c1"; +} + +.fa-hand-lizard:before { + content: "\f258"; +} + +.fa-hand-middle-finger:before { + content: "\f806"; +} + +.fa-hand-paper:before { + content: "\f256"; +} + +.fa-hand-peace:before { + content: "\f25b"; +} + +.fa-hand-point-down:before { + content: "\f0a7"; +} + +.fa-hand-point-left:before { + content: "\f0a5"; +} + +.fa-hand-point-right:before { + content: "\f0a4"; +} + +.fa-hand-point-up:before { + content: "\f0a6"; +} + +.fa-hand-pointer:before { + content: "\f25a"; +} + +.fa-hand-rock:before { + content: "\f255"; +} + +.fa-hand-scissors:before { + content: "\f257"; +} + +.fa-hand-sparkles:before { + content: "\e05d"; +} + +.fa-hand-spock:before { + content: "\f259"; +} + +.fa-hands:before { + content: "\f4c2"; +} + +.fa-hands-helping:before { + content: "\f4c4"; +} + +.fa-hands-wash:before { + content: "\e05e"; +} + +.fa-handshake:before { + content: "\f2b5"; +} + +.fa-handshake-alt-slash:before { + content: "\e05f"; +} + +.fa-handshake-slash:before { + content: "\e060"; +} + +.fa-hanukiah:before { + content: "\f6e6"; +} + +.fa-hard-hat:before { + content: "\f807"; +} + +.fa-hashtag:before { + content: "\f292"; +} + +.fa-hat-cowboy:before { + content: "\f8c0"; +} + +.fa-hat-cowboy-side:before { + content: "\f8c1"; +} + +.fa-hat-wizard:before { + content: "\f6e8"; +} + +.fa-hdd:before { + content: "\f0a0"; +} + +.fa-head-side-cough:before { + content: "\e061"; +} + +.fa-head-side-cough-slash:before { + content: "\e062"; +} + +.fa-head-side-mask:before { + content: "\e063"; +} + +.fa-head-side-virus:before { + content: "\e064"; +} + +.fa-heading:before { + content: "\f1dc"; +} + +.fa-headphones:before { + content: "\f025"; +} + +.fa-headphones-alt:before { + content: "\f58f"; +} + +.fa-headset:before { + content: "\f590"; +} + +.fa-heart:before { + content: "\f004"; +} + +.fa-heart-broken:before { + content: "\f7a9"; +} + +.fa-heartbeat:before { + content: "\f21e"; +} + +.fa-helicopter:before { + content: "\f533"; +} + +.fa-highlighter:before { + content: "\f591"; +} + +.fa-hiking:before { + content: "\f6ec"; +} + +.fa-hippo:before { + content: "\f6ed"; +} + +.fa-hips:before { + content: "\f452"; +} + +.fa-hire-a-helper:before { + content: "\f3b0"; +} + +.fa-history:before { + content: "\f1da"; +} + +.fa-hive:before { + content: "\e07f"; +} + +.fa-hockey-puck:before { + content: "\f453"; +} + +.fa-holly-berry:before { + content: "\f7aa"; +} + +.fa-home:before { + content: "\f015"; +} + +.fa-hooli:before { + content: "\f427"; +} + +.fa-hornbill:before { + content: "\f592"; +} + +.fa-horse:before { + content: "\f6f0"; +} + +.fa-horse-head:before { + content: "\f7ab"; +} + +.fa-hospital:before { + content: "\f0f8"; +} + +.fa-hospital-alt:before { + content: "\f47d"; +} + +.fa-hospital-symbol:before { + content: "\f47e"; +} + +.fa-hospital-user:before { + content: "\f80d"; +} + +.fa-hot-tub:before { + content: "\f593"; +} + +.fa-hotdog:before { + content: "\f80f"; +} + +.fa-hotel:before { + content: "\f594"; +} + +.fa-hotjar:before { + content: "\f3b1"; +} + +.fa-hourglass:before { + content: "\f254"; +} + +.fa-hourglass-end:before { + content: "\f253"; +} + +.fa-hourglass-half:before { + content: "\f252"; +} + +.fa-hourglass-start:before { + content: "\f251"; +} + +.fa-house-damage:before { + content: "\f6f1"; +} + +.fa-house-user:before { + content: "\e065"; +} + +.fa-houzz:before { + content: "\f27c"; +} + +.fa-hryvnia:before { + content: "\f6f2"; +} + +.fa-html5:before { + content: "\f13b"; +} + +.fa-hubspot:before { + content: "\f3b2"; +} + +.fa-i-cursor:before { + content: "\f246"; +} + +.fa-ice-cream:before { + content: "\f810"; +} + +.fa-icicles:before { + content: "\f7ad"; +} + +.fa-icons:before { + content: "\f86d"; +} + +.fa-id-badge:before { + content: "\f2c1"; +} + +.fa-id-card:before { + content: "\f2c2"; +} + +.fa-id-card-alt:before { + content: "\f47f"; +} + +.fa-ideal:before { + content: "\e013"; +} + +.fa-igloo:before { + content: "\f7ae"; +} + +.fa-image:before { + content: "\f03e"; +} + +.fa-images:before { + content: "\f302"; +} + +.fa-imdb:before { + content: "\f2d8"; +} + +.fa-inbox:before { + content: "\f01c"; +} + +.fa-indent:before { + content: "\f03c"; +} + +.fa-industry:before { + content: "\f275"; +} + +.fa-infinity:before { + content: "\f534"; +} + +.fa-info:before { + content: "\f129"; +} + +.fa-info-circle:before { + content: "\f05a"; +} + +.fa-innosoft:before { + content: "\e080"; +} + +.fa-instagram:before { + content: "\f16d"; +} + +.fa-instagram-square:before { + content: "\e055"; +} + +.fa-instalod:before { + content: "\e081"; +} + +.fa-intercom:before { + content: "\f7af"; +} + +.fa-internet-explorer:before { + content: "\f26b"; +} + +.fa-invision:before { + content: "\f7b0"; +} + +.fa-ioxhost:before { + content: "\f208"; +} + +.fa-italic:before { + content: "\f033"; +} + +.fa-itch-io:before { + content: "\f83a"; +} + +.fa-itunes:before { + content: "\f3b4"; +} + +.fa-itunes-note:before { + content: "\f3b5"; +} + +.fa-java:before { + content: "\f4e4"; +} + +.fa-jedi:before { + content: "\f669"; +} + +.fa-jedi-order:before { + content: "\f50e"; +} + +.fa-jenkins:before { + content: "\f3b6"; +} + +.fa-jira:before { + content: "\f7b1"; +} + +.fa-joget:before { + content: "\f3b7"; +} + +.fa-joint:before { + content: "\f595"; +} + +.fa-joomla:before { + content: "\f1aa"; +} + +.fa-journal-whills:before { + content: "\f66a"; +} + +.fa-js:before { + content: "\f3b8"; +} + +.fa-js-square:before { + content: "\f3b9"; +} + +.fa-jsfiddle:before { + content: "\f1cc"; +} + +.fa-kaaba:before { + content: "\f66b"; +} + +.fa-kaggle:before { + content: "\f5fa"; +} + +.fa-key:before { + content: "\f084"; +} + +.fa-keybase:before { + content: "\f4f5"; +} + +.fa-keyboard:before { + content: "\f11c"; +} + +.fa-keycdn:before { + content: "\f3ba"; +} + +.fa-khanda:before { + content: "\f66d"; +} + +.fa-kickstarter:before { + content: "\f3bb"; +} + +.fa-kickstarter-k:before { + content: "\f3bc"; +} + +.fa-kiss:before { + content: "\f596"; +} + +.fa-kiss-beam:before { + content: "\f597"; +} + +.fa-kiss-wink-heart:before { + content: "\f598"; +} + +.fa-kiwi-bird:before { + content: "\f535"; +} + +.fa-korvue:before { + content: "\f42f"; +} + +.fa-landmark:before { + content: "\f66f"; +} + +.fa-language:before { + content: "\f1ab"; +} + +.fa-laptop:before { + content: "\f109"; +} + +.fa-laptop-code:before { + content: "\f5fc"; +} + +.fa-laptop-house:before { + content: "\e066"; +} + +.fa-laptop-medical:before { + content: "\f812"; +} + +.fa-laravel:before { + content: "\f3bd"; +} + +.fa-lastfm:before { + content: "\f202"; +} + +.fa-lastfm-square:before { + content: "\f203"; +} + +.fa-laugh:before { + content: "\f599"; +} + +.fa-laugh-beam:before { + content: "\f59a"; +} + +.fa-laugh-squint:before { + content: "\f59b"; +} + +.fa-laugh-wink:before { + content: "\f59c"; +} + +.fa-layer-group:before { + content: "\f5fd"; +} + +.fa-leaf:before { + content: "\f06c"; +} + +.fa-leanpub:before { + content: "\f212"; +} + +.fa-lemon:before { + content: "\f094"; +} + +.fa-less:before { + content: "\f41d"; +} + +.fa-less-than:before { + content: "\f536"; +} + +.fa-less-than-equal:before { + content: "\f537"; +} + +.fa-level-down-alt:before { + content: "\f3be"; +} + +.fa-level-up-alt:before { + content: "\f3bf"; +} + +.fa-life-ring:before { + content: "\f1cd"; +} + +.fa-lightbulb:before { + content: "\f0eb"; +} + +.fa-line:before { + content: "\f3c0"; +} + +.fa-link:before { + content: "\f0c1"; +} + +.fa-linkedin:before { + content: "\f08c"; +} + +.fa-linkedin-in:before { + content: "\f0e1"; +} + +.fa-linode:before { + content: "\f2b8"; +} + +.fa-linux:before { + content: "\f17c"; +} + +.fa-lira-sign:before { + content: "\f195"; +} + +.fa-list:before { + content: "\f03a"; +} + +.fa-list-alt:before { + content: "\f022"; +} + +.fa-list-ol:before { + content: "\f0cb"; +} + +.fa-list-ul:before { + content: "\f0ca"; +} + +.fa-location-arrow:before { + content: "\f124"; +} + +.fa-lock:before { + content: "\f023"; +} + +.fa-lock-open:before { + content: "\f3c1"; +} + +.fa-long-arrow-alt-down:before { + content: "\f309"; +} + +.fa-long-arrow-alt-left:before { + content: "\f30a"; +} + +.fa-long-arrow-alt-right:before { + content: "\f30b"; +} + +.fa-long-arrow-alt-up:before { + content: "\f30c"; +} + +.fa-low-vision:before { + content: "\f2a8"; +} + +.fa-luggage-cart:before { + content: "\f59d"; +} + +.fa-lungs:before { + content: "\f604"; +} + +.fa-lungs-virus:before { + content: "\e067"; +} + +.fa-lyft:before { + content: "\f3c3"; +} + +.fa-magento:before { + content: "\f3c4"; +} + +.fa-magic:before { + content: "\f0d0"; +} + +.fa-magnet:before { + content: "\f076"; +} + +.fa-mail-bulk:before { + content: "\f674"; +} + +.fa-mailchimp:before { + content: "\f59e"; +} + +.fa-male:before { + content: "\f183"; +} + +.fa-mandalorian:before { + content: "\f50f"; +} + +.fa-map:before { + content: "\f279"; +} + +.fa-map-marked:before { + content: "\f59f"; +} + +.fa-map-marked-alt:before { + content: "\f5a0"; +} + +.fa-map-marker:before { + content: "\f041"; +} + +.fa-map-marker-alt:before { + content: "\f3c5"; +} + +.fa-map-pin:before { + content: "\f276"; +} + +.fa-map-signs:before { + content: "\f277"; +} + +.fa-markdown:before { + content: "\f60f"; +} + +.fa-marker:before { + content: "\f5a1"; +} + +.fa-mars:before { + content: "\f222"; +} + +.fa-mars-double:before { + content: "\f227"; +} + +.fa-mars-stroke:before { + content: "\f229"; +} + +.fa-mars-stroke-h:before { + content: "\f22b"; +} + +.fa-mars-stroke-v:before { + content: "\f22a"; +} + +.fa-mask:before { + content: "\f6fa"; +} + +.fa-mastodon:before { + content: "\f4f6"; +} + +.fa-maxcdn:before { + content: "\f136"; +} + +.fa-mdb:before { + content: "\f8ca"; +} + +.fa-medal:before { + content: "\f5a2"; +} + +.fa-medapps:before { + content: "\f3c6"; +} + +.fa-medium:before { + content: "\f23a"; +} + +.fa-medium-m:before { + content: "\f3c7"; +} + +.fa-medkit:before { + content: "\f0fa"; +} + +.fa-medrt:before { + content: "\f3c8"; +} + +.fa-meetup:before { + content: "\f2e0"; +} + +.fa-megaport:before { + content: "\f5a3"; +} + +.fa-meh:before { + content: "\f11a"; +} + +.fa-meh-blank:before { + content: "\f5a4"; +} + +.fa-meh-rolling-eyes:before { + content: "\f5a5"; +} + +.fa-memory:before { + content: "\f538"; +} + +.fa-mendeley:before { + content: "\f7b3"; +} + +.fa-menorah:before { + content: "\f676"; +} + +.fa-mercury:before { + content: "\f223"; +} + +.fa-meteor:before { + content: "\f753"; +} + +.fa-microblog:before { + content: "\e01a"; +} + +.fa-microchip:before { + content: "\f2db"; +} + +.fa-microphone:before { + content: "\f130"; +} + +.fa-microphone-alt:before { + content: "\f3c9"; +} + +.fa-microphone-alt-slash:before { + content: "\f539"; +} + +.fa-microphone-slash:before { + content: "\f131"; +} + +.fa-microscope:before { + content: "\f610"; +} + +.fa-microsoft:before { + content: "\f3ca"; +} + +.fa-minus:before { + content: "\f068"; +} + +.fa-minus-circle:before { + content: "\f056"; +} + +.fa-minus-square:before { + content: "\f146"; +} + +.fa-mitten:before { + content: "\f7b5"; +} + +.fa-mix:before { + content: "\f3cb"; +} + +.fa-mixcloud:before { + content: "\f289"; +} + +.fa-mixer:before { + content: "\e056"; +} + +.fa-mizuni:before { + content: "\f3cc"; +} + +.fa-mobile:before { + content: "\f10b"; +} + +.fa-mobile-alt:before { + content: "\f3cd"; +} + +.fa-modx:before { + content: "\f285"; +} + +.fa-monero:before { + content: "\f3d0"; +} + +.fa-money-bill:before { + content: "\f0d6"; +} + +.fa-money-bill-alt:before { + content: "\f3d1"; +} + +.fa-money-bill-wave:before { + content: "\f53a"; +} + +.fa-money-bill-wave-alt:before { + content: "\f53b"; +} + +.fa-money-check:before { + content: "\f53c"; +} + +.fa-money-check-alt:before { + content: "\f53d"; +} + +.fa-monument:before { + content: "\f5a6"; +} + +.fa-moon:before { + content: "\f186"; +} + +.fa-mortar-pestle:before { + content: "\f5a7"; +} + +.fa-mosque:before { + content: "\f678"; +} + +.fa-motorcycle:before { + content: "\f21c"; +} + +.fa-mountain:before { + content: "\f6fc"; +} + +.fa-mouse:before { + content: "\f8cc"; +} + +.fa-mouse-pointer:before { + content: "\f245"; +} + +.fa-mug-hot:before { + content: "\f7b6"; +} + +.fa-music:before { + content: "\f001"; +} + +.fa-napster:before { + content: "\f3d2"; +} + +.fa-neos:before { + content: "\f612"; +} + +.fa-network-wired:before { + content: "\f6ff"; +} + +.fa-neuter:before { + content: "\f22c"; +} + +.fa-newspaper:before { + content: "\f1ea"; +} + +.fa-nimblr:before { + content: "\f5a8"; +} + +.fa-node:before { + content: "\f419"; +} + +.fa-node-js:before { + content: "\f3d3"; +} + +.fa-not-equal:before { + content: "\f53e"; +} + +.fa-notes-medical:before { + content: "\f481"; +} + +.fa-npm:before { + content: "\f3d4"; +} + +.fa-ns8:before { + content: "\f3d5"; +} + +.fa-nutritionix:before { + content: "\f3d6"; +} + +.fa-object-group:before { + content: "\f247"; +} + +.fa-object-ungroup:before { + content: "\f248"; +} + +.fa-octopus-deploy:before { + content: "\e082"; +} + +.fa-odnoklassniki:before { + content: "\f263"; +} + +.fa-odnoklassniki-square:before { + content: "\f264"; +} + +.fa-oil-can:before { + content: "\f613"; +} + +.fa-old-republic:before { + content: "\f510"; +} + +.fa-om:before { + content: "\f679"; +} + +.fa-opencart:before { + content: "\f23d"; +} + +.fa-openid:before { + content: "\f19b"; +} + +.fa-opera:before { + content: "\f26a"; +} + +.fa-optin-monster:before { + content: "\f23c"; +} + +.fa-orcid:before { + content: "\f8d2"; +} + +.fa-osi:before { + content: "\f41a"; +} + +.fa-otter:before { + content: "\f700"; +} + +.fa-outdent:before { + content: "\f03b"; +} + +.fa-page4:before { + content: "\f3d7"; +} + +.fa-pagelines:before { + content: "\f18c"; +} + +.fa-pager:before { + content: "\f815"; +} + +.fa-paint-brush:before { + content: "\f1fc"; +} + +.fa-paint-roller:before { + content: "\f5aa"; +} + +.fa-palette:before { + content: "\f53f"; +} + +.fa-palfed:before { + content: "\f3d8"; +} + +.fa-pallet:before { + content: "\f482"; +} + +.fa-paper-plane:before { + content: "\f1d8"; +} + +.fa-paperclip:before { + content: "\f0c6"; +} + +.fa-parachute-box:before { + content: "\f4cd"; +} + +.fa-paragraph:before { + content: "\f1dd"; +} + +.fa-parking:before { + content: "\f540"; +} + +.fa-passport:before { + content: "\f5ab"; +} + +.fa-pastafarianism:before { + content: "\f67b"; +} + +.fa-paste:before { + content: "\f0ea"; +} + +.fa-patreon:before { + content: "\f3d9"; +} + +.fa-pause:before { + content: "\f04c"; +} + +.fa-pause-circle:before { + content: "\f28b"; +} + +.fa-paw:before { + content: "\f1b0"; +} + +.fa-paypal:before { + content: "\f1ed"; +} + +.fa-peace:before { + content: "\f67c"; +} + +.fa-pen:before { + content: "\f304"; +} + +.fa-pen-alt:before { + content: "\f305"; +} + +.fa-pen-fancy:before { + content: "\f5ac"; +} + +.fa-pen-nib:before { + content: "\f5ad"; +} + +.fa-pen-square:before { + content: "\f14b"; +} + +.fa-pencil-alt:before { + content: "\f303"; +} + +.fa-pencil-ruler:before { + content: "\f5ae"; +} + +.fa-penny-arcade:before { + content: "\f704"; +} + +.fa-people-arrows:before { + content: "\e068"; +} + +.fa-people-carry:before { + content: "\f4ce"; +} + +.fa-pepper-hot:before { + content: "\f816"; +} + +.fa-perbyte:before { + content: "\e083"; +} + +.fa-percent:before { + content: "\f295"; +} + +.fa-percentage:before { + content: "\f541"; +} + +.fa-periscope:before { + content: "\f3da"; +} + +.fa-person-booth:before { + content: "\f756"; +} + +.fa-phabricator:before { + content: "\f3db"; +} + +.fa-phoenix-framework:before { + content: "\f3dc"; +} + +.fa-phoenix-squadron:before { + content: "\f511"; +} + +.fa-phone:before { + content: "\f095"; +} + +.fa-phone-alt:before { + content: "\f879"; +} + +.fa-phone-slash:before { + content: "\f3dd"; +} + +.fa-phone-square:before { + content: "\f098"; +} + +.fa-phone-square-alt:before { + content: "\f87b"; +} + +.fa-phone-volume:before { + content: "\f2a0"; +} + +.fa-photo-video:before { + content: "\f87c"; +} + +.fa-php:before { + content: "\f457"; +} + +.fa-pied-piper:before { + content: "\f2ae"; +} + +.fa-pied-piper-alt:before { + content: "\f1a8"; +} + +.fa-pied-piper-hat:before { + content: "\f4e5"; +} + +.fa-pied-piper-pp:before { + content: "\f1a7"; +} + +.fa-pied-piper-square:before { + content: "\e01e"; +} + +.fa-piggy-bank:before { + content: "\f4d3"; +} + +.fa-pills:before { + content: "\f484"; +} + +.fa-pinterest:before { + content: "\f0d2"; +} + +.fa-pinterest-p:before { + content: "\f231"; +} + +.fa-pinterest-square:before { + content: "\f0d3"; +} + +.fa-pizza-slice:before { + content: "\f818"; +} + +.fa-place-of-worship:before { + content: "\f67f"; +} + +.fa-plane:before { + content: "\f072"; +} + +.fa-plane-arrival:before { + content: "\f5af"; +} + +.fa-plane-departure:before { + content: "\f5b0"; +} + +.fa-plane-slash:before { + content: "\e069"; +} + +.fa-play:before { + content: "\f04b"; +} + +.fa-play-circle:before { + content: "\f144"; +} + +.fa-playstation:before { + content: "\f3df"; +} + +.fa-plug:before { + content: "\f1e6"; +} + +.fa-plus:before { + content: "\f067"; +} + +.fa-plus-circle:before { + content: "\f055"; +} + +.fa-plus-square:before { + content: "\f0fe"; +} + +.fa-podcast:before { + content: "\f2ce"; +} + +.fa-poll:before { + content: "\f681"; +} + +.fa-poll-h:before { + content: "\f682"; +} + +.fa-poo:before { + content: "\f2fe"; +} + +.fa-poo-storm:before { + content: "\f75a"; +} + +.fa-poop:before { + content: "\f619"; +} + +.fa-portrait:before { + content: "\f3e0"; +} + +.fa-pound-sign:before { + content: "\f154"; +} + +.fa-power-off:before { + content: "\f011"; +} + +.fa-pray:before { + content: "\f683"; +} + +.fa-praying-hands:before { + content: "\f684"; +} + +.fa-prescription:before { + content: "\f5b1"; +} + +.fa-prescription-bottle:before { + content: "\f485"; +} + +.fa-prescription-bottle-alt:before { + content: "\f486"; +} + +.fa-print:before { + content: "\f02f"; +} + +.fa-procedures:before { + content: "\f487"; +} + +.fa-product-hunt:before { + content: "\f288"; +} + +.fa-project-diagram:before { + content: "\f542"; +} + +.fa-pump-medical:before { + content: "\e06a"; +} + +.fa-pump-soap:before { + content: "\e06b"; +} + +.fa-pushed:before { + content: "\f3e1"; +} + +.fa-puzzle-piece:before { + content: "\f12e"; +} + +.fa-python:before { + content: "\f3e2"; +} + +.fa-qq:before { + content: "\f1d6"; +} + +.fa-qrcode:before { + content: "\f029"; +} + +.fa-question:before { + content: "\f128"; +} + +.fa-question-circle:before { + content: "\f059"; +} + +.fa-quidditch:before { + content: "\f458"; +} + +.fa-quinscape:before { + content: "\f459"; +} + +.fa-quora:before { + content: "\f2c4"; +} + +.fa-quote-left:before { + content: "\f10d"; +} + +.fa-quote-right:before { + content: "\f10e"; +} + +.fa-quran:before { + content: "\f687"; +} + +.fa-r-project:before { + content: "\f4f7"; +} + +.fa-radiation:before { + content: "\f7b9"; +} + +.fa-radiation-alt:before { + content: "\f7ba"; +} + +.fa-rainbow:before { + content: "\f75b"; +} + +.fa-random:before { + content: "\f074"; +} + +.fa-raspberry-pi:before { + content: "\f7bb"; +} + +.fa-ravelry:before { + content: "\f2d9"; +} + +.fa-react:before { + content: "\f41b"; +} + +.fa-reacteurope:before { + content: "\f75d"; +} + +.fa-readme:before { + content: "\f4d5"; +} + +.fa-rebel:before { + content: "\f1d0"; +} + +.fa-receipt:before { + content: "\f543"; +} + +.fa-record-vinyl:before { + content: "\f8d9"; +} + +.fa-recycle:before { + content: "\f1b8"; +} + +.fa-red-river:before { + content: "\f3e3"; +} + +.fa-reddit:before { + content: "\f1a1"; +} + +.fa-reddit-alien:before { + content: "\f281"; +} + +.fa-reddit-square:before { + content: "\f1a2"; +} + +.fa-redhat:before { + content: "\f7bc"; +} + +.fa-redo:before { + content: "\f01e"; +} + +.fa-redo-alt:before { + content: "\f2f9"; +} + +.fa-registered:before { + content: "\f25d"; +} + +.fa-remove-format:before { + content: "\f87d"; +} + +.fa-renren:before { + content: "\f18b"; +} + +.fa-reply:before { + content: "\f3e5"; +} + +.fa-reply-all:before { + content: "\f122"; +} + +.fa-replyd:before { + content: "\f3e6"; +} + +.fa-republican:before { + content: "\f75e"; +} + +.fa-researchgate:before { + content: "\f4f8"; +} + +.fa-resolving:before { + content: "\f3e7"; +} + +.fa-restroom:before { + content: "\f7bd"; +} + +.fa-retweet:before { + content: "\f079"; +} + +.fa-rev:before { + content: "\f5b2"; +} + +.fa-ribbon:before { + content: "\f4d6"; +} + +.fa-ring:before { + content: "\f70b"; +} + +.fa-road:before { + content: "\f018"; +} + +.fa-robot:before { + content: "\f544"; +} + +.fa-rocket:before { + content: "\f135"; +} + +.fa-rocketchat:before { + content: "\f3e8"; +} + +.fa-rockrms:before { + content: "\f3e9"; +} + +.fa-route:before { + content: "\f4d7"; +} + +.fa-rss:before { + content: "\f09e"; +} + +.fa-rss-square:before { + content: "\f143"; +} + +.fa-ruble-sign:before { + content: "\f158"; +} + +.fa-ruler:before { + content: "\f545"; +} + +.fa-ruler-combined:before { + content: "\f546"; +} + +.fa-ruler-horizontal:before { + content: "\f547"; +} + +.fa-ruler-vertical:before { + content: "\f548"; +} + +.fa-running:before { + content: "\f70c"; +} + +.fa-rupee-sign:before { + content: "\f156"; +} + +.fa-rust:before { + content: "\e07a"; +} + +.fa-sad-cry:before { + content: "\f5b3"; +} + +.fa-sad-tear:before { + content: "\f5b4"; +} + +.fa-safari:before { + content: "\f267"; +} + +.fa-salesforce:before { + content: "\f83b"; +} + +.fa-sass:before { + content: "\f41e"; +} + +.fa-satellite:before { + content: "\f7bf"; +} + +.fa-satellite-dish:before { + content: "\f7c0"; +} + +.fa-save:before { + content: "\f0c7"; +} + +.fa-schlix:before { + content: "\f3ea"; +} + +.fa-school:before { + content: "\f549"; +} + +.fa-screwdriver:before { + content: "\f54a"; +} + +.fa-scribd:before { + content: "\f28a"; +} + +.fa-scroll:before { + content: "\f70e"; +} + +.fa-sd-card:before { + content: "\f7c2"; +} + +.fa-search:before { + content: "\f002"; +} + +.fa-search-dollar:before { + content: "\f688"; +} + +.fa-search-location:before { + content: "\f689"; +} + +.fa-search-minus:before { + content: "\f010"; +} + +.fa-search-plus:before { + content: "\f00e"; +} + +.fa-searchengin:before { + content: "\f3eb"; +} + +.fa-seedling:before { + content: "\f4d8"; +} + +.fa-sellcast:before { + content: "\f2da"; +} + +.fa-sellsy:before { + content: "\f213"; +} + +.fa-server:before { + content: "\f233"; +} + +.fa-servicestack:before { + content: "\f3ec"; +} + +.fa-shapes:before { + content: "\f61f"; +} + +.fa-share:before { + content: "\f064"; +} + +.fa-share-alt:before { + content: "\f1e0"; +} + +.fa-share-alt-square:before { + content: "\f1e1"; +} + +.fa-share-square:before { + content: "\f14d"; +} + +.fa-shekel-sign:before { + content: "\f20b"; +} + +.fa-shield-alt:before { + content: "\f3ed"; +} + +.fa-shield-virus:before { + content: "\e06c"; +} + +.fa-ship:before { + content: "\f21a"; +} + +.fa-shipping-fast:before { + content: "\f48b"; +} + +.fa-shirtsinbulk:before { + content: "\f214"; +} + +.fa-shoe-prints:before { + content: "\f54b"; +} + +.fa-shopify:before { + content: "\e057"; +} + +.fa-shopping-bag:before { + content: "\f290"; +} + +.fa-shopping-basket:before { + content: "\f291"; +} + +.fa-shopping-cart:before { + content: "\f07a"; +} + +.fa-shopware:before { + content: "\f5b5"; +} + +.fa-shower:before { + content: "\f2cc"; +} + +.fa-shuttle-van:before { + content: "\f5b6"; +} + +.fa-sign:before { + content: "\f4d9"; +} + +.fa-sign-in-alt:before { + content: "\f2f6"; +} + +.fa-sign-language:before { + content: "\f2a7"; +} + +.fa-sign-out-alt:before { + content: "\f2f5"; +} + +.fa-signal:before { + content: "\f012"; +} + +.fa-signature:before { + content: "\f5b7"; +} + +.fa-sim-card:before { + content: "\f7c4"; +} + +.fa-simplybuilt:before { + content: "\f215"; +} + +.fa-sink:before { + content: "\e06d"; +} + +.fa-sistrix:before { + content: "\f3ee"; +} + +.fa-sitemap:before { + content: "\f0e8"; +} + +.fa-sith:before { + content: "\f512"; +} + +.fa-skating:before { + content: "\f7c5"; +} + +.fa-sketch:before { + content: "\f7c6"; +} + +.fa-skiing:before { + content: "\f7c9"; +} + +.fa-skiing-nordic:before { + content: "\f7ca"; +} + +.fa-skull:before { + content: "\f54c"; +} + +.fa-skull-crossbones:before { + content: "\f714"; +} + +.fa-skyatlas:before { + content: "\f216"; +} + +.fa-skype:before { + content: "\f17e"; +} + +.fa-slack:before { + content: "\f198"; +} + +.fa-slack-hash:before { + content: "\f3ef"; +} + +.fa-slash:before { + content: "\f715"; +} + +.fa-sleigh:before { + content: "\f7cc"; +} + +.fa-sliders-h:before { + content: "\f1de"; +} + +.fa-slideshare:before { + content: "\f1e7"; +} + +.fa-smile:before { + content: "\f118"; +} + +.fa-smile-beam:before { + content: "\f5b8"; +} + +.fa-smile-wink:before { + content: "\f4da"; +} + +.fa-smog:before { + content: "\f75f"; +} + +.fa-smoking:before { + content: "\f48d"; +} + +.fa-smoking-ban:before { + content: "\f54d"; +} + +.fa-sms:before { + content: "\f7cd"; +} + +.fa-snapchat:before { + content: "\f2ab"; +} + +.fa-snapchat-ghost:before { + content: "\f2ac"; +} + +.fa-snapchat-square:before { + content: "\f2ad"; +} + +.fa-snowboarding:before { + content: "\f7ce"; +} + +.fa-snowflake:before { + content: "\f2dc"; +} + +.fa-snowman:before { + content: "\f7d0"; +} + +.fa-snowplow:before { + content: "\f7d2"; +} + +.fa-soap:before { + content: "\e06e"; +} + +.fa-socks:before { + content: "\f696"; +} + +.fa-solar-panel:before { + content: "\f5ba"; +} + +.fa-sort:before { + content: "\f0dc"; +} + +.fa-sort-alpha-down:before { + content: "\f15d"; +} + +.fa-sort-alpha-down-alt:before { + content: "\f881"; +} + +.fa-sort-alpha-up:before { + content: "\f15e"; +} + +.fa-sort-alpha-up-alt:before { + content: "\f882"; +} + +.fa-sort-amount-down:before { + content: "\f160"; +} + +.fa-sort-amount-down-alt:before { + content: "\f884"; +} + +.fa-sort-amount-up:before { + content: "\f161"; +} + +.fa-sort-amount-up-alt:before { + content: "\f885"; +} + +.fa-sort-down:before { + content: "\f0dd"; +} + +.fa-sort-numeric-down:before { + content: "\f162"; +} + +.fa-sort-numeric-down-alt:before { + content: "\f886"; +} + +.fa-sort-numeric-up:before { + content: "\f163"; +} + +.fa-sort-numeric-up-alt:before { + content: "\f887"; +} + +.fa-sort-up:before { + content: "\f0de"; +} + +.fa-soundcloud:before { + content: "\f1be"; +} + +.fa-sourcetree:before { + content: "\f7d3"; +} + +.fa-spa:before { + content: "\f5bb"; +} + +.fa-space-shuttle:before { + content: "\f197"; +} + +.fa-speakap:before { + content: "\f3f3"; +} + +.fa-speaker-deck:before { + content: "\f83c"; +} + +.fa-spell-check:before { + content: "\f891"; +} + +.fa-spider:before { + content: "\f717"; +} + +.fa-spinner:before { + content: "\f110"; +} + +.fa-splotch:before { + content: "\f5bc"; +} + +.fa-spotify:before { + content: "\f1bc"; +} + +.fa-spray-can:before { + content: "\f5bd"; +} + +.fa-square:before { + content: "\f0c8"; +} + +.fa-square-full:before { + content: "\f45c"; +} + +.fa-square-root-alt:before { + content: "\f698"; +} + +.fa-squarespace:before { + content: "\f5be"; +} + +.fa-stack-exchange:before { + content: "\f18d"; +} + +.fa-stack-overflow:before { + content: "\f16c"; +} + +.fa-stackpath:before { + content: "\f842"; +} + +.fa-stamp:before { + content: "\f5bf"; +} + +.fa-star:before { + content: "\f005"; +} + +.fa-star-and-crescent:before { + content: "\f699"; +} + +.fa-star-half:before { + content: "\f089"; +} + +.fa-star-half-alt:before { + content: "\f5c0"; +} + +.fa-star-of-david:before { + content: "\f69a"; +} + +.fa-star-of-life:before { + content: "\f621"; +} + +.fa-staylinked:before { + content: "\f3f5"; +} + +.fa-steam:before { + content: "\f1b6"; +} + +.fa-steam-square:before { + content: "\f1b7"; +} + +.fa-steam-symbol:before { + content: "\f3f6"; +} + +.fa-step-backward:before { + content: "\f048"; +} + +.fa-step-forward:before { + content: "\f051"; +} + +.fa-stethoscope:before { + content: "\f0f1"; +} + +.fa-sticker-mule:before { + content: "\f3f7"; +} + +.fa-sticky-note:before { + content: "\f249"; +} + +.fa-stop:before { + content: "\f04d"; +} + +.fa-stop-circle:before { + content: "\f28d"; +} + +.fa-stopwatch:before { + content: "\f2f2"; +} + +.fa-stopwatch-20:before { + content: "\e06f"; +} + +.fa-store:before { + content: "\f54e"; +} + +.fa-store-alt:before { + content: "\f54f"; +} + +.fa-store-alt-slash:before { + content: "\e070"; +} + +.fa-store-slash:before { + content: "\e071"; +} + +.fa-strava:before { + content: "\f428"; +} + +.fa-stream:before { + content: "\f550"; +} + +.fa-street-view:before { + content: "\f21d"; +} + +.fa-strikethrough:before { + content: "\f0cc"; +} + +.fa-stripe:before { + content: "\f429"; +} + +.fa-stripe-s:before { + content: "\f42a"; +} + +.fa-stroopwafel:before { + content: "\f551"; +} + +.fa-studiovinari:before { + content: "\f3f8"; +} + +.fa-stumbleupon:before { + content: "\f1a4"; +} + +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} + +.fa-subscript:before { + content: "\f12c"; +} + +.fa-subway:before { + content: "\f239"; +} + +.fa-suitcase:before { + content: "\f0f2"; +} + +.fa-suitcase-rolling:before { + content: "\f5c1"; +} + +.fa-sun:before { + content: "\f185"; +} + +.fa-superpowers:before { + content: "\f2dd"; +} + +.fa-superscript:before { + content: "\f12b"; +} + +.fa-supple:before { + content: "\f3f9"; +} + +.fa-surprise:before { + content: "\f5c2"; +} + +.fa-suse:before { + content: "\f7d6"; +} + +.fa-swatchbook:before { + content: "\f5c3"; +} + +.fa-swift:before { + content: "\f8e1"; +} + +.fa-swimmer:before { + content: "\f5c4"; +} + +.fa-swimming-pool:before { + content: "\f5c5"; +} + +.fa-symfony:before { + content: "\f83d"; +} + +.fa-synagogue:before { + content: "\f69b"; +} + +.fa-sync:before { + content: "\f021"; +} + +.fa-sync-alt:before { + content: "\f2f1"; +} + +.fa-syringe:before { + content: "\f48e"; +} + +.fa-table:before { + content: "\f0ce"; +} + +.fa-table-tennis:before { + content: "\f45d"; +} + +.fa-tablet:before { + content: "\f10a"; +} + +.fa-tablet-alt:before { + content: "\f3fa"; +} + +.fa-tablets:before { + content: "\f490"; +} + +.fa-tachometer-alt:before { + content: "\f3fd"; +} + +.fa-tag:before { + content: "\f02b"; +} + +.fa-tags:before { + content: "\f02c"; +} + +.fa-tape:before { + content: "\f4db"; +} + +.fa-tasks:before { + content: "\f0ae"; +} + +.fa-taxi:before { + content: "\f1ba"; +} + +.fa-teamspeak:before { + content: "\f4f9"; +} + +.fa-teeth:before { + content: "\f62e"; +} + +.fa-teeth-open:before { + content: "\f62f"; +} + +.fa-telegram:before { + content: "\f2c6"; +} + +.fa-telegram-plane:before { + content: "\f3fe"; +} + +.fa-temperature-high:before { + content: "\f769"; +} + +.fa-temperature-low:before { + content: "\f76b"; +} + +.fa-tencent-weibo:before { + content: "\f1d5"; +} + +.fa-tenge:before { + content: "\f7d7"; +} + +.fa-terminal:before { + content: "\f120"; +} + +.fa-text-height:before { + content: "\f034"; +} + +.fa-text-width:before { + content: "\f035"; +} + +.fa-th:before { + content: "\f00a"; +} + +.fa-th-large:before { + content: "\f009"; +} + +.fa-th-list:before { + content: "\f00b"; +} + +.fa-the-red-yeti:before { + content: "\f69d"; +} + +.fa-theater-masks:before { + content: "\f630"; +} + +.fa-themeco:before { + content: "\f5c6"; +} + +.fa-themeisle:before { + content: "\f2b2"; +} + +.fa-thermometer:before { + content: "\f491"; +} + +.fa-thermometer-empty:before { + content: "\f2cb"; +} + +.fa-thermometer-full:before { + content: "\f2c7"; +} + +.fa-thermometer-half:before { + content: "\f2c9"; +} + +.fa-thermometer-quarter:before { + content: "\f2ca"; +} + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} + +.fa-think-peaks:before { + content: "\f731"; +} + +.fa-thumbs-down:before { + content: "\f165"; +} + +.fa-thumbs-up:before { + content: "\f164"; +} + +.fa-thumbtack:before { + content: "\f08d"; +} + +.fa-ticket-alt:before { + content: "\f3ff"; +} + +.fa-tiktok:before { + content: "\e07b"; +} + +.fa-times:before { + content: "\f00d"; +} + +.fa-times-circle:before { + content: "\f057"; +} + +.fa-tint:before { + content: "\f043"; +} + +.fa-tint-slash:before { + content: "\f5c7"; +} + +.fa-tired:before { + content: "\f5c8"; +} + +.fa-toggle-off:before { + content: "\f204"; +} + +.fa-toggle-on:before { + content: "\f205"; +} + +.fa-toilet:before { + content: "\f7d8"; +} + +.fa-toilet-paper:before { + content: "\f71e"; +} + +.fa-toilet-paper-slash:before { + content: "\e072"; +} + +.fa-toolbox:before { + content: "\f552"; +} + +.fa-tools:before { + content: "\f7d9"; +} + +.fa-tooth:before { + content: "\f5c9"; +} + +.fa-torah:before { + content: "\f6a0"; +} + +.fa-torii-gate:before { + content: "\f6a1"; +} + +.fa-tractor:before { + content: "\f722"; +} + +.fa-trade-federation:before { + content: "\f513"; +} + +.fa-trademark:before { + content: "\f25c"; +} + +.fa-traffic-light:before { + content: "\f637"; +} + +.fa-trailer:before { + content: "\e041"; +} + +.fa-train:before { + content: "\f238"; +} + +.fa-tram:before { + content: "\f7da"; +} + +.fa-transgender:before { + content: "\f224"; +} + +.fa-transgender-alt:before { + content: "\f225"; +} + +.fa-trash:before { + content: "\f1f8"; +} + +.fa-trash-alt:before { + content: "\f2ed"; +} + +.fa-trash-restore:before { + content: "\f829"; +} + +.fa-trash-restore-alt:before { + content: "\f82a"; +} + +.fa-tree:before { + content: "\f1bb"; +} + +.fa-trello:before { + content: "\f181"; +} + +.fa-trophy:before { + content: "\f091"; +} + +.fa-truck:before { + content: "\f0d1"; +} + +.fa-truck-loading:before { + content: "\f4de"; +} + +.fa-truck-monster:before { + content: "\f63b"; +} + +.fa-truck-moving:before { + content: "\f4df"; +} + +.fa-truck-pickup:before { + content: "\f63c"; +} + +.fa-tshirt:before { + content: "\f553"; +} + +.fa-tty:before { + content: "\f1e4"; +} + +.fa-tumblr:before { + content: "\f173"; +} + +.fa-tumblr-square:before { + content: "\f174"; +} + +.fa-tv:before { + content: "\f26c"; +} + +.fa-twitch:before { + content: "\f1e8"; +} + +.fa-twitter:before { + content: "\f099"; +} + +.fa-twitter-square:before { + content: "\f081"; +} + +.fa-typo3:before { + content: "\f42b"; +} + +.fa-uber:before { + content: "\f402"; +} + +.fa-ubuntu:before { + content: "\f7df"; +} + +.fa-uikit:before { + content: "\f403"; +} + +.fa-umbraco:before { + content: "\f8e8"; +} + +.fa-umbrella:before { + content: "\f0e9"; +} + +.fa-umbrella-beach:before { + content: "\f5ca"; +} + +.fa-uncharted:before { + content: "\e084"; +} + +.fa-underline:before { + content: "\f0cd"; +} + +.fa-undo:before { + content: "\f0e2"; +} + +.fa-undo-alt:before { + content: "\f2ea"; +} + +.fa-uniregistry:before { + content: "\f404"; +} + +.fa-unity:before { + content: "\e049"; +} + +.fa-universal-access:before { + content: "\f29a"; +} + +.fa-university:before { + content: "\f19c"; +} + +.fa-unlink:before { + content: "\f127"; +} + +.fa-unlock:before { + content: "\f09c"; +} + +.fa-unlock-alt:before { + content: "\f13e"; +} + +.fa-unsplash:before { + content: "\e07c"; +} + +.fa-untappd:before { + content: "\f405"; +} + +.fa-upload:before { + content: "\f093"; +} + +.fa-ups:before { + content: "\f7e0"; +} + +.fa-usb:before { + content: "\f287"; +} + +.fa-user:before { + content: "\f007"; +} + +.fa-user-alt:before { + content: "\f406"; +} + +.fa-user-alt-slash:before { + content: "\f4fa"; +} + +.fa-user-astronaut:before { + content: "\f4fb"; +} + +.fa-user-check:before { + content: "\f4fc"; +} + +.fa-user-circle:before { + content: "\f2bd"; +} + +.fa-user-clock:before { + content: "\f4fd"; +} + +.fa-user-cog:before { + content: "\f4fe"; +} + +.fa-user-edit:before { + content: "\f4ff"; +} + +.fa-user-friends:before { + content: "\f500"; +} + +.fa-user-graduate:before { + content: "\f501"; +} + +.fa-user-injured:before { + content: "\f728"; +} + +.fa-user-lock:before { + content: "\f502"; +} + +.fa-user-md:before { + content: "\f0f0"; +} + +.fa-user-minus:before { + content: "\f503"; +} + +.fa-user-ninja:before { + content: "\f504"; +} + +.fa-user-nurse:before { + content: "\f82f"; +} + +.fa-user-plus:before { + content: "\f234"; +} + +.fa-user-secret:before { + content: "\f21b"; +} + +.fa-user-shield:before { + content: "\f505"; +} + +.fa-user-slash:before { + content: "\f506"; +} + +.fa-user-tag:before { + content: "\f507"; +} + +.fa-user-tie:before { + content: "\f508"; +} + +.fa-user-times:before { + content: "\f235"; +} + +.fa-users:before { + content: "\f0c0"; +} + +.fa-users-cog:before { + content: "\f509"; +} + +.fa-users-slash:before { + content: "\e073"; +} + +.fa-usps:before { + content: "\f7e1"; +} + +.fa-ussunnah:before { + content: "\f407"; +} + +.fa-utensil-spoon:before { + content: "\f2e5"; +} + +.fa-utensils:before { + content: "\f2e7"; +} + +.fa-vaadin:before { + content: "\f408"; +} + +.fa-vector-square:before { + content: "\f5cb"; +} + +.fa-venus:before { + content: "\f221"; +} + +.fa-venus-double:before { + content: "\f226"; +} + +.fa-venus-mars:before { + content: "\f228"; +} + +.fa-vest:before { + content: "\e085"; +} + +.fa-vest-patches:before { + content: "\e086"; +} + +.fa-viacoin:before { + content: "\f237"; +} + +.fa-viadeo:before { + content: "\f2a9"; +} + +.fa-viadeo-square:before { + content: "\f2aa"; +} + +.fa-vial:before { + content: "\f492"; +} + +.fa-vials:before { + content: "\f493"; +} + +.fa-viber:before { + content: "\f409"; +} + +.fa-video:before { + content: "\f03d"; +} + +.fa-video-slash:before { + content: "\f4e2"; +} + +.fa-vihara:before { + content: "\f6a7"; +} + +.fa-vimeo:before { + content: "\f40a"; +} + +.fa-vimeo-square:before { + content: "\f194"; +} + +.fa-vimeo-v:before { + content: "\f27d"; +} + +.fa-vine:before { + content: "\f1ca"; +} + +.fa-virus:before { + content: "\e074"; +} + +.fa-virus-slash:before { + content: "\e075"; +} + +.fa-viruses:before { + content: "\e076"; +} + +.fa-vk:before { + content: "\f189"; +} + +.fa-vnv:before { + content: "\f40b"; +} + +.fa-voicemail:before { + content: "\f897"; +} + +.fa-volleyball-ball:before { + content: "\f45f"; +} + +.fa-volume-down:before { + content: "\f027"; +} + +.fa-volume-mute:before { + content: "\f6a9"; +} + +.fa-volume-off:before { + content: "\f026"; +} + +.fa-volume-up:before { + content: "\f028"; +} + +.fa-vote-yea:before { + content: "\f772"; +} + +.fa-vr-cardboard:before { + content: "\f729"; +} + +.fa-vuejs:before { + content: "\f41f"; +} + +.fa-walking:before { + content: "\f554"; +} + +.fa-wallet:before { + content: "\f555"; +} + +.fa-warehouse:before { + content: "\f494"; +} + +.fa-watchman-monitoring:before { + content: "\e087"; +} + +.fa-water:before { + content: "\f773"; +} + +.fa-wave-square:before { + content: "\f83e"; +} + +.fa-waze:before { + content: "\f83f"; +} + +.fa-weebly:before { + content: "\f5cc"; +} + +.fa-weibo:before { + content: "\f18a"; +} + +.fa-weight:before { + content: "\f496"; +} + +.fa-weight-hanging:before { + content: "\f5cd"; +} + +.fa-weixin:before { + content: "\f1d7"; +} + +.fa-whatsapp:before { + content: "\f232"; +} + +.fa-whatsapp-square:before { + content: "\f40c"; +} + +.fa-wheelchair:before { + content: "\f193"; +} + +.fa-whmcs:before { + content: "\f40d"; +} + +.fa-wifi:before { + content: "\f1eb"; +} + +.fa-wikipedia-w:before { + content: "\f266"; +} + +.fa-wind:before { + content: "\f72e"; +} + +.fa-window-close:before { + content: "\f410"; +} + +.fa-window-maximize:before { + content: "\f2d0"; +} + +.fa-window-minimize:before { + content: "\f2d1"; +} + +.fa-window-restore:before { + content: "\f2d2"; +} + +.fa-windows:before { + content: "\f17a"; +} + +.fa-wine-bottle:before { + content: "\f72f"; +} + +.fa-wine-glass:before { + content: "\f4e3"; +} + +.fa-wine-glass-alt:before { + content: "\f5ce"; +} + +.fa-wix:before { + content: "\f5cf"; +} + +.fa-wizards-of-the-coast:before { + content: "\f730"; +} + +.fa-wodu:before { + content: "\e088"; +} + +.fa-wolf-pack-battalion:before { + content: "\f514"; +} + +.fa-won-sign:before { + content: "\f159"; +} + +.fa-wordpress:before { + content: "\f19a"; +} + +.fa-wordpress-simple:before { + content: "\f411"; +} + +.fa-wpbeginner:before { + content: "\f297"; +} + +.fa-wpexplorer:before { + content: "\f2de"; +} + +.fa-wpforms:before { + content: "\f298"; +} + +.fa-wpressr:before { + content: "\f3e4"; +} + +.fa-wrench:before { + content: "\f0ad"; +} + +.fa-x-ray:before { + content: "\f497"; +} + +.fa-xbox:before { + content: "\f412"; +} + +.fa-xing:before { + content: "\f168"; +} + +.fa-xing-square:before { + content: "\f169"; +} + +.fa-y-combinator:before { + content: "\f23b"; +} + +.fa-yahoo:before { + content: "\f19e"; +} + +.fa-yammer:before { + content: "\f840"; +} + +.fa-yandex:before { + content: "\f413"; +} + +.fa-yandex-international:before { + content: "\f414"; +} + +.fa-yarn:before { + content: "\f7e3"; +} + +.fa-yelp:before { + content: "\f1e9"; +} + +.fa-yen-sign:before { + content: "\f157"; +} + +.fa-yin-yang:before { + content: "\f6ad"; +} + +.fa-yoast:before { + content: "\f2b1"; +} + +.fa-youtube:before { + content: "\f167"; +} + +.fa-youtube-square:before { + content: "\f431"; +} + +.fa-zhihu:before { + content: "\f63f"; +} + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} + + +.far { + font-family: "Font Awesome 5 Free"; + font-weight: 400; +} + +.fa, +.fas { + font-family: "Font Awesome 5 Free"; + font-weight: 900; +} + +.fab { + font-family: "Font Awesome 5 Brands"; + font-weight: 400; +} + +body { + padding-top: 90px; +} + +.navbar { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1030; + background-color: #4e5365; + overflow: auto; +} + +@media (min-width: 768px) { + body { + margin-left: 200px; + padding-top: 0; + } + + .navbar { + background-color: #4e5365; + bottom: 0; + width: 200px; + flex-flow: column nowrap; + align-items: flex-start; + } + + .navbar .navbar-collapse { + flex-grow: 0; + flex-direction: column; + width: 100%; + } + + .navbar .navbar-collapse .navbar-nav { + flex-direction: column; + width: 100%; + } + + .navbar .navbar-collapse .navbar-nav .nav-item { + width: 100%; + } + + .navbar { + right: auto; + } + + #sidebar .collapse, #sidebar .navbar-collapse { + height: 100vh; + padding-bottom: 0; + } + + #sidebar::-webkit-scrollbar { + width: 10px; + } + + #sidebar::-webkit-scrollbar-track { + background: #f1f1f1; + } + + #sidebar::-webkit-scrollbar-thumb { + background: #888; + } + + #sidebar::-webkit-scrollbar-thumb:hover { + background: #555; + } +} +#sidebar ul li a { + display: block; +} + +#sidebar ul li a:hover { + color: #202020; + background: gainsboro; +} + +.nav { + width: 100%; + display: flex; +} + +.nav-link { + color: #dde0e3; + text-align: center; +} + +a:hover, a:focus { + color: darkgray; + text-decoration: none; + transition: all 0.3s; +} + +.nav-pills .nav-link.active, +.nav-pills .show .nav-link { + background-color: #727586; +} + +.logged-in-user { + border-top: 1px solid grey; + width: 100%; + display: flex; + align-items: center; + position: -webkit-sticky; + position: sticky; + top: 100%; + padding: 12px 10px 2px; +} + +.img-sidebar { + background-color: white; + width: 50px; + height: 50px; + margin-right: 10px; + border-radius: 30px; +} + +.logged-in-user p { + color: white; + margin-top: 10px; +} + +#newUser { + text-align: center; + width: 50%; + margin: 2% auto; +} + +#uniLogin { + width: 100%; + margin-left: auto; + margin-right: auto; +} + +#names { + width: 100%; + display: flex; + justify-content: space-between; + margin-top: 1%; +} + +#names .col-4 { + width: 32%; +} + +#passwords { + width: 100%; + display: flex; + justify-content: space-between; + margin-top: 1%; +} + +.disabled-button { + color: grey; + background-color: lightgray; + border: 1px solid grey; +} + +.disabled-button:hover { + color: grey; + background-color: lightgray; + border: 1px solid grey; +} + +#passwords .col-6 { + width: 49%; +} + +.submitButton { + margin-top: 5%; +} + +.edit-profile { + width: 100%; + display: flex; + justify-content: space-evenly; + margin: 0 auto; +} + +.user-loan-lists { + width: 60%; + border-right: 1px solid #ced4da; + padding-right: 20px; +} + +.bold-text { + font-weight: bold; + font-size: 24px; +} + +.table-size { + height: 370px; + overflow-y: auto; +} + +.profile-inputs { + width: 32%; + display: block; +} + +.img-profil { + display: block; + margin: 0 auto; + border: 1px solid #ced4da; + width: 175px; + height: 175px; + border-radius: 105px; +} + +#tooltip { + display: none; + background-color: #f1f1f1; + color: #000; + padding: 3px 10px; + border-radius: 3px; + font-size: 12px; + position: inherit; + margin: 5px 0 0 0; + opacity: 1 !important; +} + +.fontSizeCreate p { + padding: 5px 10px; + font-size: 115%; +} + +.fontSizeCreate h5, .fontSizeCreate .h5 { + font-size: 140%; +} + +.fontSizeEdit p { + padding: 5px 10px; + font-size: 130%; +} + +.fontSizeEdit h5, .fontSizeEdit .h5 { + font-size: 170%; +} + +span.tooltipArrow { + content: " "; + height: 0; + position: absolute; + width: 0; + border: 6px solid transparent; + border-bottom-color: #f1f1f1; + top: -11px; + left: 5px; +} + +/* Add a green text color and a checkmark when the requirements are right */ +.valid { + color: green; +} + +.valid:before { + position: relative; + left: -10px; + content: "✓"; +} + +/* Add a red text color and an "x" icon when the requirements are wrong */ +.invalid { + color: red; +} + +.invalid:before { + position: relative; + left: -10px; + content: "✕"; +} + +.passwordDropdownEdit { + width: 30%; +} + +@media only screen and (max-width: 1100px) { + #newUser { + width: 100%; + } + + #names, #passwords { + display: block; + } + + #names .col-4, #passwords .col-6 { + width: 100%; + } + + #names .col-4:first-of-type { + margin-top: 30px; + } + + #names .col-4:last-of-type { + margin-bottom: 30px; + } + + .edit-profile { + flex-direction: column-reverse; + } + + .profile-inputs { + width: 100%; + padding-bottom: 20px; + margin-bottom: 20px; + border-bottom: 1px solid #ced4da; + } + + .user-loan-lists { + width: 100%; + border: none; + } + + .fontSizeCreate p { + padding: 5px 10px; + font-size: 130%; + } + + .fontSizeCreate h5, .fontSizeCreate .h5 { + font-size: 170%; + } +} +.categories { + width: 40%; + margin: 0 auto; +} + +.category { + margin-bottom: 20px; +} + +@media only screen and (max-width: 1100px) { + .categories { + width: 100%; + } +} +@media only screen and (max-width: 768px) { + .categories { + width: 100%; + } +} +.home-container { + +} + +.home-container .col-6:first-of-type { + border-right: 1px solid lightslategray; +} + +.product-container { + margin-bottom: 20px; + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.head-section, .product-head-section { + width: 100%; + display: flex; + justify-content: space-between; +} + +.create-product-form { + width: 30%; + display: block; + margin: 20px auto; + padding-bottom: 20px; +} + +.center-create { + margin-left: 3rem; + margin-right: 3rem; + margin-bottom: 3rem; +} + +.col-7, .col-5 { + padding: 1em 1.5em; +} + +.product-buttons { + padding: 0.5em 0em 1em 1em; + width: 10%; +} + +#description, #product_status_id { + width: 50%; + margin: 0 auto; +} + +#newProductModel { + width: 50%; + margin: 0 auto; + padding-top: 30px; +} + +.flex-select { + width: 100%; + display: flex; +} + +.flex-select select { + border-radius: 5px 0 0 5px; +} + +.flex-select a { + border-radius: 0 5px 5px 0; +} + +.center-button { + display: flex; + margin: 30px auto; +} + +.padding { + padding: 1em 1.5em; +} + +.pagination { + width: 100%; + display: flex; + justify-content: flex-end; +} + +#userForm, #roomForm { + width: 60%; + display: flex; + margin: 0 auto; +} + +.search-form-group { + width: 100%; + display: flex; +} + +.search-form-group input { + border-radius: 5px 0 0 5px; +} + +.search-form-group button { + border-radius: 0 5px 5px 0; +} + +.even-spacing { + display: flex; + justify-content: space-evenly; +} + +.section { + background-color: white; +} + +.sort-button { + margin-top: 32px; +} + +.headersection { + margin-block: 10px; + padding-block:20px; + font-weight: bold; + font-size: 25px; + border-bottom:1px solid black; +} + +.col-sm-12 { + font-weight: bold; + font-size: 20px; + text-align: center; +} + +.ulDecoration ul { + list-style: none; + padding: 0px; +} + +.ulBorder { + border: 1px solid #ced4da; + border-radius: 5px; +} + +.all-rights-checkbox { + margin: 10px 0px 10px 10px; +} + +.all-rights-label { + padding: 10px 10px 10px 0px; +} + +.top-border { + border-top: 1px solid #ced4da; +} + +.current { + width: 100%; + display: flex; + border-bottom: 1px solid #ced4da; + padding: 10px; +} + +.current:last-of-type { + border-bottom: 0px; +} + +.sub_cat_box { + width: 100%; + display: block; +} + +.sub_cat_box ul { + display: none; + padding-left: 40px; +} + +.product-show { + width: 100%; + display: flex; + justify-content: space-between; + margin-bottom: 15px; +} + +.form-textarea { + height: 150px; +} + +.status { + width: 30%; +} + +.sub-inputs { + width: 47%; +} + +.edit-product { + width: 40%; + display: block; + margin: 0 auto; +} + +.edit-product #product_status_id { + width: 100%; +} + +.product-edit-buttons { + width: 20%; + display: flex; + margin: 0 auto; + justify-content: space-between; +} + +.product-edit-buttons input { + width: 100%; + margin-bottom: 20px; +} + +.buttons-wrapper { + width: 50%; + display: flex; + margin: 0 auto; + padding-top: 20px; +} + +.create-product-buttons { + width: 40%; + display: flex; + margin: 0 auto; + padding-top: 20px; +} + +@media only screen and (max-width: 1100px) { + #userForm, #roomForm, #newProductModel { + width: 100%; + } + + .edit-product { + width: 100%; + padding: 0rem 1.5rem; + } + + .create-product-form, #description { + width: 60%; + } + + .create-product-buttons { + width: 60%; + } +} +@media only screen and (max-width: 768px) { + .logged-in-user { + justify-content: center; + } + + .content-form-group { + width: 60%; + } + + .home-container { + padding-left: 0; + padding-right: 0; + } + + #userForm, #roomForm { + width: 100%; + } + + .head-section { + display: block; + } + + .product-head-section { + display: flex; + justify-content: flex-start; + } + + .product-head-section form { + width: 90%; + } + + .product-head-section form .btn-primary { + border-radius: 0px; + } + + .product-head-section .btn-success { + border-radius: 0 5px 5px 0; + } + + .flex-right { + width: 100%; + display: flex; + justify-content: flex-end; + } + + .center-create { + margin: 0; + } + + .create-head-section { + width: 100%; + display: block; + } + + .col-7, .col-5 { + width: 100%; + padding: 0; + } + + .create-head-section .justify-content-center label:first-of-type { + margin-top: 20px; + } + + #quantity { + width: 50%; + margin-bottom: 20px; + } + + .product-buttons { + width: 40%; + } + + .product-buttons input { + margin: 0 auto; + } + + #description, #product_status_id, #newProductModel { + width: 100%; + margin: 0; + } + + .edit-product { + width: 100%; + padding: 0rem 1.5rem; + } + + .product-edit-buttons { + width: 45%; + display: flex; + margin: 0 auto; + justify-content: space-between; + } + + .buttons-wrapper { + width: 80%; + } +} +@media (min-width: 768px) { + .main-container { + background: white; + margin-left: 3rem; + margin-right: 3rem; + } +} +.row { + --bs-gutter-x: 0px; + padding: 0px; +} + +.container-fluid, .container-sm, .container-md, .container-lg, .container-xl, .container-xxl { + padding: 0px; +} + +.main-container { + background: white; + padding: 1.5rem; +} + +body { + min-height: 100vh; + background-color: #F0F0F0; +} + +.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..1d69f3a --- /dev/null +++ b/public/index.php @@ -0,0 +1,55 @@ +make(Kernel::class); + +$response = $kernel->handle( + $request = Request::capture() +)->send(); + +$kernel->terminate($request, $response); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/resources/css/app.css b/resources/css/app.css new file mode 100644 index 0000000..e69de29 diff --git a/resources/js/app.js b/resources/js/app.js new file mode 100644 index 0000000..e59d6a0 --- /dev/null +++ b/resources/js/app.js @@ -0,0 +1 @@ +import './bootstrap'; diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js new file mode 100644 index 0000000..d21a8c0 --- /dev/null +++ b/resources/js/bootstrap.js @@ -0,0 +1,34 @@ +import _ from 'lodash'; +window._ = _; + +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Echo exposes an expressive API for subscribing to channels and listening + * for events that are broadcast by Laravel. Echo and event broadcasting + * allows your team to easily build robust real-time web applications. + */ + +// import Echo from 'laravel-echo'; + +// import Pusher from 'pusher-js'; +// window.Pusher = Pusher; + +// window.Echo = new Echo({ +// broadcaster: 'pusher', +// key: import.meta.env.VITE_PUSHER_APP_KEY, +// wsHost: import.meta.env.VITE_PUSHER_HOST ?? `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, +// wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, +// wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, +// forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', +// enabledTransports: ['ws', 'wss'], +// }); diff --git a/resources/lang/da.json b/resources/lang/da.json new file mode 100644 index 0000000..899eb25 --- /dev/null +++ b/resources/lang/da.json @@ -0,0 +1,208 @@ +{ + "no_amount": "Ingen", + "none": "Ingen", + "all": "Alle", + + "author": "Danny Johansson", + + "name": "Navn", + "name_full": "Fuldt Navn", + + "action": "Handling", + "cancel": "Annuler", + "canceled": "Annulleret", + "update": "Opdater", + "updated": "Opdateret", + "create": "Opret", + "created": "Oprettet", + "edit": "Rediger", + "edited": "Redigeret", + "delete": "Slet", + "deleted": "Slettet", + "delete_force": "Slet Permanent", + "force_deleted": "Permanent Slettet", + "restore": "Genopret", + "restored": "Genoprettet", + "show": "Vis", + "select": "Vælg", + "search": "Søg", + "give": "Tildele", + "add": "Tilføj", + "choose": "Vælg", + "remove": "Fjern", + "removed": "Fjernet", + "return": "Aflever", + "returned": "Afleveret", + "see": "Se", + "extend": "Udvid", + "extended": "Udvidet", + "adjust": "Juster", + "adjusted": "Justeret", + + "viewAny": "Se Liste", + "viewAny_deleted": "Se Slettede", + "view": "Se Specifik", + "view_pdf": "Se Specifik", + "amount_add": "Tilføj til Pulje", + "amount_added": "Tilføjet til Pulje", + "amount_remove": "Fjern fra Pulje", + "amount_removed": "Fjernet fra Pulje", + + "homepage": "Hjemmeside", + + "brand": "Fabrikant", + "brands": "Fabrikanter", + "building": "Bygning", + "buildings": "Bygninger", + "cabel": "Kabel", + "cabels": "Kabler", + "category" : "Kategori", + "categories" : "Kategorier", + "model": "Model", + "models": "Modeler", + "product": "Produkt", + "products": "Produkter", + "role": "Rolle", + "roles": "Roller", + "room": "Lokale", + "rooms": "Lokaler", + "stat" : "Statistik", + "stats" : "Statistiker", + "subcategory" : "Underkategori", + "subcategories" : "Underkategorier", + "user": "Bruger", + "users": "Brugere", + "log" : "Log", + "productCategory": "Produkt Kategori", + "cabelCategory": "Kabel Kategori", + "description": "Beskrivelse", + "barcode": "Stregkode", + "item": "Enhed", + "items": "Enheder", + "note": "Note", + "notes": "Noter", + + "displaying": " Viser ", + "of": " af ", + "in": "i", + "to": "Til", + "total": "Total", + "lent": "Udlånt", + "reserve": "Reserver", + "reserved": "Reserveret", + "available": "Tilgængelig", + "status": "Status", + "pool": "Pulje", + "created_at": "Oprettet", + "updated_at": "Opdateret", + "deleted_at": "Slettet", + "amount": "Mængde", + "DELETED": "SLETTET", + "active": "Aktiv", + "deletion_force" : "Permanent Sletning", + "date_start" : "Start Dato", + "date_end" : "Slut Dato", + "date" : "Dato", + + "loan": "Lån", + "loans": "Udlån", + "loan_out": "Udlån", + "loaned": "Udlånt", + "reservation": "Reservation", + "reservations": "Reservationer", + "contracts": "Kontrakter", + "productLoan": "Produkt Udlån", + "productLoans": "Produkt Udlån", + + "returns": "Afleveringer", + + "laptop": "Bærbar", + "street": "Vej", + "city": "By", + "zip": "Post", + "number": "Nummer", + "instructions": "Instruktioner", + "accessories": "Tilbehør", + "bag": "Taske", + "lock": "Lås", + "telephone": "Telefon", + "email": "Email", + "permanent": "Permanent", + "Missing": "Mangler", + "Damaged": "Beskadiget", + + "permission": "Rettighed", + "permissions": "Rettigheder", + + "pickup": "Afhentning", + "pickups": "Afhentninger", + "picked up": "Afhentet", + "setup": "Opsætning", + "setups": "Opsætninger", + "set up": "Opsat", + "validation": "Validering", + "validations": "Valideringer", + "deadline": "Deadline", + "validate": "Valider", + "validated": "Valideret", + "awaiting": "Afventer", + "target": "Modtager", + + + "password": "Kodeord", + "password_repeat": "Gentag Kodeord", + + "login.title": "Login", + "login.send": "Log Ind", + + "username": "Brugernavn", + "type": "Type", + "types": "Typer", + + + "notADUser": "Ikke AD Bruger", + "ADUser": "AD Bruger", + + "repeatPassword": "Gentag Kodeord", + "user.submit": "Opdater", + + "related": "Relateret", + "profile": "Profil", + "logout": "Log Ud", + "please_select": "Vælg...", + + "static": "Statisk", + "dynamic": "Dynamisk", + + "footer.created": "Lavet af ", + "footer.group": "SKP Programmering", + "footer.help": " delvist baseret på arbejde af", + "school": "Syddansk Erhvervsskole", + "division": "Skole Oplæring", + "loaner" : "Låner", + "lender" : "Udlåner", + + "data": "Data", + "old": "Tidligere", + + "yes": "Ja", + "no": "Nej", + "like": "Som", + + "home": "Hjemmeside", + "logs": "Logs", + + "statistic": "Statistik", + "statistics": "Statistikker", + "lastDay": "Sidste 24 Timer", + + "signature": "Underskrift", + "sign": "Underskriv", + + "Lån": "contracts", + "Bærbar": "laptops", + "Reservation": "reservations", + "storage": "Lager", + "activity": "Aktivitet", + "place": "Plads" +} diff --git a/resources/lang/en.json b/resources/lang/en.json new file mode 100644 index 0000000..6aeed68 --- /dev/null +++ b/resources/lang/en.json @@ -0,0 +1,7 @@ +{ + "Beskadiget": "Damaged", + "beskadiget": "Damaged", + "Mangler": "Missing", + "mangler": "Missing", + "blop": "dop" +} diff --git a/resources/views/Layouts/login.blade.php b/resources/views/Layouts/login.blade.php new file mode 100644 index 0000000..dfc2941 --- /dev/null +++ b/resources/views/Layouts/login.blade.php @@ -0,0 +1,32 @@ + + + + + + + {{ $title ?? 'login'}} + + + + + +
+ @if($errors->any()) + @foreach($errors->all() as $error) + + @endforeach + @endif + @yield('content') +
+@include('Partials.footer') + + + diff --git a/resources/views/Layouts/master.blade.php b/resources/views/Layouts/master.blade.php new file mode 100644 index 0000000..342d9ed --- /dev/null +++ b/resources/views/Layouts/master.blade.php @@ -0,0 +1,51 @@ + + + + + + + + + {{ $title ?? 'Lagersystem' }} + + + + + + + + + + +@include('Partials.Navbar') +@if($errors->any()) + @foreach($errors->all() as $error) + + @endforeach +@endif +
+
+
+
+
@lang(request()->segment(1))
+
+
+
@lang(request()->segment(1)) / @lang(request()->segment(2))
+
+
+
+ @yield('content') +
+ +@include('partials.footer') + + + +@yield('scripting') + + diff --git a/resources/views/Layouts/template.blade.php b/resources/views/Layouts/template.blade.php new file mode 100644 index 0000000..193d90d --- /dev/null +++ b/resources/views/Layouts/template.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.show_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/Partials/Form/Input/Modal/delete.blade.php b/resources/views/Partials/Form/Input/Modal/delete.blade.php new file mode 100644 index 0000000..48a5ff2 --- /dev/null +++ b/resources/views/Partials/Form/Input/Modal/delete.blade.php @@ -0,0 +1,38 @@ +
+
+
+ +
+
+
+ + +
+ + + diff --git a/resources/views/Partials/Form/Input/Modal/delete_force.blade.php b/resources/views/Partials/Form/Input/Modal/delete_force.blade.php new file mode 100644 index 0000000..2043867 --- /dev/null +++ b/resources/views/Partials/Form/Input/Modal/delete_force.blade.php @@ -0,0 +1,33 @@ + +
+ + +
+ + + diff --git a/resources/views/Partials/Form/Input/Submit/submit_create.blade.php b/resources/views/Partials/Form/Input/Submit/submit_create.blade.php new file mode 100644 index 0000000..393db7b --- /dev/null +++ b/resources/views/Partials/Form/Input/Submit/submit_create.blade.php @@ -0,0 +1,7 @@ +
+ @csrf +
+
+ +
+
diff --git a/resources/views/Partials/Form/Input/Submit/submit_delete.blade.php b/resources/views/Partials/Form/Input/Submit/submit_delete.blade.php new file mode 100644 index 0000000..a831b7b --- /dev/null +++ b/resources/views/Partials/Form/Input/Submit/submit_delete.blade.php @@ -0,0 +1,8 @@ +
+ @method('delete') + @csrf +
+
+ +
+
diff --git a/resources/views/Partials/Form/Input/Submit/submit_edit.blade.php b/resources/views/Partials/Form/Input/Submit/submit_edit.blade.php new file mode 100644 index 0000000..6749b1b --- /dev/null +++ b/resources/views/Partials/Form/Input/Submit/submit_edit.blade.php @@ -0,0 +1,8 @@ +
+ @method('put') + @csrf +
+
+ +
+
diff --git a/resources/views/Partials/Form/Input/Submit/submit_update.blade.php b/resources/views/Partials/Form/Input/Submit/submit_update.blade.php new file mode 100644 index 0000000..0de3f9b --- /dev/null +++ b/resources/views/Partials/Form/Input/Submit/submit_update.blade.php @@ -0,0 +1,8 @@ +
+ @method('put') + @csrf +
+
+ +
+
diff --git a/resources/views/Partials/Form/Input/amount.blade.php b/resources/views/Partials/Form/Input/amount.blade.php new file mode 100644 index 0000000..d465008 --- /dev/null +++ b/resources/views/Partials/Form/Input/amount.blade.php @@ -0,0 +1,17 @@ +
+ +
+ +
+
diff --git a/resources/views/Partials/Form/Input/barcode.blade.php b/resources/views/Partials/Form/Input/barcode.blade.php new file mode 100644 index 0000000..b5d9d22 --- /dev/null +++ b/resources/views/Partials/Form/Input/barcode.blade.php @@ -0,0 +1,19 @@ +
+ +
+ barcode)) + value="{{$data->barcode}}" + @endif + @endif + > +
+
diff --git a/resources/views/Partials/Form/Input/brand.blade.php b/resources/views/Partials/Form/Input/brand.blade.php new file mode 100644 index 0000000..23da5d1 --- /dev/null +++ b/resources/views/Partials/Form/Input/brand.blade.php @@ -0,0 +1,31 @@ +
+ +
+ +
+
+ diff --git a/resources/views/Partials/Form/Input/building.blade.php b/resources/views/Partials/Form/Input/building.blade.php new file mode 100644 index 0000000..790498f --- /dev/null +++ b/resources/views/Partials/Form/Input/building.blade.php @@ -0,0 +1,27 @@ +
+ +
+ +
+
+ + diff --git a/resources/views/Partials/Form/Input/cabels.blade.php b/resources/views/Partials/Form/Input/cabels.blade.php new file mode 100644 index 0000000..9006801 --- /dev/null +++ b/resources/views/Partials/Form/Input/cabels.blade.php @@ -0,0 +1,67 @@ +
+ +
+ + + + + + + + + + @foreach($cabels as $cabel) + + @endforeach + + + + + +
@lang('barcode')@lang('available')@lang('amount')@lang('action')
+ +
+
+ diff --git a/resources/views/Partials/Form/Input/cabels_return.blade.php b/resources/views/Partials/Form/Input/cabels_return.blade.php new file mode 100644 index 0000000..809354d --- /dev/null +++ b/resources/views/Partials/Form/Input/cabels_return.blade.php @@ -0,0 +1,89 @@ +
+ +
+ + + + + + + + + + @foreach($cabels as $cabel) + + @endforeach + + + + + +
@lang('barcode')@lang('lent')@lang('amount')@lang('action')
+ +
+
+ diff --git a/resources/views/Partials/Form/Input/category.blade.php b/resources/views/Partials/Form/Input/category.blade.php new file mode 100644 index 0000000..29826a7 --- /dev/null +++ b/resources/views/Partials/Form/Input/category.blade.php @@ -0,0 +1,31 @@ +
+ +
+ +
+
+ diff --git a/resources/views/Partials/Form/Input/city.blade.php b/resources/views/Partials/Form/Input/city.blade.php new file mode 100644 index 0000000..f9292c3 --- /dev/null +++ b/resources/views/Partials/Form/Input/city.blade.php @@ -0,0 +1,29 @@ +
+ +
+ +
+
+ +
+
diff --git a/resources/views/Partials/Form/Input/date_end.blade.php b/resources/views/Partials/Form/Input/date_end.blade.php new file mode 100644 index 0000000..c53e0d9 --- /dev/null +++ b/resources/views/Partials/Form/Input/date_end.blade.php @@ -0,0 +1,42 @@ +
+ + @if(isset($date_end_permanent)) +
+ + +
+ @endif +
+ date_end)) + value="{{date('Y-m-d',strtotime($data->date_end))}}" + @else + value="{{date('Y-m-d',strtotime(now()))}}" + @endif + required + > +
+
+ diff --git a/resources/views/Partials/Form/Input/date_start.blade.php b/resources/views/Partials/Form/Input/date_start.blade.php new file mode 100644 index 0000000..83204e2 --- /dev/null +++ b/resources/views/Partials/Form/Input/date_start.blade.php @@ -0,0 +1,24 @@ +
+ +
+ date_start)) + value="{{$data->date_start}}" + @else + value="{{date('Y-m-d',strtotime(now()))}}" + @endif + required + @if(isset($date_start_locked)) + disabled + @endif + > +
+
diff --git a/resources/views/Partials/Form/Input/description.blade.php b/resources/views/Partials/Form/Input/description.blade.php new file mode 100644 index 0000000..b07396b --- /dev/null +++ b/resources/views/Partials/Form/Input/description.blade.php @@ -0,0 +1,6 @@ +
+ +
+ +
+
diff --git a/resources/views/Partials/Form/Input/email.blade.php b/resources/views/Partials/Form/Input/email.blade.php new file mode 100644 index 0000000..3dc3d2e --- /dev/null +++ b/resources/views/Partials/Form/Input/email.blade.php @@ -0,0 +1,15 @@ +
+ +
+ +
+
diff --git a/resources/views/Partials/Form/Input/laptop.blade.php b/resources/views/Partials/Form/Input/laptop.blade.php new file mode 100644 index 0000000..e8d300a --- /dev/null +++ b/resources/views/Partials/Form/Input/laptop.blade.php @@ -0,0 +1,33 @@ +
+ +
+ + @foreach($laptops as $laptop) + @if(config('app.barcode_mode') == 'dynamic') + + @elseif(config('app.barcode_mode') == 'static') + + @endif + @endforeach + + + + +
+
+ diff --git a/resources/views/Partials/Form/Input/laptop_extras.blade.php b/resources/views/Partials/Form/Input/laptop_extras.blade.php new file mode 100644 index 0000000..13b9034 --- /dev/null +++ b/resources/views/Partials/Form/Input/laptop_extras.blade.php @@ -0,0 +1,11 @@ +
+ +
+ + +
+
+ + +
+
diff --git a/resources/views/Partials/Form/Input/model.blade.php b/resources/views/Partials/Form/Input/model.blade.php new file mode 100644 index 0000000..c7e9269 --- /dev/null +++ b/resources/views/Partials/Form/Input/model.blade.php @@ -0,0 +1,46 @@ +
+ +
+ +
+
+ + + diff --git a/resources/views/Partials/Form/Input/name.blade.php b/resources/views/Partials/Form/Input/name.blade.php new file mode 100644 index 0000000..57ffb2d --- /dev/null +++ b/resources/views/Partials/Form/Input/name.blade.php @@ -0,0 +1,19 @@ +
+ +
+ name)) + value="{{$data->name}}" + @endif + @endif + > +
+
diff --git a/resources/views/Partials/Form/Input/password.blade.php b/resources/views/Partials/Form/Input/password.blade.php new file mode 100644 index 0000000..09c67a2 --- /dev/null +++ b/resources/views/Partials/Form/Input/password.blade.php @@ -0,0 +1,30 @@ +
+ +
+ +
+
+@if(isset($password_input_repeat)) +
+ +
+ +
+
+@endif diff --git a/resources/views/Partials/Form/Input/permissions.blade.php b/resources/views/Partials/Form/Input/permissions.blade.php new file mode 100644 index 0000000..0a0d859 --- /dev/null +++ b/resources/views/Partials/Form/Input/permissions.blade.php @@ -0,0 +1,720 @@ +
+ @lang('permissions') : +
+
    +
  • + + + +
      + +
    • + + +
    • + + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • + +
      +
    • + + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • + + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • + + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • + + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • + + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • + + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • + + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • + + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • + +
      • + + +
      • + +
      • + + +
      • +
      +
    • + +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • +
    • + + +
        +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • +
    • + + +
    • +
    • + + +
    • +
    +
  • +
+
+
+@section('scripting') + +@endsection + diff --git a/resources/views/Partials/Form/Input/phone.blade.php b/resources/views/Partials/Form/Input/phone.blade.php new file mode 100644 index 0000000..5b4c27a --- /dev/null +++ b/resources/views/Partials/Form/Input/phone.blade.php @@ -0,0 +1,15 @@ +
+ +
+ +
+
diff --git a/resources/views/Partials/Form/Input/products.blade.php b/resources/views/Partials/Form/Input/products.blade.php new file mode 100644 index 0000000..0d95889 --- /dev/null +++ b/resources/views/Partials/Form/Input/products.blade.php @@ -0,0 +1,71 @@ +
+ +
+ + + + + + + + + + @foreach($products as $product) + @if(config('app.barcode_mode') == 'dynamic') + + @elseif(config('app.barcode_mode') == 'static') + + @endif + @endforeach + + + + + +
@lang('barcode')@lang('available')@lang('amount')@lang('action')
+ +
+
+ diff --git a/resources/views/Partials/Form/Input/products_return.blade.php b/resources/views/Partials/Form/Input/products_return.blade.php new file mode 100644 index 0000000..5da6029 --- /dev/null +++ b/resources/views/Partials/Form/Input/products_return.blade.php @@ -0,0 +1,94 @@ +
+ +
+ + + + + + + + + + + + @foreach($products as $product) + @if(config('app.barcode_mode') == 'dynamic') + + @elseif(config('app.barcode_mode') == 'static') + + @endif + @endforeach + + + + + +
@lang('barcode')@lang('lent')@lang('amount')@lang('action')@lang('note')
+
+
+ diff --git a/resources/views/Partials/Form/Input/role.blade.php b/resources/views/Partials/Form/Input/role.blade.php new file mode 100644 index 0000000..f9f019c --- /dev/null +++ b/resources/views/Partials/Form/Input/role.blade.php @@ -0,0 +1,10 @@ +
+ +
+ +
+
diff --git a/resources/views/Partials/Form/Input/room.blade.php b/resources/views/Partials/Form/Input/room.blade.php new file mode 100644 index 0000000..c93c9e5 --- /dev/null +++ b/resources/views/Partials/Form/Input/room.blade.php @@ -0,0 +1,39 @@ +
+ + + @foreach($rooms as $room) + + @endforeach + +
+ +
+ +
+ diff --git a/resources/views/Partials/Form/Input/street.blade.php b/resources/views/Partials/Form/Input/street.blade.php new file mode 100644 index 0000000..2f0c5b1 --- /dev/null +++ b/resources/views/Partials/Form/Input/street.blade.php @@ -0,0 +1,41 @@ +
+ +
+ +
+
+ +
+
+ +
+
diff --git a/resources/views/Partials/Form/Input/subcategory.blade.php b/resources/views/Partials/Form/Input/subcategory.blade.php new file mode 100644 index 0000000..d035924 --- /dev/null +++ b/resources/views/Partials/Form/Input/subcategory.blade.php @@ -0,0 +1,46 @@ +
+ +
+ +
+
+ diff --git a/resources/views/Partials/Form/Input/user.blade.php b/resources/views/Partials/Form/Input/user.blade.php new file mode 100644 index 0000000..b2e07cc --- /dev/null +++ b/resources/views/Partials/Form/Input/user.blade.php @@ -0,0 +1,26 @@ +
+ + + @foreach($users as $user) + + @endforeach + +
+ username)) + value="{{$data->username}}" + @endif + @endif + required + > +
+
diff --git a/resources/views/Partials/Form/Input/username.blade.php b/resources/views/Partials/Form/Input/username.blade.php new file mode 100644 index 0000000..a3453f5 --- /dev/null +++ b/resources/views/Partials/Form/Input/username.blade.php @@ -0,0 +1,26 @@ +
+ + + @foreach($users as $user) + + @endforeach + +
+ username)) + value="{{$data->username}}" + @endif + @endif + required + > +
+
diff --git a/resources/views/Partials/Form/Signature/fake_full.blade.php b/resources/views/Partials/Form/Signature/fake_full.blade.php new file mode 100644 index 0000000..e332acf --- /dev/null +++ b/resources/views/Partials/Form/Signature/fake_full.blade.php @@ -0,0 +1,29 @@ +@if(!old('loanerSigRawData')) +
+
+
+
+ +
+
+@endif + diff --git a/resources/views/Partials/Form/Signature/fake_lender.blade.php b/resources/views/Partials/Form/Signature/fake_lender.blade.php new file mode 100644 index 0000000..f969ab4 --- /dev/null +++ b/resources/views/Partials/Form/Signature/fake_lender.blade.php @@ -0,0 +1,22 @@ +@if(!old('lenderSigRawData')) +
+
+
+
+ +
+
+@endif + diff --git a/resources/views/Partials/Form/Signature/fake_loaner.blade.php b/resources/views/Partials/Form/Signature/fake_loaner.blade.php new file mode 100644 index 0000000..9547341 --- /dev/null +++ b/resources/views/Partials/Form/Signature/fake_loaner.blade.php @@ -0,0 +1,22 @@ +@if(!old('lenderSigRawData')) +
+
+
+
+ +
+
+@endif + diff --git a/resources/views/Partials/Form/Signature/lender.blade.php b/resources/views/Partials/Form/Signature/lender.blade.php new file mode 100644 index 0000000..98dc557 --- /dev/null +++ b/resources/views/Partials/Form/Signature/lender.blade.php @@ -0,0 +1,120 @@ + + + + +
+
+ @lang('lender') : +
+
+ + + @if(old('lenderSigRawData')) Underskrift modtaget @endif + + + +
+
diff --git a/resources/views/Partials/Form/Signature/loaner.blade.php b/resources/views/Partials/Form/Signature/loaner.blade.php new file mode 100644 index 0000000..0cfcd7d --- /dev/null +++ b/resources/views/Partials/Form/Signature/loaner.blade.php @@ -0,0 +1,120 @@ + + + + +
+
+ @lang('loaner') : +
+
+ + + @if(old('loanerSigRawData')) Underskrift modtaget @endif + + + +
+
diff --git a/resources/views/Partials/Pages/Search/pagination.blade.php b/resources/views/Partials/Pages/Search/pagination.blade.php new file mode 100644 index 0000000..804a624 --- /dev/null +++ b/resources/views/Partials/Pages/Search/pagination.blade.php @@ -0,0 +1,6 @@ + diff --git a/resources/views/Partials/Pages/Search/search_bar.blade.php b/resources/views/Partials/Pages/Search/search_bar.blade.php new file mode 100644 index 0000000..c74067f --- /dev/null +++ b/resources/views/Partials/Pages/Search/search_bar.blade.php @@ -0,0 +1,8 @@ +
+
+ @include('Partials.Pages.Search.pagination') + @include('Partials.Pages.Search.search_type') + @include('Partials.Pages.Search.search_compare') + @include('Partials.Pages.Search.search_field') +
+
diff --git a/resources/views/Partials/Pages/Search/search_compare.blade.php b/resources/views/Partials/Pages/Search/search_compare.blade.php new file mode 100644 index 0000000..b4de7d6 --- /dev/null +++ b/resources/views/Partials/Pages/Search/search_compare.blade.php @@ -0,0 +1,6 @@ + + @foreach($search_types as $search_type) + + @endforeach + diff --git a/resources/views/Partials/Pages/create_button.blade.php b/resources/views/Partials/Pages/create_button.blade.php new file mode 100644 index 0000000..1ab53f3 --- /dev/null +++ b/resources/views/Partials/Pages/create_button.blade.php @@ -0,0 +1,7 @@ +
+ @can(Request::segment(1)."_create") + + + + @endcan +
diff --git a/resources/views/Partials/Pages/create_page.blade.php b/resources/views/Partials/Pages/create_page.blade.php new file mode 100644 index 0000000..e8be5c9 --- /dev/null +++ b/resources/views/Partials/Pages/create_page.blade.php @@ -0,0 +1,6 @@ +
+
+ @include(Request::segment(1).'.form_input') + @include('Partials.Form.Input.Submit.submit_create') +
+
diff --git a/resources/views/Partials/Pages/deleted_page.blade.php b/resources/views/Partials/Pages/deleted_page.blade.php new file mode 100644 index 0000000..856b1a6 --- /dev/null +++ b/resources/views/Partials/Pages/deleted_page.blade.php @@ -0,0 +1,43 @@ +
+ @include('Partials.Pages.index_top') + + + + + + + @foreach($data as $object) + + + + + @endforeach + +
@lang('name')@lang('action')
+ @can(Request::segment(1).'_view') + + {{$object->name}} + + @else + {{$object->name}} + @endcan + + @can(Request::segment(1).'_edit') + + @lang('edit') + + @endcan + @can(Request::segment(1).'_restore') + + @lang('restore') + + @endcan + @can(Request::segment(1).'_delete_force') + @include('Partials.Form.Input.Modal.delete_force') + @endcan +
+ @include('Partials.Pages.display') +
diff --git a/resources/views/Partials/Pages/deleted_selector.blade.php b/resources/views/Partials/Pages/deleted_selector.blade.php new file mode 100644 index 0000000..33fbc1a --- /dev/null +++ b/resources/views/Partials/Pages/deleted_selector.blade.php @@ -0,0 +1,15 @@ + + diff --git a/resources/views/Partials/Pages/display.blade.php b/resources/views/Partials/Pages/display.blade.php new file mode 100644 index 0000000..1d24dd2 --- /dev/null +++ b/resources/views/Partials/Pages/display.blade.php @@ -0,0 +1,4 @@ +{{$data->appends($_GET)->links()}} +

+ @lang('displaying') {{$data->count()}} @lang('of'){{ $data->total() }} @lang($data_names). +

diff --git a/resources/views/Partials/Pages/edit_page.blade.php b/resources/views/Partials/Pages/edit_page.blade.php new file mode 100644 index 0000000..07b0c5e --- /dev/null +++ b/resources/views/Partials/Pages/edit_page.blade.php @@ -0,0 +1,9 @@ +
+
+ @include(Request::segment(1).'.form_input') + @include('Partials.Form.Input.Submit.submit_edit') +
+ @can(Request::segment(1).'_delete') + @include('Partials.Form.Input.Modal.delete') + @endcan +
diff --git a/resources/views/Partials/Pages/index_top.blade.php b/resources/views/Partials/Pages/index_top.blade.php new file mode 100644 index 0000000..25af607 --- /dev/null +++ b/resources/views/Partials/Pages/index_top.blade.php @@ -0,0 +1,17 @@ +
+ @include('Partials.Pages.Search.search_bar') + @if(Request::segment(2) == null) + @can(Request::segment(1)."_create") + @if(!isset($without_create)) + @include('Partials.Pages.create_button') + @endif + @endcan + @endif +
+@if(!isset($no_deleted)) +
+ @include('Partials.Pages.deleted_selector') +
+@else +
+@endif diff --git a/resources/views/Partials/Pages/loan_items.blade.php b/resources/views/Partials/Pages/loan_items.blade.php new file mode 100644 index 0000000..9184971 --- /dev/null +++ b/resources/views/Partials/Pages/loan_items.blade.php @@ -0,0 +1,78 @@ + +
+ + +
diff --git a/resources/views/Partials/Pages/reservation_items.blade.php b/resources/views/Partials/Pages/reservation_items.blade.php new file mode 100644 index 0000000..3d8bbf7 --- /dev/null +++ b/resources/views/Partials/Pages/reservation_items.blade.php @@ -0,0 +1,80 @@ + +
+ + +
diff --git a/resources/views/Partials/Pages/reservation_pickup.blade.php b/resources/views/Partials/Pages/reservation_pickup.blade.php new file mode 100644 index 0000000..16c8624 --- /dev/null +++ b/resources/views/Partials/Pages/reservation_pickup.blade.php @@ -0,0 +1,84 @@ + +
+ + +
diff --git a/resources/views/Partials/Pages/reservation_selector.blade.php b/resources/views/Partials/Pages/reservation_selector.blade.php new file mode 100644 index 0000000..0b188d8 --- /dev/null +++ b/resources/views/Partials/Pages/reservation_selector.blade.php @@ -0,0 +1,46 @@ + diff --git a/resources/views/Partials/Pages/reservation_setup.blade.php b/resources/views/Partials/Pages/reservation_setup.blade.php new file mode 100644 index 0000000..46d39d8 --- /dev/null +++ b/resources/views/Partials/Pages/reservation_setup.blade.php @@ -0,0 +1,84 @@ + +
+ + +
diff --git a/resources/views/Partials/Pages/show_page.blade.php b/resources/views/Partials/Pages/show_page.blade.php new file mode 100644 index 0000000..4c3095c --- /dev/null +++ b/resources/views/Partials/Pages/show_page.blade.php @@ -0,0 +1,4 @@ +
+ @include('Partials.Pages.show_top') + @include(Request::segment(1).'.show_data') +
diff --git a/resources/views/Partials/Pages/show_top.blade.php b/resources/views/Partials/Pages/show_top.blade.php new file mode 100644 index 0000000..bdee19e --- /dev/null +++ b/resources/views/Partials/Pages/show_top.blade.php @@ -0,0 +1,15 @@ +
+
+

+ @lang($data_name) : @if(!empty($data->name)){{$data->name}}@endif +

+
+ @can(Request::segment(1).'_edit') + + @endcan +
diff --git a/resources/views/Partials/footer.blade.php b/resources/views/Partials/footer.blade.php new file mode 100644 index 0000000..2a3d6bf --- /dev/null +++ b/resources/views/Partials/footer.blade.php @@ -0,0 +1,30 @@ +
+
+
+

+ @lang('footer.created') : + @lang('author') @lang('footer.help') @lang('footer.group') +

+
+
+ +
+
+

+ © +

+
+
+
+ diff --git a/resources/views/Partials/navbar.blade.php b/resources/views/Partials/navbar.blade.php new file mode 100644 index 0000000..b3a359b --- /dev/null +++ b/resources/views/Partials/navbar.blade.php @@ -0,0 +1,302 @@ + diff --git a/resources/views/brands/create.blade.php b/resources/views/brands/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/brands/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/brands/deleted.blade.php b/resources/views/brands/deleted.blade.php new file mode 100644 index 0000000..a41a8b6 --- /dev/null +++ b/resources/views/brands/deleted.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.deleted_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/brands/edit.blade.php b/resources/views/brands/edit.blade.php new file mode 100644 index 0000000..8485b70 --- /dev/null +++ b/resources/views/brands/edit.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.edit_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/brands/form_input.blade.php b/resources/views/brands/form_input.blade.php new file mode 100644 index 0000000..b79d603 --- /dev/null +++ b/resources/views/brands/form_input.blade.php @@ -0,0 +1 @@ +@include('Partials.Form.Input.name') diff --git a/resources/views/brands/index.blade.php b/resources/views/brands/index.blade.php new file mode 100644 index 0000000..f559f66 --- /dev/null +++ b/resources/views/brands/index.blade.php @@ -0,0 +1,39 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + @foreach($data as $brand) + + + + + @endforeach + +
@lang('name')@lang('action')
+ @can('brands_view') + + {{$brand->name}} + + @else + {{$brand->name}} + @endcan + + @can('brands_edit') + + @lang('edit') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/brands/show.blade.php b/resources/views/brands/show.blade.php new file mode 100644 index 0000000..193d90d --- /dev/null +++ b/resources/views/brands/show.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.show_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/brands/show_data.blade.php b/resources/views/brands/show_data.blade.php new file mode 100644 index 0000000..7e25860 --- /dev/null +++ b/resources/views/brands/show_data.blade.php @@ -0,0 +1,41 @@ +

@lang('models')

+@if(count($data->models) >= 1) + + @foreach($data->models as $model) + + + + @endforeach +
+ @can('models_view') + {{$model->name}} + @else + {{$model->name}} + @endcan +
+@else + @lang('no_amount') @lang('models') +@endif + +
+ +

@lang('products')

+@if(count($data->products) >= 1) + + @foreach($data->products as $product) + + + + @endforeach +
+ + @if(config('app.barcode_mode') == 'dynamic') + {{$product->category->name}}.@if(!empty($product->subcategory->name)){{$product->subcategory->name}}.@endif{{$product->brand->name}}.{{$product->model->name}}@if(!empty($product->name)).{{$product->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$product->barcode}} + @endif +
+@else + @lang('no_amount') @lang('products') +@endif diff --git a/resources/views/buildings/create.blade.php b/resources/views/buildings/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/buildings/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/buildings/deleted.blade.php b/resources/views/buildings/deleted.blade.php new file mode 100644 index 0000000..aaa37d0 --- /dev/null +++ b/resources/views/buildings/deleted.blade.php @@ -0,0 +1,48 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + @foreach($data as $object) + + + + + + @endforeach + +
@lang('name')@lang('rooms')@lang('action')
+ {{$object->name}} + + @lang('rooms') + + @can(Request::segment(1).'_edit') + + @lang('edit') + + @endcan + @can(Request::segment(1).'_restore') + + @lang('restore') + + @endcan + @can(Request::segment(1).'_delete_force') + @include('Partials.Form.Input.Modal.delete_force') + @endcan +
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/buildings/edit.blade.php b/resources/views/buildings/edit.blade.php new file mode 100644 index 0000000..8485b70 --- /dev/null +++ b/resources/views/buildings/edit.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.edit_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/buildings/form_input.blade.php b/resources/views/buildings/form_input.blade.php new file mode 100644 index 0000000..b79d603 --- /dev/null +++ b/resources/views/buildings/form_input.blade.php @@ -0,0 +1 @@ +@include('Partials.Form.Input.name') diff --git a/resources/views/buildings/index.blade.php b/resources/views/buildings/index.blade.php new file mode 100644 index 0000000..6e90f07 --- /dev/null +++ b/resources/views/buildings/index.blade.php @@ -0,0 +1,35 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + @foreach($data as $building) + + + + + + @endforeach + +
@lang('name')@lang('rooms')@lang('action')
+ {{$building->name}} + + @lang('rooms') + + @lang('edit') +
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/buildings/show.blade.php b/resources/views/buildings/show.blade.php new file mode 100644 index 0000000..193d90d --- /dev/null +++ b/resources/views/buildings/show.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.show_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/buildings/show_data.blade.php b/resources/views/buildings/show_data.blade.php new file mode 100644 index 0000000..ac33c1b --- /dev/null +++ b/resources/views/buildings/show_data.blade.php @@ -0,0 +1,18 @@ +

@lang('rooms')

+@if(count($data->rooms) >= 1) + + @foreach($data->rooms as $room) + + + + + @endforeach +
+ + {{$room->name}} + +
+@else + @lang('no_amount') @lang('rooms') +@endif diff --git a/resources/views/cabelCategories/create.blade.php b/resources/views/cabelCategories/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/cabelCategories/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/cabelCategories/deleted.blade.php b/resources/views/cabelCategories/deleted.blade.php new file mode 100644 index 0000000..bdbaa6c --- /dev/null +++ b/resources/views/cabelCategories/deleted.blade.php @@ -0,0 +1,47 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + @foreach($data as $object) + + + + + @endforeach + + +
@lang('name')@lang('action')
+ @can('cabelCategories_view') + + {{$object->name}} + + @else + {{$object->name}} + @endcan + + @can(Request::segment(1).'_edit') + + @lang('edit') + + @endcan + @can(Request::segment(1).'_restore') + + @lang('restore') + + @endcan + @can(Request::segment(1).'_delete_force') + @include('Partials.Form.Input.Modal.delete_force') + @endcan +
+
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/cabelCategories/edit.blade.php b/resources/views/cabelCategories/edit.blade.php new file mode 100644 index 0000000..8485b70 --- /dev/null +++ b/resources/views/cabelCategories/edit.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.edit_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/cabelCategories/form_input.blade.php b/resources/views/cabelCategories/form_input.blade.php new file mode 100644 index 0000000..b79d603 --- /dev/null +++ b/resources/views/cabelCategories/form_input.blade.php @@ -0,0 +1 @@ +@include('Partials.Form.Input.name') diff --git a/resources/views/cabelCategories/index.blade.php b/resources/views/cabelCategories/index.blade.php new file mode 100644 index 0000000..682f32f --- /dev/null +++ b/resources/views/cabelCategories/index.blade.php @@ -0,0 +1,38 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + @foreach($data as $object) + + + + + @endforeach + + +
@lang('name')@lang('action')
+ @can('cabelCategories_view') + + {{$object->name}} + + @else + {{$role->name}} + @endcan + + @can('cabelCategories_edit') + @lang('edit') + @endcan +
+
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/cabelCategories/show.blade.php b/resources/views/cabelCategories/show.blade.php new file mode 100644 index 0000000..193d90d --- /dev/null +++ b/resources/views/cabelCategories/show.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.show_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/cabelCategories/show_data.blade.php b/resources/views/cabelCategories/show_data.blade.php new file mode 100644 index 0000000..4e22511 --- /dev/null +++ b/resources/views/cabelCategories/show_data.blade.php @@ -0,0 +1,20 @@ +

@lang('cabels')

+@if(count($data->cabels) >= 1) + + @foreach($data->cabels as $cabel) + + + + @endforeach +
+ @can('cabels_view') + + {{$cabel->category->name}}.{{$cabel->name}} + + @else + {{$cabel->category->name}}.{{$cabel->name}} + @endcan +
+@else + @lang('no_amount') @lang('products') +@endif diff --git a/resources/views/cabels/create.blade.php b/resources/views/cabels/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/cabels/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/cabels/deleted.blade.php b/resources/views/cabels/deleted.blade.php new file mode 100644 index 0000000..543a1b2 --- /dev/null +++ b/resources/views/cabels/deleted.blade.php @@ -0,0 +1,68 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + + + + + @foreach($data as $cabel) + + + + + + + + + + @endforeach + +
@lang('category')@lang('name')@lang('available')@lang('lent')@lang('reserved')@lang('total')@lang('action')
+ {{$cabel->category->name}} + + + {{$cabel->name}} + + + {{$cabel->total - (count($cabel->loans) + count($cabel->reservations))}} + + {{count($cabel->loans)}} + + {{count($cabel->reservations)}} + + {{$cabel->total}} + + @can('cabels_edit') + + @lang('edit') + + @endcan + @can('cabels_restore') + + @lang('restore') + + @endcan + @can('cabels_delete_force') + + @lang('delete_force') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/cabels/edit.blade.php b/resources/views/cabels/edit.blade.php new file mode 100644 index 0000000..c205b0b --- /dev/null +++ b/resources/views/cabels/edit.blade.php @@ -0,0 +1,50 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('cabels.form_input') + @include('Partials.Form.Input.Submit.submit_edit') +
+ @can('cabels_delete') + @include('Partials.Form.Input.Modal.delete') + @endcan + @can('cabels_amount_add') +
+
+ @method('put') + @csrf +
+ +
+ +
+
+ @can('cabels_amount_add') + + @endcan + @can('cabels_amount_remove') + + @endcan +
+
+
+ @endcan +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/cabels/form_input.blade.php b/resources/views/cabels/form_input.blade.php new file mode 100644 index 0000000..6e90061 --- /dev/null +++ b/resources/views/cabels/form_input.blade.php @@ -0,0 +1,2 @@ +@include('Partials.Form.Input.category') +@include('Partials.Form.Input.name') diff --git a/resources/views/cabels/index.blade.php b/resources/views/cabels/index.blade.php new file mode 100644 index 0000000..23cf4e4 --- /dev/null +++ b/resources/views/cabels/index.blade.php @@ -0,0 +1,67 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + + + + + @foreach($data as $cabel) + + + + + + + + + + @endforeach + +
@lang('category')@lang('name')@lang('available')@lang('lent')@lang('reserved')@lang('total')@lang('action')
+ @can('cabelCategories_view') + + {{$cabel->category->name}} + + @else + {{$cabel->category->name}} + @endcan + + @can('cabels_view') + + {{$cabel->name}} + + @else + {{$cabel->name}} + @endcan + + {{$cabel->total - (count($cabel->loans) + count($cabel->reservations))}} + + {{count($cabel->loans)}} + + {{count($cabel->reservations)}} + + {{$cabel->total}} + + @can('cabels_edit') + @lang('edit') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/cabels/show.blade.php b/resources/views/cabels/show.blade.php new file mode 100644 index 0000000..193d90d --- /dev/null +++ b/resources/views/cabels/show.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.show_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/cabels/show_data.blade.php b/resources/views/cabels/show_data.blade.php new file mode 100644 index 0000000..a7f18bd --- /dev/null +++ b/resources/views/cabels/show_data.blade.php @@ -0,0 +1,10 @@ +

+ @lang('category') : + @can('cabelCategories_view') + + {{$data->category->name}} + + @else + {{$data->category->name}} + @endcan +

diff --git a/resources/views/categories/create.blade.php b/resources/views/categories/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/categories/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/categories/deleted.blade.php b/resources/views/categories/deleted.blade.php new file mode 100644 index 0000000..a41a8b6 --- /dev/null +++ b/resources/views/categories/deleted.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.deleted_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/categories/edit.blade.php b/resources/views/categories/edit.blade.php new file mode 100644 index 0000000..8485b70 --- /dev/null +++ b/resources/views/categories/edit.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.edit_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/categories/form_input.blade.php b/resources/views/categories/form_input.blade.php new file mode 100644 index 0000000..b79d603 --- /dev/null +++ b/resources/views/categories/form_input.blade.php @@ -0,0 +1 @@ +@include('Partials.Form.Input.name') diff --git a/resources/views/categories/index.blade.php b/resources/views/categories/index.blade.php new file mode 100644 index 0000000..a0707bb --- /dev/null +++ b/resources/views/categories/index.blade.php @@ -0,0 +1,41 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + @foreach($data as $category) + + + + + @endforeach + +
@lang('name')@lang('action')
+ @can('categories_view') + + {{$category->name}} + + @else + {{$category->name}} + @endcan + + + @can('categories_edit') + + @lang('edit') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/categories/show.blade.php b/resources/views/categories/show.blade.php new file mode 100644 index 0000000..193d90d --- /dev/null +++ b/resources/views/categories/show.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.show_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/categories/show_data.blade.php b/resources/views/categories/show_data.blade.php new file mode 100644 index 0000000..0fc69ca --- /dev/null +++ b/resources/views/categories/show_data.blade.php @@ -0,0 +1,37 @@ +

@lang('subcategories')

+@if(count($data->subcategories) >= 1) + + @foreach($data->subcategories as $subcategory) + + + + @endforeach +
+ {{$subcategory->name}} +
+@else + @lang('no_amount') @lang('subcategories') +@endif + +
+ +

@lang('products')

+@if(count($data->products) >= 1) + + @foreach($data->products as $product) + + + + @endforeach +
+ + @if(config('app.barcode_mode') == 'dynamic') + {{$product->category->name}}.@if(!empty($product->subcategory->name)){{$product->subcategory->name}}.@endif{{$product->brand->name}}.{{$product->model->name}}@if(!empty($product->name)).{{$product->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$tracked->loanable->barcode}} + @endif +
+@else + @lang('no_amount') @lang('products') +@endif diff --git a/resources/views/contracts/index.blade.php b/resources/views/contracts/index.blade.php new file mode 100644 index 0000000..4f48e3d --- /dev/null +++ b/resources/views/contracts/index.blade.php @@ -0,0 +1,64 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('Partials.Pages.Search.search_bar') +
+ + + + + + + + + @foreach($data as $contract) + + + + + + + @endforeach + +
@lang('user')@lang('date')@lang('type')@lang('action')
+ @can('users_view') + + {{ $contract->user->username }} + + @else + {{ $contract->user->username }} + @endcan + + + {{ date('d.m.Y H:i:s', $contract->timestamp) }} + + @if($contract->type == 'contracts') + @lang('loan') + @elseif($contract->type == 'laptops') + @lang('laptop') + @elseif($contract->type == 'reservations') + @lang('reservation') + @endif + + @can('pdf_view') + + @lang('show') + + @endcan + @can('delete', App\Models\PDF::class) +
+ @csrf + @method('DELETE') + +
+ @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/emails/.idea/.gitignore b/resources/views/emails/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/resources/views/emails/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/resources/views/emails/.idea/emails.iml b/resources/views/emails/.idea/emails.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/resources/views/emails/.idea/emails.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/resources/views/emails/.idea/modules.xml b/resources/views/emails/.idea/modules.xml new file mode 100644 index 0000000..ae1e1ca --- /dev/null +++ b/resources/views/emails/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/resources/views/emails/.idea/vcs.xml b/resources/views/emails/.idea/vcs.xml new file mode 100644 index 0000000..c2365ab --- /dev/null +++ b/resources/views/emails/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/resources/views/emails/laptop.blade.php b/resources/views/emails/laptop.blade.php new file mode 100644 index 0000000..120e4de --- /dev/null +++ b/resources/views/emails/laptop.blade.php @@ -0,0 +1,16 @@ + + +

+{{ $user->name }}, +

+Dit Bærbar lån fra {{ $date->format('d-m-Y H:i')}} er bekræftiget. +
+Bærbaren er dit ansvar i udlånsperioden. +

+Se det vedhæftede PDF dokument for flere detaljer. +
+Dette PDF Dokument kan også findes på din Profil i udlånssystemet +

+Med venlig hilsen +
+@lang('school')'s @lang('division') diff --git a/resources/views/emails/loan.blade.php b/resources/views/emails/loan.blade.php new file mode 100644 index 0000000..775224f --- /dev/null +++ b/resources/views/emails/loan.blade.php @@ -0,0 +1,14 @@ + + +

+{{ $user->name }}, +

+Dit lån fra {{ $date->format('d-m-Y H:i')}} er bekræftiget. +

+Se det vedhæftede PDF dokument for flere detaljer. +
+Dette PDF Dokument kan også findes på din Profil i udlånssystemet +

+Med venlig hilsen +
+@lang('school')'s @lang('division') diff --git a/resources/views/emails/reservation.blade.php b/resources/views/emails/reservation.blade.php new file mode 100644 index 0000000..d7365f1 --- /dev/null +++ b/resources/views/emails/reservation.blade.php @@ -0,0 +1,12 @@ + + +

+{{ $user->name }}, +

+Din reservation fra {{ $date->format('d.m.Y H:i')}} er registreret. +

+Før at reservation er gyldig - og produkterne kan opsættes i lokalet - skal den valideres ved Helpdesk senest {{ $deadline->format('d.m.Y H:i')}}. +

+Med venlig hilsen +
+@lang('school')'s @lang('division') diff --git a/resources/views/emails/validation.blade.php b/resources/views/emails/validation.blade.php new file mode 100644 index 0000000..03343e4 --- /dev/null +++ b/resources/views/emails/validation.blade.php @@ -0,0 +1,20 @@ + + +

+{{ $user->name }}, +

+Din reservation fra {{ $date->format('d-m-Y H:i')}} er bekræftiget. +

+Se det vedhæftede PDF dokument for flere detaljer. +
+Dette PDF Dokument kan også findes på din Profil i udlånssystemet +


+Produkterne er dit ansvar i udlånsperioden. +

+Kort tid før Start Dato starter vil de reserverede produkter blive opsat i lokalet. +
+Kort tid efter Slut Dato vil de reserverede produkter blive hentet fra lokalet. +

+Med venlig hilsen +
+@lang('school')'s @lang('division') diff --git a/resources/views/loans/adjust.blade.php b/resources/views/loans/adjust.blade.php new file mode 100644 index 0000000..8825ecc --- /dev/null +++ b/resources/views/loans/adjust.blade.php @@ -0,0 +1,21 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('Partials.Form.Input.date_end') +
+ @csrf +
+
+ @method('put') + +
+
+
+
+ +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/loans/create.blade.php b/resources/views/loans/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/loans/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/loans/create_pdf.blade.php b/resources/views/loans/create_pdf.blade.php new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/resources/views/loans/create_pdf.blade.php @@ -0,0 +1 @@ + +
+
+@include('Partials.Form.Input.products') +
+
+
+@include('Partials.Form.Input.cabels') +
+
+
+@include('Partials.Form.Input.date_start') +@include('Partials.Form.Input.date_end') +
+
+
+@include('Partials.Form.Signature.loaner') +@include('Partials.Form.Signature.lender') +@include('Partials.Form.Signature.fake_full') diff --git a/resources/views/loans/index.blade.php b/resources/views/loans/index.blade.php new file mode 100644 index 0000000..aa0ea0c --- /dev/null +++ b/resources/views/loans/index.blade.php @@ -0,0 +1,54 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('Partials.Pages.Search.search_bar') +
+ + + + + + + + + + @foreach($data as $loan) + + + + + + + + + @endforeach + +
@lang('user')@lang('items')@lang('date_start')@lang('date_end')@lang('action')
+ + {{$loan->user->username}} + + + @include('Partials.Pages.loan_items') + + {{date('d.m.Y',strtotime($loan->date_start))}} + + @if(!empty($loan->date_end)) + {{date('d.m.Y',strtotime($loan->date_end))}} + @else + @lang('permanent') + @endif + + @can('loans_adjust') + + @lang('adjust') @lang('date_end') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/loans/laptop/create.blade.php b/resources/views/loans/laptop/create.blade.php new file mode 100644 index 0000000..d8488e3 --- /dev/null +++ b/resources/views/loans/laptop/create.blade.php @@ -0,0 +1,13 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('loans.laptop.form_input') + @include('Partials.Form.Input.Submit.submit_create') +
+
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/loans/laptop/form_input.blade.php b/resources/views/loans/laptop/form_input.blade.php new file mode 100644 index 0000000..d609ff7 --- /dev/null +++ b/resources/views/loans/laptop/form_input.blade.php @@ -0,0 +1,24 @@ +@include('Partials.Form.Input.user') +@include('Partials.Form.Input.street') +@include('Partials.Form.Input.city') +
+
+
+@include('Partials.Form.Input.phone') +@include('Partials.Form.Input.email') +
+
+
+@include('Partials.Form.Input.laptop') +@include('Partials.Form.Input.laptop_extras') +
+
+
+@include('Partials.Form.Input.date_start') +@include('Partials.Form.Input.date_end') +
+
+
+@include('Partials.Form.Signature.loaner') +@include('Partials.Form.Signature.lender') +@include('Partials.Form.Signature.fake_full') diff --git a/resources/views/loans/laptop/pdf.blade.php b/resources/views/loans/laptop/pdf.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/loans/return.blade.php b/resources/views/loans/return.blade.php new file mode 100644 index 0000000..91a12d4 --- /dev/null +++ b/resources/views/loans/return.blade.php @@ -0,0 +1,30 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('Partials.Form.Input.user') +
+
+
+ @include('Partials.Form.Input.products_return') +
+
+
+ @include('Partials.Form.Input.cabels_return') +
+
+
+ @csrf +
+
+ +
+
+
+
+ +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/login.blade.php b/resources/views/login.blade.php new file mode 100644 index 0000000..83ad8da --- /dev/null +++ b/resources/views/login.blade.php @@ -0,0 +1,82 @@ + +@extends('layouts.login') + + +@section('content') + + + +@endsection + + diff --git a/resources/views/logs.blade.php b/resources/views/logs.blade.php new file mode 100644 index 0000000..d8a7af3 --- /dev/null +++ b/resources/views/logs.blade.php @@ -0,0 +1,197 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + + + + + @foreach($data as $log) + + + + + + + + + + + @endforeach + +
@lang('date')@lang('user')@lang('action')@lang('item') @lang('type')@lang('item')@lang('amount')@lang('data')
+ {{date('d.m.Y H:i:s',strtotime($log->created_at))}} + + + {{$log->user->username}} + + + @lang($log->action->name) + + @switch($log->loggable_type) + @case('App\Models\Product') + + @lang('product') + + @break + @case('App\Models\Cabel') + + @lang('cabel') + + @break + @case('App\Models\User') + + @lang('user') + + @break + @case('App\Models\Building') + + @lang('building') + + @break + @case('App\Models\Room') + + @lang('room') + + @break + @case('App\Models\Brand') + + @lang('brand') + + @break + @case('App\Models\ProductModel') + + @lang('model') + + @break + @case('App\Models\ProductCategory') + + @lang('category') + + @break + @case('App\Models\ProductSubcategory') + + @lang('subcategory') + + @break + @case('App\Models\CabelCategory') + + @lang('cabel') @lang('category') + + @break + @case('App\Models\Note') + + @lang('note') + + @break + @case('App\Models\Role') + + @lang('role') + + @break + @case('App\Models\Loan') + + @lang('loan') + + @break + @endswitch + + @if(isset($log->loggable)) + @switch($log->loggable_type) + @case('App\Models\Product') + + @if(config('app.barcode_mode') == 'static') + @if(!empty($log->loggable->barcode)) + {{$log->loggable->barcode}} + @endif + @elseif(config('app.barcode_mode') == 'dynamic') + {{$log->loggable->category->name}}.@if(!empty($log->loggable->subcategory)){{$log->loggable->subcategory->name}}.@endif{{$log->loggable->brand->name}}.{{$log->loggable->model->name}}@if(!empty($log->loggable->name)).{{$log->loggable->name}}@endif + @endif + + @break + @case('App\Models\Cabel') + + {{$log->loggable->category->name}}.{{$log->loggable->name}} + + @break + @case('App\Models\User') + + {{$log->loggable->username}} + + @break + @case('App\Models\Building') + + {{$log->loggable->name}} + + @break + @case('App\Models\Room') + + {{$log->loggable->name}} + + @break + @case('App\Models\Brand') + + {{$log->loggable->name}} + + @break + @case('App\Models\ProductModel') + + {{$log->loggable->name}} + + @break + @case('App\Models\ProductCategory') + + {{$log->loggable->name}} + + @break + @case('App\Models\ProductSubcategory') + + {{$log->loggable->name}} + + @break + @case('App\Models\CabelCategory') + + {{$log->loggable->name}} + + @break + @case('App\Models\Role') + + {{$log->loggable->name}} + + @break + @endswitch + @else + + @endif + + {{$log->amount}} + + @if(isset($log->loggable)) + @if(!empty($log->target)) + @lang('to') + + {{$log->target->username}} + + @elseif($log->action->name == "reserved") + + {{$log->target->username}} + + @elseif($log->action->name == "edited" OR $log->action->name == "adjusted") + {{$log->log}} + @endif + @endif + +
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/models/create.blade.php b/resources/views/models/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/models/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/models/deleted.blade.php b/resources/views/models/deleted.blade.php new file mode 100644 index 0000000..bd9b5be --- /dev/null +++ b/resources/views/models/deleted.blade.php @@ -0,0 +1,60 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + @foreach($data as $object) + + + + + + @endforeach + +
@lang('brand')@lang('name')@lang('action')
+ @can('brands_view') + + {{$object->brand->name}} + + @else + {{$object->brand->name}} + @endcan + + @can('models_view') + + {{$object->name}} + + @else + {{$object->name}} + @endcan + + + @can(Request::segment(1).'_edit') + + @lang('edit') + + @endcan + @can(Request::segment(1).'_restore') + + @lang('restore') + + @endcan + @can(Request::segment(1).'_delete_force') + @include('Partials.Form.Input.Modal.delete_force') + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/models/edit.blade.php b/resources/views/models/edit.blade.php new file mode 100644 index 0000000..8485b70 --- /dev/null +++ b/resources/views/models/edit.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.edit_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/models/form_input.blade.php b/resources/views/models/form_input.blade.php new file mode 100644 index 0000000..ed534fb --- /dev/null +++ b/resources/views/models/form_input.blade.php @@ -0,0 +1,2 @@ +@include('Partials.Form.Input.brand') +@include('Partials.Form.Input.name') diff --git a/resources/views/models/index.blade.php b/resources/views/models/index.blade.php new file mode 100644 index 0000000..c37086b --- /dev/null +++ b/resources/views/models/index.blade.php @@ -0,0 +1,50 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + @foreach($data as $model) + + + + + + @endforeach + +
@lang('brand')@lang('name')@lang('action')
+ @can('brands_view') + + {{$model->brand->name}} + + @else + {{$model->brand->name}} + @endcan + + @can('models_view') + + {{$model->name}} + + @else + {{$model->name}} + @endcan + + + @can('models_edit') + + @lang('edit') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/models/show.blade.php b/resources/views/models/show.blade.php new file mode 100644 index 0000000..8ebcd82 --- /dev/null +++ b/resources/views/models/show.blade.php @@ -0,0 +1,51 @@ +@extends('Layouts.master') + +@section('content') +
+
+
+

@lang('model') {{$data->name}}

+
+ @can('models_edit') + + @endcan +
+

+ @lang('brand') : + @can('brands_view') + + {{$data->brand->name}} + + @endcan +

+

@lang('products')

+ @if(count($data->products) >= 1) + + @foreach($data->products as $product) + + + + @endforeach +
+ + @if(config('app.barcode_mode') == 'dynamic') + {{$product->category->name}}.@if(!empty($product->subcategory->name)){{$product->subcategory->name}}.@endif{{$product->brand->name}}.{{$product->model->name}}@if(!empty($product->name)).{{$product->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$tracked->loanable->barcode}} + @endif +
+ @else + @lang('no_amount') @lang('products') + @endif +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/notes/deleted.blade.php b/resources/views/notes/deleted.blade.php new file mode 100644 index 0000000..f3e61e3 --- /dev/null +++ b/resources/views/notes/deleted.blade.php @@ -0,0 +1,118 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + + + + + @foreach($data as $note) + + + + + + + + + + @endforeach + +
@lang('user')@lang('item') @lang('type')@lang('item')@lang('note') @lang('type')@lang('note')@lang('created_at')@lang('action')
+ @can('users_view') + + {{$note->user->username}} + + @else + {{$note->user->username}} + @endcan + + @switch($note->loanable_type) + @case('App\Models\Product') + @can('products_viewAny') + + @lang('product') + + @else + @lang('product') + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_viewAny') + + @lang('cabel') + + @else + @lang('cabel') + @endcan + @break + + @endswitch + + @switch($note->loanable_type) + @case('App\Models\Product') + @can('products_view') + + @if(config('app.barcode_mode') == 'dynamic') + {{$note->loanable->category->name}}.@if(!empty($note->loanable->subcategory)){{$note->loanable->subcategory->name}}.@endif{{$note->loanable->brand->name}}.{{$note->loanable->model->name}}@if(!empty($note->loanable->name)).{{$note->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$note->loanable->barcode}} + @endif + + @else + @if(config('app.barcode_mode') == 'dynamic') + {{$note->loanable->category->name}}.@if(!empty($note->loanable->subcategory)){{$note->loanable->subcategory->name}}.@endif{{$note->loanable->brand->name}}.{{$note->loanable->model->name}}@if(!empty($note->loanable->name)).{{$note->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$note->loanable->barcode}} + @endif + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_view') + + {{$note->loanable->category->name}}.{{$note->loanable->name}} + + @else + {{$note->loanable->category->name}}.{{$note->loanable->name}} + @endcan + @break + @endswitch + + @lang($note->type->name) + + @lang($note->note) + + {{date('d.m.Y',strtotime($note->created_at))}} + + @can('notes_edit') + + @lang('edit') + + @endcan + @can('notes_restore') + + @lang('restore') + + @endcan + @can('notes_delete_force') + + @lang('delete_force') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/notes/edit.blade.php b/resources/views/notes/edit.blade.php new file mode 100644 index 0000000..a368330 --- /dev/null +++ b/resources/views/notes/edit.blade.php @@ -0,0 +1,48 @@ +@extends('Layouts.master') + +@section('content') +
+
+
+ +
+ +
+
+ +
+ +
+ @if(old('note') !== null) + + @elseif(isset($data->note)) + + @endif + +
+
+ @include('Partials.Form.Input.Submit.submit_update') +
+ @can('notes_delete') + @include('Partials.Form.Input.Modal.delete') + @endcan +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/notes/index.blade.php b/resources/views/notes/index.blade.php new file mode 100644 index 0000000..0a26e1f --- /dev/null +++ b/resources/views/notes/index.blade.php @@ -0,0 +1,95 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + + + + + @foreach($data as $note) + + + + + + + + + + @endforeach + +
@lang('user')@lang('item') @lang('type')@lang('item')@lang('note') @lang('type')@lang('note')@lang('created_at')@lang('action')
+ @can('users_view') + + {{$note->user->username}} + + @else + {{$note->user->username}} + @endcan + + @switch($note->loanable_type) + @case('App\Models\Product') + @can('products_viewAny') + + @lang('product') + + @else + @lang('product') + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_viewAny') + + @lang('cabel') + + @else + @lang('cabel') + @endcan + @break + + @endswitch + + @switch($note->loanable_type) + @case('App\Models\Product') + @can('products_view') + + @if(config('app.barcode_mode') == 'dynamic') + {{$note->loanable->category->name}}.@if(!empty($note->loanable->subcategory)){{$note->loanable->subcategory->name}}.@endif{{$note->loanable->brand->name}}.{{$note->loanable->model->name}}@if(!empty($note->loanable->name)).{{$note->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$note->loanable->barcode}} + @endif + + @else + @endcan + @break + @case('App\Models\Cabel') + @lang('cabel') + @break + @endswitch + + @lang($note->type->name) + + @lang($note->note) + + {{date('d.m.Y',strtotime($note->created_at))}} + + @can('notes_edit') + + @lang('edit') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/pdf/laptop.blade.php b/resources/views/pdf/laptop.blade.php new file mode 100644 index 0000000..6ceec3c --- /dev/null +++ b/resources/views/pdf/laptop.blade.php @@ -0,0 +1,284 @@ + + +

@lang('school')

+ + + + +
+ +
+ + +

@lang('division')

+

@lang('laptop')

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ @lang('user') : + + {{ $user->username }} - {{ $user->name }} +
+ @lang('street') : + + {{ $street_name }} {{ $street_number }} @if(!empty($street_instructions))- {{ $street_instructions }}@endif +
+ @lang('city') : + + {{ $city_zip }} {{ $city_name }} +
+ @lang('telephone') : + + {{ $telephone }} +
+ {{ $email }} +
+ @lang('date_start') : + + {{ date('d.m.Y', strtotime($date_start)) }} +
+ @lang('date_end') : + + @if(!empty($date_end)) + {{ date('d.m.Y', strtotime($date_end)) }} + @else + @lang('permanent') + @endif +
+ +

@lang('product')

+ + + + + + + + + + @if(!empty($product->name)) + + @endif + + + + + + + @if(!empty($product->name)) + + @endif + + +
+ @lang('category') + + @lang('brand') + + @lang('model') + + @lang('name') +
+ {{ $product->category->name }} + + {{ $product->brand->name }} + + {{ $product->model->name }} + + {{ $product->name }} +
+ + + + + + + @if(!empty($bag)) + + + + + @endif +
+ @lang('lock') : + + @lang($lock) +
+ @lang('bag') : + + @lang($bag) +
+

+ + + + + + + + + + + + + + + + + +
+ @lang('loaner') + + @lang('lender') +
+ + + +
+ {{ $user->name }} + + {{ Auth::user()->name }} +
diff --git a/resources/views/pdf/loan.blade.php b/resources/views/pdf/loan.blade.php new file mode 100644 index 0000000..2bf3dc0 --- /dev/null +++ b/resources/views/pdf/loan.blade.php @@ -0,0 +1,282 @@ + + +

@lang('school')

+ + + + +
+ +
+ + +

@lang('division')

+

@lang('loan')

+ + + + + + + + + + + + + + + + + + +
+ @lang('user') : + + {{ $user->username }} - {{ $user->name }} +
+ @lang('date_start') : + + {{ date('d.m.Y', strtotime($date_start)) }} +
+ @lang('date_end') : + + @if(!empty($date_end)) + {{ date('d.m.Y', strtotime($date_end)) }} + @else + @lang('permanent') + @endif +
+ +@if($products_total_amount >= 1) +
+ +

@lang('products')

+ + + + + + + + + + + + + + + + @foreach($products as $product) + + + + + + + + + @endforeach + +
+ @lang('category') + + @lang('subcategory') + + @lang('brand') + + @lang('model') + + @lang('name') + + @lang('amount') +
+ {{ $product[0]->category->name }} + + @if(!empty($product[0]->subcategory)) + {{ $product[0]->subcategory->name }} + @endif + + {{ $product[0]->brand->name }} + + {{ $product[0]->model->name }} + + @if(!empty($product[0]->name)) + {{ $product[0]->name }} + @endif + + {{ $product[1]}} +
+ +
+ +

Total @lang('amount') : {{$products_total_amount}}

+ +@endif + +@if($cabels_total_amount >= 1) +
+ +

Kabler

+ + + + + + + + + @foreach($cabels as $cabel) + + + + + + @endforeach + +
@lang('category')@lang('type')@lang('amount')
+ {{ $cabel[0]->category->name }} + + {{ $cabel[0]->name }} + + {{ $cabel[1] }} +
+ +
+ +

Total @lang('amount') : {{$cabels_total_amount}}

+@endif + +

+ + + + + + + + + + + + + + + + + +
+ @lang('loaner') + + @lang('lender') +
+ + + +
+ {{ $user->name }} + + {{ Auth::user()->name }} +
+ diff --git a/resources/views/pdf/reservation.blade.php b/resources/views/pdf/reservation.blade.php new file mode 100644 index 0000000..f15e49a --- /dev/null +++ b/resources/views/pdf/reservation.blade.php @@ -0,0 +1,291 @@ + + +

@lang('school')

+ + + + +
+ +
+ + +

@lang('division')

+

@lang('reservation')

+ + + + + + + + + + + + + + + + + + + + + + + + +
+ @lang('user') : + + {{ $user->username }} - {{ $user->name }} +
+ @lang('room') : + + {{ $room->building->name }} - {{ $room->name }} +
+ @lang('date_start') : + + {{ date('d.m.Y', strtotime($date_start)) }} +
+ @lang('date_end') : + + @if(!empty($date_end)) + {{ date('d.m.Y', strtotime($date_end)) }} + @else + @lang('permanent') + @endif +
+ +@if($products_total_amount >= 1) +
+ +

@lang('products')

+ + + + + + + + + + + + + + + + @foreach($products as $loan) + + + + + + + + + @endforeach + +
+ @lang('category') + + @lang('subcategory') + + @lang('brand') + + @lang('model') + + @lang('name') + + @lang('amount') +
+ {{ $loan->loanable->category->name }} + + @if(!empty($loan->loanable->subcategory)) + {{ $loan->loanable->subcategory->name }} + @endif + + {{ $loan->loanable->brand->name }} + + {{ $loan->loanable->model->name }} + + @if(!empty($loan->loanable->name)) + {{ $loan->loanable->name }} + @endif + + {{ $loan->amount}} +
+ +
+ +

Total @lang('amount') : {{$products_total_amount}}

+ +@endif + +@if($cabels_total_amount >= 1) +
+ +

Kabler

+ + + + + + + + + @foreach($cabels as $loan) + + + + + + @endforeach + +
@lang('category')@lang('type')@lang('amount')
+ {{ $loan->loanable->category->name }} + + {{ $loan->loanable->name }} + + {{ $loan->amount }} +
+ +
+ +

Total @lang('amount') : {{$cabels_total_amount}}

+@endif + +

+ + + + + + + + + + + + + + + + + +
+ @lang('loaner') + + @lang('lender') +
+ + + +
+ {{ $user->name }} + + {{ Auth::user()->name }} +
diff --git a/resources/views/products/create.blade.php b/resources/views/products/create.blade.php new file mode 100644 index 0000000..5258623 --- /dev/null +++ b/resources/views/products/create.blade.php @@ -0,0 +1,13 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('products.form_input') + @include('Partials.Form.Input.Submit.submit_create') +
+
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/products/deleted.blade.php b/resources/views/products/deleted.blade.php new file mode 100644 index 0000000..8c96ab3 --- /dev/null +++ b/resources/views/products/deleted.blade.php @@ -0,0 +1,138 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + @if(config('app.barcode_mode') == 'static') + + @endif + + + + + + + + + + + + + + + @foreach($data as $product) + + @if(config('app.barcode_mode') == 'static') + + @endif + + + + + + + + + + + + + @endforeach + +
@lang('barcode')@lang('category')@lang('subcategory')@lang('brand')@lang('model')@lang('name')@lang('description')@lang('available')@lang('lent')@lang('reserved')@lang('total')@lang('action')
+ @if(!empty($product->barcode)) + {{$product->barcode}} + @else + @lang('none') + @endif + + @can('categories_view') + + {{$product->category->name}} + + @else + {{$product->category->name}} + @endcan + + @can('subcategories_view') + @if(!empty($product->subcategory)) + + {{$product->subcategory->name}} + + @else + @lang('none') + @endif + @else + {{$product->subcategory->name}} + @endcan + + @can('brands_view') + + {{$product->brand->name}} + + @else + {{$product->brand->name}} + @endcan + + @can('models_view') + + {{$product->model->name}} + + @else + {{$product->model->name}} + @endcan + + @can('products_view') + @if(!empty($product->name)) + + {{$product->name}} + + @else + + @lang('show') + + @endif + @else + {{$product->name}} + @endcan + + + {{$product->description}} + + {{$product->total - (count($product->loans) + count($product->reservations))}} + + {{count($product->loans)}} + + {{count($product->reservations)}} + + {{$product->total}} + + @can('brand_edit') + + @lang('edit') + + @endcan + @can('brand_restore') + + @lang('restore') + + @endcan + @can('brand_delete_force') + + @lang('delete_force') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/products/edit.blade.php b/resources/views/products/edit.blade.php new file mode 100644 index 0000000..eb02b1c --- /dev/null +++ b/resources/views/products/edit.blade.php @@ -0,0 +1,50 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('products.form_input') + @include('Partials.Form.Input.Submit.submit_edit') +
+ @can('products_delete') + @include('Partials.Form.Input.Modal.delete') + @endcan + @can('products_amount_add') +
+
+ @method('put') + @csrf +
+ +
+ +
+
+ @can('products_amount_add') + + @endcan + @can('products_amount_remove') + + @endcan +
+
+
+ @endcan +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/products/form_input.blade.php b/resources/views/products/form_input.blade.php new file mode 100644 index 0000000..bb19c82 --- /dev/null +++ b/resources/views/products/form_input.blade.php @@ -0,0 +1,9 @@ +@if(config('app.barcode_mode') == "static") + @include('Partials.Form.Input.barcode') +@endif +@include('Partials.Form.Input.category') +@include('Partials.Form.Input.subcategory') +@include('Partials.Form.Input.brand') +@include('Partials.Form.Input.model') +@include('Partials.Form.Input.name') +@include('Partials.Form.Input.description') diff --git a/resources/views/products/index.blade.php b/resources/views/products/index.blade.php new file mode 100644 index 0000000..b11f776 --- /dev/null +++ b/resources/views/products/index.blade.php @@ -0,0 +1,129 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + @if(config('app.barcode_mode') == 'static') + + @endif + + + + + + + + + + + + + + @foreach($data as $product) + + @if(config('app.barcode_mode') == 'static') + + @endif + + + + + + + + + + + + + @endforeach + +
@lang('barcode')@lang('category')@lang('subcategory')@lang('brand')@lang('model')@lang('name')@lang('description')@lang('available')@lang('lent')@lang('reserved')@lang('total')@lang('action')
+ @if(!empty($product->barcode)) + {{$product->barcode}} + @else + @lang('none') + @endif + + @can('categories_view') + + {{$product->category->name}} + + @else + {{$product->category->name}} + @endcan + + @can('subcategories_view') + @if(!empty($product->subcategory)) + + {{$product->subcategory->name}} + + @else + @lang('none') + @endif + @else + {{$product->subcategory->name}} + @endcan + + @can('brands_view') + + {{$product->brand->name}} + + @else + {{$product->brand->name}} + @endcan + + @can('models_view') + + {{$product->model->name}} + + @else + {{$product->model->name}} + @endcan + + @can('products_view') + @if(!empty($product->name)) + + {{$product->name}} + + @else + + @lang('show') + + @endif + @else + {{$product->name}} + @endcan + + + {{$product->description}} + + {{$product->total - (count($product->loans) + count($product->reservations))}} + + {{count($product->loans)}} + + {{count($product->reservations)}} + + {{$product->total}} + +
+ @can('products_edit') + + @lang('edit') + + @endcan +
+
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/products/show.blade.php b/resources/views/products/show.blade.php new file mode 100644 index 0000000..5f1e406 --- /dev/null +++ b/resources/views/products/show.blade.php @@ -0,0 +1,163 @@ +@extends('Layouts.master') + +@section('content') +
+
+
+

+ @if(!empty($data->deleted_at)) + @lang('DELETED') + @endif + @lang('product') +

+
+ @can('product_edit') + + @endcan +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @if(!empty($data->deleted_at)) + + + + + @endif + + + + + + + + + + + + + + + + + + + + +
+ @if(config('app.barcode_mode') == 'static') + @lang('static') + @elseif(config('app.barcode_mode') == 'dynamic') + @lang('dynamic') + @endif + @lang('barcode') : + + @if(config('app.barcode_mode') == 'static') + @if(!empty($data->barcode)) + {{$data->barcode}} + @endif + @elseif(config('app.barcode_mode') == 'dynamic') + {{$data->category->name}}.@if(!empty($data->subcategory)){{$data->subcategory->name}}.@endif{{$data->brand->name}}.{{$data->model->name}}@if(!empty($data->name)).{{$data->name}}@endif + @endif +
+ @lang('category') : + + {{$data->category->name}} +
+ @lang('subcategory') : + + @if(!empty($data->subcategory)) + {{$data->subcategory->name}} + @else + @lang('none') + @endif +
+ @lang('brand') : + + {{$data->brand->name}} +
+ @lang('model') : + + {{$data->model->name}} +
+ @lang('name') : + + @if(!empty($data->name)) + {{$data->name}} + @endif +
+ @lang('created_at') : + + {{date('d-m-Y H:i:s',strtotime($data->created_at))}} +
+ @lang('updated_at') : + + {{date('d-m-Y H:i:s',strtotime($data->updated_at))}} +
+ @lang('deleted_at') : + + {{date('d-m-Y H:i:s',strtotime($data->deleted_at))}} +
+

@lang('pool')

+
+ @lang('available') : + + {{$data->total - (count($data->loans) + count($data->reservations))}} +
+ @lang('lent') : + + {{count($data->loans)}} +
+ @lang('reserved') : + + {{count($data->reservations)}} +
+ @lang('total') : + + {{$data->total}} +
+
+
+

+
+
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/reservations/create.blade.php b/resources/views/reservations/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/reservations/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/reservations/form_input.blade.php b/resources/views/reservations/form_input.blade.php new file mode 100644 index 0000000..bc8e283 --- /dev/null +++ b/resources/views/reservations/form_input.blade.php @@ -0,0 +1,15 @@ +@include('Partials.Form.Input.user') +@include('Partials.Form.Input.room') +
+
+
+@include('Partials.Form.Input.products') +
+
+
+@include('Partials.Form.Input.cabels') +
+
+
+@include('Partials.Form.Input.date_start') +@include('Partials.Form.Input.date_end') diff --git a/resources/views/reservations/index.blade.php b/resources/views/reservations/index.blade.php new file mode 100644 index 0000000..29739cb --- /dev/null +++ b/resources/views/reservations/index.blade.php @@ -0,0 +1,74 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('Partials.Pages.Search.search_bar') +
+ @include('Partials.Pages.reservation_selector') + + + + + + + + + + + @foreach($data as $reservation) + + + + + + + + + + + @endforeach + +
@lang('user')@lang('room')@lang('items')@lang('date_start')@lang('date_end')@lang('status')
+ + {{$reservation->user->username}} + + + + {{$reservation->room->building->name}}.{{$reservation->room->name}} + + + @include('Partials.Pages.reservation_items') + + {{date('d.m.Y',strtotime($reservation->date_start))}} + + @if(!empty($reservation->date_end)) + {{date('d.m.Y',strtotime($reservation->date_end))}} + @else + @lang('permanent') + @endif + + @switch($reservation->type->name) + @case('Reservation - Awaiting') + @lang('validation') + @break + @case('Reservation - Set Up') + @lang('setup') + @break + @case('Reservation - Pick Up') + @lang('pickup') + @break + @endswitch +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/reservations/pickups.blade.php b/resources/views/reservations/pickups.blade.php new file mode 100644 index 0000000..8d53ce1 --- /dev/null +++ b/resources/views/reservations/pickups.blade.php @@ -0,0 +1,61 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('Partials.Pages.Search.search_bar') +
+ @include('Partials.Pages.reservation_selector') + + + + + + + + + + + @foreach($data as $reservation) + + + + + + + + + + @endforeach + +
@lang('user')@lang('room')@lang('items')@lang('date_start')@lang('date_end')@lang('action')
+ + {{$reservation->user->username}} + + + + {{$reservation->room->building->name}}.{{$reservation->room->name}} + + + @include('Partials.Pages.reservation_items') + + {{date('d.m.Y',strtotime($reservation->date_start))}} + + @if(!empty($reservation->date_end)) + {{date('d.m.Y',strtotime($reservation->date_end))}} + @else + @lang('permanent') + @endif + + @can('reservations_pickup') + @include('Partials.Pages.reservation_pickup') + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/reservations/setups.blade.php b/resources/views/reservations/setups.blade.php new file mode 100644 index 0000000..fd481c2 --- /dev/null +++ b/resources/views/reservations/setups.blade.php @@ -0,0 +1,61 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('Partials.Pages.Search.search_bar') +
+ @include('Partials.Pages.reservation_selector') + + + + + + + + + + + @foreach($data as $reservation) + + + + + + + + + + @endforeach + +
@lang('user')@lang('room')@lang('items')@lang('date_start')@lang('date_end')@lang('action')
+ + {{$reservation->user->username}} + + + + {{$reservation->room->building->name}}.{{$reservation->room->name}} + + + @include('Partials.Pages.reservation_items') + + {{date('d.m.Y',strtotime($reservation->date_start))}} + + @if(!empty($reservation->date_end)) + {{date('d.m.Y',strtotime($reservation->date_end))}} + @else + @lang('permanent') + @endif + + @can('reservations_setup') + @include('Partials.Pages.reservation_setup') + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/reservations/validate.blade.php b/resources/views/reservations/validate.blade.php new file mode 100644 index 0000000..c5877c3 --- /dev/null +++ b/resources/views/reservations/validate.blade.php @@ -0,0 +1,93 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @lang('user') : +
+ {{$user->username}} +
+
+
+ @lang('room') : +
+ {{$room->building->name}} - {{$room->name}} +
+
+
+ @lang('date_start') : +
+ {{date('d.m.Y',strtotime($data->date_start))}} +
+
+
+ @lang('date_end') : +
+ {{date('d.m.Y',strtotime($data->date_end))}} +
+
+ +
+ @lang('loans') : +
+ + + + + + + + @foreach($reservations as $reservation) + + + + + + @endforeach + +
@lang('type')@lang('item')@lang('amount')
+ @switch($reservation->loanable_type) + @case('App\Models\Product') + @lang('product') + @break + @case('App\Models\Cabel') + @lang('cabel') + @break + @endswitch + + @switch($reservation->loanable_type) + @case('App\Models\Product') + @if(config('app.barcode_mode') == 'dynamic') + {{$reservation->loanable->category->name}}.@if(!empty($reservation->loanable->subcategory->name)){{$reservation->loanable->subcategory->name}}.@endif{{$reservation->loanable->brand->name}}.{{$reservation->loanable->model->name}}@if(!empty($reservation->loanable->name)).{{$reservation->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$reservation->loanable->barcode}} + @endif + @break + @case('App\Models\Cabel') + {{$reservation->loanable->category->name}}.{{$reservation->loanable->name}} + @break + @endswitch + + {{$reservation->amount}} +
+ +
+
+
+ @include('Partials.Form.Signature.loaner') + @include('Partials.Form.Signature.lender') + @include('Partials.Form.Signature.fake_full') +
+ +
+ @csrf + +
+
+
+
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/reservations/validations.blade.php b/resources/views/reservations/validations.blade.php new file mode 100644 index 0000000..3cd66a0 --- /dev/null +++ b/resources/views/reservations/validations.blade.php @@ -0,0 +1,100 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('Partials.Pages.Search.search_bar') +
+ @include('Partials.Pages.reservation_selector') + + + + + + + + + + + + @foreach($data as $loan) + + + + + + + + + + @endforeach + +
@lang('user')@lang('room')@lang('deadline')@lang('date_start')@lang('date_end')@lang('action')
+ + {{$loan->user->username}} + + + + {{$loan->room->building->name}}.{{$loan->room->name}} + + + @if(!empty($loan->date_deadline)) + {{date('d.m.Y H:i:s',strtotime($loan->date_deadline))}} + @endif + + {{date('d.m.Y',strtotime($loan->date_start))}} + + @if(!empty($loan->date_end)) + {{date('d.m.Y',strtotime($loan->date_end))}} + @else + @lang('permanent') + @endif + + @can('reservations_validate') + @if(NOW() < $loan->date_deadline) + + @lang('validate') @lang('reservation') + + @endif + @endcan + @can('reservations_cancel') + @if(NOW() > $loan->date_deadline) +
+ +
+
+ + +
+ @endif + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/roles/create.blade.php b/resources/views/roles/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/roles/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/roles/deleted.blade.php b/resources/views/roles/deleted.blade.php new file mode 100644 index 0000000..4c998c6 --- /dev/null +++ b/resources/views/roles/deleted.blade.php @@ -0,0 +1,40 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + @foreach($data as $object) + + + + + @endforeach + +
@lang('name')@lang('action')
+ {{$object->name}} + + @can(Request::segment(1).'_edit') + + @lang('edit') + + @endcan + @can(Request::segment(1).'_restore') + + @lang('restore') + + @endcan + @can(Request::segment(1).'_delete_force') + @include('Partials.Form.Input.Modal.delete_force') + @endcan +
+
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/roles/edit.blade.php b/resources/views/roles/edit.blade.php new file mode 100644 index 0000000..8485b70 --- /dev/null +++ b/resources/views/roles/edit.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.edit_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/roles/form_input.blade.php b/resources/views/roles/form_input.blade.php new file mode 100644 index 0000000..ff2d7bd --- /dev/null +++ b/resources/views/roles/form_input.blade.php @@ -0,0 +1,6 @@ +@include('Partials.Form.Input.name') +@can('roles_edit_permissions') + @if(isset($data)) + @include('Partials.Form.Input.permissions') + @endif +@endcan diff --git a/resources/views/roles/index.blade.php b/resources/views/roles/index.blade.php new file mode 100644 index 0000000..69b67de --- /dev/null +++ b/resources/views/roles/index.blade.php @@ -0,0 +1,39 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + @foreach($data as $role) + + + + + @endforeach + + +
@lang('name')@lang('action')
+ @can('roles_view') + + {{$role->name}} + + @else + {{$role->name}} + @endcan + + @can('roles_edit') + @lang('edit') + @endcan +
+ +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/roles/show.blade.php b/resources/views/roles/show.blade.php new file mode 100644 index 0000000..193d90d --- /dev/null +++ b/resources/views/roles/show.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.show_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/roles/show_data.blade.php b/resources/views/roles/show_data.blade.php new file mode 100644 index 0000000..973a6d7 --- /dev/null +++ b/resources/views/roles/show_data.blade.php @@ -0,0 +1,24 @@ +

@lang('users')

+@if(count($data->users) >= 1) + + + @foreach($data->users as $user) + + + + @endforeach + +
+ @can('users_view') + + {{$user->username}} + + @else + {{$user->username}} + @endcan +
+@else + @lang('no_amount') @lang('users') +@endif diff --git a/resources/views/rooms/create.blade.php b/resources/views/rooms/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/rooms/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/rooms/deleted.blade.php b/resources/views/rooms/deleted.blade.php new file mode 100644 index 0000000..323e877 --- /dev/null +++ b/resources/views/rooms/deleted.blade.php @@ -0,0 +1,48 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + @foreach($data as $object) + + + + + + @endforeach + +
@lang('building')@lang('room')@lang('action')
+ {{$object->building->name}} + + {{$object->name}} + + @can(Request::segment(1).'_edit') + + @lang('edit') + + @endcan + @can(Request::segment(1).'_restore') + + @lang('restore') + + @endcan + @can(Request::segment(1).'_delete_force') + @include('Partials.Form.Input.Modal.delete_force') + @endcan +
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/rooms/edit.blade.php b/resources/views/rooms/edit.blade.php new file mode 100644 index 0000000..8485b70 --- /dev/null +++ b/resources/views/rooms/edit.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.edit_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/rooms/form_input.blade.php b/resources/views/rooms/form_input.blade.php new file mode 100644 index 0000000..32df5b3 --- /dev/null +++ b/resources/views/rooms/form_input.blade.php @@ -0,0 +1,2 @@ +@include('Partials.Form.Input.building') +@include('Partials.Form.Input.name') diff --git a/resources/views/rooms/index.blade.php b/resources/views/rooms/index.blade.php new file mode 100644 index 0000000..0b0c417 --- /dev/null +++ b/resources/views/rooms/index.blade.php @@ -0,0 +1,35 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + @foreach($data as $room) + + + + + + @endforeach + +
@lang('building')@lang('room')@lang('action')
+ {{$room->building->name}} + + {{$room->name}} + + @lang('edit') +
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/rooms/show.blade.php b/resources/views/rooms/show.blade.php new file mode 100644 index 0000000..193d90d --- /dev/null +++ b/resources/views/rooms/show.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.show_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/rooms/show_data.blade.php b/resources/views/rooms/show_data.blade.php new file mode 100644 index 0000000..7449e88 --- /dev/null +++ b/resources/views/rooms/show_data.blade.php @@ -0,0 +1,116 @@ +

+ @lang('building') : + @can('buildings_view') + + {{$data->building->name}} + + @else + {{$data->building->name}} + @endcan +

+ +

@lang('reservations')

+@if(count($data->reservations) >= 1) + + + + + + + + + + + @foreach($reservations as $loan) + + + + + + + + + + + @endforeach + + + + + + +
@lang('type')@lang('item')@lang('amount')@lang('date_start')@lang('date_end')@lang('status')
+ @switch($loan->loanable_type) + @case('App\Models\Product') + @can('products_viewAny') + @lang('product') + @else + @lang('product') + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_viewAny') + @lang('cabel') + @else + @lang('cabel') + @endcan + @break + @endswitch + + @switch($loan->loanable_type) + @case('App\Models\Product') + @can('products_view') + + @if(config('app.barcode_mode') == 'dynamic') + {{$loan->loanable->category->name}}.@if(!empty($loan->loanable->subcategory)){{$loan->loanable->subcategory->name}}.@endif{{$loan->loanable->brand->name}}.{{$loan->loanable->model->name}}@if(!empty($loan->loanable->name)).{{$loan->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$loan->loanable->barcode}} + @endif + + @else + @if(config('app.barcode_mode') == 'dynamic') + {{$loan->loanable->category->name}}.@if(!empty($loan->loanable->subcategory)){{$loan->loanable->subcategory->name}}.@endif{{$loan->loanable->brand->name}}.{{$loan->loanable->model->name}}@if(!empty($loan->loanable->name)).{{$loan->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$loan->loanable->barcode}} + @endif + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_view') + + {{$loan->loanable->category->name}}.{{$loan->loanable->name}} + + @else + {{$loan->loanable->category->name}}.{{$loan->loanable->name}} + @endcan + @break + @endswitch + + {{$loan->amount}} + + {{date('d.m.Y',strtotime($loan->date_start))}} + + {{date('d.m.Y',strtotime($loan->date_end))}} + + @switch($loan->type->name) + @case('Reservation - Awaiting') + @lang('validation') + - @lang('deadline') : + @if(!empty($loan->date_deadline)) + {{date('d.m.Y H:i:s',strtotime($loan->date_deadline))}} + @endif + @break + @case('Reservation - Set Up') + @lang('awaiting') @lang('setup') + @break + @case('Reservation - Pick Up') + @lang('awaiting') @lang('pickup') + @break + @endswitch + +
Total : {{count($data->reservations)}}
+@else + @lang('no_amount') @lang('reservations') +@endif diff --git a/resources/views/statistics.blade.php b/resources/views/statistics.blade.php new file mode 100644 index 0000000..6c0f68f --- /dev/null +++ b/resources/views/statistics.blade.php @@ -0,0 +1,366 @@ +@extends('Layouts.master') + +@section('content') + +
+
+
+
+
+
+

@lang('lastDay')

+
+
+

+ @lang('loaned'): +
+ {{$lastday_lent}} +

+
+
+

+ @lang('reserved'): +
+ {{$lastday_reserved}} +

+
+
+

+ @lang('returned'): +
+ {{$lastday_returned}} +

+
+
+

+ @lang('notes'): +
+ {{$lastday_notes}} +

+
+
+
+
+

@lang('storage')

+
+
+

+ @lang('available'): +
+ {{$total_total - ($total_lent + $total_reserved)}} +

+
+
+

+ @lang('loaned'): +
+ {{$total_lent}} +

+
+
+

+ @lang('reserved'): +
+ {{$total_reserved}} +

+
+
+

+ @lang('total'): +
+ {{$total_total}} +

+
+
+
+
+
+
+
+
+

+ @lang('loans') +

+ @if(count($lent) >= 1) + + + + + + + + @for($i = 1; $i <= count($lent);$i++) + + + + + + @endfor + +
@lang('place')@lang('user')@lang('amount')
+ {{$i}} + + @can('users_view') + + {{$lent[$i-1]->user->username}} + + @else + {{$lent[$i-1]->user->username}} + @endcan + + {{$lent[$i-1]->sum}} +
+ @else +

+ @lang('no_amount') +

+ @endif + +
+
+

+ @lang('returns') +

+ @if(count($returned) >= 1) + + + + + + + + @for($i = 1; $i <= count($returned);$i++) + + + + + + @endfor + +
@lang('place')@lang('user')@lang('amount')
+ {{$i}} + + @can('users_view') + + {{$returned[$i-1]->user->username}} + + @else + {{$returned[$i-1]->user->username}} + @endcan + + {{$returned[$i-1]->sum}} +
+ @else +

+ @lang('no_amount') +

+ @endif +
+
+

+ @lang('notes') +

+ @if(count($notes) >= 1) + + + + + + + + @for($i = 1; $i <= count($notes);$i++) + + + + + + @endfor + +
@lang('place')@lang('user')@lang('amount')
+ {{$i}} + + @can('users_view') + + {{$notes[$i-1]->user->username}} + + @else + {{$notes[$i-1]->user->username}} + @endcan + + {{$notes[$i-1]->amount}} +
+ @else +

+ @lang('no_amount') +

+ @endif +
+
+

+ @lang('reservations') +

+ @if(count($reserved) >= 1) + + + + + + + + @for($i = 1; $i <= count($reserved);$i++) + + + + + + @endfor + +
@lang('place')@lang('user')@lang('amount')
+ {{$i}} + + @can('users_view') + + {{$reserved[$i-1]->user->username}} + + @else + {{$reserved[$i-1]->user->username}} + @endcan + + {{$reserved[$i-1]->sum}} +
+ @else +

+ @lang('no_amount') +

+ @endif + +
+
+

+ @lang('validations') +

+ @if(count($validated) >= 1) + + + + + + + + @for($i = 1; $i <= count($validated);$i++) + + + + + + @endfor + +
@lang('place')@lang('user')@lang('amount')
+ {{$i}} + + @can('users_view') + + {{$validated[$i-1]->user->username}} + + @else + {{$validated[$i-1]->user->username}} + @endcan + + + {{$validated[$i-1]->amount}} +
+ @else +

+ @lang('no_amount') +

+ @endif + +
+
+

+ @lang('setups') +

+ @if(count($setups) >= 1) + + + + + + + + @for($i = 1; $i <= count($setups);$i++) + + + + + + @endfor + +
@lang('place')@lang('user')@lang('amount')
+ {{$i}} + + @can('users_view') + + {{$setups[$i-1]->user->username}} + + @else + {{$setups[$i-1]->user->username}} + @endcan + + + {{$setups[$i-1]->amount}} +
+ @else +

+ @lang('no_amount') +

+ @endif +
+
+

+ @lang('pickups') +

+ @if(count($pickups) >= 1) + + + + + + + + @for($i = 1; $i <= count($pickups);$i++) + + + + + + @endfor + +
@lang('place')@lang('user')@lang('amount')
+ {{$i}} + + @can('users_view') + + {{$pickups[$i-1]->user->username}} + + @else + {{$pickups[$i-1]->user->username}} + @endcan + + {{$setups[$i-1]->amount}} +
+ @else +

+ @lang('no_amount') +

+ @endif + +
+
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/subcategories/create.blade.php b/resources/views/subcategories/create.blade.php new file mode 100644 index 0000000..cc12678 --- /dev/null +++ b/resources/views/subcategories/create.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.create_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/subcategories/deleted.blade.php b/resources/views/subcategories/deleted.blade.php new file mode 100644 index 0000000..824f02f --- /dev/null +++ b/resources/views/subcategories/deleted.blade.php @@ -0,0 +1,61 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + @foreach($data as $object) + + + + + + @endforeach + +
@lang('category')@lang('name')@lang('action')
+ @can('categories_view') + + {{$object->category->name}} + + @else + {{$object->name}} + @endcan + + @can('categories_edit') + + {{$object->name}} + + @else + {{$object->name}} + @endcan + + @can(Request::segment(1).'_edit') + + @lang('edit') + + @endcan + @can(Request::segment(1).'_restore') + + @lang('restore') + + @endcan + @can(Request::segment(1).'_delete_force') + @include('Partials.Form.Input.Modal.delete_force') + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/subcategories/edit.blade.php b/resources/views/subcategories/edit.blade.php new file mode 100644 index 0000000..8485b70 --- /dev/null +++ b/resources/views/subcategories/edit.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.edit_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/subcategories/form_input.blade.php b/resources/views/subcategories/form_input.blade.php new file mode 100644 index 0000000..6e90061 --- /dev/null +++ b/resources/views/subcategories/form_input.blade.php @@ -0,0 +1,2 @@ +@include('Partials.Form.Input.category') +@include('Partials.Form.Input.name') diff --git a/resources/views/subcategories/index.blade.php b/resources/views/subcategories/index.blade.php new file mode 100644 index 0000000..fb6d17b --- /dev/null +++ b/resources/views/subcategories/index.blade.php @@ -0,0 +1,52 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') + + + + + + + + @foreach($data as $subcategory) + + + + + + @endforeach + +
@lang('category')@lang('name')@lang('action')
+ @can('categories_view') + + {{$subcategory->category->name}} + + @else + {{$subcategory->name}} + @endcan + + @can('categories_edit') + + {{$subcategory->name}} + + @else + {{$subcategory->name}} + @endcan + + @can('categories_edit') + + @lang('edit') + + @endcan +
+ @include('Partials.Pages.display') +
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/subcategories/show.blade.php b/resources/views/subcategories/show.blade.php new file mode 100644 index 0000000..193d90d --- /dev/null +++ b/resources/views/subcategories/show.blade.php @@ -0,0 +1,8 @@ +@extends('Layouts.master') + +@section('content') + @include('Partials.Pages.show_page') +@endsection + +@section('scripting') +@endsection diff --git a/resources/views/subcategories/show_data.blade.php b/resources/views/subcategories/show_data.blade.php new file mode 100644 index 0000000..2ff637c --- /dev/null +++ b/resources/views/subcategories/show_data.blade.php @@ -0,0 +1,22 @@ +

@lang('products')

+@if(count($data->products) >= 1) + + @foreach($data->products as $product) + + + + @endforeach +
+ + @if(config('app.barcode_mode') == 'dynamic') + {{$product->category->name}}.@if(!empty($product->subcategory->name)){{$product->subcategory->name}}.@endif{{$product->brand->name}}.{{$product->model->name}}@if(!empty($product->name)).{{$product->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$tracked->loanable->barcode}} + @endif + +
+ +@else + @lang('no_amount') @lang('subcategories') +@endif diff --git a/resources/views/users/create.blade.php b/resources/views/users/create.blade.php new file mode 100644 index 0000000..f21b3c8 --- /dev/null +++ b/resources/views/users/create.blade.php @@ -0,0 +1,13 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @include('Partials.Form.Input.name') + @include('Partials.Form.Input.user') + @include('Partials.Form.Input.password') + @include('Partials.Form.Input.role') + @include('Partials.Form.Input.Submit.submit_create') +
+
+@endsection diff --git a/resources/views/users/deleted.blade.php b/resources/views/users/deleted.blade.php new file mode 100644 index 0000000..91b0557 --- /dev/null +++ b/resources/views/users/deleted.blade.php @@ -0,0 +1,148 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') +
+ + + + + + + + + + + @foreach($data as $object) + + + + + + + @endforeach + +
@lang('username')@lang('name_full')@lang('role')@lang('action')
{{$object->username}}{{$object->name}}{{$object->role->name}} + @can(Request::segment(1).'_edit') + + @lang('edit') + + @endcan + @can(Request::segment(1).'_restore') + + @lang('restore') + + @endcan + @can(Request::segment(1).'_delete_force') + +
+ + +
+ + + + + @endcan +
+
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php new file mode 100644 index 0000000..70b358a --- /dev/null +++ b/resources/views/users/edit.blade.php @@ -0,0 +1,24 @@ +@extends('Layouts.master') + +@section('content') +
+
+ @if($data->loanerType->name != "adUser") + @can("users_edit_username") + @include('Partials.Form.Input.name') + @include('Partials.Form.Input.user') + @endcan + @include('Partials.Form.Input.password') + @endif + @can("users_edit_role") + @if($data->id != Auth::user()->id) + @include('Partials.Form.Input.role') + @endif + @endcan + @include('Partials.Form.Input.Submit.submit_edit') +
+ @can('users_delete') + @include('Partials.Form.Input.Modal.delete') + @endcan +
+@endsection diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php new file mode 100644 index 0000000..d724efb --- /dev/null +++ b/resources/views/users/index.blade.php @@ -0,0 +1,56 @@ +@extends('Layouts.master') + +@section('content') +
+ @include('Partials.Pages.index_top') +
+ + + + + + + + + + + @foreach($data as $user) + + + + + + + @endforeach + +
@lang('username')@lang('name_full')@lang('role')@lang('action')
{{$user->username}}{{$user->name}} + @can('roles_view') + + {{$user->role->name}} + + @else + {{$user->role->name}} + @endcan + + + @can('view',\App\Models\User::class) + + @lang('show') + + @endcan + @can('edit',\App\Models\User::class) + + @lang('edit') + + @endcan +
+
+ @include('Partials.Pages.display') +
+@endsection +@section('scripting') +@endsection + diff --git a/resources/views/users/show.blade.php b/resources/views/users/show.blade.php new file mode 100644 index 0000000..728201a --- /dev/null +++ b/resources/views/users/show.blade.php @@ -0,0 +1,438 @@ +@extends('Layouts.master') + +@section('content') +
+
+
+
+

@lang('loans')

+ @if(count($loans) >= 1) + + + + + + + + + + @foreach($loans as $loan) + + + + + + + + + @endforeach + + + + + + +
@lang('type')@lang('item')@lang('amount')@lang('date_end')
+ @switch($loan->loanable_type) + @case('App\Models\Product') + @can('products_viewAny') + @lang('product') + @else + @lang('product') + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_viewAny') + @lang('cabel') + @else + @lang('cabel') + @endcan + @break + @endswitch + + @switch($loan->loanable_type) + @case('App\Models\Product') + @can('products_view') + + @if(config('app.barcode_mode') == 'dynamic') + {{$loan->loanable->category->name}}.@if(!empty($loan->loanable->subcategory)){{$loan->loanable->subcategory->name}}.@endif{{$loan->loanable->brand->name}}.{{$loan->loanable->model->name}}@if(!empty($loan->loanable->name)).{{$loan->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$loan->loanable->barcode}} + @endif + + @else + @if(config('app.barcode_mode') == 'dynamic') + {{$loan->loanable->category->name}}.@if(!empty($loan->loanable->subcategory)){{$loan->loanable->subcategory->name}}.@endif{{$loan->loanable->brand->name}}.{{$loan->loanable->model->name}}@if(!empty($loan->loanable->name)).{{$loan->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$loan->loanable->barcode}} + @endif + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_view') + + {{$loan->loanable->category->name}}.{{$loan->loanable->name}} + + @else + {{$loan->loanable->category->name}}.{{$loan->loanable->name}} + @endcan + @break + @endswitch + + {{$loan->amount}} + + @if(!empty($loan->date_end)) + {{date('d.m.Y',strtotime($loan->date_end))}} + @else + @lang('permanent') + @endif +
Total : {{count($data->loans)}}
+ @else + @lang('no_amount') @lang('loans') + @endif + +
+
+
+ +

@lang('reservations')

+ @if(count($reservations) >= 1) + + + + + + + + + + + @foreach($reservations as $loan) + + + + + + + + + + + @endforeach + + + + + + +
@lang('type')@lang('item')@lang('amount')@lang('date_start')@lang('date_end')@lang('status')
+ @switch($loan->loanable_type) + @case('App\Models\Product') + @can('products_viewAny') + @lang('product') + @else + @lang('product') + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_viewAny') + @lang('cabel') + @else + @lang('cabel') + @endcan + @break + @endswitch + + @switch($loan->loanable_type) + @case('App\Models\Product') + @can('products_view') + + @if(config('app.barcode_mode') == 'dynamic') + {{$loan->loanable->category->name}}.@if(!empty($loan->loanable->subcategory)){{$loan->loanable->subcategory->name}}.@endif{{$loan->loanable->brand->name}}.{{$loan->loanable->model->name}}@if(!empty($loan->loanable->name)).{{$loan->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$loan->loanable->barcode}} + @endif + + @else + @if(config('app.barcode_mode') == 'dynamic') + {{$loan->loanable->category->name}}.@if(!empty($loan->loanable->subcategory)){{$loan->loanable->subcategory->name}}.@endif{{$loan->loanable->brand->name}}.{{$loan->loanable->model->name}}@if(!empty($loan->loanable->name)).{{$loan->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$loan->loanable->barcode}} + @endif + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_view') + + {{$loan->loanable->category->name}}.{{$loan->loanable->name}} + + @else + {{$loan->loanable->category->name}}.{{$loan->loanable->name}} + @endcan + @break + @endswitch + + {{$loan->amount}} + + {{date('d.m.Y',strtotime($loan->date_start))}} + + {{date('d.m.Y',strtotime($loan->date_end))}} + + @switch($loan->type->name) + @case('Reservation - Awaiting') + @lang('validation') + - @lang('deadline') : + @if(!empty($loan->date_deadline)) + {{date('d.m.Y H:i:s',strtotime($loan->date_deadline))}} + @endif + @break + @case('Reservation - Set Up') + @lang('awaiting') @lang('setup') + @break + @case('Reservation - Pick Up') + @lang('awaiting') @lang('pickup') + @break + @endswitch + +
Total : {{count($data->reservations)}}
+ @else + @lang('no_amount') @lang('reservations') + @endif + +
+
+
+ +

@lang('contracts')

+ @if(count($contracts) >= 1) + @can('pdf_view') + + + + + + + + + + @foreach($contracts as $file) + + + + + + @endforeach + + + + + +
@lang('date') @lang('type') @lang('action')
+ {{ date('d.m.Y H:i:s', $file->timestamp) }} + + @if($file->type == 'contracts') + @lang('loan') + @elseif($file->type == 'laptops') + @lang('laptop') + @elseif($file->type == 'reservations') + @lang('reservation') + @endif + + + @lang('show') + + @can('delete', App\Models\PDF::class) +
+ @csrf + @method('DELETE') + +
+ @endcan + +
Total : {{count($contracts)}}
+ @endcan + @cannot('pdf_view') + @if(Auth::user()->id == $data->id) + + + + + + + + + + @foreach($contracts as $file) + + + + + + @endforeach + + + + + +
@lang('date') @lang('type') @lang('action')
{{ date('d.m.Y H:i:s', $file->timestamp) }} + @if($file->type == 'contracts') + @lang('loan') + @elseif($file->type == 'laptops') + @lang('laptop') + @elseif($file->type == 'reservations') + @lang('reservation') + @endif + + + @lang('show') + +
Total : {{count($contracts)}}
+ @endif + @endcannot + @else + @lang('no_amount') @lang('contracts') + @endif + +
+
+
+ + @can('notes_view') +

@lang('notes')

+ @if(count($notes) >= 1) + + + + + + + + + @foreach($notes as $note) + + + + + + + @endforeach + +
@lang('item') @lang('type')@lang('item')@lang('note') @lang('type')@lang('note')
+ @switch($note->loanable_type) + @case('App\Models\Product') + @can('products_viewAny') + @lang('product') + @else + @lang('product') + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_viewAny') + @lang('cabel') + @else + @lang('cabel') + @endcan + @break + @endswitch + + @switch($note->loanable_type) + @case('App\Models\Product') + @can('products_view') + + @if(config('app.barcode_mode') == 'dynamic') + {{$note->loanable->category->name}}.@if(!empty($note->loanable->subcategory)){{$note->loanable->subcategory->name}}.@endif{{$note->loanable->brand->name}}.{{$note->loanable->model->name}}@if(!empty($note->loanable->name)).{{$note->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$note->loanable->barcode}} + @endif + + @else + @if(config('app.barcode_mode') == 'dynamic') + {{$note->loanable->category->name}}.@if(!empty($note->loanable->subcategory)){{$note->loanable->subcategory->name}}.@endif{{$note->loanable->brand->name}}.{{$note->loanable->model->name}}@if(!empty($note->loanable->name)).{{$note->loanable->name}}@endif + @endif + @if(config('app.barcode_mode') == 'static') + {{$note->loanable->barcode}} + @endif + @endcan + @break + @case('App\Models\Cabel') + @can('cabels_view') + + {{$note->loanable->category->name}}.{{$note->loanable->name}} + + @else + {{$note->loanable->category->name}}.{{$note->loanable->name}} + @endcan + @break + @endswitch + + {{$note->type->name}} + + {{$note->note}} +
+ @else + @lang('no_amount') @lang('notes') + @endif + @endcan +
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + @switch($data->loanerType->name) + @case('adUser') + + @break + @case('nadUser') + + @break + @endswitch + +
+
+ @can('users_edit') + @if($data->loanerType->name != 'adUser') + @lang('update') + @else + @can('users_edit_role') + @if(Auth::user()->id != $data->id) + @lang('update') + @endif + @else + @lang('update') + @endcan + @endif + @endcan +
+
+
+
+@endsection + +@section('scripting') +@endsection diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php new file mode 100644 index 0000000..87f2968 --- /dev/null +++ b/resources/views/welcome.blade.php @@ -0,0 +1,13 @@ + + + + + + + SKP Lager System + + + + + + diff --git a/routes/api.php b/routes/api.php new file mode 100644 index 0000000..eb6fa48 --- /dev/null +++ b/routes/api.php @@ -0,0 +1,19 @@ +get('/user', function (Request $request) { + return $request->user(); +}); diff --git a/routes/channels.php b/routes/channels.php new file mode 100644 index 0000000..5d451e1 --- /dev/null +++ b/routes/channels.php @@ -0,0 +1,18 @@ +id === (int) $id; +}); diff --git a/routes/console.php b/routes/console.php new file mode 100644 index 0000000..e05f4c9 --- /dev/null +++ b/routes/console.php @@ -0,0 +1,19 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 0000000..28ab384 --- /dev/null +++ b/routes/web.php @@ -0,0 +1,157 @@ +route('login'); +})->name('/'); + +//auth +Route::get('login', [LoginController::class, 'login'])->name('login'); +Route::post('authenticate', [LoginController::class, 'authenticate'])->name('authenticate'); + +Route::middleware("auth:adUser,nadUser")->group(function () { + // Auth + Route::get('logout', [LoginController::class, 'logout'])->name('logout'); + + // Other Pages + Route::get('statistics', [OtherController::class, 'statistics'])->name('statistics')->middleware('can:statistics'); + Route::get('logs', [OtherController::class, 'logs'])->name('logs')->middleware('can:logs_viewAny'); + + // Roles + Route::get('/roles/deleted', [RoleController::class,'deleted'])->name('roles.deleted'); + Route::get('/roles/{role}/restore', [RoleController::class,'restore'])->name('roles.restore'); + Route::get('/roles/{role}/forceDelete', [RoleController::class,'delete_force'])->name('roles.forceDelete'); + + // Users + Route::get('/users/deleted', [UserController::class,'deleted'])->name('users.deleted'); + Route::get('/users/{user}/restore', [UserController::class,'restore'])->name('users.restore'); + Route::get('/users/{user}/forceDelete', [UserController::class,'delete_force'])->name('users.forceDelete'); + + // Buildings + Route::get('/buildings/deleted', [BuildingController::class,'deleted'])->name('buildings.deleted'); + Route::get('/buildings/{building}/restore', [BuildingController::class,'restore'])->name('buildings.restore'); + Route::get('/buildings/{building}/forceDelete', [BuildingController::class,'delete_force'])->name('buildings.forceDelete'); + + // Rooms + Route::get('/rooms/deleted', [RoomController::class,'deleted'])->name('rooms.deleted'); + Route::get('/rooms/{room}/restore', [RoomController::class,'restore'])->name('rooms.restore'); + Route::get('/rooms/{room}/forceDelete', [RoomController::class,'delete_force'])->name('rooms.forceDelete'); + + // Categories + Route::get('/categories/deleted', [ProductCategoryController::class,'deleted'])->name('categories.deleted'); + Route::get('/categories/{category}/restore', [ProductCategoryController::class,'restore'])->name('categories.restore'); + Route::get('/categories/{category}/forceDelete', [ProductCategoryController::class,'delete_force'])->name('categories.forceDelete'); + + // Subcategories + Route::get('/subcategories/deleted', [ProductSubcategoryController::class,'deleted'])->name('subcategories.deleted'); + Route::get('/subcategories/{subcategory}/restore', [ProductSubcategoryController::class,'restore'])->name('subcategories.restore'); + Route::get('/subcategories/{subcategory}/forceDelete', [ProductSubcategoryController::class,'delete_force'])->name('subcategories.forceDelete'); + + // Brands + Route::get('/brands/deleted', [BrandController::class,'deleted'])->name('brands.deleted'); + Route::get('/brands/{brand}/restore', [BrandController::class,'restore'])->name('brands.restore'); + Route::get('/brands/{brand}/forceDelete', [BrandController::class,'delete_force'])->name('brands.forceDelete'); + + // Models + Route::get('/models/deleted', [ProductModelController::class,'deleted'])->name('models.deleted'); + Route::get('/models/{model}/restore', [ProductModelController::class,'restore'])->name('models.restore'); + Route::get('/models/{model}/forceDelete', [ProductModelController::class,'delete_force'])->name('models.forceDelete'); + + // Products + Route::get('/products/deleted', [ProductController::class,'deleted'])->name('products.deleted'); + Route::get('/products/{product}/restore', [ProductController::class,'restore'])->name('products.restore'); + Route::get('/products/{product}/forceDelete', [ProductController::class,'delete_force'])->name('products.forceDelete'); + Route::put('/products/{product}/amount/add', [ProductController::class, 'amount_add'])->name('products.amount.add'); + Route::put('/products/{product}/amount/remove', [ProductController::class, 'amount_remove'])->name('products.amount.remove'); + + // Cabels + Route::get('/cabelCategories/deleted', [CabelCategoryController::class,'deleted'])->name('cabelCategories.deleted'); + Route::get('/cabelCategories/{cabelCategory}/restore', [CabelCategoryController::class,'restore'])->name('cabelCategories.restore'); + Route::get('/cabelCategories/{cabelCategory}/forceDelete', [CabelCategoryController::class,'delete_force'])->name('cabelCategories.forceDelete'); + + // Cabels + Route::get('/cabels/deleted', [CabelController::class,'deleted'])->name('cabels.deleted'); + Route::get('/cabels/{cabel}/restore', [CabelController::class,'restore'])->name('cabels.restore'); + Route::get('/cabels/{cabel}/forceDelete', [CabelController::class,'delete_force'])->name('cabels.forceDelete'); + Route::put('/cabels/{cabel}/amount/add', [CabelController::class, 'amount_add'])->name('cabels.amount.add'); + Route::put('/cabels/{cabel}/amount/remove', [CabelController::class, 'amount_remove'])->name('cabels.amount.remove'); + + // Loans + Route::get('/loans', [LoanController::class,'index'])->name('loans.index'); + Route::get('/loans/create', [LoanController::class,'create'])->name('loans.create'); + Route::post('/loans', [LoanController::class,'store'])->name('loans.store'); + Route::get('/loans/laptop', [LoanController::class,'laptop_create'])->name('loans.laptop.create'); + Route::post('/loans/laptop', [LoanController::class,'laptop_store'])->name('loans.laptop.store'); + Route::get('/loans/return', [LoanController::class,'return_page'])->name('loans.return.page'); + Route::post('/loans/return', [LoanController::class,'return_action'])->name('loans.return.action'); + Route::get('/loans/{loan}/adjust', [LoanController::class,'adjust_page'])->name('loans.adjust.page'); + Route::put('/loans/{loan}/adjust', [LoanController::class,'adjust_action'])->name('loans.adjust.action'); + + // Reservations + Route::get('/reservations', [ReservationController::class,'index'])->name('reservations.index'); + Route::get('/reservations/{reservation}/validate', [ReservationController::class,'validate_page'])->name('reservations.validate.page'); + Route::post('/reservations/{reservation}/validate', [ReservationController::class,'validate_action'])->name('reservations.validate.action'); + Route::delete('/reservations/{reservation}/validate', [ReservationController::class,'cancel'])->name('reservations.validate.cancel'); + Route::get('/reservations/validations', [ReservationController::class,'validations'])->name('reservations.validations'); + Route::get('/reservations/setups', [ReservationController::class,'setups'])->name('reservations.setups'); + Route::post('/reservations/{reservation}/setup', [ReservationController::class,'setup'])->name('reservations.setup'); + Route::get('/reservations/pickups', [ReservationController::class,'pickups'])->name('reservations.pickups'); + Route::post('/reservations/{reservation}/pickup', [ReservationController::class,'pickup'])->name('reservations.pickup'); + Route::get('/reservations/create', [ReservationController::class,'create'])->name('reservations.create'); + Route::post('/reservations', [ReservationController::class,'store'])->name('reservations.store'); + + // Notes + Route::get('/notes', [NoteController::class,'index'])->name('notes.index'); + Route::get('/notes/deleted', [NoteController::class,'deleted'])->name('notes.deleted'); + Route::get('/notes/{note}/edit', [NoteController::class,'edit'])->name('notes.edit'); + Route::put('/notes/{note}/edit', [NoteController::class,'update'])->name('notes.update'); + Route::delete('/notes/{note}', [NoteController::class,'delete'])->name('notes.destroy'); + Route::get('/notes/{note}/forceDelete', [NoteController::class,'delete_force'])->name('notes.forceDelete'); + Route::get('/notes/{note}/restore', [NoteController::class,'restore'])->name('notes.restore'); + + // PDF + Route::get('/contracts', [PdfController::class, 'index'],)->name('contracts.index'); + Route::get('/PDF/{user}/{type}/{timestamp}', [PdfController::class, 'show'],)->name('pdf.show'); + Route::delete('/PDF/{user}/{type}/{timestamp}', [PdfController::class, 'destroy'],)->name('pdf.delete')->middleware('can:pdf_delete'); + + // Resources + Route::resource('brands', BrandController::class); + Route::resource('models', ProductModelController::class); + Route::resource('products', ProductController::class); + Route::resource('categories', ProductCategoryController::class); + Route::resource('subcategories', ProductSubcategoryController::class); + Route::resource('users', UserController::class); + Route::resource('rooms', RoomController::class); + Route::resource('buildings', BuildingController::class); + Route::resource('roles', RoleController::class); + Route::resource('cabelCategories', CabelCategoryController::class); + Route::resource('cabels', CabelController::class); +}); diff --git a/storage/app/.gitignore b/storage/app/.gitignore new file mode 100644 index 0000000..8f4803c --- /dev/null +++ b/storage/app/.gitignore @@ -0,0 +1,3 @@ +* +!public/ +!.gitignore diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore new file mode 100644 index 0000000..05c4471 --- /dev/null +++ b/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore new file mode 100644 index 0000000..01e4a6c --- /dev/null +++ b/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tests/CreatesApplication.php b/tests/CreatesApplication.php new file mode 100644 index 0000000..547152f --- /dev/null +++ b/tests/CreatesApplication.php @@ -0,0 +1,22 @@ +make(Kernel::class)->bootstrap(); + + return $app; + } +} diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php new file mode 100644 index 0000000..1eafba6 --- /dev/null +++ b/tests/Feature/ExampleTest.php @@ -0,0 +1,21 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..2932d4a --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..421b569 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + ], +});